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