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