75eeceb13a046c22a7864511556fe526756d1fef
[gnupg.git] / g10 / gpg.c
1 /* gpg.c - The GnuPG utility (main for gpg)
2  * Copyright (C) 1998-2011 Free Software Foundation, Inc.
3  * Copyright (C) 1997-2017 Werner Koch
4  * Copyright (C) 2015-2017 g10 Code GmbH
5  *
6  * This file is part of GnuPG.
7  *
8  * GnuPG is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * GnuPG is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, see <https://www.gnu.org/licenses/>.
20  */
21
22 #include <config.h>
23 #include <errno.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <ctype.h>
28 #include <unistd.h>
29 #ifdef HAVE_STAT
30 #include <sys/stat.h> /* for stat() */
31 #endif
32 #include <fcntl.h>
33 #ifdef HAVE_W32_SYSTEM
34 # ifdef HAVE_WINSOCK2_H
35 #  include <winsock2.h>
36 # endif
37 # include <windows.h>
38 #endif
39
40 #define INCLUDED_BY_MAIN_MODULE 1
41 #include "gpg.h"
42 #include <assuan.h>
43 #include "../common/iobuf.h"
44 #include "../common/util.h"
45 #include "packet.h"
46 #include "../common/membuf.h"
47 #include "main.h"
48 #include "options.h"
49 #include "keydb.h"
50 #include "trustdb.h"
51 #include "filter.h"
52 #include "../common/ttyio.h"
53 #include "../common/i18n.h"
54 #include "../common/sysutils.h"
55 #include "../common/status.h"
56 #include "keyserver-internal.h"
57 #include "exec.h"
58 #include "../common/gc-opt-flags.h"
59 #include "../common/asshelp.h"
60 #include "call-dirmngr.h"
61 #include "tofu.h"
62 #include "../common/init.h"
63 #include "../common/mbox-util.h"
64 #include "../common/shareddefs.h"
65 #include "../common/compliance.h"
66
67 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
68 #define MY_O_BINARY  O_BINARY
69 #ifndef S_IRGRP
70 # define S_IRGRP 0
71 # define S_IWGRP 0
72 #endif
73 #else
74 #define MY_O_BINARY  0
75 #endif
76
77 #ifdef __MINGW32__
78 int _dowildcard = -1;
79 #endif
80
81 enum cmd_and_opt_values
82   {
83     aNull = 0,
84     oArmor        = 'a',
85     aDetachedSign = 'b',
86     aSym          = 'c',
87     aDecrypt      = 'd',
88     aEncr         = 'e',
89     oRecipientFile       = 'f',
90     oHiddenRecipientFile = 'F',
91     oInteractive  = 'i',
92     aListKeys     = 'k',
93     oDryRun       = 'n',
94     oOutput       = 'o',
95     oQuiet        = 'q',
96     oRecipient    = 'r',
97     oHiddenRecipient = 'R',
98     aSign         = 's',
99     oTextmodeShort= 't',
100     oLocalUser    = 'u',
101     oVerbose      = 'v',
102     oCompress     = 'z',
103     oSetNotation  = 'N',
104     aListSecretKeys = 'K',
105     oBatch        = 500,
106     oMaxOutput,
107     oInputSizeHint,
108     oChunkSize,
109     oSigNotation,
110     oCertNotation,
111     oShowNotation,
112     oNoShowNotation,
113     aEncrFiles,
114     aEncrSym,
115     aDecryptFiles,
116     aClearsign,
117     aStore,
118     aQuickKeygen,
119     aFullKeygen,
120     aKeygen,
121     aSignEncr,
122     aSignEncrSym,
123     aSignSym,
124     aSignKey,
125     aLSignKey,
126     aQuickSignKey,
127     aQuickLSignKey,
128     aQuickAddUid,
129     aQuickAddKey,
130     aQuickRevUid,
131     aQuickSetExpire,
132     aQuickSetPrimaryUid,
133     aListConfig,
134     aListGcryptConfig,
135     aGPGConfList,
136     aGPGConfTest,
137     aListPackets,
138     aEditKey,
139     aDeleteKeys,
140     aDeleteSecretKeys,
141     aDeleteSecretAndPublicKeys,
142     aImport,
143     aFastImport,
144     aVerify,
145     aVerifyFiles,
146     aListSigs,
147     aSendKeys,
148     aRecvKeys,
149     aLocateKeys,
150     aSearchKeys,
151     aRefreshKeys,
152     aFetchKeys,
153     aExport,
154     aExportSecret,
155     aExportSecretSub,
156     aExportSshKey,
157     aCheckKeys,
158     aGenRevoke,
159     aDesigRevoke,
160     aPrimegen,
161     aPrintMD,
162     aPrintMDs,
163     aCheckTrustDB,
164     aUpdateTrustDB,
165     aFixTrustDB,
166     aListTrustDB,
167     aListTrustPath,
168     aExportOwnerTrust,
169     aImportOwnerTrust,
170     aDeArmor,
171     aEnArmor,
172     aGenRandom,
173     aRebuildKeydbCaches,
174     aCardStatus,
175     aCardEdit,
176     aChangePIN,
177     aPasswd,
178     aServer,
179     aTOFUPolicy,
180
181     oMimemode,
182     oTextmode,
183     oNoTextmode,
184     oExpert,
185     oNoExpert,
186     oDefSigExpire,
187     oAskSigExpire,
188     oNoAskSigExpire,
189     oDefCertExpire,
190     oAskCertExpire,
191     oNoAskCertExpire,
192     oDefCertLevel,
193     oMinCertLevel,
194     oAskCertLevel,
195     oNoAskCertLevel,
196     oFingerprint,
197     oWithFingerprint,
198     oWithSubkeyFingerprint,
199     oWithICAOSpelling,
200     oWithKeygrip,
201     oWithKeyScreening,
202     oWithSecret,
203     oWithWKDHash,
204     oWithColons,
205     oWithKeyData,
206     oWithKeyOrigin,
207     oWithTofuInfo,
208     oWithSigList,
209     oWithSigCheck,
210     oAnswerYes,
211     oAnswerNo,
212     oKeyring,
213     oPrimaryKeyring,
214     oSecretKeyring,
215     oShowKeyring,
216     oDefaultKey,
217     oDefRecipient,
218     oDefRecipientSelf,
219     oNoDefRecipient,
220     oTrySecretKey,
221     oOptions,
222     oDebug,
223     oDebugLevel,
224     oDebugAll,
225     oDebugIOLBF,
226     oDebugSetIobufSize,
227     oStatusFD,
228     oStatusFile,
229     oAttributeFD,
230     oAttributeFile,
231     oEmitVersion,
232     oNoEmitVersion,
233     oCompletesNeeded,
234     oMarginalsNeeded,
235     oMaxCertDepth,
236     oLoadExtension,
237     oCompliance,
238     oGnuPG,
239     oRFC2440,
240     oRFC4880,
241     oRFC4880bis,
242     oOpenPGP,
243     oPGP6,
244     oPGP7,
245     oPGP8,
246     oDE_VS,
247     oRFC2440Text,
248     oNoRFC2440Text,
249     oCipherAlgo,
250     oAEADAlgo,
251     oDigestAlgo,
252     oCertDigestAlgo,
253     oCompressAlgo,
254     oCompressLevel,
255     oBZ2CompressLevel,
256     oBZ2DecompressLowmem,
257     oPassphrase,
258     oPassphraseFD,
259     oPassphraseFile,
260     oPassphraseRepeat,
261     oPinentryMode,
262     oCommandFD,
263     oCommandFile,
264     oQuickRandom,
265     oNoVerbose,
266     oTrustDBName,
267     oNoSecmemWarn,
268     oRequireSecmem,
269     oNoRequireSecmem,
270     oNoPermissionWarn,
271     oNoMDCWarn,
272     oNoArmor,
273     oNoDefKeyring,
274     oNoKeyring,
275     oNoGreeting,
276     oNoTTY,
277     oNoOptions,
278     oNoBatch,
279     oHomedir,
280     oSkipVerify,
281     oSkipHiddenRecipients,
282     oNoSkipHiddenRecipients,
283     oAlwaysTrust,
284     oTrustModel,
285     oForceOwnertrust,
286     oSetFilename,
287     oForYourEyesOnly,
288     oNoForYourEyesOnly,
289     oSetPolicyURL,
290     oSigPolicyURL,
291     oCertPolicyURL,
292     oShowPolicyURL,
293     oNoShowPolicyURL,
294     oSigKeyserverURL,
295     oUseEmbeddedFilename,
296     oNoUseEmbeddedFilename,
297     oComment,
298     oDefaultComment,
299     oNoComments,
300     oThrowKeyids,
301     oNoThrowKeyids,
302     oShowPhotos,
303     oNoShowPhotos,
304     oPhotoViewer,
305     oForceMDC,
306     oNoForceMDC,
307     oDisableMDC,
308     oNoDisableMDC,
309     oForceAEAD,
310     oS2KMode,
311     oS2KDigest,
312     oS2KCipher,
313     oS2KCount,
314     oDisplayCharset,
315     oNotDashEscaped,
316     oEscapeFrom,
317     oNoEscapeFrom,
318     oLockOnce,
319     oLockMultiple,
320     oLockNever,
321     oKeyServer,
322     oKeyServerOptions,
323     oImportOptions,
324     oImportFilter,
325     oExportOptions,
326     oExportFilter,
327     oListOptions,
328     oVerifyOptions,
329     oTempDir,
330     oExecPath,
331     oEncryptTo,
332     oHiddenEncryptTo,
333     oNoEncryptTo,
334     oEncryptToDefaultKey,
335     oLoggerFD,
336     oLoggerFile,
337     oUtf8Strings,
338     oNoUtf8Strings,
339     oDisableCipherAlgo,
340     oDisablePubkeyAlgo,
341     oAllowNonSelfsignedUID,
342     oNoAllowNonSelfsignedUID,
343     oAllowFreeformUID,
344     oNoAllowFreeformUID,
345     oAllowSecretKeyImport,
346     oEnableSpecialFilenames,
347     oNoLiteral,
348     oSetFilesize,
349     oHonorHttpProxy,
350     oFastListMode,
351     oListOnly,
352     oIgnoreTimeConflict,
353     oIgnoreValidFrom,
354     oIgnoreCrcError,
355     oIgnoreMDCError,
356     oShowSessionKey,
357     oOverrideSessionKey,
358     oOverrideSessionKeyFD,
359     oNoRandomSeedFile,
360     oAutoKeyRetrieve,
361     oNoAutoKeyRetrieve,
362     oUseAgent,
363     oNoUseAgent,
364     oGpgAgentInfo,
365     oMergeOnly,
366     oTryAllSecrets,
367     oTrustedKey,
368     oNoExpensiveTrustChecks,
369     oFixedListMode,
370     oLegacyListMode,
371     oNoSigCache,
372     oAutoCheckTrustDB,
373     oNoAutoCheckTrustDB,
374     oPreservePermissions,
375     oDefaultPreferenceList,
376     oDefaultKeyserverURL,
377     oPersonalCipherPreferences,
378     oPersonalAEADPreferences,
379     oPersonalDigestPreferences,
380     oPersonalCompressPreferences,
381     oAgentProgram,
382     oDirmngrProgram,
383     oDisableDirmngr,
384     oDisplay,
385     oTTYname,
386     oTTYtype,
387     oLCctype,
388     oLCmessages,
389     oXauthority,
390     oGroup,
391     oUnGroup,
392     oNoGroups,
393     oStrict,
394     oNoStrict,
395     oMangleDosFilenames,
396     oNoMangleDosFilenames,
397     oEnableProgressFilter,
398     oMultifile,
399     oKeyidFormat,
400     oExitOnStatusWriteError,
401     oLimitCardInsertTries,
402     oReaderPort,
403     octapiDriver,
404     opcscDriver,
405     oDisableCCID,
406     oRequireCrossCert,
407     oNoRequireCrossCert,
408     oAutoKeyLocate,
409     oNoAutoKeyLocate,
410     oAllowMultisigVerification,
411     oEnableLargeRSA,
412     oDisableLargeRSA,
413     oEnableDSA2,
414     oDisableDSA2,
415     oAllowMultipleMessages,
416     oNoAllowMultipleMessages,
417     oAllowWeakDigestAlgos,
418     oFakedSystemTime,
419     oNoAutostart,
420     oPrintPKARecords,
421     oPrintDANERecords,
422     oTOFUDefaultPolicy,
423     oTOFUDBFormat,
424     oDefaultNewKeyAlgo,
425     oWeakDigest,
426     oUnwrap,
427     oOnlySignTextIDs,
428     oDisableSignerUID,
429     oSender,
430     oKeyOrigin,
431     oRequestOrigin,
432     oNoSymkeyCache,
433
434     oNoop
435   };
436
437
438 static ARGPARSE_OPTS opts[] = {
439
440   ARGPARSE_group (300, N_("@Commands:\n ")),
441
442   ARGPARSE_c (aSign, "sign", N_("make a signature")),
443   ARGPARSE_c (aClearsign, "clear-sign", N_("make a clear text signature")),
444   ARGPARSE_c (aClearsign, "clearsign", "@"),
445   ARGPARSE_c (aDetachedSign, "detach-sign", N_("make a detached signature")),
446   ARGPARSE_c (aEncr, "encrypt",   N_("encrypt data")),
447   ARGPARSE_c (aEncrFiles, "encrypt-files", "@"),
448   ARGPARSE_c (aSym, "symmetric", N_("encryption only with symmetric cipher")),
449   ARGPARSE_c (aStore, "store",     "@"),
450   ARGPARSE_c (aDecrypt, "decrypt",   N_("decrypt data (default)")),
451   ARGPARSE_c (aDecryptFiles, "decrypt-files", "@"),
452   ARGPARSE_c (aVerify, "verify"   , N_("verify a signature")),
453   ARGPARSE_c (aVerifyFiles, "verify-files" , "@" ),
454   ARGPARSE_c (aListKeys, "list-keys", N_("list keys")),
455   ARGPARSE_c (aListKeys, "list-public-keys", "@" ),
456   ARGPARSE_c (aListSigs, "list-signatures", N_("list keys and signatures")),
457   ARGPARSE_c (aListSigs, "list-sigs", "@"),
458   ARGPARSE_c (aCheckKeys, "check-signatures",
459               N_("list and check key signatures")),
460   ARGPARSE_c (aCheckKeys, "check-sigs", "@"),
461   ARGPARSE_c (oFingerprint, "fingerprint", N_("list keys and fingerprints")),
462   ARGPARSE_c (aListSecretKeys, "list-secret-keys", N_("list secret keys")),
463   ARGPARSE_c (aKeygen,      "generate-key",
464               N_("generate a new key pair")),
465   ARGPARSE_c (aKeygen,      "gen-key", "@"),
466   ARGPARSE_c (aQuickKeygen, "quick-generate-key" ,
467               N_("quickly generate a new key pair")),
468   ARGPARSE_c (aQuickKeygen, "quick-gen-key", "@"),
469   ARGPARSE_c (aQuickAddUid,  "quick-add-uid",
470               N_("quickly add a new user-id")),
471   ARGPARSE_c (aQuickAddUid,  "quick-adduid", "@"),
472   ARGPARSE_c (aQuickAddKey,  "quick-add-key", "@"),
473   ARGPARSE_c (aQuickAddKey,  "quick-addkey", "@"),
474   ARGPARSE_c (aQuickRevUid,  "quick-revoke-uid",
475               N_("quickly revoke a user-id")),
476   ARGPARSE_c (aQuickRevUid,  "quick-revuid", "@"),
477   ARGPARSE_c (aQuickSetExpire,  "quick-set-expire",
478               N_("quickly set a new expiration date")),
479   ARGPARSE_c (aQuickSetPrimaryUid,  "quick-set-primary-uid", "@"),
480   ARGPARSE_c (aFullKeygen,  "full-generate-key" ,
481               N_("full featured key pair generation")),
482   ARGPARSE_c (aFullKeygen,  "full-gen-key", "@"),
483   ARGPARSE_c (aGenRevoke, "generate-revocation",
484               N_("generate a revocation certificate")),
485   ARGPARSE_c (aGenRevoke, "gen-revoke", "@"),
486   ARGPARSE_c (aDeleteKeys,"delete-keys",
487               N_("remove keys from the public keyring")),
488   ARGPARSE_c (aDeleteSecretKeys, "delete-secret-keys",
489               N_("remove keys from the secret keyring")),
490   ARGPARSE_c (aQuickSignKey,  "quick-sign-key" ,
491               N_("quickly sign a key")),
492   ARGPARSE_c (aQuickLSignKey, "quick-lsign-key",
493               N_("quickly sign a key locally")),
494   ARGPARSE_c (aSignKey,  "sign-key"   ,N_("sign a key")),
495   ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
496   ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
497   ARGPARSE_c (aEditKey,  "key-edit"   ,"@"),
498   ARGPARSE_c (aPasswd,   "change-passphrase", N_("change a passphrase")),
499   ARGPARSE_c (aPasswd,   "passwd", "@"),
500   ARGPARSE_c (aDesigRevoke, "generate-designated-revocation", "@"),
501   ARGPARSE_c (aDesigRevoke, "desig-revoke","@" ),
502   ARGPARSE_c (aExport, "export"           , N_("export keys") ),
503   ARGPARSE_c (aSendKeys, "send-keys"     , N_("export keys to a keyserver") ),
504   ARGPARSE_c (aRecvKeys, "receive-keys" , N_("import keys from a keyserver") ),
505   ARGPARSE_c (aRecvKeys, "recv-keys"     , "@"),
506   ARGPARSE_c (aSearchKeys, "search-keys" ,
507               N_("search for keys on a keyserver") ),
508   ARGPARSE_c (aRefreshKeys, "refresh-keys",
509               N_("update all keys from a keyserver")),
510   ARGPARSE_c (aLocateKeys, "locate-keys", "@"),
511   ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
512   ARGPARSE_c (aExportSecret, "export-secret-keys" , "@" ),
513   ARGPARSE_c (aExportSecretSub, "export-secret-subkeys" , "@" ),
514   ARGPARSE_c (aExportSshKey, "export-ssh-key", "@" ),
515   ARGPARSE_c (aImport, "import", N_("import/merge keys")),
516   ARGPARSE_c (aFastImport, "fast-import", "@"),
517 #ifdef ENABLE_CARD_SUPPORT
518   ARGPARSE_c (aCardStatus,  "card-status", N_("print the card status")),
519   ARGPARSE_c (aCardEdit,   "edit-card",  N_("change data on a card")),
520   ARGPARSE_c (aCardEdit,   "card-edit", "@"),
521   ARGPARSE_c (aChangePIN,  "change-pin", N_("change a card's PIN")),
522 #endif
523   ARGPARSE_c (aListConfig, "list-config", "@"),
524   ARGPARSE_c (aListGcryptConfig, "list-gcrypt-config", "@"),
525   ARGPARSE_c (aGPGConfList, "gpgconf-list", "@" ),
526   ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@" ),
527   ARGPARSE_c (aListPackets, "list-packets","@"),
528
529 #ifndef NO_TRUST_MODELS
530   ARGPARSE_c (aExportOwnerTrust, "export-ownertrust", "@"),
531   ARGPARSE_c (aImportOwnerTrust, "import-ownertrust", "@"),
532   ARGPARSE_c (aUpdateTrustDB,"update-trustdb",
533               N_("update the trust database")),
534   ARGPARSE_c (aCheckTrustDB, "check-trustdb", "@"),
535   ARGPARSE_c (aFixTrustDB, "fix-trustdb", "@"),
536 #endif
537
538   ARGPARSE_c (aDeArmor, "dearmor", "@"),
539   ARGPARSE_c (aDeArmor, "dearmour", "@"),
540   ARGPARSE_c (aEnArmor, "enarmor", "@"),
541   ARGPARSE_c (aEnArmor, "enarmour", "@"),
542   ARGPARSE_c (aPrintMD, "print-md", N_("print message digests")),
543   ARGPARSE_c (aPrimegen, "gen-prime", "@" ),
544   ARGPARSE_c (aGenRandom,"gen-random", "@" ),
545   ARGPARSE_c (aServer,   "server",  N_("run in server mode")),
546   ARGPARSE_c (aTOFUPolicy, "tofu-policy",
547               N_("|VALUE|set the TOFU policy for a key")),
548
549   ARGPARSE_group (301, N_("@\nOptions:\n ")),
550
551   ARGPARSE_s_n (oArmor, "armor", N_("create ascii armored output")),
552   ARGPARSE_s_n (oArmor, "armour", "@"),
553
554   ARGPARSE_s_s (oRecipient, "recipient", N_("|USER-ID|encrypt for USER-ID")),
555   ARGPARSE_s_s (oHiddenRecipient, "hidden-recipient", "@"),
556   ARGPARSE_s_s (oRecipientFile, "recipient-file", "@"),
557   ARGPARSE_s_s (oHiddenRecipientFile, "hidden-recipient-file", "@"),
558   ARGPARSE_s_s (oRecipient, "remote-user", "@"),  /* (old option name) */
559   ARGPARSE_s_s (oDefRecipient, "default-recipient", "@"),
560   ARGPARSE_s_n (oDefRecipientSelf,  "default-recipient-self", "@"),
561   ARGPARSE_s_n (oNoDefRecipient, "no-default-recipient", "@"),
562
563   ARGPARSE_s_s (oTempDir,  "temp-directory", "@"),
564   ARGPARSE_s_s (oExecPath, "exec-path", "@"),
565   ARGPARSE_s_s (oEncryptTo,      "encrypt-to", "@"),
566   ARGPARSE_s_n (oNoEncryptTo, "no-encrypt-to", "@"),
567   ARGPARSE_s_s (oHiddenEncryptTo, "hidden-encrypt-to", "@"),
568   ARGPARSE_s_n (oEncryptToDefaultKey, "encrypt-to-default-key", "@"),
569   ARGPARSE_s_s (oLocalUser, "local-user",
570                 N_("|USER-ID|use USER-ID to sign or decrypt")),
571   ARGPARSE_s_s (oSender, "sender", "@"),
572
573   ARGPARSE_s_s (oTrySecretKey, "try-secret-key", "@"),
574
575   ARGPARSE_s_i (oCompress, NULL,
576                 N_("|N|set compress level to N (0 disables)")),
577   ARGPARSE_s_i (oCompressLevel, "compress-level", "@"),
578   ARGPARSE_s_i (oBZ2CompressLevel, "bzip2-compress-level", "@"),
579   ARGPARSE_s_n (oBZ2DecompressLowmem, "bzip2-decompress-lowmem", "@"),
580
581   ARGPARSE_s_n (oMimemode, "mimemode", "@"),
582   ARGPARSE_s_n (oTextmodeShort, NULL, "@"),
583   ARGPARSE_s_n (oTextmode,   "textmode", N_("use canonical text mode")),
584   ARGPARSE_s_n (oNoTextmode, "no-textmode", "@"),
585
586   ARGPARSE_s_n (oExpert,      "expert", "@"),
587   ARGPARSE_s_n (oNoExpert, "no-expert", "@"),
588
589   ARGPARSE_s_s (oDefSigExpire, "default-sig-expire", "@"),
590   ARGPARSE_s_n (oAskSigExpire,      "ask-sig-expire", "@"),
591   ARGPARSE_s_n (oNoAskSigExpire, "no-ask-sig-expire", "@"),
592   ARGPARSE_s_s (oDefCertExpire, "default-cert-expire", "@"),
593   ARGPARSE_s_n (oAskCertExpire,      "ask-cert-expire", "@"),
594   ARGPARSE_s_n (oNoAskCertExpire, "no-ask-cert-expire", "@"),
595   ARGPARSE_s_i (oDefCertLevel, "default-cert-level", "@"),
596   ARGPARSE_s_i (oMinCertLevel, "min-cert-level", "@"),
597   ARGPARSE_s_n (oAskCertLevel,      "ask-cert-level", "@"),
598   ARGPARSE_s_n (oNoAskCertLevel, "no-ask-cert-level", "@"),
599
600   ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
601   ARGPARSE_p_u (oMaxOutput, "max-output", "@"),
602   ARGPARSE_s_s (oInputSizeHint, "input-size-hint", "@"),
603   ARGPARSE_s_i (oChunkSize, "chunk-size", "@"),
604
605   ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
606   ARGPARSE_s_n (oQuiet,   "quiet",   "@"),
607   ARGPARSE_s_n (oNoTTY,   "no-tty",  "@"),
608
609   ARGPARSE_s_n (oForceMDC, "force-mdc", "@"),
610   ARGPARSE_s_n (oNoForceMDC, "no-force-mdc", "@"),
611   ARGPARSE_s_n (oDisableMDC, "disable-mdc", "@"),
612   ARGPARSE_s_n (oNoDisableMDC, "no-disable-mdc", "@"),
613
614   ARGPARSE_s_n (oForceAEAD, "force-aead", "@"),
615
616   ARGPARSE_s_n (oDisableSignerUID, "disable-signer-uid", "@"),
617
618   ARGPARSE_s_n (oDryRun, "dry-run", N_("do not make any changes")),
619   ARGPARSE_s_n (oInteractive, "interactive", N_("prompt before overwriting")),
620
621   ARGPARSE_s_n (oBatch, "batch", "@"),
622   ARGPARSE_s_n (oAnswerYes, "yes", "@"),
623   ARGPARSE_s_n (oAnswerNo, "no", "@"),
624   ARGPARSE_s_s (oKeyring, "keyring", "@"),
625   ARGPARSE_s_s (oPrimaryKeyring, "primary-keyring", "@"),
626   ARGPARSE_s_s (oSecretKeyring, "secret-keyring", "@"),
627   ARGPARSE_s_n (oShowKeyring, "show-keyring", "@"),
628   ARGPARSE_s_s (oDefaultKey, "default-key", "@"),
629
630   ARGPARSE_s_s (oKeyServer, "keyserver", "@"),
631   ARGPARSE_s_s (oKeyServerOptions, "keyserver-options", "@"),
632   ARGPARSE_s_s (oKeyOrigin, "key-origin", "@"),
633   ARGPARSE_s_s (oImportOptions, "import-options", "@"),
634   ARGPARSE_s_s (oImportFilter,  "import-filter", "@"),
635   ARGPARSE_s_s (oExportOptions, "export-options", "@"),
636   ARGPARSE_s_s (oExportFilter,  "export-filter", "@"),
637   ARGPARSE_s_s (oListOptions,   "list-options", "@"),
638   ARGPARSE_s_s (oVerifyOptions, "verify-options", "@"),
639
640   ARGPARSE_s_s (oDisplayCharset, "display-charset", "@"),
641   ARGPARSE_s_s (oDisplayCharset, "charset", "@"),
642   ARGPARSE_s_s (oOptions, "options", "@"),
643
644   ARGPARSE_s_s (oDebug, "debug", "@"),
645   ARGPARSE_s_s (oDebugLevel, "debug-level", "@"),
646   ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
647   ARGPARSE_s_n (oDebugIOLBF, "debug-iolbf", "@"),
648   ARGPARSE_s_u (oDebugSetIobufSize, "debug-set-iobuf-size", "@"),
649   ARGPARSE_s_i (oStatusFD, "status-fd", "@"),
650   ARGPARSE_s_s (oStatusFile, "status-file", "@"),
651   ARGPARSE_s_i (oAttributeFD, "attribute-fd", "@"),
652   ARGPARSE_s_s (oAttributeFile, "attribute-file", "@"),
653
654   ARGPARSE_s_i (oCompletesNeeded, "completes-needed", "@"),
655   ARGPARSE_s_i (oMarginalsNeeded, "marginals-needed", "@"),
656   ARGPARSE_s_i (oMaxCertDepth,  "max-cert-depth", "@" ),
657   ARGPARSE_s_s (oTrustedKey, "trusted-key", "@"),
658
659   ARGPARSE_s_s (oLoadExtension, "load-extension", "@"),  /* Dummy.  */
660
661   ARGPARSE_s_s (oCompliance, "compliance",   "@"),
662   ARGPARSE_s_n (oGnuPG, "gnupg",   "@"),
663   ARGPARSE_s_n (oGnuPG, "no-pgp2", "@"),
664   ARGPARSE_s_n (oGnuPG, "no-pgp6", "@"),
665   ARGPARSE_s_n (oGnuPG, "no-pgp7", "@"),
666   ARGPARSE_s_n (oGnuPG, "no-pgp8", "@"),
667   ARGPARSE_s_n (oRFC2440, "rfc2440", "@"),
668   ARGPARSE_s_n (oRFC4880, "rfc4880", "@"),
669   ARGPARSE_s_n (oRFC4880bis, "rfc4880bis", "@"),
670   ARGPARSE_s_n (oOpenPGP, "openpgp", N_("use strict OpenPGP behavior")),
671   ARGPARSE_s_n (oPGP6, "pgp6", "@"),
672   ARGPARSE_s_n (oPGP7, "pgp7", "@"),
673   ARGPARSE_s_n (oPGP8, "pgp8", "@"),
674
675   ARGPARSE_s_n (oRFC2440Text,      "rfc2440-text", "@"),
676   ARGPARSE_s_n (oNoRFC2440Text, "no-rfc2440-text", "@"),
677   ARGPARSE_s_i (oS2KMode, "s2k-mode", "@"),
678   ARGPARSE_s_s (oS2KDigest, "s2k-digest-algo", "@"),
679   ARGPARSE_s_s (oS2KCipher, "s2k-cipher-algo", "@"),
680   ARGPARSE_s_i (oS2KCount, "s2k-count", "@"),
681   ARGPARSE_s_s (oCipherAlgo, "cipher-algo", "@"),
682   ARGPARSE_s_s (oAEADAlgo,   "aead-algo", "@"),
683   ARGPARSE_s_s (oDigestAlgo, "digest-algo", "@"),
684   ARGPARSE_s_s (oCertDigestAlgo, "cert-digest-algo", "@"),
685   ARGPARSE_s_s (oCompressAlgo,"compress-algo", "@"),
686   ARGPARSE_s_s (oCompressAlgo, "compression-algo", "@"), /* Alias */
687   ARGPARSE_s_n (oThrowKeyids, "throw-keyids", "@"),
688   ARGPARSE_s_n (oNoThrowKeyids, "no-throw-keyids", "@"),
689   ARGPARSE_s_n (oShowPhotos,   "show-photos", "@"),
690   ARGPARSE_s_n (oNoShowPhotos, "no-show-photos", "@"),
691   ARGPARSE_s_s (oPhotoViewer,  "photo-viewer", "@"),
692   ARGPARSE_s_s (oSetNotation,  "set-notation", "@"),
693   ARGPARSE_s_s (oSigNotation,  "sig-notation", "@"),
694   ARGPARSE_s_s (oCertNotation, "cert-notation", "@"),
695
696   ARGPARSE_group (302, N_(
697   "@\n(See the man page for a complete listing of all commands and options)\n"
698                       )),
699
700   ARGPARSE_group (303, N_("@\nExamples:\n\n"
701     " -se -r Bob [file]          sign and encrypt for user Bob\n"
702     " --clear-sign [file]        make a clear text signature\n"
703     " --detach-sign [file]       make a detached signature\n"
704     " --list-keys [names]        show keys\n"
705     " --fingerprint [names]      show fingerprints\n")),
706
707   /* More hidden commands and options. */
708   ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
709 #ifndef NO_TRUST_MODELS
710   ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
711 #endif
712
713   /* Not yet used:
714      ARGPARSE_c (aListTrustPath, "list-trust-path", "@"), */
715   ARGPARSE_c (aDeleteSecretAndPublicKeys,
716               "delete-secret-and-public-keys", "@"),
717   ARGPARSE_c (aRebuildKeydbCaches, "rebuild-keydb-caches", "@"),
718
719   ARGPARSE_s_s (oPassphrase,      "passphrase", "@"),
720   ARGPARSE_s_i (oPassphraseFD,    "passphrase-fd", "@"),
721   ARGPARSE_s_s (oPassphraseFile,  "passphrase-file", "@"),
722   ARGPARSE_s_i (oPassphraseRepeat,"passphrase-repeat", "@"),
723   ARGPARSE_s_s (oPinentryMode,    "pinentry-mode", "@"),
724   ARGPARSE_s_s (oRequestOrigin,   "request-origin", "@"),
725   ARGPARSE_s_i (oCommandFD, "command-fd", "@"),
726   ARGPARSE_s_s (oCommandFile, "command-file", "@"),
727   ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
728   ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
729
730 #ifndef NO_TRUST_MODELS
731   ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
732   ARGPARSE_s_n (oAutoCheckTrustDB, "auto-check-trustdb", "@"),
733   ARGPARSE_s_n (oNoAutoCheckTrustDB, "no-auto-check-trustdb", "@"),
734   ARGPARSE_s_s (oForceOwnertrust, "force-ownertrust", "@"),
735 #endif
736
737   ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
738   ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
739   ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
740   ARGPARSE_s_n (oNoPermissionWarn, "no-permission-warning", "@"),
741   ARGPARSE_s_n (oNoMDCWarn, "no-mdc-warning", "@"),
742   ARGPARSE_s_n (oNoArmor, "no-armor", "@"),
743   ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
744   ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
745   ARGPARSE_s_n (oNoKeyring, "no-keyring", "@"),
746   ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
747   ARGPARSE_s_n (oNoOptions, "no-options", "@"),
748   ARGPARSE_s_s (oHomedir, "homedir", "@"),
749   ARGPARSE_s_n (oNoBatch, "no-batch", "@"),
750   ARGPARSE_s_n (oWithColons, "with-colons", "@"),
751   ARGPARSE_s_n (oWithTofuInfo,"with-tofu-info", "@"),
752   ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
753   ARGPARSE_s_n (oWithSigList,"with-sig-list", "@"),
754   ARGPARSE_s_n (oWithSigCheck,"with-sig-check", "@"),
755   ARGPARSE_c (aListKeys, "list-key", "@"),   /* alias */
756   ARGPARSE_c (aListSigs, "list-sig", "@"),   /* alias */
757   ARGPARSE_c (aCheckKeys, "check-sig", "@"), /* alias */
758   ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
759   ARGPARSE_s_n (oSkipHiddenRecipients, "skip-hidden-recipients", "@"),
760   ARGPARSE_s_n (oNoSkipHiddenRecipients, "no-skip-hidden-recipients", "@"),
761   ARGPARSE_s_i (oDefCertLevel, "default-cert-check-level", "@"), /* old */
762 #ifndef NO_TRUST_MODELS
763   ARGPARSE_s_n (oAlwaysTrust, "always-trust", "@"),
764 #endif
765   ARGPARSE_s_s (oTrustModel, "trust-model", "@"),
766   ARGPARSE_s_s (oTOFUDefaultPolicy, "tofu-default-policy", "@"),
767   ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
768   ARGPARSE_s_n (oForYourEyesOnly, "for-your-eyes-only", "@"),
769   ARGPARSE_s_n (oNoForYourEyesOnly, "no-for-your-eyes-only", "@"),
770   ARGPARSE_s_s (oSetPolicyURL,  "set-policy-url", "@"),
771   ARGPARSE_s_s (oSigPolicyURL,  "sig-policy-url", "@"),
772   ARGPARSE_s_s (oCertPolicyURL, "cert-policy-url", "@"),
773   ARGPARSE_s_n (oShowPolicyURL,      "show-policy-url", "@"),
774   ARGPARSE_s_n (oNoShowPolicyURL, "no-show-policy-url", "@"),
775   ARGPARSE_s_s (oSigKeyserverURL, "sig-keyserver-url", "@"),
776   ARGPARSE_s_n (oShowNotation,      "show-notation", "@"),
777   ARGPARSE_s_n (oNoShowNotation, "no-show-notation", "@"),
778   ARGPARSE_s_s (oComment, "comment", "@"),
779   ARGPARSE_s_n (oDefaultComment, "default-comment", "@"),
780   ARGPARSE_s_n (oNoComments, "no-comments", "@"),
781   ARGPARSE_s_n (oEmitVersion,      "emit-version", "@"),
782   ARGPARSE_s_n (oNoEmitVersion, "no-emit-version", "@"),
783   ARGPARSE_s_n (oNoEmitVersion, "no-version", "@"), /* alias */
784   ARGPARSE_s_n (oNotDashEscaped, "not-dash-escaped", "@"),
785   ARGPARSE_s_n (oEscapeFrom,      "escape-from-lines", "@"),
786   ARGPARSE_s_n (oNoEscapeFrom, "no-escape-from-lines", "@"),
787   ARGPARSE_s_n (oLockOnce,     "lock-once", "@"),
788   ARGPARSE_s_n (oLockMultiple, "lock-multiple", "@"),
789   ARGPARSE_s_n (oLockNever,    "lock-never", "@"),
790   ARGPARSE_s_i (oLoggerFD,   "logger-fd", "@"),
791   ARGPARSE_s_s (oLoggerFile, "log-file", "@"),
792   ARGPARSE_s_s (oLoggerFile, "logger-file", "@"),  /* 1.4 compatibility.  */
793   ARGPARSE_s_n (oUseEmbeddedFilename,      "use-embedded-filename", "@"),
794   ARGPARSE_s_n (oNoUseEmbeddedFilename, "no-use-embedded-filename", "@"),
795   ARGPARSE_s_n (oUtf8Strings,      "utf8-strings", "@"),
796   ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
797   ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
798   ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprint", "@"),
799   ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprints", "@"),
800   ARGPARSE_s_n (oWithICAOSpelling, "with-icao-spelling", "@"),
801   ARGPARSE_s_n (oWithKeygrip,     "with-keygrip", "@"),
802   ARGPARSE_s_n (oWithKeyScreening,"with-key-screening", "@"),
803   ARGPARSE_s_n (oWithSecret,      "with-secret", "@"),
804   ARGPARSE_s_n (oWithWKDHash,     "with-wkd-hash", "@"),
805   ARGPARSE_s_n (oWithKeyOrigin,   "with-key-origin", "@"),
806   ARGPARSE_s_s (oDisableCipherAlgo,  "disable-cipher-algo", "@"),
807   ARGPARSE_s_s (oDisablePubkeyAlgo,  "disable-pubkey-algo", "@"),
808   ARGPARSE_s_n (oAllowNonSelfsignedUID,      "allow-non-selfsigned-uid", "@"),
809   ARGPARSE_s_n (oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", "@"),
810   ARGPARSE_s_n (oAllowFreeformUID,      "allow-freeform-uid", "@"),
811   ARGPARSE_s_n (oNoAllowFreeformUID, "no-allow-freeform-uid", "@"),
812   ARGPARSE_s_n (oNoLiteral, "no-literal", "@"),
813   ARGPARSE_p_u (oSetFilesize, "set-filesize", "@"),
814   ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
815   ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
816   ARGPARSE_s_n (oLegacyListMode, "legacy-list-mode", "@"),
817   ARGPARSE_s_n (oListOnly, "list-only", "@"),
818   ARGPARSE_s_n (oPrintPKARecords, "print-pka-records", "@"),
819   ARGPARSE_s_n (oPrintDANERecords, "print-dane-records", "@"),
820   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
821   ARGPARSE_s_n (oIgnoreValidFrom,    "ignore-valid-from", "@"),
822   ARGPARSE_s_n (oIgnoreCrcError, "ignore-crc-error", "@"),
823   ARGPARSE_s_n (oIgnoreMDCError, "ignore-mdc-error", "@"),
824   ARGPARSE_s_n (oShowSessionKey, "show-session-key", "@"),
825   ARGPARSE_s_s (oOverrideSessionKey, "override-session-key", "@"),
826   ARGPARSE_s_i (oOverrideSessionKeyFD, "override-session-key-fd", "@"),
827   ARGPARSE_s_n (oNoRandomSeedFile,  "no-random-seed-file", "@"),
828   ARGPARSE_s_n (oAutoKeyRetrieve, "auto-key-retrieve", "@"),
829   ARGPARSE_s_n (oNoAutoKeyRetrieve, "no-auto-key-retrieve", "@"),
830   ARGPARSE_s_n (oNoSigCache,         "no-sig-cache", "@"),
831   ARGPARSE_s_n (oMergeOnly,       "merge-only", "@" ),
832   ARGPARSE_s_n (oAllowSecretKeyImport, "allow-secret-key-import", "@"),
833   ARGPARSE_s_n (oTryAllSecrets,  "try-all-secrets", "@"),
834   ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
835   ARGPARSE_s_n (oNoExpensiveTrustChecks, "no-expensive-trust-checks", "@"),
836   ARGPARSE_s_n (oPreservePermissions, "preserve-permissions", "@"),
837   ARGPARSE_s_s (oDefaultPreferenceList,  "default-preference-list", "@"),
838   ARGPARSE_s_s (oDefaultKeyserverURL,  "default-keyserver-url", "@"),
839   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-preferences","@"),
840   ARGPARSE_s_s (oPersonalAEADPreferences, "personal-aead-preferences","@"),
841   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
842   ARGPARSE_s_s (oPersonalCompressPreferences,
843                                          "personal-compress-preferences", "@"),
844   ARGPARSE_s_s (oFakedSystemTime, "faked-system-time", "@"),
845   ARGPARSE_s_s (oWeakDigest, "weak-digest","@"),
846   ARGPARSE_s_n (oUnwrap, "unwrap", "@"),
847   ARGPARSE_s_n (oOnlySignTextIDs, "only-sign-text-ids", "@"),
848
849   /* Aliases.  I constantly mistype these, and assume other people do
850      as well. */
851   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-prefs", "@"),
852   ARGPARSE_s_s (oPersonalAEADPreferences,   "personal-aead-prefs", "@"),
853   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-prefs", "@"),
854   ARGPARSE_s_s (oPersonalCompressPreferences, "personal-compress-prefs", "@"),
855
856   ARGPARSE_s_s (oAgentProgram, "agent-program", "@"),
857   ARGPARSE_s_s (oDirmngrProgram, "dirmngr-program", "@"),
858   ARGPARSE_s_n (oDisableDirmngr, "disable-dirmngr", "@"),
859   ARGPARSE_s_s (oDisplay,    "display",    "@"),
860   ARGPARSE_s_s (oTTYname,    "ttyname",    "@"),
861   ARGPARSE_s_s (oTTYtype,    "ttytype",    "@"),
862   ARGPARSE_s_s (oLCctype,    "lc-ctype",   "@"),
863   ARGPARSE_s_s (oLCmessages, "lc-messages","@"),
864   ARGPARSE_s_s (oXauthority, "xauthority", "@"),
865   ARGPARSE_s_s (oGroup,      "group",      "@"),
866   ARGPARSE_s_s (oUnGroup,    "ungroup",    "@"),
867   ARGPARSE_s_n (oNoGroups,   "no-groups",  "@"),
868   ARGPARSE_s_n (oStrict,     "strict",     "@"),
869   ARGPARSE_s_n (oNoStrict,   "no-strict",  "@"),
870   ARGPARSE_s_n (oMangleDosFilenames,      "mangle-dos-filenames", "@"),
871   ARGPARSE_s_n (oNoMangleDosFilenames, "no-mangle-dos-filenames", "@"),
872   ARGPARSE_s_n (oEnableProgressFilter, "enable-progress-filter", "@"),
873   ARGPARSE_s_n (oMultifile, "multifile", "@"),
874   ARGPARSE_s_s (oKeyidFormat, "keyid-format", "@"),
875   ARGPARSE_s_n (oExitOnStatusWriteError, "exit-on-status-write-error", "@"),
876   ARGPARSE_s_i (oLimitCardInsertTries, "limit-card-insert-tries", "@"),
877
878   ARGPARSE_s_n (oAllowMultisigVerification,
879                 "allow-multisig-verification", "@"),
880   ARGPARSE_s_n (oEnableLargeRSA, "enable-large-rsa", "@"),
881   ARGPARSE_s_n (oDisableLargeRSA, "disable-large-rsa", "@"),
882   ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
883   ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
884   ARGPARSE_s_n (oAllowMultipleMessages,      "allow-multiple-messages", "@"),
885   ARGPARSE_s_n (oNoAllowMultipleMessages, "no-allow-multiple-messages", "@"),
886   ARGPARSE_s_n (oAllowWeakDigestAlgos, "allow-weak-digest-algos", "@"),
887
888   ARGPARSE_s_s (oDefaultNewKeyAlgo, "default-new-key-algo", "@"),
889
890   /* These two are aliases to help users of the PGP command line
891      product use gpg with minimal pain.  Many commands are common
892      already as they seem to have borrowed commands from us.  Now I'm
893      returning the favor. */
894   ARGPARSE_s_s (oLocalUser, "sign-with", "@"),
895   ARGPARSE_s_s (oRecipient, "user", "@"),
896
897   ARGPARSE_s_n (oRequireCrossCert, "require-backsigs", "@"),
898   ARGPARSE_s_n (oRequireCrossCert, "require-cross-certification", "@"),
899   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-backsigs", "@"),
900   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-cross-certification", "@"),
901
902   /* New options.  Fixme: Should go more to the top.  */
903   ARGPARSE_s_s (oAutoKeyLocate, "auto-key-locate", "@"),
904   ARGPARSE_s_n (oNoAutoKeyLocate, "no-auto-key-locate", "@"),
905   ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
906   ARGPARSE_s_n (oNoSymkeyCache, "no-symkey-cache", "@"),
907
908   /* Dummy options with warnings.  */
909   ARGPARSE_s_n (oUseAgent,      "use-agent", "@"),
910   ARGPARSE_s_n (oNoUseAgent, "no-use-agent", "@"),
911   ARGPARSE_s_s (oGpgAgentInfo, "gpg-agent-info", "@"),
912   ARGPARSE_s_s (oReaderPort, "reader-port", "@"),
913   ARGPARSE_s_s (octapiDriver, "ctapi-driver", "@"),
914   ARGPARSE_s_s (opcscDriver, "pcsc-driver", "@"),
915   ARGPARSE_s_n (oDisableCCID, "disable-ccid", "@"),
916   ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
917   ARGPARSE_s_s (oTOFUDBFormat, "tofu-db-format", "@"),
918
919   /* Dummy options.  */
920   ARGPARSE_s_n (oNoop, "sk-comments", "@"),
921   ARGPARSE_s_n (oNoop, "no-sk-comments", "@"),
922   ARGPARSE_s_n (oNoop, "compress-keys", "@"),
923   ARGPARSE_s_n (oNoop, "compress-sigs", "@"),
924   ARGPARSE_s_n (oNoop, "force-v3-sigs", "@"),
925   ARGPARSE_s_n (oNoop, "no-force-v3-sigs", "@"),
926   ARGPARSE_s_n (oNoop, "force-v4-certs", "@"),
927   ARGPARSE_s_n (oNoop, "no-force-v4-certs", "@"),
928
929   ARGPARSE_end ()
930 };
931
932
933 /* The list of supported debug flags.  */
934 static struct debug_flags_s debug_flags [] =
935   {
936     { DBG_PACKET_VALUE , "packet"  },
937     { DBG_MPI_VALUE    , "mpi"     },
938     { DBG_CRYPTO_VALUE , "crypto"  },
939     { DBG_FILTER_VALUE , "filter"  },
940     { DBG_IOBUF_VALUE  , "iobuf"   },
941     { DBG_MEMORY_VALUE , "memory"  },
942     { DBG_CACHE_VALUE  , "cache"   },
943     { DBG_MEMSTAT_VALUE, "memstat" },
944     { DBG_TRUST_VALUE  , "trust"   },
945     { DBG_HASHING_VALUE, "hashing" },
946     { DBG_IPC_VALUE    , "ipc"     },
947     { DBG_CLOCK_VALUE  , "clock"   },
948     { DBG_LOOKUP_VALUE , "lookup"  },
949     { DBG_EXTPROG_VALUE, "extprog" },
950     { 0, NULL }
951   };
952
953
954 #ifdef ENABLE_SELINUX_HACKS
955 #define ALWAYS_ADD_KEYRINGS 1
956 #else
957 #define ALWAYS_ADD_KEYRINGS 0
958 #endif
959
960
961 int g10_errors_seen = 0;
962
963 static int utf8_strings = 0;
964 static int maybe_setuid = 1;
965 static unsigned int opt_set_iobuf_size;
966 static unsigned int opt_set_iobuf_size_used;
967
968 static char *build_list( const char *text, char letter,
969                          const char *(*mapf)(int), int (*chkf)(int) );
970 static void set_cmd( enum cmd_and_opt_values *ret_cmd,
971                         enum cmd_and_opt_values new_cmd );
972 static void print_mds( const char *fname, int algo );
973 static void add_notation_data( const char *string, int which );
974 static void add_policy_url( const char *string, int which );
975 static void add_keyserver_url( const char *string, int which );
976 static void emergency_cleanup (void);
977 static void read_sessionkey_from_fd (int fd);
978
979
980 static char *
981 make_libversion (const char *libname, const char *(*getfnc)(const char*))
982 {
983   const char *s;
984   char *result;
985
986   if (maybe_setuid)
987     {
988       gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
989       maybe_setuid = 0;
990     }
991   s = getfnc (NULL);
992   result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
993   strcpy (stpcpy (stpcpy (result, libname), " "), s);
994   return result;
995 }
996
997
998 static int
999 build_list_pk_test_algo (int algo)
1000 {
1001   /* Show only one "RSA" string.  If RSA_E or RSA_S is available RSA
1002      is also available.  */
1003   if (algo == PUBKEY_ALGO_RSA_E
1004       || algo == PUBKEY_ALGO_RSA_S)
1005     return GPG_ERR_DIGEST_ALGO;
1006
1007   return openpgp_pk_test_algo (algo);
1008 }
1009
1010 static const char *
1011 build_list_pk_algo_name (int algo)
1012 {
1013   return openpgp_pk_algo_name (algo);
1014 }
1015
1016 static int
1017 build_list_cipher_test_algo (int algo)
1018 {
1019   return openpgp_cipher_test_algo (algo);
1020 }
1021
1022 static const char *
1023 build_list_cipher_algo_name (int algo)
1024 {
1025   return openpgp_cipher_algo_name (algo);
1026 }
1027
1028 static int
1029 build_list_aead_test_algo (int algo)
1030 {
1031   return openpgp_aead_test_algo (algo);
1032 }
1033
1034 static const char *
1035 build_list_aead_algo_name (int algo)
1036 {
1037   return openpgp_aead_algo_name (algo);
1038 }
1039
1040 static int
1041 build_list_md_test_algo (int algo)
1042 {
1043   /* By default we do not accept MD5 based signatures.  To avoid
1044      confusion we do not announce support for it either.  */
1045   if (algo == DIGEST_ALGO_MD5)
1046     return GPG_ERR_DIGEST_ALGO;
1047
1048   return openpgp_md_test_algo (algo);
1049 }
1050
1051 static const char *
1052 build_list_md_algo_name (int algo)
1053 {
1054   return openpgp_md_algo_name (algo);
1055 }
1056
1057
1058 static const char *
1059 my_strusage( int level )
1060 {
1061   static char *digests, *pubkeys, *ciphers, *zips, *aeads, *ver_gcry;
1062   const char *p;
1063
1064     switch( level ) {
1065       case 11: p = "@GPG@ (@GNUPG@)";
1066         break;
1067       case 13: p = VERSION; break;
1068       case 17: p = PRINTABLE_OS_NAME; break;
1069       case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
1070
1071     case 20:
1072       if (!ver_gcry)
1073         ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
1074       p = ver_gcry;
1075       break;
1076
1077 #ifdef IS_DEVELOPMENT_VERSION
1078       case 25:
1079         p="NOTE: THIS IS A DEVELOPMENT VERSION!";
1080         break;
1081       case 26:
1082         p="It is only intended for test purposes and should NOT be";
1083         break;
1084       case 27:
1085         p="used in a production environment or with production keys!";
1086         break;
1087 #endif
1088
1089       case 1:
1090       case 40:  p =
1091             _("Usage: @GPG@ [options] [files] (-h for help)");
1092         break;
1093       case 41:  p =
1094             _("Syntax: @GPG@ [options] [files]\n"
1095               "Sign, check, encrypt or decrypt\n"
1096               "Default operation depends on the input data\n");
1097         break;
1098
1099       case 31: p = "\nHome: "; break;
1100 #ifndef __riscos__
1101       case 32: p = gnupg_homedir (); break;
1102 #else /* __riscos__ */
1103       case 32: p = make_filename(gnupg_homedir (), NULL); break;
1104 #endif /* __riscos__ */
1105       case 33: p = _("\nSupported algorithms:\n"); break;
1106       case 34:
1107         if (!pubkeys)
1108             pubkeys = build_list (_("Pubkey: "), 1,
1109                                   build_list_pk_algo_name,
1110                                   build_list_pk_test_algo );
1111         p = pubkeys;
1112         break;
1113       case 35:
1114         if( !ciphers )
1115             ciphers = build_list(_("Cipher: "), 'S',
1116                                  build_list_cipher_algo_name,
1117                                  build_list_cipher_test_algo );
1118         p = ciphers;
1119         break;
1120       case 36:
1121         if (!aeads)
1122           aeads = build_list ("AEAD: ", 'A',
1123                               build_list_aead_algo_name,
1124                               build_list_aead_test_algo);
1125         p = aeads;
1126         break;
1127       case 37:
1128         if( !digests )
1129             digests = build_list(_("Hash: "), 'H',
1130                                  build_list_md_algo_name,
1131                                  build_list_md_test_algo );
1132         p = digests;
1133         break;
1134       case 38:
1135         if( !zips )
1136             zips = build_list(_("Compression: "),'Z',
1137                               compress_algo_to_string,
1138                               check_compress_algo);
1139         p = zips;
1140         break;
1141
1142       default:  p = NULL;
1143     }
1144     return p;
1145 }
1146
1147
1148 static char *
1149 build_list (const char *text, char letter,
1150             const char * (*mapf)(int), int (*chkf)(int))
1151 {
1152   membuf_t mb;
1153   int indent;
1154   int i, j, len;
1155   int limit;
1156   const char *s;
1157   char *string;
1158
1159   if (maybe_setuid)
1160     gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
1161
1162   indent = utf8_charcount (text, -1);
1163   len = 0;
1164   init_membuf (&mb, 512);
1165
1166   limit = (letter == 'A')? 4 : 110;
1167   for (i=0; i <= limit; i++ )
1168     {
1169       if (!chkf (i) && (s = mapf (i)))
1170         {
1171           if (mb.len - len > 60)
1172             {
1173               put_membuf_str (&mb, ",\n");
1174               len = mb.len;
1175               for (j=0; j < indent; j++)
1176                 put_membuf_str (&mb, " ");
1177             }
1178           else if (mb.len)
1179             put_membuf_str (&mb, ", ");
1180           else
1181             put_membuf_str (&mb, text);
1182
1183           put_membuf_str (&mb, s);
1184           if (opt.verbose && letter)
1185             {
1186               char num[20];
1187               if (letter == 1)
1188                 snprintf (num, sizeof num, " (%d)", i);
1189               else
1190                 snprintf (num, sizeof num, " (%c%d)", letter, i);
1191               put_membuf_str (&mb, num);
1192             }
1193         }
1194     }
1195   if (mb.len)
1196     put_membuf_str (&mb, "\n");
1197   put_membuf (&mb, "", 1);
1198
1199   string = get_membuf (&mb, NULL);
1200   return xrealloc (string, strlen (string)+1);
1201 }
1202
1203
1204 static void
1205 wrong_args( const char *text)
1206 {
1207   es_fprintf (es_stderr, _("usage: %s [options] %s\n"), GPG_NAME, text);
1208   log_inc_errorcount ();
1209   g10_exit(2);
1210 }
1211
1212
1213 static char *
1214 make_username( const char *string )
1215 {
1216     char *p;
1217     if( utf8_strings )
1218         p = xstrdup(string);
1219     else
1220         p = native_to_utf8( string );
1221     return p;
1222 }
1223
1224
1225 static void
1226 set_opt_session_env (const char *name, const char *value)
1227 {
1228   gpg_error_t err;
1229
1230   err = session_env_setenv (opt.session_env, name, value);
1231   if (err)
1232     log_fatal ("error setting session environment: %s\n",
1233                gpg_strerror (err));
1234 }
1235
1236
1237 /* Setup the debugging.  With a LEVEL of NULL only the active debug
1238    flags are propagated to the subsystems.  With LEVEL set, a specific
1239    set of debug flags is set; thus overriding all flags already
1240    set. */
1241 static void
1242 set_debug (const char *level)
1243 {
1244   int numok = (level && digitp (level));
1245   int numlvl = numok? atoi (level) : 0;
1246
1247   if (!level)
1248     ;
1249   else if (!strcmp (level, "none") || (numok && numlvl < 1))
1250     opt.debug = 0;
1251   else if (!strcmp (level, "basic") || (numok && numlvl <= 2))
1252     opt.debug = DBG_MEMSTAT_VALUE;
1253   else if (!strcmp (level, "advanced") || (numok && numlvl <= 5))
1254     opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE;
1255   else if (!strcmp (level, "expert")  || (numok && numlvl <= 8))
1256     opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE
1257                  |DBG_CACHE_VALUE|DBG_LOOKUP|DBG_FILTER_VALUE|DBG_PACKET_VALUE);
1258   else if (!strcmp (level, "guru") || numok)
1259     {
1260       opt.debug = ~0;
1261       /* Unless the "guru" string has been used we don't want to allow
1262          hashing debugging.  The rationale is that people tend to
1263          select the highest debug value and would then clutter their
1264          disk with debug files which may reveal confidential data.  */
1265       if (numok)
1266         opt.debug &= ~(DBG_HASHING_VALUE);
1267     }
1268   else
1269     {
1270       log_error (_("invalid debug-level '%s' given\n"), level);
1271       g10_exit (2);
1272     }
1273
1274   if ((opt.debug & DBG_MEMORY_VALUE))
1275     memory_debug_mode = 1;
1276   if ((opt.debug & DBG_MEMSTAT_VALUE))
1277     memory_stat_debug_mode = 1;
1278   if (DBG_MPI)
1279     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2);
1280   if (DBG_CRYPTO)
1281     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
1282   if ((opt.debug & DBG_IOBUF_VALUE))
1283     iobuf_debug_mode = 1;
1284   gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
1285
1286   if (opt.debug)
1287     parse_debug_flag (NULL, &opt.debug, debug_flags);
1288
1289   if (opt_set_iobuf_size || opt_set_iobuf_size_used)
1290     log_debug ("iobuf buffer size is %uk\n",
1291                iobuf_set_buffer_size (opt_set_iobuf_size));
1292 }
1293
1294
1295 /* We set the screen dimensions for UI purposes.  Do not allow screens
1296    smaller than 80x24 for the sake of simplicity. */
1297 static void
1298 set_screen_dimensions(void)
1299 {
1300 #ifndef HAVE_W32_SYSTEM
1301   char *str;
1302
1303   str=getenv("COLUMNS");
1304   if(str)
1305     opt.screen_columns=atoi(str);
1306
1307   str=getenv("LINES");
1308   if(str)
1309     opt.screen_lines=atoi(str);
1310 #endif
1311
1312   if(opt.screen_columns<80 || opt.screen_columns>255)
1313     opt.screen_columns=80;
1314
1315   if(opt.screen_lines<24 || opt.screen_lines>255)
1316     opt.screen_lines=24;
1317 }
1318
1319
1320 /* Helper to open a file FNAME either for reading or writing to be
1321    used with --status-file etc functions.  Not generally useful but it
1322    avoids the riscos specific functions and well some Windows people
1323    might like it too.  Prints an error message and returns -1 on
1324    error.  On success the file descriptor is returned.  */
1325 static int
1326 open_info_file (const char *fname, int for_write, int binary)
1327 {
1328 #ifdef __riscos__
1329   return riscos_fdopenfile (fname, for_write);
1330 #elif defined (ENABLE_SELINUX_HACKS)
1331   /* We can't allow these even when testing for a secured filename
1332      because files to be secured might not yet been secured.  This is
1333      similar to the option file but in that case it is unlikely that
1334      sensitive information may be retrieved by means of error
1335      messages.  */
1336   (void)fname;
1337   (void)for_write;
1338   (void)binary;
1339   return -1;
1340 #else
1341   int fd;
1342
1343   if (binary)
1344     binary = MY_O_BINARY;
1345
1346 /*   if (is_secured_filename (fname)) */
1347 /*     { */
1348 /*       fd = -1; */
1349 /*       gpg_err_set_errno (EPERM); */
1350 /*     } */
1351 /*   else */
1352 /*     { */
1353       do
1354         {
1355           if (for_write)
1356             fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY | binary,
1357                         S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
1358           else
1359             fd = open (fname, O_RDONLY | binary);
1360         }
1361       while (fd == -1 && errno == EINTR);
1362 /*     } */
1363   if ( fd == -1)
1364     log_error ( for_write? _("can't create '%s': %s\n")
1365                          : _("can't open '%s': %s\n"), fname, strerror(errno));
1366
1367   return fd;
1368 #endif
1369 }
1370
1371 static void
1372 set_cmd( enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd )
1373 {
1374     enum cmd_and_opt_values cmd = *ret_cmd;
1375
1376     if( !cmd || cmd == new_cmd )
1377         cmd = new_cmd;
1378     else if( cmd == aSign && new_cmd == aEncr )
1379         cmd = aSignEncr;
1380     else if( cmd == aEncr && new_cmd == aSign )
1381         cmd = aSignEncr;
1382     else if( cmd == aSign && new_cmd == aSym )
1383         cmd = aSignSym;
1384     else if( cmd == aSym && new_cmd == aSign )
1385         cmd = aSignSym;
1386     else if( cmd == aSym && new_cmd == aEncr )
1387         cmd = aEncrSym;
1388     else if( cmd == aEncr && new_cmd == aSym )
1389         cmd = aEncrSym;
1390     else if (cmd == aSignEncr && new_cmd == aSym)
1391         cmd = aSignEncrSym;
1392     else if (cmd == aSignSym && new_cmd == aEncr)
1393         cmd = aSignEncrSym;
1394     else if (cmd == aEncrSym && new_cmd == aSign)
1395         cmd = aSignEncrSym;
1396     else if(    ( cmd == aSign     && new_cmd == aClearsign )
1397              || ( cmd == aClearsign && new_cmd == aSign )  )
1398         cmd = aClearsign;
1399     else {
1400         log_error(_("conflicting commands\n"));
1401         g10_exit(2);
1402     }
1403
1404     *ret_cmd = cmd;
1405 }
1406
1407
1408 static void
1409 add_group(char *string)
1410 {
1411   char *name,*value;
1412   struct groupitem *item;
1413
1414   /* Break off the group name */
1415   name=strsep(&string,"=");
1416   if(string==NULL)
1417     {
1418       log_error(_("no = sign found in group definition '%s'\n"),name);
1419       return;
1420     }
1421
1422   trim_trailing_ws(name,strlen(name));
1423
1424   /* Does this group already exist? */
1425   for(item=opt.grouplist;item;item=item->next)
1426     if(strcasecmp(item->name,name)==0)
1427       break;
1428
1429   if(!item)
1430     {
1431       item=xmalloc(sizeof(struct groupitem));
1432       item->name=name;
1433       item->next=opt.grouplist;
1434       item->values=NULL;
1435       opt.grouplist=item;
1436     }
1437
1438   /* Break apart the values */
1439   while ((value= strsep(&string," \t")))
1440     {
1441       if (*value)
1442         add_to_strlist2(&item->values,value,utf8_strings);
1443     }
1444 }
1445
1446
1447 static void
1448 rm_group(char *name)
1449 {
1450   struct groupitem *item,*last=NULL;
1451
1452   trim_trailing_ws(name,strlen(name));
1453
1454   for(item=opt.grouplist;item;last=item,item=item->next)
1455     {
1456       if(strcasecmp(item->name,name)==0)
1457         {
1458           if(last)
1459             last->next=item->next;
1460           else
1461             opt.grouplist=item->next;
1462
1463           free_strlist(item->values);
1464           xfree(item);
1465           break;
1466         }
1467     }
1468 }
1469
1470
1471 /* We need to check three things.
1472
1473    0) The homedir.  It must be x00, a directory, and owned by the
1474    user.
1475
1476    1) The options/gpg.conf file.  Okay unless it or its containing
1477    directory is group or other writable or not owned by us.  Disable
1478    exec in this case.
1479
1480    2) Extensions.  Same as #1.
1481
1482    Returns true if the item is unsafe. */
1483 static int
1484 check_permissions (const char *path, int item)
1485 {
1486 #if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
1487   static int homedir_cache=-1;
1488   char *tmppath,*dir;
1489   struct stat statbuf,dirbuf;
1490   int homedir=0,ret=0,checkonly=0;
1491   int perm=0,own=0,enc_dir_perm=0,enc_dir_own=0;
1492
1493   if(opt.no_perm_warn)
1494     return 0;
1495
1496   log_assert(item==0 || item==1 || item==2);
1497
1498   /* extensions may attach a path */
1499   if(item==2 && path[0]!=DIRSEP_C)
1500     {
1501       if(strchr(path,DIRSEP_C))
1502         tmppath=make_filename(path,NULL);
1503       else
1504         tmppath=make_filename(gnupg_libdir (),path,NULL);
1505     }
1506   else
1507     tmppath=xstrdup(path);
1508
1509   /* If the item is located in the homedir, but isn't the homedir,
1510      don't continue if we already checked the homedir itself.  This is
1511      to avoid user confusion with an extra options file warning which
1512      could be rectified if the homedir itself had proper
1513      permissions. */
1514   if(item!=0 && homedir_cache>-1
1515      && !ascii_strncasecmp (gnupg_homedir (), tmppath,
1516                             strlen (gnupg_homedir ())))
1517     {
1518       ret=homedir_cache;
1519       goto end;
1520     }
1521
1522   /* It's okay if the file or directory doesn't exist */
1523   if(stat(tmppath,&statbuf)!=0)
1524     {
1525       ret=0;
1526       goto end;
1527     }
1528
1529   /* Now check the enclosing directory.  Theoretically, we could walk
1530      this test up to the root directory /, but for the sake of sanity,
1531      I'm stopping at one level down. */
1532   dir=make_dirname(tmppath);
1533
1534   if(stat(dir,&dirbuf)!=0 || !S_ISDIR(dirbuf.st_mode))
1535     {
1536       /* Weird error */
1537       ret=1;
1538       goto end;
1539     }
1540
1541   xfree(dir);
1542
1543   /* Assume failure */
1544   ret=1;
1545
1546   if(item==0)
1547     {
1548       /* The homedir must be x00, a directory, and owned by the user. */
1549
1550       if(S_ISDIR(statbuf.st_mode))
1551         {
1552           if(statbuf.st_uid==getuid())
1553             {
1554               if((statbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
1555                 ret=0;
1556               else
1557                 perm=1;
1558             }
1559           else
1560             own=1;
1561
1562           homedir_cache=ret;
1563         }
1564     }
1565   else if(item==1 || item==2)
1566     {
1567       /* The options or extension file.  Okay unless it or its
1568          containing directory is group or other writable or not owned
1569          by us or root. */
1570
1571       if(S_ISREG(statbuf.st_mode))
1572         {
1573           if(statbuf.st_uid==getuid() || statbuf.st_uid==0)
1574             {
1575               if((statbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
1576                 {
1577                   /* it's not writable, so make sure the enclosing
1578                      directory is also not writable */
1579                   if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
1580                     {
1581                       if((dirbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
1582                         ret=0;
1583                       else
1584                         enc_dir_perm=1;
1585                     }
1586                   else
1587                     enc_dir_own=1;
1588                 }
1589               else
1590                 {
1591                   /* it's writable, so the enclosing directory had
1592                      better not let people get to it. */
1593                   if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
1594                     {
1595                       if((dirbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
1596                         ret=0;
1597                       else
1598                         perm=enc_dir_perm=1; /* unclear which one to fix! */
1599                     }
1600                   else
1601                     enc_dir_own=1;
1602                 }
1603             }
1604           else
1605             own=1;
1606         }
1607     }
1608   else
1609     BUG();
1610
1611   if(!checkonly)
1612     {
1613       if(own)
1614         {
1615           if(item==0)
1616             log_info(_("WARNING: unsafe ownership on"
1617                        " homedir '%s'\n"),tmppath);
1618           else if(item==1)
1619             log_info(_("WARNING: unsafe ownership on"
1620                        " configuration file '%s'\n"),tmppath);
1621           else
1622             log_info(_("WARNING: unsafe ownership on"
1623                        " extension '%s'\n"),tmppath);
1624         }
1625       if(perm)
1626         {
1627           if(item==0)
1628             log_info(_("WARNING: unsafe permissions on"
1629                        " homedir '%s'\n"),tmppath);
1630           else if(item==1)
1631             log_info(_("WARNING: unsafe permissions on"
1632                        " configuration file '%s'\n"),tmppath);
1633           else
1634             log_info(_("WARNING: unsafe permissions on"
1635                        " extension '%s'\n"),tmppath);
1636         }
1637       if(enc_dir_own)
1638         {
1639           if(item==0)
1640             log_info(_("WARNING: unsafe enclosing directory ownership on"
1641                        " homedir '%s'\n"),tmppath);
1642           else if(item==1)
1643             log_info(_("WARNING: unsafe enclosing directory ownership on"
1644                        " configuration file '%s'\n"),tmppath);
1645           else
1646             log_info(_("WARNING: unsafe enclosing directory ownership on"
1647                        " extension '%s'\n"),tmppath);
1648         }
1649       if(enc_dir_perm)
1650         {
1651           if(item==0)
1652             log_info(_("WARNING: unsafe enclosing directory permissions on"
1653                        " homedir '%s'\n"),tmppath);
1654           else if(item==1)
1655             log_info(_("WARNING: unsafe enclosing directory permissions on"
1656                        " configuration file '%s'\n"),tmppath);
1657           else
1658             log_info(_("WARNING: unsafe enclosing directory permissions on"
1659                        " extension '%s'\n"),tmppath);
1660         }
1661     }
1662
1663  end:
1664   xfree(tmppath);
1665
1666   if(homedir)
1667     homedir_cache=ret;
1668
1669   return ret;
1670
1671 #else /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
1672   (void)path;
1673   (void)item;
1674   return 0;
1675 #endif /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
1676 }
1677
1678
1679 /* Print the OpenPGP defined algo numbers.  */
1680 static void
1681 print_algo_numbers(int (*checker)(int))
1682 {
1683   int i,first=1;
1684
1685   for(i=0;i<=110;i++)
1686     {
1687       if(!checker(i))
1688         {
1689           if(first)
1690             first=0;
1691           else
1692             es_printf (";");
1693           es_printf ("%d",i);
1694         }
1695     }
1696 }
1697
1698
1699 static void
1700 print_algo_names(int (*checker)(int),const char *(*mapper)(int))
1701 {
1702   int i,first=1;
1703
1704   for(i=0;i<=110;i++)
1705     {
1706       if(!checker(i))
1707         {
1708           if(first)
1709             first=0;
1710           else
1711             es_printf (";");
1712           es_printf ("%s",mapper(i));
1713         }
1714     }
1715 }
1716
1717 /* In the future, we can do all sorts of interesting configuration
1718    output here.  For now, just give "group" as the Enigmail folks need
1719    it, and pubkey, cipher, hash, and compress as they may be useful
1720    for frontends. */
1721 static void
1722 list_config(char *items)
1723 {
1724   int show_all = !items;
1725   char *name = NULL;
1726   const char *s;
1727   struct groupitem *giter;
1728   int first, iter;
1729
1730   if(!opt.with_colons)
1731     return;
1732
1733   while(show_all || (name=strsep(&items," ")))
1734     {
1735       int any=0;
1736
1737       if(show_all || ascii_strcasecmp(name,"group")==0)
1738         {
1739           for (giter = opt.grouplist; giter; giter = giter->next)
1740             {
1741               strlist_t sl;
1742
1743               es_fprintf (es_stdout, "cfg:group:");
1744               es_write_sanitized (es_stdout, giter->name, strlen(giter->name),
1745                                   ":", NULL);
1746               es_putc (':', es_stdout);
1747
1748               for(sl=giter->values; sl; sl=sl->next)
1749                 {
1750                   es_write_sanitized (es_stdout, sl->d, strlen (sl->d),
1751                                       ":;", NULL);
1752                   if(sl->next)
1753                     es_printf(";");
1754                 }
1755
1756               es_printf("\n");
1757             }
1758
1759           any=1;
1760         }
1761
1762       if(show_all || ascii_strcasecmp(name,"version")==0)
1763         {
1764           es_printf("cfg:version:");
1765           es_write_sanitized (es_stdout, VERSION, strlen(VERSION), ":", NULL);
1766           es_printf ("\n");
1767           any=1;
1768         }
1769
1770       if(show_all || ascii_strcasecmp(name,"pubkey")==0)
1771         {
1772           es_printf ("cfg:pubkey:");
1773           print_algo_numbers (build_list_pk_test_algo);
1774           es_printf ("\n");
1775           any=1;
1776         }
1777
1778       if(show_all || ascii_strcasecmp(name,"pubkeyname")==0)
1779         {
1780           es_printf ("cfg:pubkeyname:");
1781           print_algo_names (build_list_pk_test_algo,
1782                             build_list_pk_algo_name);
1783           es_printf ("\n");
1784           any=1;
1785         }
1786
1787       if(show_all || ascii_strcasecmp(name,"cipher")==0)
1788         {
1789           es_printf ("cfg:cipher:");
1790           print_algo_numbers (build_list_cipher_test_algo);
1791           es_printf ("\n");
1792           any=1;
1793         }
1794
1795       if (show_all || !ascii_strcasecmp (name,"ciphername"))
1796         {
1797           es_printf ("cfg:ciphername:");
1798           print_algo_names (build_list_cipher_test_algo,
1799                             build_list_cipher_algo_name);
1800           es_printf ("\n");
1801           any = 1;
1802         }
1803
1804       if(show_all
1805          || ascii_strcasecmp(name,"digest")==0
1806          || ascii_strcasecmp(name,"hash")==0)
1807         {
1808           es_printf ("cfg:digest:");
1809           print_algo_numbers (build_list_md_test_algo);
1810           es_printf ("\n");
1811           any=1;
1812         }
1813
1814       if (show_all
1815           || !ascii_strcasecmp(name,"digestname")
1816           || !ascii_strcasecmp(name,"hashname"))
1817         {
1818           es_printf ("cfg:digestname:");
1819           print_algo_names (build_list_md_test_algo,
1820                             build_list_md_algo_name);
1821           es_printf ("\n");
1822           any=1;
1823         }
1824
1825       if(show_all || ascii_strcasecmp(name,"compress")==0)
1826         {
1827           es_printf ("cfg:compress:");
1828           print_algo_numbers(check_compress_algo);
1829           es_printf ("\n");
1830           any=1;
1831         }
1832
1833       if(show_all || ascii_strcasecmp (name, "compressname") == 0)
1834         {
1835           es_printf ("cfg:compressname:");
1836           print_algo_names (check_compress_algo,
1837                             compress_algo_to_string);
1838           es_printf ("\n");
1839           any=1;
1840         }
1841
1842       if (show_all || !ascii_strcasecmp(name,"ccid-reader-id"))
1843         {
1844           /* We ignore this for GnuPG 1.4 backward compatibility.  */
1845           any=1;
1846         }
1847
1848       if (show_all || !ascii_strcasecmp (name,"curve"))
1849         {
1850           es_printf ("cfg:curve:");
1851           for (iter=0, first=1; (s = openpgp_enum_curves (&iter)); first=0)
1852             es_printf ("%s%s", first?"":";", s);
1853           es_printf ("\n");
1854           any=1;
1855         }
1856
1857       /* Curve OIDs are rarely useful and thus only printed if requested.  */
1858       if (name && !ascii_strcasecmp (name,"curveoid"))
1859         {
1860           es_printf ("cfg:curveoid:");
1861           for (iter=0, first=1; (s = openpgp_enum_curves (&iter)); first = 0)
1862             {
1863               s = openpgp_curve_to_oid (s, NULL);
1864               es_printf ("%s%s", first?"":";", s? s:"[?]");
1865             }
1866           es_printf ("\n");
1867           any=1;
1868         }
1869
1870       if(show_all)
1871         break;
1872
1873       if(!any)
1874         log_error(_("unknown configuration item '%s'\n"),name);
1875     }
1876 }
1877
1878
1879 /* List options and default values in the GPG Conf format.  This is a
1880    new tool distributed with gnupg 1.9.x but we also want some limited
1881    support in older gpg versions.  The output is the name of the
1882    configuration file and a list of options available for editing by
1883    gpgconf.  */
1884 static void
1885 gpgconf_list (const char *configfile)
1886 {
1887   char *configfile_esc = percent_escape (configfile, NULL);
1888
1889   es_printf ("%s-%s.conf:%lu:\"%s\n",
1890              GPGCONF_NAME, GPG_NAME,
1891              GC_OPT_FLAG_DEFAULT,
1892              configfile_esc ? configfile_esc : "/dev/null");
1893   es_printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
1894   es_printf ("quiet:%lu:\n",   GC_OPT_FLAG_NONE);
1895   es_printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
1896   es_printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
1897   es_printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE);
1898   es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
1899   es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE);
1900   es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
1901   es_printf ("auto-key-retrieve:%lu:\n", GC_OPT_FLAG_NONE);
1902   es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
1903   es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
1904   es_printf ("group:%lu:\n", GC_OPT_FLAG_NONE);
1905   es_printf ("compliance:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT, "gnupg");
1906   es_printf ("default-new-key-algo:%lu:\n", GC_OPT_FLAG_NONE);
1907   es_printf ("trust-model:%lu:\n", GC_OPT_FLAG_NONE);
1908   es_printf ("disable-dirmngr:%lu:\n", GC_OPT_FLAG_NONE);
1909   es_printf ("max-cert-depth:%lu:\n", GC_OPT_FLAG_NONE);
1910   es_printf ("completes-needed:%lu:\n", GC_OPT_FLAG_NONE);
1911   es_printf ("marginals-needed:%lu:\n", GC_OPT_FLAG_NONE);
1912
1913   /* The next one is an info only item and should match the macros at
1914      the top of keygen.c  */
1915   es_printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
1916              get_default_pubkey_algo ());
1917
1918   xfree (configfile_esc);
1919 }
1920
1921
1922 static int
1923 parse_subpacket_list(char *list)
1924 {
1925   char *tok;
1926   byte subpackets[128],i;
1927   int count=0;
1928
1929   if(!list)
1930     {
1931       /* No arguments means all subpackets */
1932       memset(subpackets+1,1,sizeof(subpackets)-1);
1933       count=127;
1934     }
1935   else
1936     {
1937       memset(subpackets,0,sizeof(subpackets));
1938
1939       /* Merge with earlier copy */
1940       if(opt.show_subpackets)
1941         {
1942           byte *in;
1943
1944           for(in=opt.show_subpackets;*in;in++)
1945             {
1946               if(*in>127 || *in<1)
1947                 BUG();
1948
1949               if(!subpackets[*in])
1950                 count++;
1951               subpackets[*in]=1;
1952             }
1953         }
1954
1955       while((tok=strsep(&list," ,")))
1956         {
1957           if(!*tok)
1958             continue;
1959
1960           i=atoi(tok);
1961           if(i>127 || i<1)
1962             return 0;
1963
1964           if(!subpackets[i])
1965             count++;
1966           subpackets[i]=1;
1967         }
1968     }
1969
1970   xfree(opt.show_subpackets);
1971   opt.show_subpackets=xmalloc(count+1);
1972   opt.show_subpackets[count--]=0;
1973
1974   for(i=1;i<128 && count>=0;i++)
1975     if(subpackets[i])
1976       opt.show_subpackets[count--]=i;
1977
1978   return 1;
1979 }
1980
1981
1982 static int
1983 parse_list_options(char *str)
1984 {
1985   char *subpackets=""; /* something that isn't NULL */
1986   struct parse_options lopts[]=
1987     {
1988       {"show-photos",LIST_SHOW_PHOTOS,NULL,
1989        N_("display photo IDs during key listings")},
1990       {"show-usage",LIST_SHOW_USAGE,NULL,
1991        N_("show key usage information during key listings")},
1992       {"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL,
1993        N_("show policy URLs during signature listings")},
1994       {"show-notations",LIST_SHOW_NOTATIONS,NULL,
1995        N_("show all notations during signature listings")},
1996       {"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1997        N_("show IETF standard notations during signature listings")},
1998       {"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1999        NULL},
2000       {"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL,
2001        N_("show user-supplied notations during signature listings")},
2002       {"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL,
2003        N_("show preferred keyserver URLs during signature listings")},
2004       {"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL,
2005        N_("show user ID validity during key listings")},
2006       {"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL,
2007        N_("show revoked and expired user IDs in key listings")},
2008       {"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL,
2009        N_("show revoked and expired subkeys in key listings")},
2010       {"show-keyring",LIST_SHOW_KEYRING,NULL,
2011        N_("show the keyring name in key listings")},
2012       {"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL,
2013        N_("show expiration dates during signature listings")},
2014       {"show-sig-subpackets",LIST_SHOW_SIG_SUBPACKETS,NULL,
2015        NULL},
2016       {NULL,0,NULL,NULL}
2017     };
2018
2019   /* C99 allows for non-constant initializers, but we'd like to
2020      compile everywhere, so fill in the show-sig-subpackets argument
2021      here.  Note that if the parse_options array changes, we'll have
2022      to change the subscript here. */
2023   lopts[13].value=&subpackets;
2024
2025   if(parse_options(str,&opt.list_options,lopts,1))
2026     {
2027       if(opt.list_options&LIST_SHOW_SIG_SUBPACKETS)
2028         {
2029           /* Unset so users can pass multiple lists in. */
2030           opt.list_options&=~LIST_SHOW_SIG_SUBPACKETS;
2031           if(!parse_subpacket_list(subpackets))
2032             return 0;
2033         }
2034       else if(subpackets==NULL && opt.show_subpackets)
2035         {
2036           /* User did 'no-show-subpackets' */
2037           xfree(opt.show_subpackets);
2038           opt.show_subpackets=NULL;
2039         }
2040
2041       return 1;
2042     }
2043   else
2044     return 0;
2045 }
2046
2047
2048 /* Collapses argc/argv into a single string that must be freed */
2049 static char *
2050 collapse_args(int argc,char *argv[])
2051 {
2052   char *str=NULL;
2053   int i,first=1,len=0;
2054
2055   for(i=0;i<argc;i++)
2056     {
2057       len+=strlen(argv[i])+2;
2058       str=xrealloc(str,len);
2059       if(first)
2060         {
2061           str[0]='\0';
2062           first=0;
2063         }
2064       else
2065         strcat(str," ");
2066
2067       strcat(str,argv[i]);
2068     }
2069
2070   return str;
2071 }
2072
2073
2074 #ifndef NO_TRUST_MODELS
2075 static void
2076 parse_trust_model(const char *model)
2077 {
2078   if(ascii_strcasecmp(model,"pgp")==0)
2079     opt.trust_model=TM_PGP;
2080   else if(ascii_strcasecmp(model,"classic")==0)
2081     opt.trust_model=TM_CLASSIC;
2082   else if(ascii_strcasecmp(model,"always")==0)
2083     opt.trust_model=TM_ALWAYS;
2084   else if(ascii_strcasecmp(model,"direct")==0)
2085     opt.trust_model=TM_DIRECT;
2086 #ifdef USE_TOFU
2087   else if(ascii_strcasecmp(model,"tofu")==0)
2088     opt.trust_model=TM_TOFU;
2089   else if(ascii_strcasecmp(model,"tofu+pgp")==0)
2090     opt.trust_model=TM_TOFU_PGP;
2091 #endif /*USE_TOFU*/
2092   else if(ascii_strcasecmp(model,"auto")==0)
2093     opt.trust_model=TM_AUTO;
2094   else
2095     log_error("unknown trust model '%s'\n",model);
2096 }
2097 #endif /*NO_TRUST_MODELS*/
2098
2099
2100 static int
2101 parse_tofu_policy (const char *policystr)
2102 {
2103 #ifdef USE_TOFU
2104   struct { const char *keyword; int policy; } list[] = {
2105     { "auto",    TOFU_POLICY_AUTO },
2106     { "good",    TOFU_POLICY_GOOD },
2107     { "unknown", TOFU_POLICY_UNKNOWN },
2108     { "bad",     TOFU_POLICY_BAD },
2109     { "ask",     TOFU_POLICY_ASK }
2110   };
2111   int i;
2112
2113   if (!ascii_strcasecmp (policystr, "help"))
2114     {
2115       log_info (_("valid values for option '%s':\n"), "--tofu-policy");
2116       for (i=0; i < DIM (list); i++)
2117         log_info ("  %s\n", list[i].keyword);
2118       g10_exit (1);
2119     }
2120
2121   for (i=0; i < DIM (list); i++)
2122     if (!ascii_strcasecmp (policystr, list[i].keyword))
2123       return list[i].policy;
2124 #endif /*USE_TOFU*/
2125
2126   log_error (_("unknown TOFU policy '%s'\n"), policystr);
2127   if (!opt.quiet)
2128     log_info (_("(use \"help\" to list choices)\n"));
2129   g10_exit (1);
2130 }
2131
2132
2133 static struct gnupg_compliance_option compliance_options[] =
2134   {
2135     { "gnupg",      oGnuPG },
2136     { "openpgp",    oOpenPGP },
2137     { "rfc4880bis", oRFC4880bis },
2138     { "rfc4880",    oRFC4880 },
2139     { "rfc2440",    oRFC2440 },
2140     { "pgp6",       oPGP6 },
2141     { "pgp7",       oPGP7 },
2142     { "pgp8",       oPGP8 },
2143     { "de-vs",      oDE_VS }
2144   };
2145
2146
2147 /* Helper to set compliance related options.  This is a separate
2148  * function so that it can also be used by the --compliance option
2149  * parser.  */
2150 static void
2151 set_compliance_option (enum cmd_and_opt_values option)
2152 {
2153   switch (option)
2154     {
2155     case oRFC4880bis:
2156       opt.flags.rfc4880bis = 1;
2157       /* fall through.  */
2158     case oOpenPGP:
2159     case oRFC4880:
2160       /* This is effectively the same as RFC2440, but with
2161          "--enable-dsa2 --no-rfc2440-text --escape-from-lines
2162          --require-cross-certification". */
2163       opt.compliance = CO_RFC4880;
2164       opt.flags.dsa2 = 1;
2165       opt.flags.require_cross_cert = 1;
2166       opt.rfc2440_text = 0;
2167       opt.allow_non_selfsigned_uid = 1;
2168       opt.allow_freeform_uid = 1;
2169       opt.escape_from = 1;
2170       opt.not_dash_escaped = 0;
2171       opt.def_cipher_algo = 0;
2172       opt.def_aead_algo = 0;
2173       opt.def_digest_algo = 0;
2174       opt.cert_digest_algo = 0;
2175       opt.compress_algo = -1;
2176       opt.s2k_mode = 3; /* iterated+salted */
2177       opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2178       opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2179       break;
2180     case oRFC2440:
2181       opt.compliance = CO_RFC2440;
2182       opt.flags.dsa2 = 0;
2183       opt.rfc2440_text = 1;
2184       opt.allow_non_selfsigned_uid = 1;
2185       opt.allow_freeform_uid = 1;
2186       opt.escape_from = 0;
2187       opt.not_dash_escaped = 0;
2188       opt.def_cipher_algo = 0;
2189       opt.def_aead_algo = 0;
2190       opt.def_digest_algo = 0;
2191       opt.cert_digest_algo = 0;
2192       opt.compress_algo = -1;
2193       opt.s2k_mode = 3; /* iterated+salted */
2194       opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2195       opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2196       break;
2197     case oPGP6:  opt.compliance = CO_PGP6;  break;
2198     case oPGP7:  opt.compliance = CO_PGP7;  break;
2199     case oPGP8:  opt.compliance = CO_PGP8;  break;
2200     case oGnuPG: opt.compliance = CO_GNUPG; break;
2201
2202     case oDE_VS:
2203       set_compliance_option (oOpenPGP);
2204       opt.compliance = CO_DE_VS;
2205       opt.force_mdc = 1;
2206       opt.def_aead_algo = 0;
2207       /* Fixme: Change other options.  */
2208       break;
2209
2210     default:
2211       BUG ();
2212     }
2213 }
2214
2215
2216
2217
2218
2219
2220 /* This function called to initialized a new control object.  It is
2221    assumed that this object has been zeroed out before calling this
2222    function. */
2223 static void
2224 gpg_init_default_ctrl (ctrl_t ctrl)
2225 {
2226   ctrl->magic = SERVER_CONTROL_MAGIC;
2227 }
2228
2229
2230 /* This function is called to deinitialize a control object.  It is
2231    not deallocated. */
2232 static void
2233 gpg_deinit_default_ctrl (ctrl_t ctrl)
2234 {
2235 #ifdef USE_TOFU
2236   tofu_closedbs (ctrl);
2237 #endif
2238   gpg_dirmngr_deinit_session_data (ctrl);
2239
2240   keydb_release (ctrl->cached_getkey_kdb);
2241 }
2242
2243
2244 char *
2245 get_default_configname (void)
2246 {
2247   char *configname = NULL;
2248   char *name = xstrdup (GPG_NAME EXTSEP_S "conf-" SAFE_VERSION);
2249   char *ver = &name[strlen (GPG_NAME EXTSEP_S "conf-")];
2250
2251   do
2252     {
2253       if (configname)
2254         {
2255           char *tok;
2256
2257           xfree (configname);
2258           configname = NULL;
2259
2260           if ((tok = strrchr (ver, SAFE_VERSION_DASH)))
2261             *tok='\0';
2262           else if ((tok = strrchr (ver, SAFE_VERSION_DOT)))
2263             *tok='\0';
2264           else
2265             break;
2266         }
2267
2268       configname = make_filename (gnupg_homedir (), name, NULL);
2269     }
2270   while (access (configname, R_OK));
2271
2272   xfree(name);
2273
2274   if (! configname)
2275     configname = make_filename (gnupg_homedir (),
2276                                 GPG_NAME EXTSEP_S "conf", NULL);
2277   if (! access (configname, R_OK))
2278     {
2279       /* Print a warning when both config files are present.  */
2280       char *p = make_filename (gnupg_homedir (), "options", NULL);
2281       if (! access (p, R_OK))
2282         log_info (_("Note: old default options file '%s' ignored\n"), p);
2283       xfree (p);
2284     }
2285   else
2286     {
2287       /* Use the old default only if it exists.  */
2288       char *p = make_filename (gnupg_homedir (), "options", NULL);
2289       if (!access (p, R_OK))
2290         {
2291           xfree (configname);
2292           configname = p;
2293         }
2294       else
2295         xfree (p);
2296     }
2297
2298   return configname;
2299 }
2300
2301 int
2302 main (int argc, char **argv)
2303 {
2304     ARGPARSE_ARGS pargs;
2305     IOBUF a;
2306     int rc=0;
2307     int orig_argc;
2308     char **orig_argv;
2309     const char *fname;
2310     char *username;
2311     int may_coredump;
2312     strlist_t sl;
2313     strlist_t remusr = NULL;
2314     strlist_t locusr = NULL;
2315     strlist_t nrings = NULL;
2316     armor_filter_context_t *afx = NULL;
2317     int detached_sig = 0;
2318     FILE *configfp = NULL;
2319     char *configname = NULL;
2320     char *save_configname = NULL;
2321     char *default_configname = NULL;
2322     unsigned configlineno;
2323     int parse_debug = 0;
2324     int default_config = 1;
2325     int default_keyring = 1;
2326     int greeting = 0;
2327     int nogreeting = 0;
2328     char *logfile = NULL;
2329     int use_random_seed = 1;
2330     enum cmd_and_opt_values cmd = 0;
2331     const char *debug_level = NULL;
2332 #ifndef NO_TRUST_MODELS
2333     const char *trustdb_name = NULL;
2334 #endif /*!NO_TRUST_MODELS*/
2335     char *def_cipher_string = NULL;
2336     char *def_aead_string = NULL;
2337     char *def_digest_string = NULL;
2338     char *compress_algo_string = NULL;
2339     char *cert_digest_string = NULL;
2340     char *s2k_cipher_string = NULL;
2341     char *s2k_digest_string = NULL;
2342     char *pers_cipher_list = NULL;
2343     char *pers_aead_list = NULL;
2344     char *pers_digest_list = NULL;
2345     char *pers_compress_list = NULL;
2346     int eyes_only=0;
2347     int multifile=0;
2348     int pwfd = -1;
2349     int ovrseskeyfd = -1;
2350     int fpr_maybe_cmd = 0; /* --fingerprint maybe a command.  */
2351     int any_explicit_recipient = 0;
2352     int default_akl = 1;
2353     int require_secmem = 0;
2354     int got_secmem = 0;
2355     struct assuan_malloc_hooks malloc_hooks;
2356     ctrl_t ctrl;
2357
2358     static int print_dane_records;
2359     static int print_pka_records;
2360
2361
2362 #ifdef __riscos__
2363     opt.lock_once = 1;
2364 #endif /* __riscos__ */
2365
2366     /* Please note that we may running SUID(ROOT), so be very CAREFUL
2367        when adding any stuff between here and the call to
2368        secmem_init() somewhere after the option parsing. */
2369     early_system_init ();
2370     gnupg_reopen_std (GPG_NAME);
2371     trap_unaligned ();
2372     gnupg_rl_initialize ();
2373     set_strusage (my_strusage);
2374     gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
2375     log_set_prefix (GPG_NAME, GPGRT_LOG_WITH_PREFIX);
2376
2377     /* Make sure that our subsystems are ready.  */
2378     i18n_init();
2379     init_common_subsystems (&argc, &argv);
2380
2381     /* Use our own logging handler for Libcgrypt.  */
2382     setup_libgcrypt_logging ();
2383
2384     /* Put random number into secure memory */
2385     gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
2386
2387     may_coredump = disable_core_dumps();
2388
2389     gnupg_init_signals (0, emergency_cleanup);
2390
2391     dotlock_create (NULL, 0); /* Register lock file cleanup. */
2392
2393     /* Tell the compliance module who we are.  */
2394     gnupg_initialize_compliance (GNUPG_MODULE_NAME_GPG);
2395
2396     opt.autostart = 1;
2397     opt.session_env = session_env_new ();
2398     if (!opt.session_env)
2399       log_fatal ("error allocating session environment block: %s\n",
2400                  strerror (errno));
2401
2402     opt.command_fd = -1; /* no command fd */
2403     opt.compress_level = -1; /* defaults to standard compress level */
2404     opt.bz2_compress_level = -1; /* defaults to standard compress level */
2405     /* note: if you change these lines, look at oOpenPGP */
2406     opt.def_cipher_algo = 0;
2407     opt.def_aead_algo = 0;
2408     opt.def_digest_algo = 0;
2409     opt.cert_digest_algo = 0;
2410     opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
2411     opt.s2k_mode = 3; /* iterated+salted */
2412     opt.s2k_count = 0; /* Auto-calibrate when needed.  */
2413     opt.s2k_cipher_algo = DEFAULT_CIPHER_ALGO;
2414     opt.completes_needed = 1;
2415     opt.marginals_needed = 3;
2416     opt.max_cert_depth = 5;
2417     opt.escape_from = 1;
2418     opt.flags.require_cross_cert = 1;
2419     opt.import_options = IMPORT_REPAIR_KEYS;
2420     opt.export_options = EXPORT_ATTRIBUTES;
2421     opt.keyserver_options.import_options = (IMPORT_REPAIR_KEYS
2422                                             | IMPORT_REPAIR_PKS_SUBKEY_BUG);
2423     opt.keyserver_options.export_options = EXPORT_ATTRIBUTES;
2424     opt.keyserver_options.options = KEYSERVER_HONOR_PKA_RECORD;
2425     opt.verify_options = (LIST_SHOW_UID_VALIDITY
2426                           | VERIFY_SHOW_POLICY_URLS
2427                           | VERIFY_SHOW_STD_NOTATIONS
2428                           | VERIFY_SHOW_KEYSERVER_URLS);
2429     opt.list_options   = (LIST_SHOW_UID_VALIDITY
2430                           | LIST_SHOW_USAGE);
2431 #ifdef NO_TRUST_MODELS
2432     opt.trust_model = TM_ALWAYS;
2433 #else
2434     opt.trust_model = TM_AUTO;
2435 #endif
2436     opt.tofu_default_policy = TOFU_POLICY_AUTO;
2437     opt.mangle_dos_filenames = 0;
2438     opt.min_cert_level = 2;
2439     set_screen_dimensions ();
2440     opt.keyid_format = KF_NONE;
2441     opt.def_sig_expire = "0";
2442     opt.def_cert_expire = "0";
2443     gnupg_set_homedir (NULL);
2444     opt.passphrase_repeat = 1;
2445     opt.emit_version = 0;
2446     opt.weak_digests = NULL;
2447
2448     /* Check whether we have a config file on the command line.  */
2449     orig_argc = argc;
2450     orig_argv = argv;
2451     pargs.argc = &argc;
2452     pargs.argv = &argv;
2453     pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
2454     while( arg_parse( &pargs, opts) ) {
2455         if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
2456             parse_debug++;
2457         else if (pargs.r_opt == oDebugIOLBF)
2458             es_setvbuf (es_stdout, NULL, _IOLBF, 0);
2459         else if( pargs.r_opt == oOptions ) {
2460             /* yes there is one, so we do not try the default one, but
2461              * read the option file when it is encountered at the commandline
2462              */
2463             default_config = 0;
2464         }
2465         else if( pargs.r_opt == oNoOptions )
2466           {
2467             default_config = 0; /* --no-options */
2468             opt.no_homedir_creation = 1;
2469           }
2470         else if( pargs.r_opt == oHomedir )
2471             gnupg_set_homedir (pargs.r.ret_str);
2472         else if( pargs.r_opt == oNoPermissionWarn )
2473             opt.no_perm_warn=1;
2474         else if (pargs.r_opt == oStrict )
2475           {
2476             /* Not used */
2477           }
2478         else if (pargs.r_opt == oNoStrict )
2479           {
2480             /* Not used */
2481           }
2482     }
2483
2484 #ifdef HAVE_DOSISH_SYSTEM
2485     if ( strchr (gnupg_homedir (), '\\') ) {
2486       char *d, *buf = xmalloc (strlen (gnupg_homedir ())+1);
2487       const char *s;
2488       for (d=buf, s = gnupg_homedir (); *s; s++)
2489           {
2490             *d++ = *s == '\\'? '/': *s;
2491 #ifdef HAVE_W32_SYSTEM
2492             if (s[1] && IsDBCSLeadByte (*s))
2493               *d++ = *++s;
2494 #endif
2495           }
2496         *d = 0;
2497         gnupg_set_homedir (buf);
2498     }
2499 #endif
2500
2501     /* Initialize the secure memory. */
2502     if (!gcry_control (GCRYCTL_INIT_SECMEM, SECMEM_BUFFER_SIZE, 0))
2503       got_secmem = 1;
2504 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
2505     /* There should be no way to get to this spot while still carrying
2506        setuid privs.  Just in case, bomb out if we are. */
2507     if ( getuid () != geteuid () )
2508       BUG ();
2509 #endif
2510     maybe_setuid = 0;
2511
2512     /* Okay, we are now working under our real uid */
2513
2514     /* malloc hooks go here ... */
2515     malloc_hooks.malloc = gcry_malloc;
2516     malloc_hooks.realloc = gcry_realloc;
2517     malloc_hooks.free = gcry_free;
2518     assuan_set_malloc_hooks (&malloc_hooks);
2519     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
2520     setup_libassuan_logging (&opt.debug, NULL);
2521
2522     /* Set default options which require that malloc stuff is ready.  */
2523     additional_weak_digest ("MD5");
2524     parse_auto_key_locate ("local,wkd");
2525
2526     /* Try for a version specific config file first */
2527     default_configname = get_default_configname ();
2528     if (default_config)
2529       configname = xstrdup (default_configname);
2530
2531     argc = orig_argc;
2532     argv = orig_argv;
2533     pargs.argc = &argc;
2534     pargs.argv = &argv;
2535     pargs.flags= ARGPARSE_FLAG_KEEP;
2536
2537     /* By this point we have a homedir, and cannot change it. */
2538     check_permissions (gnupg_homedir (), 0);
2539
2540   next_pass:
2541     if( configname ) {
2542       if(check_permissions(configname,1))
2543         {
2544           /* If any options file is unsafe, then disable any external
2545              programs for keyserver calls or photo IDs.  Since the
2546              external program to call is set in the options file, a
2547              unsafe options file can lead to an arbitrary program
2548              being run. */
2549
2550           opt.exec_disable=1;
2551         }
2552
2553         configlineno = 0;
2554         configfp = fopen( configname, "r" );
2555         if (configfp && is_secured_file (fileno (configfp)))
2556           {
2557             fclose (configfp);
2558             configfp = NULL;
2559             gpg_err_set_errno (EPERM);
2560           }
2561         if( !configfp ) {
2562             if( default_config ) {
2563                 if( parse_debug )
2564                     log_info(_("Note: no default option file '%s'\n"),
2565                                                             configname );
2566             }
2567             else {
2568                 log_error(_("option file '%s': %s\n"),
2569                                     configname, strerror(errno) );
2570                 g10_exit(2);
2571             }
2572             xfree(configname); configname = NULL;
2573         }
2574         if( parse_debug && configname )
2575             log_info(_("reading options from '%s'\n"), configname );
2576         default_config = 0;
2577     }
2578
2579     while( optfile_parse( configfp, configname, &configlineno,
2580                                                 &pargs, opts) )
2581       {
2582         switch( pargs.r_opt )
2583           {
2584           case aListConfig:
2585           case aListGcryptConfig:
2586           case aGPGConfList:
2587           case aGPGConfTest:
2588             set_cmd (&cmd, pargs.r_opt);
2589             /* Do not register a keyring for these commands.  */
2590             default_keyring = -1;
2591             break;
2592
2593           case aCheckKeys:
2594           case aListPackets:
2595           case aImport:
2596           case aFastImport:
2597           case aSendKeys:
2598           case aRecvKeys:
2599           case aSearchKeys:
2600           case aRefreshKeys:
2601           case aFetchKeys:
2602           case aExport:
2603 #ifdef ENABLE_CARD_SUPPORT
2604           case aCardStatus:
2605           case aCardEdit:
2606           case aChangePIN:
2607 #endif /* ENABLE_CARD_SUPPORT*/
2608           case aListKeys:
2609           case aLocateKeys:
2610           case aListSigs:
2611           case aExportSecret:
2612           case aExportSecretSub:
2613           case aExportSshKey:
2614           case aSym:
2615           case aClearsign:
2616           case aGenRevoke:
2617           case aDesigRevoke:
2618           case aPrimegen:
2619           case aGenRandom:
2620           case aPrintMD:
2621           case aPrintMDs:
2622           case aListTrustDB:
2623           case aCheckTrustDB:
2624           case aUpdateTrustDB:
2625           case aFixTrustDB:
2626           case aListTrustPath:
2627           case aDeArmor:
2628           case aEnArmor:
2629           case aSign:
2630           case aQuickSignKey:
2631           case aQuickLSignKey:
2632           case aSignKey:
2633           case aLSignKey:
2634           case aStore:
2635           case aQuickKeygen:
2636           case aQuickAddUid:
2637           case aQuickAddKey:
2638           case aQuickRevUid:
2639           case aQuickSetExpire:
2640           case aQuickSetPrimaryUid:
2641           case aExportOwnerTrust:
2642           case aImportOwnerTrust:
2643           case aRebuildKeydbCaches:
2644             set_cmd (&cmd, pargs.r_opt);
2645             break;
2646
2647           case aKeygen:
2648           case aFullKeygen:
2649           case aEditKey:
2650           case aDeleteSecretKeys:
2651           case aDeleteSecretAndPublicKeys:
2652           case aDeleteKeys:
2653           case aPasswd:
2654             set_cmd (&cmd, pargs.r_opt);
2655             greeting=1;
2656             break;
2657
2658           case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
2659
2660           case aDecryptFiles: multifile=1; /* fall through */
2661           case aDecrypt: set_cmd( &cmd, aDecrypt); break;
2662
2663           case aEncrFiles: multifile=1; /* fall through */
2664           case aEncr: set_cmd( &cmd, aEncr); break;
2665
2666           case aVerifyFiles: multifile=1; /* fall through */
2667           case aVerify: set_cmd( &cmd, aVerify); break;
2668
2669           case aServer:
2670             set_cmd (&cmd, pargs.r_opt);
2671             opt.batch = 1;
2672             break;
2673
2674           case aTOFUPolicy:
2675             set_cmd (&cmd, pargs.r_opt);
2676             break;
2677
2678           case oArmor: opt.armor = 1; opt.no_armor=0; break;
2679           case oOutput: opt.outfile = pargs.r.ret_str; break;
2680
2681           case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
2682
2683           case oInputSizeHint:
2684             opt.input_size_hint = string_to_u64 (pargs.r.ret_str);
2685             break;
2686
2687           case oChunkSize:
2688             opt.chunk_size = pargs.r.ret_int;
2689             break;
2690
2691           case oQuiet: opt.quiet = 1; break;
2692           case oNoTTY: tty_no_terminal(1); break;
2693           case oDryRun: opt.dry_run = 1; break;
2694           case oInteractive: opt.interactive = 1; break;
2695           case oVerbose:
2696             opt.verbose++;
2697             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2698             opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
2699             opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
2700             break;
2701
2702           case oBatch:
2703             opt.batch = 1;
2704             nogreeting = 1;
2705             break;
2706
2707           case oUseAgent: /* Dummy. */
2708             break;
2709
2710           case oNoUseAgent:
2711             obsolete_option (configname, configlineno, "no-use-agent");
2712             break;
2713           case oGpgAgentInfo:
2714             obsolete_option (configname, configlineno, "gpg-agent-info");
2715             break;
2716           case oReaderPort:
2717             obsolete_scdaemon_option (configname, configlineno, "reader-port");
2718             break;
2719           case octapiDriver:
2720             obsolete_scdaemon_option (configname, configlineno, "ctapi-driver");
2721             break;
2722           case opcscDriver:
2723             obsolete_scdaemon_option (configname, configlineno, "pcsc-driver");
2724             break;
2725           case oDisableCCID:
2726             obsolete_scdaemon_option (configname, configlineno, "disable-ccid");
2727             break;
2728           case oHonorHttpProxy:
2729             obsolete_option (configname, configlineno, "honor-http-proxy");
2730             break;
2731
2732           case oAnswerYes: opt.answer_yes = 1; break;
2733           case oAnswerNo: opt.answer_no = 1; break;
2734           case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
2735           case oPrimaryKeyring:
2736             sl = append_to_strlist (&nrings, pargs.r.ret_str);
2737             sl->flags = KEYDB_RESOURCE_FLAG_PRIMARY;
2738             break;
2739           case oShowKeyring:
2740             deprecated_warning(configname,configlineno,"--show-keyring",
2741                                "--list-options ","show-keyring");
2742             opt.list_options|=LIST_SHOW_KEYRING;
2743             break;
2744
2745           case oDebug:
2746             if (parse_debug_flag (pargs.r.ret_str, &opt.debug, debug_flags))
2747               {
2748                 pargs.r_opt = ARGPARSE_INVALID_ARG;
2749                 pargs.err = ARGPARSE_PRINT_ERROR;
2750               }
2751             break;
2752
2753           case oDebugAll: opt.debug = ~0; break;
2754           case oDebugLevel: debug_level = pargs.r.ret_str; break;
2755
2756           case oDebugIOLBF: break; /* Already set in pre-parse step.  */
2757
2758           case oDebugSetIobufSize:
2759             opt_set_iobuf_size = pargs.r.ret_ulong;
2760             opt_set_iobuf_size_used = 1;
2761             break;
2762
2763           case oStatusFD:
2764             set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2765             break;
2766           case oStatusFile:
2767             set_status_fd ( open_info_file (pargs.r.ret_str, 1, 0) );
2768             break;
2769           case oAttributeFD:
2770             set_attrib_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2771             break;
2772           case oAttributeFile:
2773             set_attrib_fd ( open_info_file (pargs.r.ret_str, 1, 1) );
2774             break;
2775           case oLoggerFD:
2776             log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
2777             break;
2778           case oLoggerFile:
2779             logfile = pargs.r.ret_str;
2780             break;
2781
2782           case oWithFingerprint:
2783             opt.with_fingerprint = 1;
2784             opt.fingerprint++;
2785             break;
2786           case oWithSubkeyFingerprint:
2787             opt.with_subkey_fingerprint = 1;
2788             break;
2789           case oWithICAOSpelling:
2790             opt.with_icao_spelling = 1;
2791             break;
2792           case oFingerprint:
2793             opt.fingerprint++;
2794             fpr_maybe_cmd = 1;
2795             break;
2796
2797           case oWithKeygrip:
2798             opt.with_keygrip = 1;
2799             break;
2800
2801           case oWithKeyScreening:
2802             opt.with_key_screening = 1;
2803             break;
2804
2805           case oWithSecret:
2806             opt.with_secret = 1;
2807             break;
2808
2809           case oWithWKDHash:
2810             opt.with_wkd_hash = 1;
2811             break;
2812
2813           case oWithKeyOrigin:
2814             opt.with_key_origin = 1;
2815             break;
2816
2817           case oSecretKeyring:
2818             /* Ignore this old option.  */
2819             break;
2820
2821           case oOptions:
2822             /* config files may not be nested (silently ignore them) */
2823             if( !configfp ) {
2824                 xfree(configname);
2825                 configname = xstrdup(pargs.r.ret_str);
2826                 goto next_pass;
2827             }
2828             break;
2829           case oNoArmor: opt.no_armor=1; opt.armor=0; break;
2830
2831           case oNoDefKeyring:
2832             if (default_keyring > 0)
2833               default_keyring = 0;
2834             break;
2835           case oNoKeyring:
2836             default_keyring = -1;
2837             break;
2838
2839           case oNoGreeting: nogreeting = 1; break;
2840           case oNoVerbose:
2841             opt.verbose = 0;
2842             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2843             opt.list_sigs=0;
2844             break;
2845           case oQuickRandom:
2846             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
2847             break;
2848           case oEmitVersion: opt.emit_version++; break;
2849           case oNoEmitVersion: opt.emit_version=0; break;
2850           case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
2851           case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
2852           case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
2853
2854 #ifndef NO_TRUST_MODELS
2855           case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
2856
2857 #endif /*!NO_TRUST_MODELS*/
2858           case oDefaultKey:
2859             sl = add_to_strlist (&opt.def_secret_key, pargs.r.ret_str);
2860             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
2861             if (configfp)
2862               sl->flags |= PK_LIST_CONFIG;
2863             break;
2864           case oDefRecipient:
2865             if( *pargs.r.ret_str )
2866               {
2867                 xfree (opt.def_recipient);
2868                 opt.def_recipient = make_username(pargs.r.ret_str);
2869               }
2870             break;
2871           case oDefRecipientSelf:
2872             xfree(opt.def_recipient); opt.def_recipient = NULL;
2873             opt.def_recipient_self = 1;
2874             break;
2875           case oNoDefRecipient:
2876             xfree(opt.def_recipient); opt.def_recipient = NULL;
2877             opt.def_recipient_self = 0;
2878             break;
2879           case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
2880           case oHomedir: break;
2881           case oNoBatch: opt.batch = 0; break;
2882
2883           case oWithTofuInfo: opt.with_tofu_info = 1; break;
2884
2885           case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
2886           case oWithColons: opt.with_colons=':'; break;
2887
2888           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
2889           case oWithSigList: opt.list_sigs = 1; break;
2890
2891           case oSkipVerify: opt.skip_verify=1; break;
2892
2893           case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
2894           case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
2895
2896           case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
2897
2898 #ifndef NO_TRUST_MODELS
2899             /* There are many programs (like mutt) that call gpg with
2900                --always-trust so keep this option around for a long
2901                time. */
2902           case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
2903           case oTrustModel:
2904             parse_trust_model(pargs.r.ret_str);
2905             break;
2906 #endif /*!NO_TRUST_MODELS*/
2907           case oTOFUDefaultPolicy:
2908             opt.tofu_default_policy = parse_tofu_policy (pargs.r.ret_str);
2909             break;
2910           case oTOFUDBFormat:
2911             obsolete_option (configname, configlineno, "tofu-db-format");
2912             break;
2913
2914           case oForceOwnertrust:
2915             log_info(_("Note: %s is not for normal use!\n"),
2916                      "--force-ownertrust");
2917             opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
2918             if(opt.force_ownertrust==-1)
2919               {
2920                 log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
2921                 opt.force_ownertrust=0;
2922               }
2923             break;
2924           case oLoadExtension:
2925             /* Dummy so that gpg 1.4 conf files can work. Should
2926                eventually be removed.  */
2927             break;
2928
2929           case oCompliance:
2930             {
2931               int compliance = gnupg_parse_compliance_option
2932                 (pargs.r.ret_str,
2933                  compliance_options, DIM (compliance_options),
2934                  opt.quiet);
2935               if (compliance < 0)
2936                 g10_exit (1);
2937               set_compliance_option (compliance);
2938             }
2939             break;
2940           case oOpenPGP:
2941           case oRFC2440:
2942           case oRFC4880:
2943           case oRFC4880bis:
2944           case oPGP6:
2945           case oPGP7:
2946           case oPGP8:
2947           case oGnuPG:
2948             set_compliance_option (pargs.r_opt);
2949             break;
2950
2951           case oRFC2440Text: opt.rfc2440_text=1; break;
2952           case oNoRFC2440Text: opt.rfc2440_text=0; break;
2953
2954           case oSetFilename:
2955             if(utf8_strings)
2956               opt.set_filename = pargs.r.ret_str;
2957             else
2958               opt.set_filename = native_to_utf8(pargs.r.ret_str);
2959             break;
2960           case oForYourEyesOnly: eyes_only = 1; break;
2961           case oNoForYourEyesOnly: eyes_only = 0; break;
2962           case oSetPolicyURL:
2963             add_policy_url(pargs.r.ret_str,0);
2964             add_policy_url(pargs.r.ret_str,1);
2965             break;
2966           case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
2967           case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
2968           case oShowPolicyURL:
2969             deprecated_warning(configname,configlineno,"--show-policy-url",
2970                                "--list-options ","show-policy-urls");
2971             deprecated_warning(configname,configlineno,"--show-policy-url",
2972                                "--verify-options ","show-policy-urls");
2973             opt.list_options|=LIST_SHOW_POLICY_URLS;
2974             opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
2975             break;
2976           case oNoShowPolicyURL:
2977             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2978                                "--list-options ","no-show-policy-urls");
2979             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2980                                "--verify-options ","no-show-policy-urls");
2981             opt.list_options&=~LIST_SHOW_POLICY_URLS;
2982             opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
2983             break;
2984           case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
2985           case oUseEmbeddedFilename:
2986             opt.flags.use_embedded_filename=1;
2987             break;
2988           case oNoUseEmbeddedFilename:
2989             opt.flags.use_embedded_filename=0;
2990             break;
2991           case oComment:
2992             if(pargs.r.ret_str[0])
2993               append_to_strlist(&opt.comments,pargs.r.ret_str);
2994             break;
2995           case oDefaultComment:
2996             deprecated_warning(configname,configlineno,
2997                                "--default-comment","--no-comments","");
2998             /* fall through */
2999           case oNoComments:
3000             free_strlist(opt.comments);
3001             opt.comments=NULL;
3002             break;
3003           case oThrowKeyids: opt.throw_keyids = 1; break;
3004           case oNoThrowKeyids: opt.throw_keyids = 0; break;
3005           case oShowPhotos:
3006             deprecated_warning(configname,configlineno,"--show-photos",
3007                                "--list-options ","show-photos");
3008             deprecated_warning(configname,configlineno,"--show-photos",
3009                                "--verify-options ","show-photos");
3010             opt.list_options|=LIST_SHOW_PHOTOS;
3011             opt.verify_options|=VERIFY_SHOW_PHOTOS;
3012             break;
3013           case oNoShowPhotos:
3014             deprecated_warning(configname,configlineno,"--no-show-photos",
3015                                "--list-options ","no-show-photos");
3016             deprecated_warning(configname,configlineno,"--no-show-photos",
3017                                "--verify-options ","no-show-photos");
3018             opt.list_options&=~LIST_SHOW_PHOTOS;
3019             opt.verify_options&=~VERIFY_SHOW_PHOTOS;
3020             break;
3021           case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
3022
3023           case oForceMDC: opt.force_mdc = 1; break;
3024           case oNoForceMDC: opt.force_mdc = 0; break;
3025           case oDisableMDC: opt.disable_mdc = 1; break;
3026           case oNoDisableMDC: opt.disable_mdc = 0; break;
3027
3028           case oForceAEAD: opt.force_aead = 1; break;
3029
3030           case oDisableSignerUID: opt.flags.disable_signer_uid = 1; break;
3031
3032           case oS2KMode:   opt.s2k_mode = pargs.r.ret_int; break;
3033           case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
3034           case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
3035           case oS2KCount:
3036             if (pargs.r.ret_int)
3037               opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
3038             else
3039               opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
3040             break;
3041
3042           case oRecipient:
3043           case oHiddenRecipient:
3044           case oRecipientFile:
3045           case oHiddenRecipientFile:
3046             /* Store the recipient.  Note that we also store the
3047              * option as private data in the flags.  This is achieved
3048              * by shifting the option value to the left so to keep
3049              * enough space for the flags.  */
3050             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
3051             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
3052             if (configfp)
3053               sl->flags |= PK_LIST_CONFIG;
3054             if (pargs.r_opt == oHiddenRecipient
3055                 || pargs.r_opt == oHiddenRecipientFile)
3056               sl->flags |= PK_LIST_HIDDEN;
3057             if (pargs.r_opt == oRecipientFile
3058                 || pargs.r_opt == oHiddenRecipientFile)
3059               sl->flags |= PK_LIST_FROM_FILE;
3060             any_explicit_recipient = 1;
3061             break;
3062
3063           case oEncryptTo:
3064           case oHiddenEncryptTo:
3065             /* Store an additional recipient.  */
3066             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
3067             sl->flags = ((pargs.r_opt << PK_LIST_SHIFT) | PK_LIST_ENCRYPT_TO);
3068             if (configfp)
3069               sl->flags |= PK_LIST_CONFIG;
3070             if (pargs.r_opt == oHiddenEncryptTo)
3071               sl->flags |= PK_LIST_HIDDEN;
3072             break;
3073
3074           case oNoEncryptTo:
3075             opt.no_encrypt_to = 1;
3076             break;
3077           case oEncryptToDefaultKey:
3078             opt.encrypt_to_default_key = configfp ? 2 : 1;
3079             break;
3080
3081           case oTrySecretKey:
3082             add_to_strlist2 (&opt.secret_keys_to_try,
3083                              pargs.r.ret_str, utf8_strings);
3084             break;
3085
3086           case oMimemode: opt.mimemode = opt.textmode = 1; break;
3087           case oTextmodeShort: opt.textmode = 2; break;
3088           case oTextmode: opt.textmode=1;  break;
3089           case oNoTextmode: opt.textmode=opt.mimemode=0;  break;
3090
3091           case oExpert: opt.expert = 1; break;
3092           case oNoExpert: opt.expert = 0; break;
3093           case oDefSigExpire:
3094             if(*pargs.r.ret_str!='\0')
3095               {
3096                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3097                   log_error(_("'%s' is not a valid signature expiration\n"),
3098                             pargs.r.ret_str);
3099                 else
3100                   opt.def_sig_expire=pargs.r.ret_str;
3101               }
3102             break;
3103           case oAskSigExpire: opt.ask_sig_expire = 1; break;
3104           case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
3105           case oDefCertExpire:
3106             if(*pargs.r.ret_str!='\0')
3107               {
3108                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3109                   log_error(_("'%s' is not a valid signature expiration\n"),
3110                             pargs.r.ret_str);
3111                 else
3112                   opt.def_cert_expire=pargs.r.ret_str;
3113               }
3114             break;
3115           case oAskCertExpire: opt.ask_cert_expire = 1; break;
3116           case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
3117           case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
3118           case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
3119           case oAskCertLevel: opt.ask_cert_level = 1; break;
3120           case oNoAskCertLevel: opt.ask_cert_level = 0; break;
3121           case oLocalUser: /* store the local users */
3122             sl = add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
3123             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
3124             if (configfp)
3125               sl->flags |= PK_LIST_CONFIG;
3126             break;
3127           case oSender:
3128             {
3129               char *mbox = mailbox_from_userid (pargs.r.ret_str);
3130               if (!mbox)
3131                 log_error (_("\"%s\" is not a proper mail address\n"),
3132                            pargs.r.ret_str);
3133               else
3134                 {
3135                   add_to_strlist (&opt.sender_list, mbox);
3136                   xfree (mbox);
3137                 }
3138             }
3139             break;
3140           case oCompress:
3141             /* this is the -z command line option */
3142             opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
3143             break;
3144           case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
3145           case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
3146           case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
3147           case oPassphrase:
3148             set_passphrase_from_string(pargs.r.ret_str);
3149             break;
3150           case oPassphraseFD:
3151             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3152             break;
3153           case oPassphraseFile:
3154             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
3155             break;
3156           case oPassphraseRepeat:
3157             opt.passphrase_repeat = pargs.r.ret_int;
3158             break;
3159
3160           case oPinentryMode:
3161             opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
3162             if (opt.pinentry_mode == -1)
3163               log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
3164             break;
3165
3166           case oRequestOrigin:
3167             opt.request_origin = parse_request_origin (pargs.r.ret_str);
3168             if (opt.request_origin == -1)
3169               log_error (_("invalid request origin '%s'\n"), pargs.r.ret_str);
3170             break;
3171
3172           case oCommandFD:
3173             opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3174             if (! gnupg_fd_valid (opt.command_fd))
3175               log_error ("command-fd is invalid: %s\n", strerror (errno));
3176             break;
3177           case oCommandFile:
3178             opt.command_fd = open_info_file (pargs.r.ret_str, 0, 1);
3179             break;
3180           case oCipherAlgo:
3181             def_cipher_string = xstrdup(pargs.r.ret_str);
3182             break;
3183           case oAEADAlgo:
3184             def_aead_string = xstrdup (pargs.r.ret_str);
3185             break;
3186           case oDigestAlgo:
3187             def_digest_string = xstrdup(pargs.r.ret_str);
3188             break;
3189           case oCompressAlgo:
3190             /* If it is all digits, stick a Z in front of it for
3191                later.  This is for backwards compatibility with
3192                versions that took the compress algorithm number. */
3193             {
3194               char *pt=pargs.r.ret_str;
3195               while(*pt)
3196                 {
3197                   if (!isascii (*pt) || !isdigit (*pt))
3198                     break;
3199
3200                   pt++;
3201                 }
3202
3203               if(*pt=='\0')
3204                 {
3205                   compress_algo_string=xmalloc(strlen(pargs.r.ret_str)+2);
3206                   strcpy(compress_algo_string,"Z");
3207                   strcat(compress_algo_string,pargs.r.ret_str);
3208                 }
3209               else
3210                 compress_algo_string = xstrdup(pargs.r.ret_str);
3211             }
3212             break;
3213           case oCertDigestAlgo:
3214             cert_digest_string = xstrdup(pargs.r.ret_str);
3215             break;
3216
3217           case oNoSecmemWarn:
3218             gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
3219             break;
3220
3221           case oRequireSecmem: require_secmem=1; break;
3222           case oNoRequireSecmem: require_secmem=0; break;
3223           case oNoPermissionWarn: opt.no_perm_warn=1; break;
3224           case oNoMDCWarn: opt.no_mdc_warn=1; break;
3225           case oDisplayCharset:
3226             if( set_native_charset( pargs.r.ret_str ) )
3227                 log_error(_("'%s' is not a valid character set\n"),
3228                           pargs.r.ret_str);
3229             break;
3230           case oNotDashEscaped: opt.not_dash_escaped = 1; break;
3231           case oEscapeFrom: opt.escape_from = 1; break;
3232           case oNoEscapeFrom: opt.escape_from = 0; break;
3233           case oLockOnce: opt.lock_once = 1; break;
3234           case oLockNever:
3235             dotlock_disable ();
3236             break;
3237           case oLockMultiple:
3238 #ifndef __riscos__
3239             opt.lock_once = 0;
3240 #else /* __riscos__ */
3241             riscos_not_implemented("lock-multiple");
3242 #endif /* __riscos__ */
3243             break;
3244           case oKeyServer:
3245             {
3246               keyserver_spec_t keyserver;
3247               keyserver = parse_keyserver_uri (pargs.r.ret_str, 0);
3248               if (!keyserver)
3249                 log_error (_("could not parse keyserver URL\n"));
3250               else
3251                 {
3252                   /* We only support a single keyserver.  Later ones
3253                      override earlier ones.  (Since we parse the
3254                      config file first and then the command line
3255                      arguments, the command line takes
3256                      precedence.)  */
3257                   if (opt.keyserver)
3258                     free_keyserver_spec (opt.keyserver);
3259                   opt.keyserver = keyserver;
3260                 }
3261             }
3262             break;
3263           case oKeyServerOptions:
3264             if(!parse_keyserver_options(pargs.r.ret_str))
3265               {
3266                 if(configname)
3267                   log_error(_("%s:%d: invalid keyserver options\n"),
3268                             configname,configlineno);
3269                 else
3270                   log_error(_("invalid keyserver options\n"));
3271               }
3272             break;
3273           case oImportOptions:
3274             if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
3275               {
3276                 if(configname)
3277                   log_error(_("%s:%d: invalid import options\n"),
3278                             configname,configlineno);
3279                 else
3280                   log_error(_("invalid import options\n"));
3281               }
3282             break;
3283           case oImportFilter:
3284             rc = parse_and_set_import_filter (pargs.r.ret_str);
3285             if (rc)
3286               log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3287             break;
3288           case oExportOptions:
3289             if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
3290               {
3291                 if(configname)
3292                   log_error(_("%s:%d: invalid export options\n"),
3293                             configname,configlineno);
3294                 else
3295                   log_error(_("invalid export options\n"));
3296               }
3297             break;
3298           case oExportFilter:
3299             rc = parse_and_set_export_filter (pargs.r.ret_str);
3300             if (rc)
3301               log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3302             break;
3303           case oListOptions:
3304             if(!parse_list_options(pargs.r.ret_str))
3305               {
3306                 if(configname)
3307                   log_error(_("%s:%d: invalid list options\n"),
3308                             configname,configlineno);
3309                 else
3310                   log_error(_("invalid list options\n"));
3311               }
3312             break;
3313           case oVerifyOptions:
3314             {
3315               struct parse_options vopts[]=
3316                 {
3317                   {"show-photos",VERIFY_SHOW_PHOTOS,NULL,
3318                    N_("display photo IDs during signature verification")},
3319                   {"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL,
3320                    N_("show policy URLs during signature verification")},
3321                   {"show-notations",VERIFY_SHOW_NOTATIONS,NULL,
3322                    N_("show all notations during signature verification")},
3323                   {"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3324                    N_("show IETF standard notations during signature verification")},
3325                   {"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3326                    NULL},
3327                   {"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL,
3328                    N_("show user-supplied notations during signature verification")},
3329                   {"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL,
3330                    N_("show preferred keyserver URLs during signature verification")},
3331                   {"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL,
3332                    N_("show user ID validity during signature verification")},
3333                   {"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL,
3334                    N_("show revoked and expired user IDs in signature verification")},
3335                   {"show-primary-uid-only",VERIFY_SHOW_PRIMARY_UID_ONLY,NULL,
3336                    N_("show only the primary user ID in signature verification")},
3337                   {"pka-lookups",VERIFY_PKA_LOOKUPS,NULL,
3338                    N_("validate signatures with PKA data")},
3339                   {"pka-trust-increase",VERIFY_PKA_TRUST_INCREASE,NULL,
3340                    N_("elevate the trust of signatures with valid PKA data")},
3341                   {NULL,0,NULL,NULL}
3342                 };
3343
3344               if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
3345                 {
3346                   if(configname)
3347                     log_error(_("%s:%d: invalid verify options\n"),
3348                               configname,configlineno);
3349                   else
3350                     log_error(_("invalid verify options\n"));
3351                 }
3352             }
3353             break;
3354           case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
3355           case oExecPath:
3356             if(set_exec_path(pargs.r.ret_str))
3357               log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
3358             else
3359               opt.exec_path_set=1;
3360             break;
3361           case oSetNotation:
3362             add_notation_data( pargs.r.ret_str, 0 );
3363             add_notation_data( pargs.r.ret_str, 1 );
3364             break;
3365           case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
3366           case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
3367           case oShowNotation:
3368             deprecated_warning(configname,configlineno,"--show-notation",
3369                                "--list-options ","show-notations");
3370             deprecated_warning(configname,configlineno,"--show-notation",
3371                                "--verify-options ","show-notations");
3372             opt.list_options|=LIST_SHOW_NOTATIONS;
3373             opt.verify_options|=VERIFY_SHOW_NOTATIONS;
3374             break;
3375           case oNoShowNotation:
3376             deprecated_warning(configname,configlineno,"--no-show-notation",
3377                                "--list-options ","no-show-notations");
3378             deprecated_warning(configname,configlineno,"--no-show-notation",
3379                                "--verify-options ","no-show-notations");
3380             opt.list_options&=~LIST_SHOW_NOTATIONS;
3381             opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
3382             break;
3383           case oUtf8Strings: utf8_strings = 1; break;
3384           case oNoUtf8Strings: utf8_strings = 0; break;
3385           case oDisableCipherAlgo:
3386             {
3387               int algo = string_to_cipher_algo (pargs.r.ret_str);
3388               gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3389             }
3390             break;
3391           case oDisablePubkeyAlgo:
3392             {
3393               int algo = gcry_pk_map_name (pargs.r.ret_str);
3394               gcry_pk_ctl (GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3395             }
3396             break;
3397           case oNoSigCache: opt.no_sig_cache = 1; break;
3398           case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
3399           case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
3400           case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
3401           case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
3402           case oNoLiteral: opt.no_literal = 1; break;
3403           case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
3404           case oFastListMode: opt.fast_list_mode = 1; break;
3405           case oFixedListMode: /* Dummy */ break;
3406           case oLegacyListMode: opt.legacy_list_mode = 1; break;
3407           case oPrintPKARecords: print_pka_records = 1; break;
3408           case oPrintDANERecords: print_dane_records = 1; break;
3409           case oListOnly: opt.list_only=1; break;
3410           case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
3411           case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
3412           case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
3413           case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
3414           case oNoRandomSeedFile: use_random_seed = 0; break;
3415
3416           case oAutoKeyRetrieve:
3417             opt.keyserver_options.options |= KEYSERVER_AUTO_KEY_RETRIEVE;
3418             break;
3419           case oNoAutoKeyRetrieve:
3420             opt.keyserver_options.options &= ~KEYSERVER_AUTO_KEY_RETRIEVE;
3421             break;
3422
3423           case oShowSessionKey: opt.show_session_key = 1; break;
3424           case oOverrideSessionKey:
3425                 opt.override_session_key = pargs.r.ret_str;
3426                 break;
3427           case oOverrideSessionKeyFD:
3428                 ovrseskeyfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3429                 break;
3430           case oMergeOnly:
3431                 deprecated_warning(configname,configlineno,"--merge-only",
3432                                    "--import-options ","merge-only");
3433                 opt.import_options|=IMPORT_MERGE_ONLY;
3434             break;
3435           case oAllowSecretKeyImport: /* obsolete */ break;
3436           case oTryAllSecrets: opt.try_all_secrets = 1; break;
3437           case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
3438
3439           case oEnableSpecialFilenames:
3440             enable_special_filenames ();
3441             break;
3442
3443           case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
3444           case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
3445           case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
3446           case oPreservePermissions: opt.preserve_permissions=1; break;
3447           case oDefaultPreferenceList:
3448             opt.def_preference_list = pargs.r.ret_str;
3449             break;
3450           case oDefaultKeyserverURL:
3451             {
3452               keyserver_spec_t keyserver;
3453               keyserver = parse_keyserver_uri (pargs.r.ret_str,1 );
3454               if (!keyserver)
3455                 log_error (_("could not parse keyserver URL\n"));
3456               else
3457                 free_keyserver_spec (keyserver);
3458
3459               opt.def_keyserver_url = pargs.r.ret_str;
3460             }
3461             break;
3462           case oPersonalCipherPreferences:
3463             pers_cipher_list=pargs.r.ret_str;
3464             break;
3465           case oPersonalAEADPreferences:
3466             pers_aead_list = pargs.r.ret_str;
3467             break;
3468           case oPersonalDigestPreferences:
3469             pers_digest_list=pargs.r.ret_str;
3470             break;
3471           case oPersonalCompressPreferences:
3472             pers_compress_list=pargs.r.ret_str;
3473             break;
3474           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
3475           case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
3476           case oDisableDirmngr: opt.disable_dirmngr = 1;  break;
3477           case oWeakDigest:
3478             additional_weak_digest(pargs.r.ret_str);
3479             break;
3480           case oUnwrap:
3481             opt.unwrap_encryption = 1;
3482             break;
3483           case oOnlySignTextIDs:
3484             opt.only_sign_text_ids = 1;
3485             break;
3486
3487           case oDisplay:
3488             set_opt_session_env ("DISPLAY", pargs.r.ret_str);
3489             break;
3490           case oTTYname:
3491             set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
3492             break;
3493           case oTTYtype:
3494             set_opt_session_env ("TERM", pargs.r.ret_str);
3495             break;
3496           case oXauthority:
3497             set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
3498             break;
3499
3500           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
3501           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
3502
3503           case oGroup: add_group(pargs.r.ret_str); break;
3504           case oUnGroup: rm_group(pargs.r.ret_str); break;
3505           case oNoGroups:
3506             while(opt.grouplist)
3507               {
3508                 struct groupitem *iter=opt.grouplist;
3509                 free_strlist(iter->values);
3510                 opt.grouplist=opt.grouplist->next;
3511                 xfree(iter);
3512               }
3513             break;
3514
3515           case oStrict:
3516           case oNoStrict:
3517             /* Not used */
3518             break;
3519
3520           case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
3521           case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
3522           case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
3523           case oMultifile: multifile=1; break;
3524           case oKeyidFormat:
3525             if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
3526               opt.keyid_format=KF_SHORT;
3527             else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
3528               opt.keyid_format=KF_LONG;
3529             else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
3530               opt.keyid_format=KF_0xSHORT;
3531             else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
3532               opt.keyid_format=KF_0xLONG;
3533             else if(ascii_strcasecmp(pargs.r.ret_str,"none")==0)
3534               opt.keyid_format = KF_NONE;
3535             else
3536               log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
3537             break;
3538
3539           case oExitOnStatusWriteError:
3540             opt.exit_on_status_write_error = 1;
3541             break;
3542
3543           case oLimitCardInsertTries:
3544             opt.limit_card_insert_tries = pargs.r.ret_int;
3545             break;
3546
3547           case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
3548           case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
3549
3550           case oAutoKeyLocate:
3551             if (default_akl)
3552               {
3553                 /* This is the first time --aito-key-locate is seen.
3554                  * We need to reset the default akl.  */
3555                 default_akl = 0;
3556                 release_akl();
3557               }
3558             if(!parse_auto_key_locate(pargs.r.ret_str))
3559               {
3560                 if(configname)
3561                   log_error(_("%s:%d: invalid auto-key-locate list\n"),
3562                             configname,configlineno);
3563                 else
3564                   log_error(_("invalid auto-key-locate list\n"));
3565               }
3566             break;
3567           case oNoAutoKeyLocate:
3568             release_akl();
3569             break;
3570
3571           case oKeyOrigin:
3572             if(!parse_key_origin (pargs.r.ret_str))
3573               log_error (_("invalid argument for option \"%.50s\"\n"),
3574                          "--key-origin");
3575             break;
3576
3577           case oEnableLargeRSA:
3578 #if SECMEM_BUFFER_SIZE >= 65536
3579             opt.flags.large_rsa=1;
3580 #else
3581             if (configname)
3582               log_info("%s:%d: WARNING: gpg not built with large secure "
3583                          "memory buffer.  Ignoring enable-large-rsa\n",
3584                         configname,configlineno);
3585             else
3586               log_info("WARNING: gpg not built with large secure "
3587                          "memory buffer.  Ignoring --enable-large-rsa\n");
3588 #endif /* SECMEM_BUFFER_SIZE >= 65536 */
3589             break;
3590           case oDisableLargeRSA: opt.flags.large_rsa=0;
3591             break;
3592
3593           case oEnableDSA2: opt.flags.dsa2=1; break;
3594           case oDisableDSA2: opt.flags.dsa2=0; break;
3595
3596           case oAllowMultisigVerification: