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