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