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