gpg: New maintainer option --debug-set-iobuf-size.
[gnupg.git] / g10 / gpg.c
1 /* gpg.c - The GnuPG utility (main for gpg)
2  * Copyright (C) 1998-2011 Free Software Foundation, Inc.
3  * Copyright (C) 1997-2017 Werner Koch
4  * Copyright (C) 2015-2017 g10 Code GmbH
5  *
6  * This file is part of GnuPG.
7  *
8  * GnuPG is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * GnuPG is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, see <https://www.gnu.org/licenses/>.
20  */
21
22 #include <config.h>
23 #include <errno.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <ctype.h>
28 #include <unistd.h>
29 #ifdef HAVE_STAT
30 #include <sys/stat.h> /* for stat() */
31 #endif
32 #include <fcntl.h>
33 #ifdef HAVE_W32_SYSTEM
34 # ifdef HAVE_WINSOCK2_H
35 #  include <winsock2.h>
36 # endif
37 # include <windows.h>
38 #endif
39
40 #define INCLUDED_BY_MAIN_MODULE 1
41 #include "gpg.h"
42 #include <assuan.h>
43 #include "../common/iobuf.h"
44 #include "../common/util.h"
45 #include "packet.h"
46 #include "../common/membuf.h"
47 #include "main.h"
48 #include "options.h"
49 #include "keydb.h"
50 #include "trustdb.h"
51 #include "filter.h"
52 #include "../common/ttyio.h"
53 #include "../common/i18n.h"
54 #include "../common/sysutils.h"
55 #include "../common/status.h"
56 #include "keyserver-internal.h"
57 #include "exec.h"
58 #include "../common/gc-opt-flags.h"
59 #include "../common/asshelp.h"
60 #include "call-dirmngr.h"
61 #include "tofu.h"
62 #include "../common/init.h"
63 #include "../common/mbox-util.h"
64 #include "../common/shareddefs.h"
65 #include "../common/compliance.h"
66
67 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
68 #define MY_O_BINARY  O_BINARY
69 #ifndef S_IRGRP
70 # define S_IRGRP 0
71 # define S_IWGRP 0
72 #endif
73 #else
74 #define MY_O_BINARY  0
75 #endif
76
77 #ifdef __MINGW32__
78 int _dowildcard = -1;
79 #endif
80
81 enum cmd_and_opt_values
82   {
83     aNull = 0,
84     oArmor        = 'a',
85     aDetachedSign = 'b',
86     aSym          = 'c',
87     aDecrypt      = 'd',
88     aEncr         = 'e',
89     oRecipientFile       = 'f',
90     oHiddenRecipientFile = 'F',
91     oInteractive  = 'i',
92     aListKeys     = 'k',
93     oDryRun       = 'n',
94     oOutput       = 'o',
95     oQuiet        = 'q',
96     oRecipient    = 'r',
97     oHiddenRecipient = 'R',
98     aSign         = 's',
99     oTextmodeShort= 't',
100     oLocalUser    = 'u',
101     oVerbose      = 'v',
102     oCompress     = 'z',
103     oSetNotation  = 'N',
104     aListSecretKeys = 'K',
105     oBatch        = 500,
106     oMaxOutput,
107     oInputSizeHint,
108     oChunkSize,
109     oSigNotation,
110     oCertNotation,
111     oShowNotation,
112     oNoShowNotation,
113     aEncrFiles,
114     aEncrSym,
115     aDecryptFiles,
116     aClearsign,
117     aStore,
118     aQuickKeygen,
119     aFullKeygen,
120     aKeygen,
121     aSignEncr,
122     aSignEncrSym,
123     aSignSym,
124     aSignKey,
125     aLSignKey,
126     aQuickSignKey,
127     aQuickLSignKey,
128     aQuickAddUid,
129     aQuickAddKey,
130     aQuickRevUid,
131     aQuickSetExpire,
132     aQuickSetPrimaryUid,
133     aListConfig,
134     aListGcryptConfig,
135     aGPGConfList,
136     aGPGConfTest,
137     aListPackets,
138     aEditKey,
139     aDeleteKeys,
140     aDeleteSecretKeys,
141     aDeleteSecretAndPublicKeys,
142     aImport,
143     aFastImport,
144     aVerify,
145     aVerifyFiles,
146     aListSigs,
147     aSendKeys,
148     aRecvKeys,
149     aLocateKeys,
150     aSearchKeys,
151     aRefreshKeys,
152     aFetchKeys,
153     aExport,
154     aExportSecret,
155     aExportSecretSub,
156     aExportSshKey,
157     aCheckKeys,
158     aGenRevoke,
159     aDesigRevoke,
160     aPrimegen,
161     aPrintMD,
162     aPrintMDs,
163     aCheckTrustDB,
164     aUpdateTrustDB,
165     aFixTrustDB,
166     aListTrustDB,
167     aListTrustPath,
168     aExportOwnerTrust,
169     aImportOwnerTrust,
170     aDeArmor,
171     aEnArmor,
172     aGenRandom,
173     aRebuildKeydbCaches,
174     aCardStatus,
175     aCardEdit,
176     aChangePIN,
177     aPasswd,
178     aServer,
179     aTOFUPolicy,
180
181     oMimemode,
182     oTextmode,
183     oNoTextmode,
184     oExpert,
185     oNoExpert,
186     oDefSigExpire,
187     oAskSigExpire,
188     oNoAskSigExpire,
189     oDefCertExpire,
190     oAskCertExpire,
191     oNoAskCertExpire,
192     oDefCertLevel,
193     oMinCertLevel,
194     oAskCertLevel,
195     oNoAskCertLevel,
196     oFingerprint,
197     oWithFingerprint,
198     oWithSubkeyFingerprint,
199     oWithICAOSpelling,
200     oWithKeygrip,
201     oWithKeyScreening,
202     oWithSecret,
203     oWithWKDHash,
204     oWithColons,
205     oWithKeyData,
206     oWithKeyOrigin,
207     oWithTofuInfo,
208     oWithSigList,
209     oWithSigCheck,
210     oAnswerYes,
211     oAnswerNo,
212     oKeyring,
213     oPrimaryKeyring,
214     oSecretKeyring,
215     oShowKeyring,
216     oDefaultKey,
217     oDefRecipient,
218     oDefRecipientSelf,
219     oNoDefRecipient,
220     oTrySecretKey,
221     oOptions,
222     oDebug,
223     oDebugLevel,
224     oDebugAll,
225     oDebugIOLBF,
226     oDebugSetIobufSize,
227     oStatusFD,
228     oStatusFile,
229     oAttributeFD,
230     oAttributeFile,
231     oEmitVersion,
232     oNoEmitVersion,
233     oCompletesNeeded,
234     oMarginalsNeeded,
235     oMaxCertDepth,
236     oLoadExtension,
237     oCompliance,
238     oGnuPG,
239     oRFC2440,
240     oRFC4880,
241     oRFC4880bis,
242     oOpenPGP,
243     oPGP6,
244     oPGP7,
245     oPGP8,
246     oDE_VS,
247     oRFC2440Text,
248     oNoRFC2440Text,
249     oCipherAlgo,
250     oAEADAlgo,
251     oDigestAlgo,
252     oCertDigestAlgo,
253     oCompressAlgo,
254     oCompressLevel,
255     oBZ2CompressLevel,
256     oBZ2DecompressLowmem,
257     oPassphrase,
258     oPassphraseFD,
259     oPassphraseFile,
260     oPassphraseRepeat,
261     oPinentryMode,
262     oCommandFD,
263     oCommandFile,
264     oQuickRandom,
265     oNoVerbose,
266     oTrustDBName,
267     oNoSecmemWarn,
268     oRequireSecmem,
269     oNoRequireSecmem,
270     oNoPermissionWarn,
271     oNoMDCWarn,
272     oNoArmor,
273     oNoDefKeyring,
274     oNoKeyring,
275     oNoGreeting,
276     oNoTTY,
277     oNoOptions,
278     oNoBatch,
279     oHomedir,
280     oSkipVerify,
281     oSkipHiddenRecipients,
282     oNoSkipHiddenRecipients,
283     oAlwaysTrust,
284     oTrustModel,
285     oForceOwnertrust,
286     oSetFilename,
287     oForYourEyesOnly,
288     oNoForYourEyesOnly,
289     oSetPolicyURL,
290     oSigPolicyURL,
291     oCertPolicyURL,
292     oShowPolicyURL,
293     oNoShowPolicyURL,
294     oSigKeyserverURL,
295     oUseEmbeddedFilename,
296     oNoUseEmbeddedFilename,
297     oComment,
298     oDefaultComment,
299     oNoComments,
300     oThrowKeyids,
301     oNoThrowKeyids,
302     oShowPhotos,
303     oNoShowPhotos,
304     oPhotoViewer,
305     oForceMDC,
306     oNoForceMDC,
307     oDisableMDC,
308     oNoDisableMDC,
309     oForceAEAD,
310     oS2KMode,
311     oS2KDigest,
312     oS2KCipher,
313     oS2KCount,
314     oDisplayCharset,
315     oNotDashEscaped,
316     oEscapeFrom,
317     oNoEscapeFrom,
318     oLockOnce,
319     oLockMultiple,
320     oLockNever,
321     oKeyServer,
322     oKeyServerOptions,
323     oImportOptions,
324     oImportFilter,
325     oExportOptions,
326     oExportFilter,
327     oListOptions,
328     oVerifyOptions,
329     oTempDir,
330     oExecPath,
331     oEncryptTo,
332     oHiddenEncryptTo,
333     oNoEncryptTo,
334     oEncryptToDefaultKey,
335     oLoggerFD,
336     oLoggerFile,
337     oUtf8Strings,
338     oNoUtf8Strings,
339     oDisableCipherAlgo,
340     oDisablePubkeyAlgo,
341     oAllowNonSelfsignedUID,
342     oNoAllowNonSelfsignedUID,
343     oAllowFreeformUID,
344     oNoAllowFreeformUID,
345     oAllowSecretKeyImport,
346     oEnableSpecialFilenames,
347     oNoLiteral,
348     oSetFilesize,
349     oHonorHttpProxy,
350     oFastListMode,
351     oListOnly,
352     oIgnoreTimeConflict,
353     oIgnoreValidFrom,
354     oIgnoreCrcError,
355     oIgnoreMDCError,
356     oShowSessionKey,
357     oOverrideSessionKey,
358     oOverrideSessionKeyFD,
359     oNoRandomSeedFile,
360     oAutoKeyRetrieve,
361     oNoAutoKeyRetrieve,
362     oUseAgent,
363     oNoUseAgent,
364     oGpgAgentInfo,
365     oMergeOnly,
366     oTryAllSecrets,
367     oTrustedKey,
368     oNoExpensiveTrustChecks,
369     oFixedListMode,
370     oLegacyListMode,
371     oNoSigCache,
372     oAutoCheckTrustDB,
373     oNoAutoCheckTrustDB,
374     oPreservePermissions,
375     oDefaultPreferenceList,
376     oDefaultKeyserverURL,
377     oPersonalCipherPreferences,
378     oPersonalAEADPreferences,
379     oPersonalDigestPreferences,
380     oPersonalCompressPreferences,
381     oAgentProgram,
382     oDirmngrProgram,
383     oDisableDirmngr,
384     oDisplay,
385     oTTYname,
386     oTTYtype,
387     oLCctype,
388     oLCmessages,
389     oXauthority,
390     oGroup,
391     oUnGroup,
392     oNoGroups,
393     oStrict,
394     oNoStrict,
395     oMangleDosFilenames,
396     oNoMangleDosFilenames,
397     oEnableProgressFilter,
398     oMultifile,
399     oKeyidFormat,
400     oExitOnStatusWriteError,
401     oLimitCardInsertTries,
402     oReaderPort,
403     octapiDriver,
404     opcscDriver,
405     oDisableCCID,
406     oRequireCrossCert,
407     oNoRequireCrossCert,
408     oAutoKeyLocate,
409     oNoAutoKeyLocate,
410     oAllowMultisigVerification,
411     oEnableLargeRSA,
412     oDisableLargeRSA,
413     oEnableDSA2,
414     oDisableDSA2,
415     oAllowMultipleMessages,
416     oNoAllowMultipleMessages,
417     oAllowWeakDigestAlgos,
418     oFakedSystemTime,
419     oNoAutostart,
420     oPrintPKARecords,
421     oPrintDANERecords,
422     oTOFUDefaultPolicy,
423     oTOFUDBFormat,
424     oDefaultNewKeyAlgo,
425     oWeakDigest,
426     oUnwrap,
427     oOnlySignTextIDs,
428     oDisableSignerUID,
429     oSender,
430     oKeyOrigin,
431
432     oNoop
433   };
434
435
436 static ARGPARSE_OPTS opts[] = {
437
438   ARGPARSE_group (300, N_("@Commands:\n ")),
439
440   ARGPARSE_c (aSign, "sign", N_("make a signature")),
441   ARGPARSE_c (aClearsign, "clear-sign", N_("make a clear text signature")),
442   ARGPARSE_c (aClearsign, "clearsign", "@"),
443   ARGPARSE_c (aDetachedSign, "detach-sign", N_("make a detached signature")),
444   ARGPARSE_c (aEncr, "encrypt",   N_("encrypt data")),
445   ARGPARSE_c (aEncrFiles, "encrypt-files", "@"),
446   ARGPARSE_c (aSym, "symmetric", N_("encryption only with symmetric cipher")),
447   ARGPARSE_c (aStore, "store",     "@"),
448   ARGPARSE_c (aDecrypt, "decrypt",   N_("decrypt data (default)")),
449   ARGPARSE_c (aDecryptFiles, "decrypt-files", "@"),
450   ARGPARSE_c (aVerify, "verify"   , N_("verify a signature")),
451   ARGPARSE_c (aVerifyFiles, "verify-files" , "@" ),
452   ARGPARSE_c (aListKeys, "list-keys", N_("list keys")),
453   ARGPARSE_c (aListKeys, "list-public-keys", "@" ),
454   ARGPARSE_c (aListSigs, "list-signatures", N_("list keys and signatures")),
455   ARGPARSE_c (aListSigs, "list-sigs", "@"),
456   ARGPARSE_c (aCheckKeys, "check-signatures",
457               N_("list and check key signatures")),
458   ARGPARSE_c (aCheckKeys, "check-sigs", "@"),
459   ARGPARSE_c (oFingerprint, "fingerprint", N_("list keys and fingerprints")),
460   ARGPARSE_c (aListSecretKeys, "list-secret-keys", N_("list secret keys")),
461   ARGPARSE_c (aKeygen,      "generate-key",
462               N_("generate a new key pair")),
463   ARGPARSE_c (aKeygen,      "gen-key", "@"),
464   ARGPARSE_c (aQuickKeygen, "quick-generate-key" ,
465               N_("quickly generate a new key pair")),
466   ARGPARSE_c (aQuickKeygen, "quick-gen-key", "@"),
467   ARGPARSE_c (aQuickAddUid,  "quick-add-uid",
468               N_("quickly add a new user-id")),
469   ARGPARSE_c (aQuickAddUid,  "quick-adduid", "@"),
470   ARGPARSE_c (aQuickAddKey,  "quick-add-key", "@"),
471   ARGPARSE_c (aQuickAddKey,  "quick-addkey", "@"),
472   ARGPARSE_c (aQuickRevUid,  "quick-revoke-uid",
473               N_("quickly revoke a user-id")),
474   ARGPARSE_c (aQuickRevUid,  "quick-revuid", "@"),
475   ARGPARSE_c (aQuickSetExpire,  "quick-set-expire",
476               N_("quickly set a new expiration date")),
477   ARGPARSE_c (aQuickSetPrimaryUid,  "quick-set-primary-uid", "@"),
478   ARGPARSE_c (aFullKeygen,  "full-generate-key" ,
479               N_("full featured key pair generation")),
480   ARGPARSE_c (aFullKeygen,  "full-gen-key", "@"),
481   ARGPARSE_c (aGenRevoke, "generate-revocation",
482               N_("generate a revocation certificate")),
483   ARGPARSE_c (aGenRevoke, "gen-revoke", "@"),
484   ARGPARSE_c (aDeleteKeys,"delete-keys",
485               N_("remove keys from the public keyring")),
486   ARGPARSE_c (aDeleteSecretKeys, "delete-secret-keys",
487               N_("remove keys from the secret keyring")),
488   ARGPARSE_c (aQuickSignKey,  "quick-sign-key" ,
489               N_("quickly sign a key")),
490   ARGPARSE_c (aQuickLSignKey, "quick-lsign-key",
491               N_("quickly sign a key locally")),
492   ARGPARSE_c (aSignKey,  "sign-key"   ,N_("sign a key")),
493   ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
494   ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
495   ARGPARSE_c (aEditKey,  "key-edit"   ,"@"),
496   ARGPARSE_c (aPasswd,   "change-passphrase", N_("change a passphrase")),
497   ARGPARSE_c (aPasswd,   "passwd", "@"),
498   ARGPARSE_c (aDesigRevoke, "generate-designated-revocation", "@"),
499   ARGPARSE_c (aDesigRevoke, "desig-revoke","@" ),
500   ARGPARSE_c (aExport, "export"           , N_("export keys") ),
501   ARGPARSE_c (aSendKeys, "send-keys"     , N_("export keys to a keyserver") ),
502   ARGPARSE_c (aRecvKeys, "receive-keys" , N_("import keys from a keyserver") ),
503   ARGPARSE_c (aRecvKeys, "recv-keys"     , "@"),
504   ARGPARSE_c (aSearchKeys, "search-keys" ,
505               N_("search for keys on a keyserver") ),
506   ARGPARSE_c (aRefreshKeys, "refresh-keys",
507               N_("update all keys from a keyserver")),
508   ARGPARSE_c (aLocateKeys, "locate-keys", "@"),
509   ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
510   ARGPARSE_c (aExportSecret, "export-secret-keys" , "@" ),
511   ARGPARSE_c (aExportSecretSub, "export-secret-subkeys" , "@" ),
512   ARGPARSE_c (aExportSshKey, "export-ssh-key", "@" ),
513   ARGPARSE_c (aImport, "import", N_("import/merge keys")),
514   ARGPARSE_c (aFastImport, "fast-import", "@"),
515 #ifdef ENABLE_CARD_SUPPORT
516   ARGPARSE_c (aCardStatus,  "card-status", N_("print the card status")),
517   ARGPARSE_c (aCardEdit,   "edit-card",  N_("change data on a card")),
518   ARGPARSE_c (aCardEdit,   "card-edit", "@"),
519   ARGPARSE_c (aChangePIN,  "change-pin", N_("change a card's PIN")),
520 #endif
521   ARGPARSE_c (aListConfig, "list-config", "@"),
522   ARGPARSE_c (aListGcryptConfig, "list-gcrypt-config", "@"),
523   ARGPARSE_c (aGPGConfList, "gpgconf-list", "@" ),
524   ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@" ),
525   ARGPARSE_c (aListPackets, "list-packets","@"),
526
527 #ifndef NO_TRUST_MODELS
528   ARGPARSE_c (aExportOwnerTrust, "export-ownertrust", "@"),
529   ARGPARSE_c (aImportOwnerTrust, "import-ownertrust", "@"),
530   ARGPARSE_c (aUpdateTrustDB,"update-trustdb",
531               N_("update the trust database")),
532   ARGPARSE_c (aCheckTrustDB, "check-trustdb", "@"),
533   ARGPARSE_c (aFixTrustDB, "fix-trustdb", "@"),
534 #endif
535
536   ARGPARSE_c (aDeArmor, "dearmor", "@"),
537   ARGPARSE_c (aDeArmor, "dearmour", "@"),
538   ARGPARSE_c (aEnArmor, "enarmor", "@"),
539   ARGPARSE_c (aEnArmor, "enarmour", "@"),
540   ARGPARSE_c (aPrintMD, "print-md", N_("print message digests")),
541   ARGPARSE_c (aPrimegen, "gen-prime", "@" ),
542   ARGPARSE_c (aGenRandom,"gen-random", "@" ),
543   ARGPARSE_c (aServer,   "server",  N_("run in server mode")),
544   ARGPARSE_c (aTOFUPolicy, "tofu-policy",
545               N_("|VALUE|set the TOFU policy for a key")),
546
547   ARGPARSE_group (301, N_("@\nOptions:\n ")),
548
549   ARGPARSE_s_n (oArmor, "armor", N_("create ascii armored output")),
550   ARGPARSE_s_n (oArmor, "armour", "@"),
551
552   ARGPARSE_s_s (oRecipient, "recipient", N_("|USER-ID|encrypt for USER-ID")),
553   ARGPARSE_s_s (oHiddenRecipient, "hidden-recipient", "@"),
554   ARGPARSE_s_s (oRecipientFile, "recipient-file", "@"),
555   ARGPARSE_s_s (oHiddenRecipientFile, "hidden-recipient-file", "@"),
556   ARGPARSE_s_s (oRecipient, "remote-user", "@"),  /* (old option name) */
557   ARGPARSE_s_s (oDefRecipient, "default-recipient", "@"),
558   ARGPARSE_s_n (oDefRecipientSelf,  "default-recipient-self", "@"),
559   ARGPARSE_s_n (oNoDefRecipient, "no-default-recipient", "@"),
560
561   ARGPARSE_s_s (oTempDir,  "temp-directory", "@"),
562   ARGPARSE_s_s (oExecPath, "exec-path", "@"),
563   ARGPARSE_s_s (oEncryptTo,      "encrypt-to", "@"),
564   ARGPARSE_s_n (oNoEncryptTo, "no-encrypt-to", "@"),
565   ARGPARSE_s_s (oHiddenEncryptTo, "hidden-encrypt-to", "@"),
566   ARGPARSE_s_n (oEncryptToDefaultKey, "encrypt-to-default-key", "@"),
567   ARGPARSE_s_s (oLocalUser, "local-user",
568                 N_("|USER-ID|use USER-ID to sign or decrypt")),
569   ARGPARSE_s_s (oSender, "sender", "@"),
570
571   ARGPARSE_s_s (oTrySecretKey, "try-secret-key", "@"),
572
573   ARGPARSE_s_i (oCompress, NULL,
574                 N_("|N|set compress level to N (0 disables)")),
575   ARGPARSE_s_i (oCompressLevel, "compress-level", "@"),
576   ARGPARSE_s_i (oBZ2CompressLevel, "bzip2-compress-level", "@"),
577   ARGPARSE_s_n (oBZ2DecompressLowmem, "bzip2-decompress-lowmem", "@"),
578
579   ARGPARSE_s_n (oMimemode, "mimemode", "@"),
580   ARGPARSE_s_n (oTextmodeShort, NULL, "@"),
581   ARGPARSE_s_n (oTextmode,   "textmode", N_("use canonical text mode")),
582   ARGPARSE_s_n (oNoTextmode, "no-textmode", "@"),
583
584   ARGPARSE_s_n (oExpert,      "expert", "@"),
585   ARGPARSE_s_n (oNoExpert, "no-expert", "@"),
586
587   ARGPARSE_s_s (oDefSigExpire, "default-sig-expire", "@"),
588   ARGPARSE_s_n (oAskSigExpire,      "ask-sig-expire", "@"),
589   ARGPARSE_s_n (oNoAskSigExpire, "no-ask-sig-expire", "@"),
590   ARGPARSE_s_s (oDefCertExpire, "default-cert-expire", "@"),
591   ARGPARSE_s_n (oAskCertExpire,      "ask-cert-expire", "@"),
592   ARGPARSE_s_n (oNoAskCertExpire, "no-ask-cert-expire", "@"),
593   ARGPARSE_s_i (oDefCertLevel, "default-cert-level", "@"),
594   ARGPARSE_s_i (oMinCertLevel, "min-cert-level", "@"),
595   ARGPARSE_s_n (oAskCertLevel,      "ask-cert-level", "@"),
596   ARGPARSE_s_n (oNoAskCertLevel, "no-ask-cert-level", "@"),
597
598   ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
599   ARGPARSE_p_u (oMaxOutput, "max-output", "@"),
600   ARGPARSE_s_s (oInputSizeHint, "input-size-hint", "@"),
601   ARGPARSE_s_i (oChunkSize, "chunk-size", "@"),
602
603   ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
604   ARGPARSE_s_n (oQuiet,   "quiet",   "@"),
605   ARGPARSE_s_n (oNoTTY,   "no-tty",  "@"),
606
607   ARGPARSE_s_n (oForceMDC, "force-mdc", "@"),
608   ARGPARSE_s_n (oNoForceMDC, "no-force-mdc", "@"),
609   ARGPARSE_s_n (oDisableMDC, "disable-mdc", "@"),
610   ARGPARSE_s_n (oNoDisableMDC, "no-disable-mdc", "@"),
611
612   ARGPARSE_s_n (oForceAEAD, "force-aead", "@"),
613
614   ARGPARSE_s_n (oDisableSignerUID, "disable-signer-uid", "@"),
615
616   ARGPARSE_s_n (oDryRun, "dry-run", N_("do not make any changes")),
617   ARGPARSE_s_n (oInteractive, "interactive", N_("prompt before overwriting")),
618
619   ARGPARSE_s_n (oBatch, "batch", "@"),
620   ARGPARSE_s_n (oAnswerYes, "yes", "@"),
621   ARGPARSE_s_n (oAnswerNo, "no", "@"),
622   ARGPARSE_s_s (oKeyring, "keyring", "@"),
623   ARGPARSE_s_s (oPrimaryKeyring, "primary-keyring", "@"),
624   ARGPARSE_s_s (oSecretKeyring, "secret-keyring", "@"),
625   ARGPARSE_s_n (oShowKeyring, "show-keyring", "@"),
626   ARGPARSE_s_s (oDefaultKey, "default-key", "@"),
627
628   ARGPARSE_s_s (oKeyServer, "keyserver", "@"),
629   ARGPARSE_s_s (oKeyServerOptions, "keyserver-options", "@"),
630   ARGPARSE_s_s (oKeyOrigin, "key-origin", "@"),
631   ARGPARSE_s_s (oImportOptions, "import-options", "@"),
632   ARGPARSE_s_s (oImportFilter,  "import-filter", "@"),
633   ARGPARSE_s_s (oExportOptions, "export-options", "@"),
634   ARGPARSE_s_s (oExportFilter,  "export-filter", "@"),
635   ARGPARSE_s_s (oListOptions,   "list-options", "@"),
636   ARGPARSE_s_s (oVerifyOptions, "verify-options", "@"),
637
638   ARGPARSE_s_s (oDisplayCharset, "display-charset", "@"),
639   ARGPARSE_s_s (oDisplayCharset, "charset", "@"),
640   ARGPARSE_s_s (oOptions, "options", "@"),
641
642   ARGPARSE_s_s (oDebug, "debug", "@"),
643   ARGPARSE_s_s (oDebugLevel, "debug-level", "@"),
644   ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
645   ARGPARSE_s_n (oDebugIOLBF, "debug-iolbf", "@"),
646   ARGPARSE_s_u (oDebugSetIobufSize, "debug-set-iobuf-size", "@"),
647   ARGPARSE_s_i (oStatusFD, "status-fd", "@"),
648   ARGPARSE_s_s (oStatusFile, "status-file", "@"),
649   ARGPARSE_s_i (oAttributeFD, "attribute-fd", "@"),
650   ARGPARSE_s_s (oAttributeFile, "attribute-file", "@"),
651
652   ARGPARSE_s_i (oCompletesNeeded, "completes-needed", "@"),
653   ARGPARSE_s_i (oMarginalsNeeded, "marginals-needed", "@"),
654   ARGPARSE_s_i (oMaxCertDepth,  "max-cert-depth", "@" ),
655   ARGPARSE_s_s (oTrustedKey, "trusted-key", "@"),
656
657   ARGPARSE_s_s (oLoadExtension, "load-extension", "@"),  /* Dummy.  */
658
659   ARGPARSE_s_s (oCompliance, "compliance",   "@"),
660   ARGPARSE_s_n (oGnuPG, "gnupg",   "@"),
661   ARGPARSE_s_n (oGnuPG, "no-pgp2", "@"),
662   ARGPARSE_s_n (oGnuPG, "no-pgp6", "@"),
663   ARGPARSE_s_n (oGnuPG, "no-pgp7", "@"),
664   ARGPARSE_s_n (oGnuPG, "no-pgp8", "@"),
665   ARGPARSE_s_n (oRFC2440, "rfc2440", "@"),
666   ARGPARSE_s_n (oRFC4880, "rfc4880", "@"),
667   ARGPARSE_s_n (oRFC4880bis, "rfc4880bis", "@"),
668   ARGPARSE_s_n (oOpenPGP, "openpgp", N_("use strict OpenPGP behavior")),
669   ARGPARSE_s_n (oPGP6, "pgp6", "@"),
670   ARGPARSE_s_n (oPGP7, "pgp7", "@"),
671   ARGPARSE_s_n (oPGP8, "pgp8", "@"),
672
673   ARGPARSE_s_n (oRFC2440Text,      "rfc2440-text", "@"),
674   ARGPARSE_s_n (oNoRFC2440Text, "no-rfc2440-text", "@"),
675   ARGPARSE_s_i (oS2KMode, "s2k-mode", "@"),
676   ARGPARSE_s_s (oS2KDigest, "s2k-digest-algo", "@"),
677   ARGPARSE_s_s (oS2KCipher, "s2k-cipher-algo", "@"),
678   ARGPARSE_s_i (oS2KCount, "s2k-count", "@"),
679   ARGPARSE_s_s (oCipherAlgo, "cipher-algo", "@"),
680   ARGPARSE_s_s (oAEADAlgo,   "aead-algo", "@"),
681   ARGPARSE_s_s (oDigestAlgo, "digest-algo", "@"),
682   ARGPARSE_s_s (oCertDigestAlgo, "cert-digest-algo", "@"),
683   ARGPARSE_s_s (oCompressAlgo,"compress-algo", "@"),
684   ARGPARSE_s_s (oCompressAlgo, "compression-algo", "@"), /* Alias */
685   ARGPARSE_s_n (oThrowKeyids, "throw-keyids", "@"),
686   ARGPARSE_s_n (oNoThrowKeyids, "no-throw-keyids", "@"),
687   ARGPARSE_s_n (oShowPhotos,   "show-photos", "@"),
688   ARGPARSE_s_n (oNoShowPhotos, "no-show-photos", "@"),
689   ARGPARSE_s_s (oPhotoViewer,  "photo-viewer", "@"),
690   ARGPARSE_s_s (oSetNotation,  "set-notation", "@"),
691   ARGPARSE_s_s (oSigNotation,  "sig-notation", "@"),
692   ARGPARSE_s_s (oCertNotation, "cert-notation", "@"),
693
694   ARGPARSE_group (302, N_(
695   "@\n(See the man page for a complete listing of all commands and options)\n"
696                       )),
697
698   ARGPARSE_group (303, N_("@\nExamples:\n\n"
699     " -se -r Bob [file]          sign and encrypt for user Bob\n"
700     " --clear-sign [file]        make a clear text signature\n"
701     " --detach-sign [file]       make a detached signature\n"
702     " --list-keys [names]        show keys\n"
703     " --fingerprint [names]      show fingerprints\n")),
704
705   /* More hidden commands and options. */
706   ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
707 #ifndef NO_TRUST_MODELS
708   ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
709 #endif
710
711   /* Not yet used:
712      ARGPARSE_c (aListTrustPath, "list-trust-path", "@"), */
713   ARGPARSE_c (aDeleteSecretAndPublicKeys,
714               "delete-secret-and-public-keys", "@"),
715   ARGPARSE_c (aRebuildKeydbCaches, "rebuild-keydb-caches", "@"),
716
717   ARGPARSE_s_s (oPassphrase,      "passphrase", "@"),
718   ARGPARSE_s_i (oPassphraseFD,    "passphrase-fd", "@"),
719   ARGPARSE_s_s (oPassphraseFile,  "passphrase-file", "@"),
720   ARGPARSE_s_i (oPassphraseRepeat,"passphrase-repeat", "@"),
721   ARGPARSE_s_s (oPinentryMode,    "pinentry-mode", "@"),
722   ARGPARSE_s_i (oCommandFD, "command-fd", "@"),
723   ARGPARSE_s_s (oCommandFile, "command-file", "@"),
724   ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
725   ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
726
727 #ifndef NO_TRUST_MODELS
728   ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
729   ARGPARSE_s_n (oAutoCheckTrustDB, "auto-check-trustdb", "@"),
730   ARGPARSE_s_n (oNoAutoCheckTrustDB, "no-auto-check-trustdb", "@"),
731   ARGPARSE_s_s (oForceOwnertrust, "force-ownertrust", "@"),
732 #endif
733
734   ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
735   ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
736   ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
737   ARGPARSE_s_n (oNoPermissionWarn, "no-permission-warning", "@"),
738   ARGPARSE_s_n (oNoMDCWarn, "no-mdc-warning", "@"),
739   ARGPARSE_s_n (oNoArmor, "no-armor", "@"),
740   ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
741   ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
742   ARGPARSE_s_n (oNoKeyring, "no-keyring", "@"),
743   ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
744   ARGPARSE_s_n (oNoOptions, "no-options", "@"),
745   ARGPARSE_s_s (oHomedir, "homedir", "@"),
746   ARGPARSE_s_n (oNoBatch, "no-batch", "@"),
747   ARGPARSE_s_n (oWithColons, "with-colons", "@"),
748   ARGPARSE_s_n (oWithTofuInfo,"with-tofu-info", "@"),
749   ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
750   ARGPARSE_s_n (oWithSigList,"with-sig-list", "@"),
751   ARGPARSE_s_n (oWithSigCheck,"with-sig-check", "@"),
752   ARGPARSE_c (aListKeys, "list-key", "@"),   /* alias */
753   ARGPARSE_c (aListSigs, "list-sig", "@"),   /* alias */
754   ARGPARSE_c (aCheckKeys, "check-sig", "@"), /* alias */
755   ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
756   ARGPARSE_s_n (oSkipHiddenRecipients, "skip-hidden-recipients", "@"),
757   ARGPARSE_s_n (oNoSkipHiddenRecipients, "no-skip-hidden-recipients", "@"),
758   ARGPARSE_s_i (oDefCertLevel, "default-cert-check-level", "@"), /* old */
759 #ifndef NO_TRUST_MODELS
760   ARGPARSE_s_n (oAlwaysTrust, "always-trust", "@"),
761 #endif
762   ARGPARSE_s_s (oTrustModel, "trust-model", "@"),
763   ARGPARSE_s_s (oTOFUDefaultPolicy, "tofu-default-policy", "@"),
764   ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
765   ARGPARSE_s_n (oForYourEyesOnly, "for-your-eyes-only", "@"),
766   ARGPARSE_s_n (oNoForYourEyesOnly, "no-for-your-eyes-only", "@"),
767   ARGPARSE_s_s (oSetPolicyURL,  "set-policy-url", "@"),
768   ARGPARSE_s_s (oSigPolicyURL,  "sig-policy-url", "@"),
769   ARGPARSE_s_s (oCertPolicyURL, "cert-policy-url", "@"),
770   ARGPARSE_s_n (oShowPolicyURL,      "show-policy-url", "@"),
771   ARGPARSE_s_n (oNoShowPolicyURL, "no-show-policy-url", "@"),
772   ARGPARSE_s_s (oSigKeyserverURL, "sig-keyserver-url", "@"),
773   ARGPARSE_s_n (oShowNotation,      "show-notation", "@"),
774   ARGPARSE_s_n (oNoShowNotation, "no-show-notation", "@"),
775   ARGPARSE_s_s (oComment, "comment", "@"),
776   ARGPARSE_s_n (oDefaultComment, "default-comment", "@"),
777   ARGPARSE_s_n (oNoComments, "no-comments", "@"),
778   ARGPARSE_s_n (oEmitVersion,      "emit-version", "@"),
779   ARGPARSE_s_n (oNoEmitVersion, "no-emit-version", "@"),
780   ARGPARSE_s_n (oNoEmitVersion, "no-version", "@"), /* alias */
781   ARGPARSE_s_n (oNotDashEscaped, "not-dash-escaped", "@"),
782   ARGPARSE_s_n (oEscapeFrom,      "escape-from-lines", "@"),
783   ARGPARSE_s_n (oNoEscapeFrom, "no-escape-from-lines", "@"),
784   ARGPARSE_s_n (oLockOnce,     "lock-once", "@"),
785   ARGPARSE_s_n (oLockMultiple, "lock-multiple", "@"),
786   ARGPARSE_s_n (oLockNever,    "lock-never", "@"),
787   ARGPARSE_s_i (oLoggerFD,   "logger-fd", "@"),
788   ARGPARSE_s_s (oLoggerFile, "log-file", "@"),
789   ARGPARSE_s_s (oLoggerFile, "logger-file", "@"),  /* 1.4 compatibility.  */
790   ARGPARSE_s_n (oUseEmbeddedFilename,      "use-embedded-filename", "@"),
791   ARGPARSE_s_n (oNoUseEmbeddedFilename, "no-use-embedded-filename", "@"),
792   ARGPARSE_s_n (oUtf8Strings,      "utf8-strings", "@"),
793   ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
794   ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
795   ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprint", "@"),
796   ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprints", "@"),
797   ARGPARSE_s_n (oWithICAOSpelling, "with-icao-spelling", "@"),
798   ARGPARSE_s_n (oWithKeygrip,     "with-keygrip", "@"),
799   ARGPARSE_s_n (oWithKeyScreening,"with-key-screening", "@"),
800   ARGPARSE_s_n (oWithSecret,      "with-secret", "@"),
801   ARGPARSE_s_n (oWithWKDHash,     "with-wkd-hash", "@"),
802   ARGPARSE_s_n (oWithKeyOrigin,   "with-key-origin", "@"),
803   ARGPARSE_s_s (oDisableCipherAlgo,  "disable-cipher-algo", "@"),
804   ARGPARSE_s_s (oDisablePubkeyAlgo,  "disable-pubkey-algo", "@"),
805   ARGPARSE_s_n (oAllowNonSelfsignedUID,      "allow-non-selfsigned-uid", "@"),
806   ARGPARSE_s_n (oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", "@"),
807   ARGPARSE_s_n (oAllowFreeformUID,      "allow-freeform-uid", "@"),
808   ARGPARSE_s_n (oNoAllowFreeformUID, "no-allow-freeform-uid", "@"),
809   ARGPARSE_s_n (oNoLiteral, "no-literal", "@"),
810   ARGPARSE_p_u (oSetFilesize, "set-filesize", "@"),
811   ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
812   ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
813   ARGPARSE_s_n (oLegacyListMode, "legacy-list-mode", "@"),
814   ARGPARSE_s_n (oListOnly, "list-only", "@"),
815   ARGPARSE_s_n (oPrintPKARecords, "print-pka-records", "@"),
816   ARGPARSE_s_n (oPrintDANERecords, "print-dane-records", "@"),
817   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
818   ARGPARSE_s_n (oIgnoreValidFrom,    "ignore-valid-from", "@"),
819   ARGPARSE_s_n (oIgnoreCrcError, "ignore-crc-error", "@"),
820   ARGPARSE_s_n (oIgnoreMDCError, "ignore-mdc-error", "@"),
821   ARGPARSE_s_n (oShowSessionKey, "show-session-key", "@"),
822   ARGPARSE_s_s (oOverrideSessionKey, "override-session-key", "@"),
823   ARGPARSE_s_i (oOverrideSessionKeyFD, "override-session-key-fd", "@"),
824   ARGPARSE_s_n (oNoRandomSeedFile,  "no-random-seed-file", "@"),
825   ARGPARSE_s_n (oAutoKeyRetrieve, "auto-key-retrieve", "@"),
826   ARGPARSE_s_n (oNoAutoKeyRetrieve, "no-auto-key-retrieve", "@"),
827   ARGPARSE_s_n (oNoSigCache,         "no-sig-cache", "@"),
828   ARGPARSE_s_n (oMergeOnly,       "merge-only", "@" ),
829   ARGPARSE_s_n (oAllowSecretKeyImport, "allow-secret-key-import", "@"),
830   ARGPARSE_s_n (oTryAllSecrets,  "try-all-secrets", "@"),
831   ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
832   ARGPARSE_s_n (oNoExpensiveTrustChecks, "no-expensive-trust-checks", "@"),
833   ARGPARSE_s_n (oPreservePermissions, "preserve-permissions", "@"),
834   ARGPARSE_s_s (oDefaultPreferenceList,  "default-preference-list", "@"),
835   ARGPARSE_s_s (oDefaultKeyserverURL,  "default-keyserver-url", "@"),
836   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-preferences","@"),
837   ARGPARSE_s_s (oPersonalAEADPreferences, "personal-aead-preferences","@"),
838   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
839   ARGPARSE_s_s (oPersonalCompressPreferences,
840                                          "personal-compress-preferences", "@"),
841   ARGPARSE_s_s (oFakedSystemTime, "faked-system-time", "@"),
842   ARGPARSE_s_s (oWeakDigest, "weak-digest","@"),
843   ARGPARSE_s_n (oUnwrap, "unwrap", "@"),
844   ARGPARSE_s_n (oOnlySignTextIDs, "only-sign-text-ids", "@"),
845
846   /* Aliases.  I constantly mistype these, and assume other people do
847      as well. */
848   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-prefs", "@"),
849   ARGPARSE_s_s (oPersonalAEADPreferences,   "personal-aead-prefs", "@"),
850   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-prefs", "@"),
851   ARGPARSE_s_s (oPersonalCompressPreferences, "personal-compress-prefs", "@"),
852
853   ARGPARSE_s_s (oAgentProgram, "agent-program", "@"),
854   ARGPARSE_s_s (oDirmngrProgram, "dirmngr-program", "@"),
855   ARGPARSE_s_n (oDisableDirmngr, "disable-dirmngr", "@"),
856   ARGPARSE_s_s (oDisplay,    "display",    "@"),
857   ARGPARSE_s_s (oTTYname,    "ttyname",    "@"),
858   ARGPARSE_s_s (oTTYtype,    "ttytype",    "@"),
859   ARGPARSE_s_s (oLCctype,    "lc-ctype",   "@"),
860   ARGPARSE_s_s (oLCmessages, "lc-messages","@"),
861   ARGPARSE_s_s (oXauthority, "xauthority", "@"),
862   ARGPARSE_s_s (oGroup,      "group",      "@"),
863   ARGPARSE_s_s (oUnGroup,    "ungroup",    "@"),
864   ARGPARSE_s_n (oNoGroups,   "no-groups",  "@"),
865   ARGPARSE_s_n (oStrict,     "strict",     "@"),
866   ARGPARSE_s_n (oNoStrict,   "no-strict",  "@"),
867   ARGPARSE_s_n (oMangleDosFilenames,      "mangle-dos-filenames", "@"),
868   ARGPARSE_s_n (oNoMangleDosFilenames, "no-mangle-dos-filenames", "@"),
869   ARGPARSE_s_n (oEnableProgressFilter, "enable-progress-filter", "@"),
870   ARGPARSE_s_n (oMultifile, "multifile", "@"),
871   ARGPARSE_s_s (oKeyidFormat, "keyid-format", "@"),
872   ARGPARSE_s_n (oExitOnStatusWriteError, "exit-on-status-write-error", "@"),
873   ARGPARSE_s_i (oLimitCardInsertTries, "limit-card-insert-tries", "@"),
874
875   ARGPARSE_s_n (oAllowMultisigVerification,
876                 "allow-multisig-verification", "@"),
877   ARGPARSE_s_n (oEnableLargeRSA, "enable-large-rsa", "@"),
878   ARGPARSE_s_n (oDisableLargeRSA, "disable-large-rsa", "@"),
879   ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
880   ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
881   ARGPARSE_s_n (oAllowMultipleMessages,      "allow-multiple-messages", "@"),
882   ARGPARSE_s_n (oNoAllowMultipleMessages, "no-allow-multiple-messages", "@"),
883   ARGPARSE_s_n (oAllowWeakDigestAlgos, "allow-weak-digest-algos", "@"),
884
885   ARGPARSE_s_s (oDefaultNewKeyAlgo, "default-new-key-algo", "@"),
886
887   /* These two are aliases to help users of the PGP command line
888      product use gpg with minimal pain.  Many commands are common
889      already as they seem to have borrowed commands from us.  Now I'm
890      returning the favor. */
891   ARGPARSE_s_s (oLocalUser, "sign-with", "@"),
892   ARGPARSE_s_s (oRecipient, "user", "@"),
893
894   ARGPARSE_s_n (oRequireCrossCert, "require-backsigs", "@"),
895   ARGPARSE_s_n (oRequireCrossCert, "require-cross-certification", "@"),
896   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-backsigs", "@"),
897   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-cross-certification", "@"),
898
899   /* New options.  Fixme: Should go more to the top.  */
900   ARGPARSE_s_s (oAutoKeyLocate, "auto-key-locate", "@"),
901   ARGPARSE_s_n (oNoAutoKeyLocate, "no-auto-key-locate", "@"),
902   ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
903
904   /* Dummy options with warnings.  */
905   ARGPARSE_s_n (oUseAgent,      "use-agent", "@"),
906   ARGPARSE_s_n (oNoUseAgent, "no-use-agent", "@"),
907   ARGPARSE_s_s (oGpgAgentInfo, "gpg-agent-info", "@"),
908   ARGPARSE_s_s (oReaderPort, "reader-port", "@"),
909   ARGPARSE_s_s (octapiDriver, "ctapi-driver", "@"),
910   ARGPARSE_s_s (opcscDriver, "pcsc-driver", "@"),
911   ARGPARSE_s_n (oDisableCCID, "disable-ccid", "@"),
912   ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
913   ARGPARSE_s_s (oTOFUDBFormat, "tofu-db-format", "@"),
914
915   /* Dummy options.  */
916   ARGPARSE_s_n (oNoop, "sk-comments", "@"),
917   ARGPARSE_s_n (oNoop, "no-sk-comments", "@"),
918   ARGPARSE_s_n (oNoop, "compress-keys", "@"),
919   ARGPARSE_s_n (oNoop, "compress-sigs", "@"),
920   ARGPARSE_s_n (oNoop, "force-v3-sigs", "@"),
921   ARGPARSE_s_n (oNoop, "no-force-v3-sigs", "@"),
922   ARGPARSE_s_n (oNoop, "force-v4-certs", "@"),
923   ARGPARSE_s_n (oNoop, "no-force-v4-certs", "@"),
924
925   ARGPARSE_end ()
926 };
927
928
929 /* The list of supported debug flags.  */
930 static struct debug_flags_s debug_flags [] =
931   {
932     { DBG_PACKET_VALUE , "packet"  },
933     { DBG_MPI_VALUE    , "mpi"     },
934     { DBG_CRYPTO_VALUE , "crypto"  },
935     { DBG_FILTER_VALUE , "filter"  },
936     { DBG_IOBUF_VALUE  , "iobuf"   },
937     { DBG_MEMORY_VALUE , "memory"  },
938     { DBG_CACHE_VALUE  , "cache"   },
939     { DBG_MEMSTAT_VALUE, "memstat" },
940     { DBG_TRUST_VALUE  , "trust"   },
941     { DBG_HASHING_VALUE, "hashing" },
942     { DBG_IPC_VALUE    , "ipc"     },
943     { DBG_CLOCK_VALUE  , "clock"   },
944     { DBG_LOOKUP_VALUE , "lookup"  },
945     { DBG_EXTPROG_VALUE, "extprog" },
946     { 0, NULL }
947   };
948
949
950 #ifdef ENABLE_SELINUX_HACKS
951 #define ALWAYS_ADD_KEYRINGS 1
952 #else
953 #define ALWAYS_ADD_KEYRINGS 0
954 #endif
955
956
957 int g10_errors_seen = 0;
958
959 static int utf8_strings = 0;
960 static int maybe_setuid = 1;
961 static unsigned int opt_set_iobuf_size;
962 static unsigned int opt_set_iobuf_size_used;
963
964 static char *build_list( const char *text, char letter,
965                          const char *(*mapf)(int), int (*chkf)(int) );
966 static void set_cmd( enum cmd_and_opt_values *ret_cmd,
967                         enum cmd_and_opt_values new_cmd );
968 static void print_mds( const char *fname, int algo );
969 static void add_notation_data( const char *string, int which );
970 static void add_policy_url( const char *string, int which );
971 static void add_keyserver_url( const char *string, int which );
972 static void emergency_cleanup (void);
973 static void read_sessionkey_from_fd (int fd);
974
975
976 static char *
977 make_libversion (const char *libname, const char *(*getfnc)(const char*))
978 {
979   const char *s;
980   char *result;
981
982   if (maybe_setuid)
983     {
984       gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
985       maybe_setuid = 0;
986     }
987   s = getfnc (NULL);
988   result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
989   strcpy (stpcpy (stpcpy (result, libname), " "), s);
990   return result;
991 }
992
993
994 static int
995 build_list_pk_test_algo (int algo)
996 {
997   /* Show only one "RSA" string.  If RSA_E or RSA_S is available RSA
998      is also available.  */
999   if (algo == PUBKEY_ALGO_RSA_E
1000       || algo == PUBKEY_ALGO_RSA_S)
1001     return GPG_ERR_DIGEST_ALGO;
1002
1003   return openpgp_pk_test_algo (algo);
1004 }
1005
1006 static const char *
1007 build_list_pk_algo_name (int algo)
1008 {
1009   return openpgp_pk_algo_name (algo);
1010 }
1011
1012 static int
1013 build_list_cipher_test_algo (int algo)
1014 {
1015   return openpgp_cipher_test_algo (algo);
1016 }
1017
1018 static const char *
1019 build_list_cipher_algo_name (int algo)
1020 {
1021   return openpgp_cipher_algo_name (algo);
1022 }
1023
1024 static int
1025 build_list_aead_test_algo (int algo)
1026 {
1027   return openpgp_aead_test_algo (algo);
1028 }
1029
1030 static const char *
1031 build_list_aead_algo_name (int algo)
1032 {
1033   return openpgp_aead_algo_name (algo);
1034 }
1035
1036 static int
1037 build_list_md_test_algo (int algo)
1038 {
1039   /* By default we do not accept MD5 based signatures.  To avoid
1040      confusion we do not announce support for it either.  */
1041   if (algo == DIGEST_ALGO_MD5)
1042     return GPG_ERR_DIGEST_ALGO;
1043
1044   return openpgp_md_test_algo (algo);
1045 }
1046
1047 static const char *
1048 build_list_md_algo_name (int algo)
1049 {
1050   return openpgp_md_algo_name (algo);
1051 }
1052
1053
1054 static const char *
1055 my_strusage( int level )
1056 {
1057   static char *digests, *pubkeys, *ciphers, *zips, *aeads, *ver_gcry;
1058   const char *p;
1059
1060     switch( level ) {
1061       case 11: p = "@GPG@ (@GNUPG@)";
1062         break;
1063       case 13: p = VERSION; break;
1064       case 17: p = PRINTABLE_OS_NAME; break;
1065       case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
1066
1067     case 20:
1068       if (!ver_gcry)
1069         ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
1070       p = ver_gcry;
1071       break;
1072
1073 #ifdef IS_DEVELOPMENT_VERSION
1074       case 25:
1075         p="NOTE: THIS IS A DEVELOPMENT VERSION!";
1076         break;
1077       case 26:
1078         p="It is only intended for test purposes and should NOT be";
1079         break;
1080       case 27:
1081         p="used in a production environment or with production keys!";
1082         break;
1083 #endif
1084
1085       case 1:
1086       case 40:  p =
1087             _("Usage: @GPG@ [options] [files] (-h for help)");
1088         break;
1089       case 41:  p =
1090             _("Syntax: @GPG@ [options] [files]\n"
1091               "Sign, check, encrypt or decrypt\n"
1092               "Default operation depends on the input data\n");
1093         break;
1094
1095       case 31: p = "\nHome: "; break;
1096 #ifndef __riscos__
1097       case 32: p = gnupg_homedir (); break;
1098 #else /* __riscos__ */
1099       case 32: p = make_filename(gnupg_homedir (), NULL); break;
1100 #endif /* __riscos__ */
1101       case 33: p = _("\nSupported algorithms:\n"); break;
1102       case 34:
1103         if (!pubkeys)
1104             pubkeys = build_list (_("Pubkey: "), 1,
1105                                   build_list_pk_algo_name,
1106                                   build_list_pk_test_algo );
1107         p = pubkeys;
1108         break;
1109       case 35:
1110         if( !ciphers )
1111             ciphers = build_list(_("Cipher: "), 'S',
1112                                  build_list_cipher_algo_name,
1113                                  build_list_cipher_test_algo );
1114         p = ciphers;
1115         break;
1116       case 36:
1117         if (!aeads)
1118           aeads = build_list ("AEAD: ", 'A',
1119                               build_list_aead_algo_name,
1120                               build_list_aead_test_algo);
1121         p = aeads;
1122         break;
1123       case 37:
1124         if( !digests )
1125             digests = build_list(_("Hash: "), 'H',
1126                                  build_list_md_algo_name,
1127                                  build_list_md_test_algo );
1128         p = digests;
1129         break;
1130       case 38:
1131         if( !zips )
1132             zips = build_list(_("Compression: "),'Z',
1133                               compress_algo_to_string,
1134                               check_compress_algo);
1135         p = zips;
1136         break;
1137
1138       default:  p = NULL;
1139     }
1140     return p;
1141 }
1142
1143
1144 static char *
1145 build_list (const char *text, char letter,
1146             const char * (*mapf)(int), int (*chkf)(int))
1147 {
1148   membuf_t mb;
1149   int indent;
1150   int i, j, len;
1151   int limit;
1152   const char *s;
1153   char *string;
1154
1155   if (maybe_setuid)
1156     gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
1157
1158   indent = utf8_charcount (text, -1);
1159   len = 0;
1160   init_membuf (&mb, 512);
1161
1162   limit = (letter == 'A')? 4 : 110;
1163   for (i=0; i <= limit; i++ )
1164     {
1165       if (!chkf (i) && (s = mapf (i)))
1166         {
1167           if (mb.len - len > 60)
1168             {
1169               put_membuf_str (&mb, ",\n");
1170               len = mb.len;
1171               for (j=0; j < indent; j++)
1172                 put_membuf_str (&mb, " ");
1173             }
1174           else if (mb.len)
1175             put_membuf_str (&mb, ", ");
1176           else
1177             put_membuf_str (&mb, text);
1178
1179           put_membuf_str (&mb, s);
1180           if (opt.verbose && letter)
1181             {
1182               char num[20];
1183               if (letter == 1)
1184                 snprintf (num, sizeof num, " (%d)", i);
1185               else
1186                 snprintf (num, sizeof num, " (%c%d)", letter, i);
1187               put_membuf_str (&mb, num);
1188             }
1189         }
1190     }
1191   if (mb.len)
1192     put_membuf_str (&mb, "\n");
1193   put_membuf (&mb, "", 1);
1194
1195   string = get_membuf (&mb, NULL);
1196   return xrealloc (string, strlen (string)+1);
1197 }
1198
1199
1200 static void
1201 wrong_args( const char *text)
1202 {
1203   es_fprintf (es_stderr, _("usage: %s [options] %s\n"), GPG_NAME, text);
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.force_mdc = 1;
2201       opt.def_aead_algo = 0;
2202       /* Fixme: Change other options.  */
2203       break;
2204
2205     default:
2206       BUG ();
2207     }
2208 }
2209
2210
2211
2212
2213
2214
2215 /* This function called to initialized a new control object.  It is
2216    assumed that this object has been zeroed out before calling this
2217    function. */
2218 static void
2219 gpg_init_default_ctrl (ctrl_t ctrl)
2220 {
2221   ctrl->magic = SERVER_CONTROL_MAGIC;
2222 }
2223
2224
2225 /* This function is called to deinitialize a control object.  It is
2226    not deallocated. */
2227 static void
2228 gpg_deinit_default_ctrl (ctrl_t ctrl)
2229 {
2230 #ifdef USE_TOFU
2231   tofu_closedbs (ctrl);
2232 #endif
2233   gpg_dirmngr_deinit_session_data (ctrl);
2234
2235   keydb_release (ctrl->cached_getkey_kdb);
2236 }
2237
2238
2239 char *
2240 get_default_configname (void)
2241 {
2242   char *configname = NULL;
2243   char *name = xstrdup (GPG_NAME EXTSEP_S "conf-" SAFE_VERSION);
2244   char *ver = &name[strlen (GPG_NAME EXTSEP_S "conf-")];
2245
2246   do
2247     {
2248       if (configname)
2249         {
2250           char *tok;
2251
2252           xfree (configname);
2253           configname = NULL;
2254
2255           if ((tok = strrchr (ver, SAFE_VERSION_DASH)))
2256             *tok='\0';
2257           else if ((tok = strrchr (ver, SAFE_VERSION_DOT)))
2258             *tok='\0';
2259           else
2260             break;
2261         }
2262
2263       configname = make_filename (gnupg_homedir (), name, NULL);
2264     }
2265   while (access (configname, R_OK));
2266
2267   xfree(name);
2268
2269   if (! configname)
2270     configname = make_filename (gnupg_homedir (),
2271                                 GPG_NAME EXTSEP_S "conf", NULL);
2272   if (! access (configname, R_OK))
2273     {
2274       /* Print a warning when both config files are present.  */
2275       char *p = make_filename (gnupg_homedir (), "options", NULL);
2276       if (! access (p, R_OK))
2277         log_info (_("Note: old default options file '%s' ignored\n"), p);
2278       xfree (p);
2279     }
2280   else
2281     {
2282       /* Use the old default only if it exists.  */
2283       char *p = make_filename (gnupg_homedir (), "options", NULL);
2284       if (!access (p, R_OK))
2285         {
2286           xfree (configname);
2287           configname = p;
2288         }
2289       else
2290         xfree (p);
2291     }
2292
2293   return configname;
2294 }
2295
2296 int
2297 main (int argc, char **argv)
2298 {
2299     ARGPARSE_ARGS pargs;
2300     IOBUF a;
2301     int rc=0;
2302     int orig_argc;
2303     char **orig_argv;
2304     const char *fname;
2305     char *username;
2306     int may_coredump;
2307     strlist_t sl;
2308     strlist_t remusr = NULL;
2309     strlist_t locusr = NULL;
2310     strlist_t nrings = NULL;
2311     armor_filter_context_t *afx = NULL;
2312     int detached_sig = 0;
2313     FILE *configfp = NULL;
2314     char *configname = NULL;
2315     char *save_configname = NULL;
2316     char *default_configname = NULL;
2317     unsigned configlineno;
2318     int parse_debug = 0;
2319     int default_config = 1;
2320     int default_keyring = 1;
2321     int greeting = 0;
2322     int nogreeting = 0;
2323     char *logfile = NULL;
2324     int use_random_seed = 1;
2325     enum cmd_and_opt_values cmd = 0;
2326     const char *debug_level = NULL;
2327 #ifndef NO_TRUST_MODELS
2328     const char *trustdb_name = NULL;
2329 #endif /*!NO_TRUST_MODELS*/
2330     char *def_cipher_string = NULL;
2331     char *def_aead_string = NULL;
2332     char *def_digest_string = NULL;
2333     char *compress_algo_string = NULL;
2334     char *cert_digest_string = NULL;
2335     char *s2k_cipher_string = NULL;
2336     char *s2k_digest_string = NULL;
2337     char *pers_cipher_list = NULL;
2338     char *pers_aead_list = NULL;
2339     char *pers_digest_list = NULL;
2340     char *pers_compress_list = NULL;
2341     int eyes_only=0;
2342     int multifile=0;
2343     int pwfd = -1;
2344     int ovrseskeyfd = -1;
2345     int fpr_maybe_cmd = 0; /* --fingerprint maybe a command.  */
2346     int any_explicit_recipient = 0;
2347     int default_akl = 1;
2348     int require_secmem = 0;
2349     int got_secmem = 0;
2350     struct assuan_malloc_hooks malloc_hooks;
2351     ctrl_t ctrl;
2352
2353     static int print_dane_records;
2354     static int print_pka_records;
2355
2356
2357 #ifdef __riscos__
2358     opt.lock_once = 1;
2359 #endif /* __riscos__ */
2360
2361     /* Please note that we may running SUID(ROOT), so be very CAREFUL
2362        when adding any stuff between here and the call to
2363        secmem_init() somewhere after the option parsing. */
2364     early_system_init ();
2365     gnupg_reopen_std (GPG_NAME);
2366     trap_unaligned ();
2367     gnupg_rl_initialize ();
2368     set_strusage (my_strusage);
2369     gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
2370     log_set_prefix (GPG_NAME, GPGRT_LOG_WITH_PREFIX);
2371
2372     /* Make sure that our subsystems are ready.  */
2373     i18n_init();
2374     init_common_subsystems (&argc, &argv);
2375
2376     /* Use our own logging handler for Libcgrypt.  */
2377     setup_libgcrypt_logging ();
2378
2379     /* Put random number into secure memory */
2380     gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
2381
2382     may_coredump = disable_core_dumps();
2383
2384     gnupg_init_signals (0, emergency_cleanup);
2385
2386     dotlock_create (NULL, 0); /* Register lock file cleanup. */
2387
2388     /* Tell the compliance module who we are.  */
2389     gnupg_initialize_compliance (GNUPG_MODULE_NAME_GPG);
2390
2391     opt.autostart = 1;
2392     opt.session_env = session_env_new ();
2393     if (!opt.session_env)
2394       log_fatal ("error allocating session environment block: %s\n",
2395                  strerror (errno));
2396
2397     opt.command_fd = -1; /* no command fd */
2398     opt.compress_level = -1; /* defaults to standard compress level */
2399     opt.bz2_compress_level = -1; /* defaults to standard compress level */
2400     /* note: if you change these lines, look at oOpenPGP */
2401     opt.def_cipher_algo = 0;
2402     opt.def_aead_algo = 0;
2403     opt.def_digest_algo = 0;
2404     opt.cert_digest_algo = 0;
2405     opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
2406     opt.s2k_mode = 3; /* iterated+salted */
2407     opt.s2k_count = 0; /* Auto-calibrate when needed.  */
2408     opt.s2k_cipher_algo = DEFAULT_CIPHER_ALGO;
2409     opt.completes_needed = 1;
2410     opt.marginals_needed = 3;
2411     opt.max_cert_depth = 5;
2412     opt.escape_from = 1;
2413     opt.flags.require_cross_cert = 1;
2414     opt.import_options = IMPORT_REPAIR_KEYS;
2415     opt.export_options = EXPORT_ATTRIBUTES;
2416     opt.keyserver_options.import_options = (IMPORT_REPAIR_KEYS
2417                                             | IMPORT_REPAIR_PKS_SUBKEY_BUG);
2418     opt.keyserver_options.export_options = EXPORT_ATTRIBUTES;
2419     opt.keyserver_options.options = KEYSERVER_HONOR_PKA_RECORD;
2420     opt.verify_options = (LIST_SHOW_UID_VALIDITY
2421                           | VERIFY_SHOW_POLICY_URLS
2422                           | VERIFY_SHOW_STD_NOTATIONS
2423                           | VERIFY_SHOW_KEYSERVER_URLS);
2424     opt.list_options   = (LIST_SHOW_UID_VALIDITY
2425                           | LIST_SHOW_USAGE);
2426 #ifdef NO_TRUST_MODELS
2427     opt.trust_model = TM_ALWAYS;
2428 #else
2429     opt.trust_model = TM_AUTO;
2430 #endif
2431     opt.tofu_default_policy = TOFU_POLICY_AUTO;
2432     opt.mangle_dos_filenames = 0;
2433     opt.min_cert_level = 2;
2434     set_screen_dimensions ();
2435     opt.keyid_format = KF_NONE;
2436     opt.def_sig_expire = "0";
2437     opt.def_cert_expire = "0";
2438     gnupg_set_homedir (NULL);
2439     opt.passphrase_repeat = 1;
2440     opt.emit_version = 0;
2441     opt.weak_digests = NULL;
2442
2443     /* Check whether we have a config file on the command line.  */
2444     orig_argc = argc;
2445     orig_argv = argv;
2446     pargs.argc = &argc;
2447     pargs.argv = &argv;
2448     pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
2449     while( arg_parse( &pargs, opts) ) {
2450         if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
2451             parse_debug++;
2452         else if (pargs.r_opt == oDebugIOLBF)
2453             es_setvbuf (es_stdout, NULL, _IOLBF, 0);
2454         else if( pargs.r_opt == oOptions ) {
2455             /* yes there is one, so we do not try the default one, but
2456              * read the option file when it is encountered at the commandline
2457              */
2458             default_config = 0;
2459         }
2460         else if( pargs.r_opt == oNoOptions )
2461           {
2462             default_config = 0; /* --no-options */
2463             opt.no_homedir_creation = 1;
2464           }
2465         else if( pargs.r_opt == oHomedir )
2466             gnupg_set_homedir (pargs.r.ret_str);
2467         else if( pargs.r_opt == oNoPermissionWarn )
2468             opt.no_perm_warn=1;
2469         else if (pargs.r_opt == oStrict )
2470           {
2471             /* Not used */
2472           }
2473         else if (pargs.r_opt == oNoStrict )
2474           {
2475             /* Not used */
2476           }
2477     }
2478
2479 #ifdef HAVE_DOSISH_SYSTEM
2480     if ( strchr (gnupg_homedir (), '\\') ) {
2481       char *d, *buf = xmalloc (strlen (gnupg_homedir ())+1);
2482       const char *s;
2483       for (d=buf, s = gnupg_homedir (); *s; s++)
2484           {
2485             *d++ = *s == '\\'? '/': *s;
2486 #ifdef HAVE_W32_SYSTEM
2487             if (s[1] && IsDBCSLeadByte (*s))
2488               *d++ = *++s;
2489 #endif
2490           }
2491         *d = 0;
2492         gnupg_set_homedir (buf);
2493     }
2494 #endif
2495
2496     /* Initialize the secure memory. */
2497     if (!gcry_control (GCRYCTL_INIT_SECMEM, SECMEM_BUFFER_SIZE, 0))
2498       got_secmem = 1;
2499 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
2500     /* There should be no way to get to this spot while still carrying
2501        setuid privs.  Just in case, bomb out if we are. */
2502     if ( getuid () != geteuid () )
2503       BUG ();
2504 #endif
2505     maybe_setuid = 0;
2506
2507     /* Okay, we are now working under our real uid */
2508
2509     /* malloc hooks go here ... */
2510     malloc_hooks.malloc = gcry_malloc;
2511     malloc_hooks.realloc = gcry_realloc;
2512     malloc_hooks.free = gcry_free;
2513     assuan_set_malloc_hooks (&malloc_hooks);
2514     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
2515     setup_libassuan_logging (&opt.debug, NULL);
2516
2517     /* Set default options which require that malloc stuff is ready.  */
2518     additional_weak_digest ("MD5");
2519     parse_auto_key_locate ("local,wkd");
2520
2521     /* Try for a version specific config file first */
2522     default_configname = get_default_configname ();
2523     if (default_config)
2524       configname = xstrdup (default_configname);
2525
2526     argc = orig_argc;
2527     argv = orig_argv;
2528     pargs.argc = &argc;
2529     pargs.argv = &argv;
2530     pargs.flags= ARGPARSE_FLAG_KEEP;
2531
2532     /* By this point we have a homedir, and cannot change it. */
2533     check_permissions (gnupg_homedir (), 0);
2534
2535   next_pass:
2536     if( configname ) {
2537       if(check_permissions(configname,1))
2538         {
2539           /* If any options file is unsafe, then disable any external
2540              programs for keyserver calls or photo IDs.  Since the
2541              external program to call is set in the options file, a
2542              unsafe options file can lead to an arbitrary program
2543              being run. */
2544
2545           opt.exec_disable=1;
2546         }
2547
2548         configlineno = 0;
2549         configfp = fopen( configname, "r" );
2550         if (configfp && is_secured_file (fileno (configfp)))
2551           {
2552             fclose (configfp);
2553             configfp = NULL;
2554             gpg_err_set_errno (EPERM);
2555           }
2556         if( !configfp ) {
2557             if( default_config ) {
2558                 if( parse_debug )
2559                     log_info(_("Note: no default option file '%s'\n"),
2560                                                             configname );
2561             }
2562             else {
2563                 log_error(_("option file '%s': %s\n"),
2564                                     configname, strerror(errno) );
2565                 g10_exit(2);
2566             }
2567             xfree(configname); configname = NULL;
2568         }
2569         if( parse_debug && configname )
2570             log_info(_("reading options from '%s'\n"), configname );
2571         default_config = 0;
2572     }
2573
2574     while( optfile_parse( configfp, configname, &configlineno,
2575                                                 &pargs, opts) )
2576       {
2577         switch( pargs.r_opt )
2578           {
2579           case aListConfig:
2580           case aListGcryptConfig:
2581           case aGPGConfList:
2582           case aGPGConfTest:
2583             set_cmd (&cmd, pargs.r_opt);
2584             /* Do not register a keyring for these commands.  */
2585             default_keyring = -1;
2586             break;
2587
2588           case aCheckKeys:
2589           case aListPackets:
2590           case aImport:
2591           case aFastImport:
2592           case aSendKeys:
2593           case aRecvKeys:
2594           case aSearchKeys:
2595           case aRefreshKeys:
2596           case aFetchKeys:
2597           case aExport:
2598 #ifdef ENABLE_CARD_SUPPORT
2599           case aCardStatus:
2600           case aCardEdit:
2601           case aChangePIN:
2602 #endif /* ENABLE_CARD_SUPPORT*/
2603           case aListKeys:
2604           case aLocateKeys:
2605           case aListSigs:
2606           case aExportSecret:
2607           case aExportSecretSub:
2608           case aExportSshKey:
2609           case aSym:
2610           case aClearsign:
2611           case aGenRevoke:
2612           case aDesigRevoke:
2613           case aPrimegen:
2614           case aGenRandom:
2615           case aPrintMD:
2616           case aPrintMDs:
2617           case aListTrustDB:
2618           case aCheckTrustDB:
2619           case aUpdateTrustDB:
2620           case aFixTrustDB:
2621           case aListTrustPath:
2622           case aDeArmor:
2623           case aEnArmor:
2624           case aSign:
2625           case aQuickSignKey:
2626           case aQuickLSignKey:
2627           case aSignKey:
2628           case aLSignKey:
2629           case aStore:
2630           case aQuickKeygen:
2631           case aQuickAddUid:
2632           case aQuickAddKey:
2633           case aQuickRevUid:
2634           case aQuickSetExpire:
2635           case aQuickSetPrimaryUid:
2636           case aExportOwnerTrust:
2637           case aImportOwnerTrust:
2638           case aRebuildKeydbCaches:
2639             set_cmd (&cmd, pargs.r_opt);
2640             break;
2641
2642           case aKeygen:
2643           case aFullKeygen:
2644           case aEditKey:
2645           case aDeleteSecretKeys:
2646           case aDeleteSecretAndPublicKeys:
2647           case aDeleteKeys:
2648           case aPasswd:
2649             set_cmd (&cmd, pargs.r_opt);
2650             greeting=1;
2651             break;
2652
2653           case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
2654
2655           case aDecryptFiles: multifile=1; /* fall through */
2656           case aDecrypt: set_cmd( &cmd, aDecrypt); break;
2657
2658           case aEncrFiles: multifile=1; /* fall through */
2659           case aEncr: set_cmd( &cmd, aEncr); break;
2660
2661           case aVerifyFiles: multifile=1; /* fall through */
2662           case aVerify: set_cmd( &cmd, aVerify); break;
2663
2664           case aServer:
2665             set_cmd (&cmd, pargs.r_opt);
2666             opt.batch = 1;
2667             break;
2668
2669           case aTOFUPolicy:
2670             set_cmd (&cmd, pargs.r_opt);
2671             break;
2672
2673           case oArmor: opt.armor = 1; opt.no_armor=0; break;
2674           case oOutput: opt.outfile = pargs.r.ret_str; break;
2675
2676           case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
2677
2678           case oInputSizeHint:
2679             opt.input_size_hint = string_to_u64 (pargs.r.ret_str);
2680             break;
2681
2682           case oChunkSize:
2683             opt.chunk_size = pargs.r.ret_int;
2684             break;
2685
2686           case oQuiet: opt.quiet = 1; break;
2687           case oNoTTY: tty_no_terminal(1); break;
2688           case oDryRun: opt.dry_run = 1; break;
2689           case oInteractive: opt.interactive = 1; break;
2690           case oVerbose:
2691             opt.verbose++;
2692             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2693             opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
2694             opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
2695             break;
2696
2697           case oBatch:
2698             opt.batch = 1;
2699             nogreeting = 1;
2700             break;
2701
2702           case oUseAgent: /* Dummy. */
2703             break;
2704
2705           case oNoUseAgent:
2706             obsolete_option (configname, configlineno, "no-use-agent");
2707             break;
2708           case oGpgAgentInfo:
2709             obsolete_option (configname, configlineno, "gpg-agent-info");
2710             break;
2711           case oReaderPort:
2712             obsolete_scdaemon_option (configname, configlineno, "reader-port");
2713             break;
2714           case octapiDriver:
2715             obsolete_scdaemon_option (configname, configlineno, "ctapi-driver");
2716             break;
2717           case opcscDriver:
2718             obsolete_scdaemon_option (configname, configlineno, "pcsc-driver");
2719             break;
2720           case oDisableCCID:
2721             obsolete_scdaemon_option (configname, configlineno, "disable-ccid");
2722             break;
2723           case oHonorHttpProxy:
2724             obsolete_option (configname, configlineno, "honor-http-proxy");
2725             break;
2726
2727           case oAnswerYes: opt.answer_yes = 1; break;
2728           case oAnswerNo: opt.answer_no = 1; break;
2729           case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
2730           case oPrimaryKeyring:
2731             sl = append_to_strlist (&nrings, pargs.r.ret_str);
2732             sl->flags = KEYDB_RESOURCE_FLAG_PRIMARY;
2733             break;
2734           case oShowKeyring:
2735             deprecated_warning(configname,configlineno,"--show-keyring",
2736                                "--list-options ","show-keyring");
2737             opt.list_options|=LIST_SHOW_KEYRING;
2738             break;
2739
2740           case oDebug:
2741             if (parse_debug_flag (pargs.r.ret_str, &opt.debug, debug_flags))
2742               {
2743                 pargs.r_opt = ARGPARSE_INVALID_ARG;
2744                 pargs.err = ARGPARSE_PRINT_ERROR;
2745               }
2746             break;
2747
2748           case oDebugAll: opt.debug = ~0; break;
2749           case oDebugLevel: debug_level = pargs.r.ret_str; break;
2750
2751           case oDebugIOLBF: break; /* Already set in pre-parse step.  */
2752
2753           case oDebugSetIobufSize:
2754             opt_set_iobuf_size = pargs.r.ret_ulong;
2755             opt_set_iobuf_size_used = 1;
2756             break;
2757
2758           case oStatusFD:
2759             set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2760             break;
2761           case oStatusFile:
2762             set_status_fd ( open_info_file (pargs.r.ret_str, 1, 0) );
2763             break;
2764           case oAttributeFD:
2765             set_attrib_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2766             break;
2767           case oAttributeFile:
2768             set_attrib_fd ( open_info_file (pargs.r.ret_str, 1, 1) );
2769             break;
2770           case oLoggerFD:
2771             log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
2772             break;
2773           case oLoggerFile:
2774             logfile = pargs.r.ret_str;
2775             break;
2776
2777           case oWithFingerprint:
2778             opt.with_fingerprint = 1;
2779             opt.fingerprint++;
2780             break;
2781           case oWithSubkeyFingerprint:
2782             opt.with_subkey_fingerprint = 1;
2783             break;
2784           case oWithICAOSpelling:
2785             opt.with_icao_spelling = 1;
2786             break;
2787           case oFingerprint:
2788             opt.fingerprint++;
2789             fpr_maybe_cmd = 1;
2790             break;
2791
2792           case oWithKeygrip:
2793             opt.with_keygrip = 1;
2794             break;
2795
2796           case oWithKeyScreening:
2797             opt.with_key_screening = 1;
2798             break;
2799
2800           case oWithSecret:
2801             opt.with_secret = 1;
2802             break;
2803
2804           case oWithWKDHash:
2805             opt.with_wkd_hash = 1;
2806             break;
2807
2808           case oWithKeyOrigin:
2809             opt.with_key_origin = 1;
2810             break;
2811
2812           case oSecretKeyring:
2813             /* Ignore this old option.  */
2814             break;
2815
2816           case oOptions:
2817             /* config files may not be nested (silently ignore them) */
2818             if( !configfp ) {
2819                 xfree(configname);
2820                 configname = xstrdup(pargs.r.ret_str);
2821                 goto next_pass;
2822             }
2823             break;
2824           case oNoArmor: opt.no_armor=1; opt.armor=0; break;
2825
2826           case oNoDefKeyring:
2827             if (default_keyring > 0)
2828               default_keyring = 0;
2829             break;
2830           case oNoKeyring:
2831             default_keyring = -1;
2832             break;
2833
2834           case oNoGreeting: nogreeting = 1; break;
2835           case oNoVerbose:
2836             opt.verbose = 0;
2837             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2838             opt.list_sigs=0;
2839             break;
2840           case oQuickRandom:
2841             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
2842             break;
2843           case oEmitVersion: opt.emit_version++; break;
2844           case oNoEmitVersion: opt.emit_version=0; break;
2845           case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
2846           case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
2847           case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
2848
2849 #ifndef NO_TRUST_MODELS
2850           case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
2851
2852 #endif /*!NO_TRUST_MODELS*/
2853           case oDefaultKey:
2854             sl = add_to_strlist (&opt.def_secret_key, pargs.r.ret_str);
2855             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
2856             if (configfp)
2857               sl->flags |= PK_LIST_CONFIG;
2858             break;
2859           case oDefRecipient:
2860             if( *pargs.r.ret_str )
2861               {
2862                 xfree (opt.def_recipient);
2863                 opt.def_recipient = make_username(pargs.r.ret_str);
2864               }
2865             break;
2866           case oDefRecipientSelf:
2867             xfree(opt.def_recipient); opt.def_recipient = NULL;
2868             opt.def_recipient_self = 1;
2869             break;
2870           case oNoDefRecipient:
2871             xfree(opt.def_recipient); opt.def_recipient = NULL;
2872             opt.def_recipient_self = 0;
2873             break;
2874           case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
2875           case oHomedir: break;
2876           case oNoBatch: opt.batch = 0; break;
2877
2878           case oWithTofuInfo: opt.with_tofu_info = 1; break;
2879
2880           case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
2881           case oWithColons: opt.with_colons=':'; break;
2882
2883           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
2884           case oWithSigList: opt.list_sigs = 1; break;
2885
2886           case oSkipVerify: opt.skip_verify=1; break;
2887
2888           case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
2889           case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
2890
2891           case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
2892
2893 #ifndef NO_TRUST_MODELS
2894             /* There are many programs (like mutt) that call gpg with
2895                --always-trust so keep this option around for a long
2896                time. */
2897           case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
2898           case oTrustModel:
2899             parse_trust_model(pargs.r.ret_str);
2900             break;
2901 #endif /*!NO_TRUST_MODELS*/
2902           case oTOFUDefaultPolicy:
2903             opt.tofu_default_policy = parse_tofu_policy (pargs.r.ret_str);
2904             break;
2905           case oTOFUDBFormat:
2906             obsolete_option (configname, configlineno, "tofu-db-format");
2907             break;
2908
2909           case oForceOwnertrust:
2910             log_info(_("Note: %s is not for normal use!\n"),
2911                      "--force-ownertrust");
2912             opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
2913             if(opt.force_ownertrust==-1)
2914               {
2915                 log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
2916                 opt.force_ownertrust=0;
2917               }
2918             break;
2919           case oLoadExtension:
2920             /* Dummy so that gpg 1.4 conf files can work. Should
2921                eventually be removed.  */
2922             break;
2923
2924           case oCompliance:
2925             {
2926               int compliance = gnupg_parse_compliance_option
2927                 (pargs.r.ret_str,
2928                  compliance_options, DIM (compliance_options),
2929                  opt.quiet);
2930               if (compliance < 0)
2931                 g10_exit (1);
2932               set_compliance_option (compliance);
2933             }
2934             break;
2935           case oOpenPGP:
2936           case oRFC2440:
2937           case oRFC4880:
2938           case oRFC4880bis:
2939           case oPGP6:
2940           case oPGP7:
2941           case oPGP8:
2942           case oGnuPG:
2943             set_compliance_option (pargs.r_opt);
2944             break;
2945
2946           case oRFC2440Text: opt.rfc2440_text=1; break;
2947           case oNoRFC2440Text: opt.rfc2440_text=0; break;
2948
2949           case oSetFilename:
2950             if(utf8_strings)
2951               opt.set_filename = pargs.r.ret_str;
2952             else
2953               opt.set_filename = native_to_utf8(pargs.r.ret_str);
2954             break;
2955           case oForYourEyesOnly: eyes_only = 1; break;
2956           case oNoForYourEyesOnly: eyes_only = 0; break;
2957           case oSetPolicyURL:
2958             add_policy_url(pargs.r.ret_str,0);
2959             add_policy_url(pargs.r.ret_str,1);
2960             break;
2961           case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
2962           case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
2963           case oShowPolicyURL:
2964             deprecated_warning(configname,configlineno,"--show-policy-url",
2965                                "--list-options ","show-policy-urls");
2966             deprecated_warning(configname,configlineno,"--show-policy-url",
2967                                "--verify-options ","show-policy-urls");
2968             opt.list_options|=LIST_SHOW_POLICY_URLS;
2969             opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
2970             break;
2971           case oNoShowPolicyURL:
2972             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2973                                "--list-options ","no-show-policy-urls");
2974             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2975                                "--verify-options ","no-show-policy-urls");
2976             opt.list_options&=~LIST_SHOW_POLICY_URLS;
2977             opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
2978             break;
2979           case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
2980           case oUseEmbeddedFilename:
2981             opt.flags.use_embedded_filename=1;
2982             break;
2983           case oNoUseEmbeddedFilename:
2984             opt.flags.use_embedded_filename=0;
2985             break;
2986           case oComment:
2987             if(pargs.r.ret_str[0])
2988               append_to_strlist(&opt.comments,pargs.r.ret_str);
2989             break;
2990           case oDefaultComment:
2991             deprecated_warning(configname,configlineno,
2992                                "--default-comment","--no-comments","");
2993             /* fall through */
2994           case oNoComments:
2995             free_strlist(opt.comments);
2996             opt.comments=NULL;
2997             break;
2998           case oThrowKeyids: opt.throw_keyids = 1; break;
2999           case oNoThrowKeyids: opt.throw_keyids = 0; break;
3000           case oShowPhotos:
3001             deprecated_warning(configname,configlineno,"--show-photos",
3002                                "--list-options ","show-photos");
3003             deprecated_warning(configname,configlineno,"--show-photos",
3004                                "--verify-options ","show-photos");
3005             opt.list_options|=LIST_SHOW_PHOTOS;
3006             opt.verify_options|=VERIFY_SHOW_PHOTOS;
3007             break;
3008           case oNoShowPhotos:
3009             deprecated_warning(configname,configlineno,"--no-show-photos",
3010                                "--list-options ","no-show-photos");
3011             deprecated_warning(configname,configlineno,"--no-show-photos",
3012                                "--verify-options ","no-show-photos");
3013             opt.list_options&=~LIST_SHOW_PHOTOS;
3014             opt.verify_options&=~VERIFY_SHOW_PHOTOS;
3015             break;
3016           case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
3017
3018           case oForceMDC: opt.force_mdc = 1; break;
3019           case oNoForceMDC: opt.force_mdc = 0; break;
3020           case oDisableMDC: opt.disable_mdc = 1; break;
3021           case oNoDisableMDC: opt.disable_mdc = 0; break;
3022
3023           case oForceAEAD: opt.force_aead = 1; break;
3024
3025           case oDisableSignerUID: opt.flags.disable_signer_uid = 1; break;
3026
3027           case oS2KMode:   opt.s2k_mode = pargs.r.ret_int; break;
3028           case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
3029           case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
3030           case oS2KCount:
3031             if (pargs.r.ret_int)
3032               opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
3033             else
3034               opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
3035             break;
3036
3037           case oRecipient:
3038           case oHiddenRecipient:
3039           case oRecipientFile:
3040           case oHiddenRecipientFile:
3041             /* Store the recipient.  Note that we also store the
3042              * option as private data in the flags.  This is achieved
3043              * by shifting the option value to the left so to keep
3044              * enough space for the flags.  */
3045             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
3046             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
3047             if (configfp)
3048               sl->flags |= PK_LIST_CONFIG;
3049             if (pargs.r_opt == oHiddenRecipient
3050                 || pargs.r_opt == oHiddenRecipientFile)
3051               sl->flags |= PK_LIST_HIDDEN;
3052             if (pargs.r_opt == oRecipientFile
3053                 || pargs.r_opt == oHiddenRecipientFile)
3054               sl->flags |= PK_LIST_FROM_FILE;
3055             any_explicit_recipient = 1;
3056             break;
3057
3058           case oEncryptTo:
3059           case oHiddenEncryptTo:
3060             /* Store an additional recipient.  */
3061             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
3062             sl->flags = ((pargs.r_opt << PK_LIST_SHIFT) | PK_LIST_ENCRYPT_TO);
3063             if (configfp)
3064               sl->flags |= PK_LIST_CONFIG;
3065             if (pargs.r_opt == oHiddenEncryptTo)
3066               sl->flags |= PK_LIST_HIDDEN;
3067             break;
3068
3069           case oNoEncryptTo:
3070             opt.no_encrypt_to = 1;
3071             break;
3072           case oEncryptToDefaultKey:
3073             opt.encrypt_to_default_key = configfp ? 2 : 1;
3074             break;
3075
3076           case oTrySecretKey:
3077             add_to_strlist2 (&opt.secret_keys_to_try,
3078                              pargs.r.ret_str, utf8_strings);
3079             break;
3080
3081           case oMimemode: opt.mimemode = opt.textmode = 1; break;
3082           case oTextmodeShort: opt.textmode = 2; break;
3083           case oTextmode: opt.textmode=1;  break;
3084           case oNoTextmode: opt.textmode=opt.mimemode=0;  break;
3085
3086           case oExpert: opt.expert = 1; break;
3087           case oNoExpert: opt.expert = 0; break;
3088           case oDefSigExpire:
3089             if(*pargs.r.ret_str!='\0')
3090               {
3091                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3092                   log_error(_("'%s' is not a valid signature expiration\n"),
3093                             pargs.r.ret_str);
3094                 else
3095                   opt.def_sig_expire=pargs.r.ret_str;
3096               }
3097             break;
3098           case oAskSigExpire: opt.ask_sig_expire = 1; break;
3099           case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
3100           case oDefCertExpire:
3101             if(*pargs.r.ret_str!='\0')
3102               {
3103                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3104                   log_error(_("'%s' is not a valid signature expiration\n"),
3105                             pargs.r.ret_str);
3106                 else
3107                   opt.def_cert_expire=pargs.r.ret_str;
3108               }
3109             break;
3110           case oAskCertExpire: opt.ask_cert_expire = 1; break;
3111           case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
3112           case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
3113           case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
3114           case oAskCertLevel: opt.ask_cert_level = 1; break;
3115           case oNoAskCertLevel: opt.ask_cert_level = 0; break;
3116           case oLocalUser: /* store the local users */
3117             sl = add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
3118             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
3119             if (configfp)
3120               sl->flags |= PK_LIST_CONFIG;
3121             break;
3122           case oSender:
3123             {
3124               char *mbox = mailbox_from_userid (pargs.r.ret_str);
3125               if (!mbox)
3126                 log_error (_("\"%s\" is not a proper mail address\n"),
3127                            pargs.r.ret_str);
3128               else
3129                 {
3130                   add_to_strlist (&opt.sender_list, mbox);
3131                   xfree (mbox);
3132                 }
3133             }
3134             break;
3135           case oCompress:
3136             /* this is the -z command line option */
3137             opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
3138             break;
3139           case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
3140           case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
3141           case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
3142           case oPassphrase:
3143             set_passphrase_from_string(pargs.r.ret_str);
3144             break;
3145           case oPassphraseFD:
3146             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3147             break;
3148           case oPassphraseFile:
3149             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
3150             break;
3151           case oPassphraseRepeat:
3152             opt.passphrase_repeat = pargs.r.ret_int;
3153             break;
3154
3155           case oPinentryMode:
3156             opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
3157             if (opt.pinentry_mode == -1)
3158               log_error (_("invalid pinentry mode '%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_fatal ("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 oNoMDCWarn: opt.no_mdc_warn=1; break;
3214           case oDisplayCharset:
3215             if( set_native_charset( pargs.r.ret_str ) )
3216                 log_error(_("'%s' is not a valid character set\n"),
3217                           pargs.r.ret_str);
3218             break;
3219           case oNotDashEscaped: opt.not_dash_escaped = 1; break;
3220           case oEscapeFrom: opt.escape_from = 1; break;
3221           case oNoEscapeFrom: opt.escape_from = 0; break;
3222           case oLockOnce: opt.lock_once = 1; break;
3223           case oLockNever:
3224             dotlock_disable ();
3225             break;
3226           case oLockMultiple:
3227 #ifndef __riscos__
3228             opt.lock_once = 0;
3229 #else /* __riscos__ */
3230             riscos_not_implemented("lock-multiple");
3231 #endif /* __riscos__ */
3232             break;
3233           case oKeyServer:
3234             {
3235               keyserver_spec_t keyserver;
3236               keyserver = parse_keyserver_uri (pargs.r.ret_str, 0);
3237               if (!keyserver)
3238                 log_error (_("could not parse keyserver URL\n"));
3239               else
3240                 {
3241                   /* We only support a single keyserver.  Later ones
3242                      override earlier ones.  (Since we parse the
3243                      config file first and then the command line
3244                      arguments, the command line takes
3245                      precedence.)  */
3246                   if (opt.keyserver)
3247                     free_keyserver_spec (opt.keyserver);
3248                   opt.keyserver = keyserver;
3249                 }
3250             }
3251             break;
3252           case oKeyServerOptions:
3253             if(!parse_keyserver_options(pargs.r.ret_str))
3254               {
3255                 if(configname)
3256                   log_error(_("%s:%d: invalid keyserver options\n"),
3257                             configname,configlineno);
3258                 else
3259                   log_error(_("invalid keyserver options\n"));
3260               }
3261             break;
3262           case oImportOptions:
3263             if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
3264               {
3265                 if(configname)
3266                   log_error(_("%s:%d: invalid import options\n"),
3267                             configname,configlineno);
3268                 else
3269                   log_error(_("invalid import options\n"));
3270               }
3271             break;
3272           case oImportFilter:
3273             rc = parse_and_set_import_filter (pargs.r.ret_str);
3274             if (rc)
3275               log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3276             break;
3277           case oExportOptions:
3278             if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
3279               {
3280                 if(configname)
3281                   log_error(_("%s:%d: invalid export options\n"),
3282                             configname,configlineno);
3283                 else
3284                   log_error(_("invalid export options\n"));
3285               }
3286             break;
3287           case oExportFilter:
3288             rc = parse_and_set_export_filter (pargs.r.ret_str);
3289             if (rc)
3290               log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3291             break;
3292           case oListOptions:
3293             if(!parse_list_options(pargs.r.ret_str))
3294               {
3295                 if(configname)
3296                   log_error(_("%s:%d: invalid list options\n"),
3297                             configname,configlineno);
3298                 else
3299                   log_error(_("invalid list options\n"));
3300               }
3301             break;
3302           case oVerifyOptions:
3303             {
3304               struct parse_options vopts[]=
3305                 {
3306                   {"show-photos",VERIFY_SHOW_PHOTOS,NULL,
3307                    N_("display photo IDs during signature verification")},
3308                   {"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL,
3309                    N_("show policy URLs during signature verification")},
3310                   {"show-notations",VERIFY_SHOW_NOTATIONS,NULL,
3311                    N_("show all notations during signature verification")},
3312                   {"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3313                    N_("show IETF standard notations during signature verification")},
3314                   {"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3315                    NULL},
3316                   {"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL,
3317                    N_("show user-supplied notations during signature verification")},
3318                   {"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL,
3319                    N_("show preferred keyserver URLs during signature verification")},
3320                   {"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL,
3321                    N_("show user ID validity during signature verification")},
3322                   {"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL,
3323                    N_("show revoked and expired user IDs in signature verification")},
3324                   {"show-primary-uid-only",VERIFY_SHOW_PRIMARY_UID_ONLY,NULL,
3325                    N_("show only the primary user ID in signature verification")},
3326                   {"pka-lookups",VERIFY_PKA_LOOKUPS,NULL,
3327                    N_("validate signatures with PKA data")},
3328                   {"pka-trust-increase",VERIFY_PKA_TRUST_INCREASE,NULL,
3329                    N_("elevate the trust of signatures with valid PKA data")},
3330                   {NULL,0,NULL,NULL}
3331                 };
3332
3333               if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
3334                 {
3335                   if(configname)
3336                     log_error(_("%s:%d: invalid verify options\n"),
3337                               configname,configlineno);
3338                   else
3339                     log_error(_("invalid verify options\n"));
3340                 }
3341             }
3342             break;
3343           case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
3344           case oExecPath:
3345             if(set_exec_path(pargs.r.ret_str))
3346               log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
3347             else
3348               opt.exec_path_set=1;
3349             break;
3350           case oSetNotation:
3351             add_notation_data( pargs.r.ret_str, 0 );
3352             add_notation_data( pargs.r.ret_str, 1 );
3353             break;
3354           case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
3355           case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
3356           case oShowNotation:
3357             deprecated_warning(configname,configlineno,"--show-notation",
3358                                "--list-options ","show-notations");
3359             deprecated_warning(configname,configlineno,"--show-notation",
3360                                "--verify-options ","show-notations");
3361             opt.list_options|=LIST_SHOW_NOTATIONS;
3362             opt.verify_options|=VERIFY_SHOW_NOTATIONS;
3363             break;
3364           case oNoShowNotation:
3365             deprecated_warning(configname,configlineno,"--no-show-notation",
3366                                "--list-options ","no-show-notations");
3367             deprecated_warning(configname,configlineno,"--no-show-notation",
3368                                "--verify-options ","no-show-notations");
3369             opt.list_options&=~LIST_SHOW_NOTATIONS;
3370             opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
3371             break;
3372           case oUtf8Strings: utf8_strings = 1; break;
3373           case oNoUtf8Strings: utf8_strings = 0; break;
3374           case oDisableCipherAlgo:
3375             {
3376               int algo = string_to_cipher_algo (pargs.r.ret_str);
3377               gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3378             }
3379             break;
3380           case oDisablePubkeyAlgo:
3381             {
3382               int algo = gcry_pk_map_name (pargs.r.ret_str);
3383               gcry_pk_ctl (GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3384             }
3385             break;
3386           case oNoSigCache: opt.no_sig_cache = 1; break;
3387           case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
3388           case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
3389           case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
3390           case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
3391           case oNoLiteral: opt.no_literal = 1; break;
3392           case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
3393           case oFastListMode: opt.fast_list_mode = 1; break;
3394           case oFixedListMode: /* Dummy */ break;
3395           case oLegacyListMode: opt.legacy_list_mode = 1; break;
3396           case oPrintPKARecords: print_pka_records = 1; break;
3397           case oPrintDANERecords: print_dane_records = 1; break;
3398           case oListOnly: opt.list_only=1; break;
3399           case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
3400           case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
3401           case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
3402           case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
3403           case oNoRandomSeedFile: use_random_seed = 0; break;
3404
3405           case oAutoKeyRetrieve:
3406             opt.keyserver_options.options |= KEYSERVER_AUTO_KEY_RETRIEVE;
3407             break;
3408           case oNoAutoKeyRetrieve:
3409             opt.keyserver_options.options &= ~KEYSERVER_AUTO_KEY_RETRIEVE;
3410             break;
3411
3412           case oShowSessionKey: opt.show_session_key = 1; break;
3413           case oOverrideSessionKey:
3414                 opt.override_session_key = pargs.r.ret_str;
3415                 break;
3416           case oOverrideSessionKeyFD:
3417                 ovrseskeyfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3418                 break;
3419           case oMergeOnly:
3420                 deprecated_warning(configname,configlineno,"--merge-only",
3421                                    "--import-options ","merge-only");
3422                 opt.import_options|=IMPORT_MERGE_ONLY;
3423             break;
3424           case oAllowSecretKeyImport: /* obsolete */ break;
3425           case oTryAllSecrets: opt.try_all_secrets = 1; break;
3426           case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
3427
3428           case oEnableSpecialFilenames:
3429             enable_special_filenames ();
3430             break;
3431
3432           case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
3433           case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
3434           case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
3435           case oPreservePermissions: opt.preserve_permissions=1; break;
3436           case oDefaultPreferenceList:
3437             opt.def_preference_list = pargs.r.ret_str;
3438             break;
3439           case oDefaultKeyserverURL:
3440             {
3441               keyserver_spec_t keyserver;
3442               keyserver = parse_keyserver_uri (pargs.r.ret_str,1 );
3443               if (!keyserver)
3444                 log_error (_("could not parse keyserver URL\n"));
3445               else
3446                 free_keyserver_spec (keyserver);
3447
3448               opt.def_keyserver_url = pargs.r.ret_str;
3449             }
3450             break;
3451           case oPersonalCipherPreferences:
3452             pers_cipher_list=pargs.r.ret_str;
3453             break;
3454           case oPersonalAEADPreferences:
3455             pers_aead_list = pargs.r.ret_str;
3456             break;
3457           case oPersonalDigestPreferences:
3458             pers_digest_list=pargs.r.ret_str;
3459             break;
3460           case oPersonalCompressPreferences:
3461             pers_compress_list=pargs.r.ret_str;
3462             break;
3463           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
3464           case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
3465           case oDisableDirmngr: opt.disable_dirmngr = 1;  break;
3466           case oWeakDigest:
3467             additional_weak_digest(pargs.r.ret_str);
3468             break;
3469           case oUnwrap:
3470             opt.unwrap_encryption = 1;
3471             break;
3472           case oOnlySignTextIDs:
3473             opt.only_sign_text_ids = 1;
3474             break;
3475
3476           case oDisplay:
3477             set_opt_session_env ("DISPLAY", pargs.r.ret_str);
3478             break;
3479           case oTTYname:
3480             set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
3481             break;
3482           case oTTYtype:
3483             set_opt_session_env ("TERM", pargs.r.ret_str);
3484             break;
3485           case oXauthority:
3486             set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
3487             break;
3488
3489           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
3490           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
3491
3492           case oGroup: add_group(pargs.r.ret_str); break;
3493           case oUnGroup: rm_group(pargs.r.ret_str); break;
3494           case oNoGroups:
3495             while(opt.grouplist)
3496               {
3497                 struct groupitem *iter=opt.grouplist;
3498                 free_strlist(iter->values);
3499                 opt.grouplist=opt.grouplist->next;
3500                 xfree(iter);
3501               }
3502             break;
3503
3504           case oStrict:
3505           case oNoStrict:
3506             /* Not used */
3507             break;
3508
3509           case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
3510           case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
3511           case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
3512           case oMultifile: multifile=1; break;
3513           case oKeyidFormat:
3514             if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
3515               opt.keyid_format=KF_SHORT;
3516             else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
3517               opt.keyid_format=KF_LONG;
3518             else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
3519               opt.keyid_format=KF_0xSHORT;
3520             else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
3521               opt.keyid_format=KF_0xLONG;
3522             else if(ascii_strcasecmp(pargs.r.ret_str,"none")==0)
3523               opt.keyid_format = KF_NONE;
3524             else
3525               log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
3526             break;
3527
3528           case oExitOnStatusWriteError:
3529             opt.exit_on_status_write_error = 1;
3530             break;
3531
3532           case oLimitCardInsertTries:
3533             opt.limit_card_insert_tries = pargs.r.ret_int;
3534             break;
3535
3536           case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
3537           case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
3538
3539           case oAutoKeyLocate:
3540             if (default_akl)
3541               {
3542                 /* This is the first time --aito-key-locate is seen.
3543                  * We need to reset the default akl.  */
3544                 default_akl = 0;
3545                 release_akl();
3546               }
3547             if(!parse_auto_key_locate(pargs.r.ret_str))
3548               {
3549                 if(configname)
3550                   log_error(_("%s:%d: invalid auto-key-locate list\n"),
3551                             configname,configlineno);
3552                 else
3553                   log_error(_("invalid auto-key-locate list\n"));
3554               }
3555             break;
3556           case oNoAutoKeyLocate:
3557             release_akl();
3558             break;
3559
3560           case oKeyOrigin:
3561             if(!parse_key_origin (pargs.r.ret_str))
3562               log_error (_("invalid argument for option \"%.50s\"\n"),
3563                          "--key-origin");
3564             break;
3565
3566           case oEnableLargeRSA:
3567 #if SECMEM_BUFFER_SIZE >= 65536
3568             opt.flags.large_rsa=1;
3569 #else
3570             if (configname)
3571               log_info("%s:%d: WARNING: gpg not built with large secure "
3572                          "memory buffer.  Ignoring enable-large-rsa\n",
3573                         configname,configlineno);
3574             else
3575               log_info("WARNING: gpg not built with large secure "
3576                          "memory buffer.  Ignoring --enable-large-rsa\n");
3577 #endif /* SECMEM_BUFFER_SIZE >= 65536 */
3578             break;
3579           case oDisableLargeRSA: opt.flags.large_rsa=0;
3580             break;
3581
3582           case oEnableDSA2: opt.flags.dsa2=1; break;
3583           case oDisableDSA2: opt.flags.dsa2=0; break;
3584
3585           case oAllowMultisigVerification:
3586           case oAllowMultipleMessages:
3587             opt.flags.allow_multiple_messages=1;
3588             break;
3589
3590           case oNoAllowMultipleMessages:
3591             opt.flags.allow_multiple_messages=0;
3592             break;
3593