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