0bedf253363022c0659ca1675d83a78dcbe2a33f
[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 (oHonorHttpProxy, "honor-http-proxy", "@"),
706   ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
707   ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
708   ARGPARSE_s_n (oLegacyListMode, "legacy-list-mode", "@"),
709   ARGPARSE_s_n (oListOnly, "list-only", "@"),
710   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
711   ARGPARSE_s_n (oIgnoreValidFrom,    "ignore-valid-from", "@"),
712   ARGPARSE_s_n (oIgnoreCrcError, "ignore-crc-error", "@"),
713   ARGPARSE_s_n (oIgnoreMDCError, "ignore-mdc-error", "@"),
714   ARGPARSE_s_n (oShowSessionKey, "show-session-key", "@"),
715   ARGPARSE_s_s (oOverrideSessionKey, "override-session-key", "@"),
716   ARGPARSE_s_n (oNoRandomSeedFile,  "no-random-seed-file", "@"),
717   ARGPARSE_s_n (oAutoKeyRetrieve, "auto-key-retrieve", "@"),
718   ARGPARSE_s_n (oNoAutoKeyRetrieve, "no-auto-key-retrieve", "@"),
719   ARGPARSE_s_n (oNoSigCache,         "no-sig-cache", "@"),
720   ARGPARSE_s_n (oNoSigCreateCheck,   "no-sig-create-check", "@"),
721   ARGPARSE_s_n (oMergeOnly,       "merge-only", "@" ),
722   ARGPARSE_s_n (oAllowSecretKeyImport, "allow-secret-key-import", "@"),
723   ARGPARSE_s_n (oTryAllSecrets,  "try-all-secrets", "@"),
724   ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
725   ARGPARSE_s_n (oNoExpensiveTrustChecks, "no-expensive-trust-checks", "@"),
726   ARGPARSE_s_n (oPreservePermissions, "preserve-permissions", "@"),
727   ARGPARSE_s_s (oDefaultPreferenceList,  "default-preference-list", "@"),
728   ARGPARSE_s_s (oDefaultKeyserverURL,  "default-keyserver-url", "@"),
729   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-preferences","@"),
730   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
731   ARGPARSE_s_s (oPersonalCompressPreferences,
732                                          "personal-compress-preferences", "@"),
733   ARGPARSE_s_s (oFakedSystemTime, "faked-system-time", "@"),
734
735   /* Aliases.  I constantly mistype these, and assume other people do
736      as well. */
737   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-prefs", "@"),
738   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-prefs", "@"),
739   ARGPARSE_s_s (oPersonalCompressPreferences, "personal-compress-prefs", "@"),
740
741   ARGPARSE_s_s (oAgentProgram, "agent-program", "@"),
742   ARGPARSE_s_s (oDirmngrProgram, "dirmngr-program", "@"),
743   ARGPARSE_s_s (oDisplay,    "display",    "@"),
744   ARGPARSE_s_s (oTTYname,    "ttyname",    "@"),
745   ARGPARSE_s_s (oTTYtype,    "ttytype",    "@"),
746   ARGPARSE_s_s (oLCctype,    "lc-ctype",   "@"),
747   ARGPARSE_s_s (oLCmessages, "lc-messages","@"),
748   ARGPARSE_s_s (oXauthority, "xauthority", "@"),
749   ARGPARSE_s_s (oGroup,      "group",      "@"),
750   ARGPARSE_s_s (oUnGroup,    "ungroup",    "@"),
751   ARGPARSE_s_n (oNoGroups,   "no-groups",  "@"),
752   ARGPARSE_s_n (oStrict,     "strict",     "@"),
753   ARGPARSE_s_n (oNoStrict,   "no-strict",  "@"),
754   ARGPARSE_s_n (oMangleDosFilenames,      "mangle-dos-filenames", "@"),
755   ARGPARSE_s_n (oNoMangleDosFilenames, "no-mangle-dos-filenames", "@"),
756   ARGPARSE_s_n (oEnableProgressFilter, "enable-progress-filter", "@"),
757   ARGPARSE_s_n (oMultifile, "multifile", "@"),
758   ARGPARSE_s_s (oKeyidFormat, "keyid-format", "@"),
759   ARGPARSE_s_n (oExitOnStatusWriteError, "exit-on-status-write-error", "@"),
760   ARGPARSE_s_i (oLimitCardInsertTries, "limit-card-insert-tries", "@"),
761
762   ARGPARSE_s_n (oAllowMultisigVerification,
763                 "allow-multisig-verification", "@"),
764   ARGPARSE_s_n (oEnableLargeRSA, "enable-large-rsa", "@"),
765   ARGPARSE_s_n (oDisableLargeRSA, "disable-large-rsa", "@"),
766   ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
767   ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
768   ARGPARSE_s_n (oAllowMultipleMessages,      "allow-multiple-messages", "@"),
769   ARGPARSE_s_n (oNoAllowMultipleMessages, "no-allow-multiple-messages", "@"),
770   ARGPARSE_s_n (oAllowWeakDigestAlgos, "allow-weak-digest-algos", "@"),
771
772   /* These two are aliases to help users of the PGP command line
773      product use gpg with minimal pain.  Many commands are common
774      already as they seem to have borrowed commands from us.  Now I'm
775      returning the favor. */
776   ARGPARSE_s_s (oLocalUser, "sign-with", "@"),
777   ARGPARSE_s_s (oRecipient, "user", "@"),
778
779   ARGPARSE_s_n (oRequireCrossCert, "require-backsigs", "@"),
780   ARGPARSE_s_n (oRequireCrossCert, "require-cross-certification", "@"),
781   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-backsigs", "@"),
782   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-cross-certification", "@"),
783
784   /* New options.  Fixme: Should go more to the top.  */
785   ARGPARSE_s_s (oAutoKeyLocate, "auto-key-locate", "@"),
786   ARGPARSE_s_n (oNoAutoKeyLocate, "no-auto-key-locate", "@"),
787   ARGPARSE_s_n (oNoAutostart, "no-autostart", "@"),
788
789   /* Dummy options with warnings.  */
790   ARGPARSE_s_n (oUseAgent,      "use-agent", "@"),
791   ARGPARSE_s_n (oNoUseAgent, "no-use-agent", "@"),
792   ARGPARSE_s_s (oGpgAgentInfo, "gpg-agent-info", "@"),
793   ARGPARSE_s_s (oReaderPort, "reader-port", "@"),
794   ARGPARSE_s_s (octapiDriver, "ctapi-driver", "@"),
795   ARGPARSE_s_s (opcscDriver, "pcsc-driver", "@"),
796   ARGPARSE_s_n (oDisableCCID, "disable-ccid", "@"),
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                   print_sanitized_string2 (stdout, sl->d, ':',';');
1603                   if(sl->next)
1604                     es_printf(";");
1605                 }
1606
1607               es_printf("\n");
1608             }
1609
1610           any=1;
1611         }
1612
1613       if(show_all || ascii_strcasecmp(name,"version")==0)
1614         {
1615           es_printf("cfg:version:");
1616           es_write_sanitized (es_stdout, VERSION, strlen(VERSION), ":", NULL);
1617           es_printf ("\n");
1618           any=1;
1619         }
1620
1621       if(show_all || ascii_strcasecmp(name,"pubkey")==0)
1622         {
1623           es_printf ("cfg:pubkey:");
1624           print_algo_numbers (build_list_pk_test_algo);
1625           es_printf ("\n");
1626           any=1;
1627         }
1628
1629       if(show_all || ascii_strcasecmp(name,"pubkeyname")==0)
1630         {
1631           es_printf ("cfg:pubkeyname:");
1632           print_algo_names (build_list_pk_test_algo,
1633                             build_list_pk_algo_name);
1634           es_printf ("\n");
1635           any=1;
1636         }
1637
1638       if(show_all || ascii_strcasecmp(name,"cipher")==0)
1639         {
1640           es_printf ("cfg:cipher:");
1641           print_algo_numbers (build_list_cipher_test_algo);
1642           es_printf ("\n");
1643           any=1;
1644         }
1645
1646       if (show_all || !ascii_strcasecmp (name,"ciphername"))
1647         {
1648           es_printf ("cfg:ciphername:");
1649           print_algo_names (build_list_cipher_test_algo,
1650                             build_list_cipher_algo_name);
1651           es_printf ("\n");
1652           any = 1;
1653         }
1654
1655       if(show_all
1656          || ascii_strcasecmp(name,"digest")==0
1657          || ascii_strcasecmp(name,"hash")==0)
1658         {
1659           es_printf ("cfg:digest:");
1660           print_algo_numbers (build_list_md_test_algo);
1661           es_printf ("\n");
1662           any=1;
1663         }
1664
1665       if (show_all
1666           || !ascii_strcasecmp(name,"digestname")
1667           || !ascii_strcasecmp(name,"hashname"))
1668         {
1669           es_printf ("cfg:digestname:");
1670           print_algo_names (build_list_md_test_algo,
1671                             build_list_md_algo_name);
1672           es_printf ("\n");
1673           any=1;
1674         }
1675
1676       if(show_all || ascii_strcasecmp(name,"compress")==0)
1677         {
1678           es_printf ("cfg:compress:");
1679           print_algo_numbers(check_compress_algo);
1680           es_printf ("\n");
1681           any=1;
1682         }
1683
1684       if(show_all || ascii_strcasecmp(name,"ccid-reader-id")==0)
1685         {
1686 #if defined(ENABLE_CARD_SUPPORT) && defined(HAVE_LIBUSB) \
1687     && GNUPG_MAJOR_VERSION == 1
1688
1689           char *p, *p2, *list = ccid_get_reader_list ();
1690
1691           for (p=list; p && (p2 = strchr (p, '\n')); p = p2+1)
1692             {
1693               *p2 = 0;
1694               es_printf ("cfg:ccid-reader-id:%s\n", p);
1695             }
1696           free (list);
1697 #endif
1698           any=1;
1699         }
1700
1701       if(show_all)
1702         break;
1703
1704       if(!any)
1705         log_error(_("unknown configuration item '%s'\n"),name);
1706     }
1707 }
1708
1709
1710 /* List options and default values in the GPG Conf format.  This is a
1711    new tool distributed with gnupg 1.9.x but we also want some limited
1712    support in older gpg versions.  The output is the name of the
1713    configuration file and a list of options available for editing by
1714    gpgconf.  */
1715 static void
1716 gpgconf_list (const char *configfile)
1717 {
1718   char *configfile_esc = percent_escape (configfile, NULL);
1719
1720   es_printf ("%s-%s.conf:%lu:\"%s\n",
1721              GPGCONF_NAME, GPG_NAME,
1722              GC_OPT_FLAG_DEFAULT,
1723              configfile_esc ? configfile_esc : "/dev/null");
1724   es_printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
1725   es_printf ("quiet:%lu:\n",   GC_OPT_FLAG_NONE);
1726   es_printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
1727   es_printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
1728   es_printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE);
1729   es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
1730   es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE);
1731   es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
1732   es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
1733   es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
1734   es_printf ("group:%lu:\n", GC_OPT_FLAG_NONE);
1735
1736   /* The next one is an info only item and should match the macros at
1737      the top of keygen.c  */
1738   es_printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
1739              "RSA-2048");
1740
1741   xfree (configfile_esc);
1742 }
1743
1744
1745 static int
1746 parse_subpacket_list(char *list)
1747 {
1748   char *tok;
1749   byte subpackets[128],i;
1750   int count=0;
1751
1752   if(!list)
1753     {
1754       /* No arguments means all subpackets */
1755       memset(subpackets+1,1,sizeof(subpackets)-1);
1756       count=127;
1757     }
1758   else
1759     {
1760       memset(subpackets,0,sizeof(subpackets));
1761
1762       /* Merge with earlier copy */
1763       if(opt.show_subpackets)
1764         {
1765           byte *in;
1766
1767           for(in=opt.show_subpackets;*in;in++)
1768             {
1769               if(*in>127 || *in<1)
1770                 BUG();
1771
1772               if(!subpackets[*in])
1773                 count++;
1774               subpackets[*in]=1;
1775             }
1776         }
1777
1778       while((tok=strsep(&list," ,")))
1779         {
1780           if(!*tok)
1781             continue;
1782
1783           i=atoi(tok);
1784           if(i>127 || i<1)
1785             return 0;
1786
1787           if(!subpackets[i])
1788             count++;
1789           subpackets[i]=1;
1790         }
1791     }
1792
1793   xfree(opt.show_subpackets);
1794   opt.show_subpackets=xmalloc(count+1);
1795   opt.show_subpackets[count--]=0;
1796
1797   for(i=1;i<128 && count>=0;i++)
1798     if(subpackets[i])
1799       opt.show_subpackets[count--]=i;
1800
1801   return 1;
1802 }
1803
1804
1805 static int
1806 parse_list_options(char *str)
1807 {
1808   char *subpackets=""; /* something that isn't NULL */
1809   struct parse_options lopts[]=
1810     {
1811       {"show-photos",LIST_SHOW_PHOTOS,NULL,
1812        N_("display photo IDs during key listings")},
1813       {"show-usage",LIST_SHOW_USAGE,NULL,
1814        N_("show key usage information during key listings")},
1815       {"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL,
1816        N_("show policy URLs during signature listings")},
1817       {"show-notations",LIST_SHOW_NOTATIONS,NULL,
1818        N_("show all notations during signature listings")},
1819       {"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1820        N_("show IETF standard notations during signature listings")},
1821       {"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1822        NULL},
1823       {"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL,
1824        N_("show user-supplied notations during signature listings")},
1825       {"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL,
1826        N_("show preferred keyserver URLs during signature listings")},
1827       {"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL,
1828        N_("show user ID validity during key listings")},
1829       {"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL,
1830        N_("show revoked and expired user IDs in key listings")},
1831       {"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL,
1832        N_("show revoked and expired subkeys in key listings")},
1833       {"show-keyring",LIST_SHOW_KEYRING,NULL,
1834        N_("show the keyring name in key listings")},
1835       {"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL,
1836        N_("show expiration dates during signature listings")},
1837       {"show-sig-subpackets",LIST_SHOW_SIG_SUBPACKETS,NULL,
1838        NULL},
1839       {NULL,0,NULL,NULL}
1840     };
1841
1842   /* C99 allows for non-constant initializers, but we'd like to
1843      compile everywhere, so fill in the show-sig-subpackets argument
1844      here.  Note that if the parse_options array changes, we'll have
1845      to change the subscript here. */
1846   lopts[12].value=&subpackets;
1847
1848   if(parse_options(str,&opt.list_options,lopts,1))
1849     {
1850       if(opt.list_options&LIST_SHOW_SIG_SUBPACKETS)
1851         {
1852           /* Unset so users can pass multiple lists in. */
1853           opt.list_options&=~LIST_SHOW_SIG_SUBPACKETS;
1854           if(!parse_subpacket_list(subpackets))
1855             return 0;
1856         }
1857       else if(subpackets==NULL && opt.show_subpackets)
1858         {
1859           /* User did 'no-show-subpackets' */
1860           xfree(opt.show_subpackets);
1861           opt.show_subpackets=NULL;
1862         }
1863
1864       return 1;
1865     }
1866   else
1867     return 0;
1868 }
1869
1870
1871 /* Collapses argc/argv into a single string that must be freed */
1872 static char *
1873 collapse_args(int argc,char *argv[])
1874 {
1875   char *str=NULL;
1876   int i,first=1,len=0;
1877
1878   for(i=0;i<argc;i++)
1879     {
1880       len+=strlen(argv[i])+2;
1881       str=xrealloc(str,len);
1882       if(first)
1883         {
1884           str[0]='\0';
1885           first=0;
1886         }
1887       else
1888         strcat(str," ");
1889
1890       strcat(str,argv[i]);
1891     }
1892
1893   return str;
1894 }
1895
1896
1897 #ifndef NO_TRUST_MODELS
1898 static void
1899 parse_trust_model(const char *model)
1900 {
1901   if(ascii_strcasecmp(model,"pgp")==0)
1902     opt.trust_model=TM_PGP;
1903   else if(ascii_strcasecmp(model,"classic")==0)
1904     opt.trust_model=TM_CLASSIC;
1905   else if(ascii_strcasecmp(model,"always")==0)
1906     opt.trust_model=TM_ALWAYS;
1907   else if(ascii_strcasecmp(model,"direct")==0)
1908     opt.trust_model=TM_DIRECT;
1909   else if(ascii_strcasecmp(model,"auto")==0)
1910     opt.trust_model=TM_AUTO;
1911   else
1912     log_error("unknown trust model '%s'\n",model);
1913 }
1914 #endif /*NO_TRUST_MODELS*/
1915
1916
1917 /* This fucntion called to initialized a new control object.  It is
1918    assumed that this object has been zeroed out before calling this
1919    function. */
1920 static void
1921 gpg_init_default_ctrl (ctrl_t ctrl)
1922 {
1923   (void)ctrl;
1924 }
1925
1926
1927 /* This function is called to deinitialize a control object.  It is
1928    not deallocated. */
1929 static void
1930 gpg_deinit_default_ctrl (ctrl_t ctrl)
1931 {
1932   gpg_dirmngr_deinit_session_data (ctrl);
1933 }
1934
1935
1936 char *
1937 get_default_configname (void)
1938 {
1939   char *configname = NULL;
1940   char *name = xstrdup (GPG_NAME EXTSEP_S "conf-" SAFE_VERSION);
1941   char *ver = &name[strlen (GPG_NAME EXTSEP_S "conf-")];
1942
1943   do
1944     {
1945       if (configname)
1946         {
1947           char *tok;
1948
1949           xfree (configname);
1950           configname = NULL;
1951
1952           if ((tok = strrchr (ver, SAFE_VERSION_DASH)))
1953             *tok='\0';
1954           else if ((tok = strrchr (ver, SAFE_VERSION_DOT)))
1955             *tok='\0';
1956           else
1957             break;
1958         }
1959
1960       configname = make_filename (opt.homedir, name, NULL);
1961     }
1962   while (access (configname, R_OK));
1963
1964   xfree(name);
1965
1966   if (! configname)
1967     configname = make_filename (opt.homedir, GPG_NAME EXTSEP_S "conf", NULL);
1968   if (! access (configname, R_OK))
1969     {
1970       /* Print a warning when both config files are present.  */
1971       char *p = make_filename (opt.homedir, "options", NULL);
1972       if (! access (p, R_OK))
1973         log_info (_("Note: old default options file '%s' ignored\n"), p);
1974       xfree (p);
1975     }
1976   else
1977     {
1978       /* Use the old default only if it exists.  */
1979       char *p = make_filename (opt.homedir, "options", NULL);
1980       if (!access (p, R_OK))
1981         {
1982           xfree (configname);
1983           configname = p;
1984         }
1985       else
1986         xfree (p);
1987     }
1988
1989   return configname;
1990 }
1991
1992
1993 int
1994 main (int argc, char **argv)
1995 {
1996     ARGPARSE_ARGS pargs;
1997     IOBUF a;
1998     int rc=0;
1999     int orig_argc;
2000     char **orig_argv;
2001     const char *fname;
2002     char *username;
2003     int may_coredump;
2004     strlist_t sl, remusr= NULL, locusr=NULL;
2005     strlist_t nrings = NULL;
2006     armor_filter_context_t *afx = NULL;
2007     int detached_sig = 0;
2008     FILE *configfp = NULL;
2009     char *configname = NULL;
2010     char *save_configname = NULL;
2011     char *default_configname = NULL;
2012     unsigned configlineno;
2013     int parse_debug = 0;
2014     int default_config = 1;
2015     int default_keyring = 1;
2016     int greeting = 0;
2017     int nogreeting = 0;
2018     char *logfile = NULL;
2019     int use_random_seed = 1;
2020     enum cmd_and_opt_values cmd = 0;
2021     const char *debug_level = NULL;
2022 #ifndef NO_TRUST_MODELS
2023     const char *trustdb_name = NULL;
2024 #endif /*!NO_TRUST_MODELS*/
2025     char *def_cipher_string = NULL;
2026     char *def_digest_string = NULL;
2027     char *compress_algo_string = NULL;
2028     char *cert_digest_string = NULL;
2029     char *s2k_cipher_string = NULL;
2030     char *s2k_digest_string = NULL;
2031     char *pers_cipher_list = NULL;
2032     char *pers_digest_list = NULL;
2033     char *pers_compress_list = NULL;
2034     int eyes_only=0;
2035     int multifile=0;
2036     int pwfd = -1;
2037     int fpr_maybe_cmd = 0; /* --fingerprint maybe a command.  */
2038     int any_explicit_recipient = 0;
2039     int require_secmem=0,got_secmem=0;
2040     struct assuan_malloc_hooks malloc_hooks;
2041     ctrl_t ctrl;
2042
2043 #ifdef __riscos__
2044     opt.lock_once = 1;
2045 #endif /* __riscos__ */
2046
2047
2048     /* Please note that we may running SUID(ROOT), so be very CAREFUL
2049        when adding any stuff between here and the call to
2050        secmem_init() somewhere after the option parsing. */
2051     gnupg_reopen_std (GPG_NAME);
2052     trap_unaligned ();
2053     gnupg_rl_initialize ();
2054     set_strusage (my_strusage);
2055     gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
2056     log_set_prefix (GPG_NAME, 1);
2057
2058     /* Make sure that our subsystems are ready.  */
2059     i18n_init();
2060     init_common_subsystems (&argc, &argv);
2061
2062     /* Check that the libraries are suitable.  Do it right here because the
2063        option parsing may need services of the library.  */
2064     if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) )
2065       {
2066         log_fatal ( _("libgcrypt is too old (need %s, have %s)\n"),
2067                     NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
2068       }
2069
2070     /* Use our own logging handler for Libcgrypt.  */
2071     setup_libgcrypt_logging ();
2072
2073     /* Put random number into secure memory */
2074     gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
2075
2076     may_coredump = disable_core_dumps();
2077
2078     gnupg_init_signals (0, emergency_cleanup);
2079
2080     dotlock_create (NULL, 0); /* Register lock file cleanup. */
2081
2082     opt.autostart = 1;
2083     opt.session_env = session_env_new ();
2084     if (!opt.session_env)
2085       log_fatal ("error allocating session environment block: %s\n",
2086                  strerror (errno));
2087
2088     opt.command_fd = -1; /* no command fd */
2089     opt.compress_level = -1; /* defaults to standard compress level */
2090     opt.bz2_compress_level = -1; /* defaults to standard compress level */
2091     /* note: if you change these lines, look at oOpenPGP */
2092     opt.def_cipher_algo = 0;
2093     opt.def_digest_algo = 0;
2094     opt.cert_digest_algo = 0;
2095     opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
2096     opt.s2k_mode = 3; /* iterated+salted */
2097     opt.s2k_count = 0; /* Auto-calibrate when needed.  */
2098     opt.s2k_cipher_algo = DEFAULT_CIPHER_ALGO;
2099     opt.completes_needed = 1;
2100     opt.marginals_needed = 3;
2101     opt.max_cert_depth = 5;
2102     opt.escape_from = 1;
2103     opt.flags.require_cross_cert = 1;
2104     opt.import_options = 0;
2105     opt.export_options = EXPORT_ATTRIBUTES;
2106     opt.keyserver_options.import_options = IMPORT_REPAIR_PKS_SUBKEY_BUG;
2107     opt.keyserver_options.export_options = EXPORT_ATTRIBUTES;
2108     opt.keyserver_options.options = (KEYSERVER_HONOR_KEYSERVER_URL
2109                                      | KEYSERVER_HONOR_PKA_RECORD );
2110     opt.verify_options = (LIST_SHOW_UID_VALIDITY
2111                           | VERIFY_SHOW_POLICY_URLS
2112                           | VERIFY_SHOW_STD_NOTATIONS
2113                           | VERIFY_SHOW_KEYSERVER_URLS);
2114     opt.list_options   = LIST_SHOW_UID_VALIDITY;
2115 #ifdef NO_TRUST_MODELS
2116     opt.trust_model = TM_ALWAYS;
2117 #else
2118     opt.trust_model = TM_AUTO;
2119 #endif
2120     opt.mangle_dos_filenames = 0;
2121     opt.min_cert_level = 2;
2122     set_screen_dimensions ();
2123     opt.keyid_format = KF_SHORT;
2124     opt.def_sig_expire = "0";
2125     opt.def_cert_expire = "0";
2126     set_homedir (default_homedir ());
2127     opt.passphrase_repeat = 1;
2128     opt.emit_version = 1; /* Limit to the major number.  */
2129
2130     /* Check whether we have a config file on the command line.  */
2131     orig_argc = argc;
2132     orig_argv = argv;
2133     pargs.argc = &argc;
2134     pargs.argv = &argv;
2135     pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
2136     while( arg_parse( &pargs, opts) ) {
2137         if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
2138             parse_debug++;
2139         else if( pargs.r_opt == oOptions ) {
2140             /* yes there is one, so we do not try the default one, but
2141              * read the option file when it is encountered at the commandline
2142              */
2143             default_config = 0;
2144         }
2145         else if( pargs.r_opt == oNoOptions )
2146           {
2147             default_config = 0; /* --no-options */
2148             opt.no_homedir_creation = 1;
2149           }
2150         else if( pargs.r_opt == oHomedir )
2151             set_homedir ( pargs.r.ret_str );
2152         else if( pargs.r_opt == oNoPermissionWarn )
2153             opt.no_perm_warn=1;
2154         else if (pargs.r_opt == oStrict )
2155           {
2156             /* Not used */
2157           }
2158         else if (pargs.r_opt == oNoStrict )
2159           {
2160             /* Not used */
2161           }
2162     }
2163
2164 #ifdef HAVE_DOSISH_SYSTEM
2165     if ( strchr (opt.homedir,'\\') ) {
2166         char *d, *buf = xmalloc (strlen (opt.homedir)+1);
2167         const char *s = opt.homedir;
2168         for (d=buf,s=opt.homedir; *s; s++)
2169           {
2170             *d++ = *s == '\\'? '/': *s;
2171 #ifdef HAVE_W32_SYSTEM
2172             if (s[1] && IsDBCSLeadByte (*s))
2173               *d++ = *++s;
2174 #endif
2175           }
2176         *d = 0;
2177         set_homedir (buf);
2178     }
2179 #endif
2180
2181     /* Initialize the secure memory. */
2182     if (!gcry_control (GCRYCTL_INIT_SECMEM, SECMEM_BUFFER_SIZE, 0))
2183       got_secmem = 1;
2184 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
2185     /* There should be no way to get to this spot while still carrying
2186        setuid privs.  Just in case, bomb out if we are. */
2187     if ( getuid () != geteuid () )
2188       BUG ();
2189 #endif
2190     maybe_setuid = 0;
2191
2192     /* Okay, we are now working under our real uid */
2193
2194     /* malloc hooks go here ... */
2195     malloc_hooks.malloc = gcry_malloc;
2196     malloc_hooks.realloc = gcry_realloc;
2197     malloc_hooks.free = gcry_free;
2198     assuan_set_malloc_hooks (&malloc_hooks);
2199     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
2200     setup_libassuan_logging (&opt.debug);
2201
2202     /* Try for a version specific config file first */
2203     default_configname = get_default_configname ();
2204     if (default_config)
2205       configname = xstrdup (default_configname);
2206
2207     argc = orig_argc;
2208     argv = orig_argv;
2209     pargs.argc = &argc;
2210     pargs.argv = &argv;
2211     pargs.flags= ARGPARSE_FLAG_KEEP;
2212
2213     /* By this point we have a homedir, and cannot change it. */
2214     check_permissions(opt.homedir,0);
2215
2216   next_pass:
2217     if( configname ) {
2218       if(check_permissions(configname,1))
2219         {
2220           /* If any options file is unsafe, then disable any external
2221              programs for keyserver calls or photo IDs.  Since the
2222              external program to call is set in the options file, a
2223              unsafe options file can lead to an arbitrary program
2224              being run. */
2225
2226           opt.exec_disable=1;
2227         }
2228
2229         configlineno = 0;
2230         configfp = fopen( configname, "r" );
2231         if (configfp && is_secured_file (fileno (configfp)))
2232           {
2233             fclose (configfp);
2234             configfp = NULL;
2235             gpg_err_set_errno (EPERM);
2236           }
2237         if( !configfp ) {
2238             if( default_config ) {
2239                 if( parse_debug )
2240                     log_info(_("Note: no default option file '%s'\n"),
2241                                                             configname );
2242             }
2243             else {
2244                 log_error(_("option file '%s': %s\n"),
2245                                     configname, strerror(errno) );
2246                 g10_exit(2);
2247             }
2248             xfree(configname); configname = NULL;
2249         }
2250         if( parse_debug && configname )
2251             log_info(_("reading options from '%s'\n"), configname );
2252         default_config = 0;
2253     }
2254
2255     while( optfile_parse( configfp, configname, &configlineno,
2256                                                 &pargs, opts) )
2257       {
2258         switch( pargs.r_opt )
2259           {
2260           case aCheckKeys:
2261           case aListConfig:
2262           case aGPGConfList:
2263           case aGPGConfTest:
2264           case aListPackets:
2265           case aImport:
2266           case aFastImport:
2267           case aSendKeys:
2268           case aRecvKeys:
2269           case aSearchKeys:
2270           case aRefreshKeys:
2271           case aFetchKeys:
2272           case aExport:
2273 #ifdef ENABLE_CARD_SUPPORT
2274           case aCardStatus:
2275           case aCardEdit:
2276           case aChangePIN:
2277 #endif /* ENABLE_CARD_SUPPORT*/
2278           case aListKeys:
2279           case aLocateKeys:
2280           case aListSigs:
2281           case aExportSecret:
2282           case aExportSecretSub:
2283           case aSym:
2284           case aClearsign:
2285           case aGenRevoke:
2286           case aDesigRevoke:
2287           case aPrimegen:
2288           case aGenRandom:
2289           case aPrintMD:
2290           case aPrintMDs:
2291           case aListTrustDB:
2292           case aCheckTrustDB:
2293           case aUpdateTrustDB:
2294           case aFixTrustDB:
2295           case aListTrustPath:
2296           case aDeArmor:
2297           case aEnArmor:
2298           case aSign:
2299           case aQuickSignKey:
2300           case aQuickLSignKey:
2301           case aSignKey:
2302           case aLSignKey:
2303           case aStore:
2304           case aQuickKeygen:
2305           case aExportOwnerTrust:
2306           case aImportOwnerTrust:
2307           case aRebuildKeydbCaches:
2308             set_cmd (&cmd, pargs.r_opt);
2309             break;
2310
2311           case aKeygen:
2312           case aFullKeygen:
2313           case aEditKey:
2314           case aDeleteSecretKeys:
2315           case aDeleteSecretAndPublicKeys:
2316           case aDeleteKeys:
2317           case aPasswd:
2318             set_cmd (&cmd, pargs.r_opt);
2319             greeting=1;
2320             break;
2321
2322           case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
2323
2324           case aDecryptFiles: multifile=1; /* fall through */
2325           case aDecrypt: set_cmd( &cmd, aDecrypt); break;
2326
2327           case aEncrFiles: multifile=1; /* fall through */
2328           case aEncr: set_cmd( &cmd, aEncr); break;
2329
2330           case aVerifyFiles: multifile=1; /* fall through */
2331           case aVerify: set_cmd( &cmd, aVerify); break;
2332
2333           case aServer:
2334             set_cmd (&cmd, pargs.r_opt);
2335             opt.batch = 1;
2336             break;
2337
2338           case oArmor: opt.armor = 1; opt.no_armor=0; break;
2339           case oOutput: opt.outfile = pargs.r.ret_str; break;
2340           case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
2341           case oQuiet: opt.quiet = 1; break;
2342           case oNoTTY: tty_no_terminal(1); break;
2343           case oDryRun: opt.dry_run = 1; break;
2344           case oInteractive: opt.interactive = 1; break;
2345           case oVerbose:
2346             opt.verbose++;
2347             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2348             opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
2349             opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
2350             break;
2351
2352           case oBatch:
2353             opt.batch = 1;
2354             nogreeting = 1;
2355             break;
2356
2357           case oUseAgent: /* Dummy. */
2358             break;
2359
2360           case oNoUseAgent:
2361             obsolete_option (configname, configlineno, "no-use-agent");
2362             break;
2363           case oGpgAgentInfo:
2364             obsolete_option (configname, configlineno, "gpg-agent-info");
2365             break;
2366           case oReaderPort:
2367             obsolete_scdaemon_option (configname, configlineno, "reader-port");
2368             break;
2369           case octapiDriver:
2370             obsolete_scdaemon_option (configname, configlineno, "ctapi-driver");
2371             break;
2372           case opcscDriver:
2373             obsolete_scdaemon_option (configname, configlineno, "pcsc-driver");
2374             break;
2375           case oDisableCCID:
2376             obsolete_scdaemon_option (configname, configlineno, "disable-ccid");
2377             break;
2378
2379           case oAnswerYes: opt.answer_yes = 1; break;
2380           case oAnswerNo: opt.answer_no = 1; break;
2381           case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
2382           case oPrimaryKeyring:
2383             sl = append_to_strlist (&nrings, pargs.r.ret_str);
2384             sl->flags = KEYDB_RESOURCE_FLAG_PRIMARY;
2385             break;
2386           case oShowKeyring:
2387             deprecated_warning(configname,configlineno,"--show-keyring",
2388                                "--list-options ","show-keyring");
2389             opt.list_options|=LIST_SHOW_KEYRING;
2390             break;
2391
2392           case oDebug: opt.debug |= pargs.r.ret_ulong; break;
2393           case oDebugAll: opt.debug = ~0; break;
2394           case oDebugLevel: debug_level = pargs.r.ret_str; break;
2395
2396           case oStatusFD:
2397             set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2398             break;
2399           case oStatusFile:
2400             set_status_fd ( open_info_file (pargs.r.ret_str, 1, 0) );
2401             break;
2402           case oAttributeFD:
2403             set_attrib_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2404             break;
2405           case oAttributeFile:
2406             set_attrib_fd ( open_info_file (pargs.r.ret_str, 1, 1) );
2407             break;
2408           case oLoggerFD:
2409             log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
2410             break;
2411           case oLoggerFile:
2412             logfile = pargs.r.ret_str;
2413             break;
2414
2415           case oWithFingerprint:
2416             opt.with_fingerprint = 1;
2417             opt.fingerprint++;
2418             break;
2419           case oFingerprint:
2420             opt.fingerprint++;
2421             fpr_maybe_cmd = 1;
2422             break;
2423
2424           case oWithKeygrip:
2425             opt.with_keygrip = 1;
2426             break;
2427
2428           case oWithSecret:
2429             opt.with_secret = 1;
2430             break;
2431
2432           case oSecretKeyring:
2433             /* Ignore this old option.  */
2434             break;
2435
2436           case oOptions:
2437             /* config files may not be nested (silently ignore them) */
2438             if( !configfp ) {
2439                 xfree(configname);
2440                 configname = xstrdup(pargs.r.ret_str);
2441                 goto next_pass;
2442             }
2443             break;
2444           case oNoArmor: opt.no_armor=1; opt.armor=0; break;
2445           case oNoDefKeyring: default_keyring = 0; break;
2446           case oNoGreeting: nogreeting = 1; break;
2447           case oNoVerbose:
2448             opt.verbose = 0;
2449             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2450             opt.list_sigs=0;
2451             break;
2452           case oQuickRandom:
2453             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
2454             break;
2455           case oEmitVersion: opt.emit_version++; break;
2456           case oNoEmitVersion: opt.emit_version=0; break;
2457           case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
2458           case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
2459           case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
2460
2461 #ifndef NO_TRUST_MODELS
2462           case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
2463
2464 #endif /*!NO_TRUST_MODELS*/
2465           case oDefaultKey: opt.def_secret_key = pargs.r.ret_str; break;
2466           case oDefRecipient:
2467             if( *pargs.r.ret_str )
2468               opt.def_recipient = make_username(pargs.r.ret_str);
2469             break;
2470           case oDefRecipientSelf:
2471             xfree(opt.def_recipient); opt.def_recipient = NULL;
2472             opt.def_recipient_self = 1;
2473             break;
2474           case oNoDefRecipient:
2475             xfree(opt.def_recipient); opt.def_recipient = NULL;
2476             opt.def_recipient_self = 0;
2477             break;
2478           case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
2479           case oHomedir: break;
2480           case oNoBatch: opt.batch = 0; break;
2481
2482           case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
2483           case oWithColons: opt.with_colons=':'; break;
2484
2485           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
2486           case oWithSigList: opt.list_sigs = 1; break;
2487
2488           case oSkipVerify: opt.skip_verify=1; break;
2489
2490           case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
2491           case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
2492
2493           case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
2494
2495 #ifndef NO_TRUST_MODELS
2496             /* There are many programs (like mutt) that call gpg with
2497                --always-trust so keep this option around for a long
2498                time. */
2499           case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
2500           case oTrustModel:
2501             parse_trust_model(pargs.r.ret_str);
2502             break;
2503 #endif /*!NO_TRUST_MODELS*/
2504
2505           case oForceOwnertrust:
2506             log_info(_("Note: %s is not for normal use!\n"),
2507                      "--force-ownertrust");
2508             opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
2509             if(opt.force_ownertrust==-1)
2510               {
2511                 log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
2512                 opt.force_ownertrust=0;
2513               }
2514             break;
2515           case oLoadExtension:
2516             /* Dummy so that gpg 1.4 conf files can work. Should
2517                eventually be removed.  */
2518             break;
2519           case oOpenPGP:
2520           case oRFC4880:
2521             /* This is effectively the same as RFC2440, but with
2522                "--enable-dsa2 --no-rfc2440-text --escape-from-lines
2523                --require-cross-certification". */
2524             opt.compliance = CO_RFC4880;
2525             opt.flags.dsa2 = 1;
2526             opt.flags.require_cross_cert = 1;
2527             opt.rfc2440_text = 0;
2528             opt.allow_non_selfsigned_uid = 1;
2529             opt.allow_freeform_uid = 1;
2530             opt.escape_from = 1;
2531             opt.not_dash_escaped = 0;
2532             opt.def_cipher_algo = 0;
2533             opt.def_digest_algo = 0;
2534             opt.cert_digest_algo = 0;
2535             opt.compress_algo = -1;
2536             opt.s2k_mode = 3; /* iterated+salted */
2537             opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2538             opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2539             break;
2540           case oRFC2440:
2541             opt.compliance = CO_RFC2440;
2542             opt.flags.dsa2 = 0;
2543             opt.rfc2440_text = 1;
2544             opt.allow_non_selfsigned_uid = 1;
2545             opt.allow_freeform_uid = 1;
2546             opt.escape_from = 0;
2547             opt.not_dash_escaped = 0;
2548             opt.def_cipher_algo = 0;
2549             opt.def_digest_algo = 0;
2550             opt.cert_digest_algo = 0;
2551             opt.compress_algo = -1;
2552             opt.s2k_mode = 3; /* iterated+salted */
2553             opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2554             opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2555             break;
2556           case oPGP6:  opt.compliance = CO_PGP6;  break;
2557           case oPGP7:  opt.compliance = CO_PGP7;  break;
2558           case oPGP8:  opt.compliance = CO_PGP8;  break;
2559           case oGnuPG: opt.compliance = CO_GNUPG; break;
2560           case oRFC2440Text: opt.rfc2440_text=1; break;
2561           case oNoRFC2440Text: opt.rfc2440_text=0; break;
2562           case oSetFilename:
2563             if(utf8_strings)
2564               opt.set_filename = pargs.r.ret_str;
2565             else
2566               opt.set_filename = native_to_utf8(pargs.r.ret_str);
2567             break;
2568           case oForYourEyesOnly: eyes_only = 1; break;
2569           case oNoForYourEyesOnly: eyes_only = 0; break;
2570           case oSetPolicyURL:
2571             add_policy_url(pargs.r.ret_str,0);
2572             add_policy_url(pargs.r.ret_str,1);
2573             break;
2574           case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
2575           case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
2576           case oShowPolicyURL:
2577             deprecated_warning(configname,configlineno,"--show-policy-url",
2578                                "--list-options ","show-policy-urls");
2579             deprecated_warning(configname,configlineno,"--show-policy-url",
2580                                "--verify-options ","show-policy-urls");
2581             opt.list_options|=LIST_SHOW_POLICY_URLS;
2582             opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
2583             break;
2584           case oNoShowPolicyURL:
2585             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2586                                "--list-options ","no-show-policy-urls");
2587             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2588                                "--verify-options ","no-show-policy-urls");
2589             opt.list_options&=~LIST_SHOW_POLICY_URLS;
2590             opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
2591             break;
2592           case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
2593           case oUseEmbeddedFilename:
2594             opt.flags.use_embedded_filename=1;
2595             break;
2596           case oNoUseEmbeddedFilename:
2597             opt.flags.use_embedded_filename=0;
2598             break;
2599           case oComment:
2600             if(pargs.r.ret_str[0])
2601               append_to_strlist(&opt.comments,pargs.r.ret_str);
2602             break;
2603           case oDefaultComment:
2604             deprecated_warning(configname,configlineno,
2605                                "--default-comment","--no-comments","");
2606             /* fall through */
2607           case oNoComments:
2608             free_strlist(opt.comments);
2609             opt.comments=NULL;
2610             break;
2611           case oThrowKeyids: opt.throw_keyids = 1; break;
2612           case oNoThrowKeyids: opt.throw_keyids = 0; break;
2613           case oShowPhotos:
2614             deprecated_warning(configname,configlineno,"--show-photos",
2615                                "--list-options ","show-photos");
2616             deprecated_warning(configname,configlineno,"--show-photos",
2617                                "--verify-options ","show-photos");
2618             opt.list_options|=LIST_SHOW_PHOTOS;
2619             opt.verify_options|=VERIFY_SHOW_PHOTOS;
2620             break;
2621           case oNoShowPhotos:
2622             deprecated_warning(configname,configlineno,"--no-show-photos",
2623                                "--list-options ","no-show-photos");
2624             deprecated_warning(configname,configlineno,"--no-show-photos",
2625                                "--verify-options ","no-show-photos");
2626             opt.list_options&=~LIST_SHOW_PHOTOS;
2627             opt.verify_options&=~VERIFY_SHOW_PHOTOS;
2628             break;
2629           case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
2630
2631           case oForceMDC: opt.force_mdc = 1; break;
2632           case oNoForceMDC: opt.force_mdc = 0; break;
2633           case oDisableMDC: opt.disable_mdc = 1; break;
2634           case oNoDisableMDC: opt.disable_mdc = 0; break;
2635           case oS2KMode:   opt.s2k_mode = pargs.r.ret_int; break;
2636           case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
2637           case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
2638           case oS2KCount:
2639             if (pargs.r.ret_int)
2640               opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
2641             else
2642               opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
2643             break;
2644           case oNoEncryptTo: opt.no_encrypt_to = 1; break;
2645           case oEncryptTo: /* store the recipient in the second list */
2646             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2647             sl->flags = 1;
2648             break;
2649           case oHiddenEncryptTo: /* store the recipient in the second list */
2650             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2651             sl->flags = 1|2;
2652             break;
2653           case oRecipient: /* store the recipient */
2654             add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2655             any_explicit_recipient = 1;
2656             break;
2657           case oHiddenRecipient: /* store the recipient with a flag */
2658             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2659             sl->flags = 2;
2660             any_explicit_recipient = 1;
2661             break;
2662
2663           case oTrySecretKey:
2664             add_to_strlist2 (&opt.secret_keys_to_try,
2665                              pargs.r.ret_str, utf8_strings);
2666             break;
2667
2668           case oTextmodeShort: opt.textmode = 2; break;
2669           case oTextmode: opt.textmode=1;  break;
2670           case oNoTextmode: opt.textmode=0;  break;
2671           case oExpert: opt.expert = 1; break;
2672           case oNoExpert: opt.expert = 0; break;
2673           case oDefSigExpire:
2674             if(*pargs.r.ret_str!='\0')
2675               {
2676                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
2677                   log_error(_("'%s' is not a valid signature expiration\n"),
2678                             pargs.r.ret_str);
2679                 else
2680                   opt.def_sig_expire=pargs.r.ret_str;
2681               }
2682             break;
2683           case oAskSigExpire: opt.ask_sig_expire = 1; break;
2684           case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
2685           case oDefCertExpire:
2686             if(*pargs.r.ret_str!='\0')
2687               {
2688                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
2689                   log_error(_("'%s' is not a valid signature expiration\n"),
2690                             pargs.r.ret_str);
2691                 else
2692                   opt.def_cert_expire=pargs.r.ret_str;
2693               }
2694             break;
2695           case oAskCertExpire: opt.ask_cert_expire = 1; break;
2696           case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
2697           case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
2698           case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
2699           case oAskCertLevel: opt.ask_cert_level = 1; break;
2700           case oNoAskCertLevel: opt.ask_cert_level = 0; break;
2701           case oLocalUser: /* store the local users */
2702             add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
2703             break;
2704           case oCompress:
2705             /* this is the -z command line option */
2706             opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
2707             break;
2708           case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
2709           case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
2710           case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
2711           case oPassphrase:
2712             set_passphrase_from_string(pargs.r.ret_str);
2713             break;
2714           case oPassphraseFD:
2715             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
2716             break;
2717           case oPassphraseFile:
2718             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
2719             break;
2720           case oPassphraseRepeat:
2721             opt.passphrase_repeat = pargs.r.ret_int;
2722             break;
2723
2724           case oPinentryMode:
2725             opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
2726             if (opt.pinentry_mode == -1)
2727               log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
2728             break;
2729
2730           case oCommandFD:
2731             opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
2732             break;
2733           case oCommandFile:
2734             opt.command_fd = open_info_file (pargs.r.ret_str, 0, 1);
2735             break;
2736           case oCipherAlgo:
2737             def_cipher_string = xstrdup(pargs.r.ret_str);
2738             break;
2739           case oDigestAlgo:
2740             def_digest_string = xstrdup(pargs.r.ret_str);
2741             break;
2742           case oCompressAlgo:
2743             /* If it is all digits, stick a Z in front of it for
2744                later.  This is for backwards compatibility with
2745                versions that took the compress algorithm number. */
2746             {
2747               char *pt=pargs.r.ret_str;
2748               while(*pt)
2749                 {
2750                   if (!isascii (*pt) || !isdigit (*pt))
2751                     break;
2752
2753                   pt++;
2754                 }
2755
2756               if(*pt=='\0')
2757                 {
2758                   compress_algo_string=xmalloc(strlen(pargs.r.ret_str)+2);
2759                   strcpy(compress_algo_string,"Z");
2760                   strcat(compress_algo_string,pargs.r.ret_str);
2761                 }
2762               else
2763                 compress_algo_string = xstrdup(pargs.r.ret_str);
2764             }
2765             break;
2766           case oCertDigestAlgo:
2767             cert_digest_string = xstrdup(pargs.r.ret_str);
2768             break;
2769
2770           case oNoSecmemWarn:
2771             gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
2772             break;
2773
2774           case oRequireSecmem: require_secmem=1; break;
2775           case oNoRequireSecmem: require_secmem=0; break;
2776           case oNoPermissionWarn: opt.no_perm_warn=1; break;
2777           case oNoMDCWarn: opt.no_mdc_warn=1; break;
2778           case oDisplayCharset:
2779             if( set_native_charset( pargs.r.ret_str ) )
2780                 log_error(_("'%s' is not a valid character set\n"),
2781                           pargs.r.ret_str);
2782             break;
2783           case oNotDashEscaped: opt.not_dash_escaped = 1; break;
2784           case oEscapeFrom: opt.escape_from = 1; break;
2785           case oNoEscapeFrom: opt.escape_from = 0; break;
2786           case oLockOnce: opt.lock_once = 1; break;
2787           case oLockNever:
2788             dotlock_disable ();
2789             break;
2790           case oLockMultiple:
2791 #ifndef __riscos__
2792             opt.lock_once = 0;
2793 #else /* __riscos__ */
2794             riscos_not_implemented("lock-multiple");
2795 #endif /* __riscos__ */
2796             break;
2797           case oKeyServer:
2798             {
2799               keyserver_spec_t keyserver;
2800               keyserver = parse_keyserver_uri (pargs.r.ret_str,0,
2801                                                configname,configlineno);
2802               if (!keyserver)
2803                 log_error (_("could not parse keyserver URL\n"));
2804               else
2805                 {
2806                   keyserver->next = opt.keyserver;
2807                   opt.keyserver = keyserver;
2808                 }
2809             }
2810             break;
2811           case oKeyServerOptions:
2812             if(!parse_keyserver_options(pargs.r.ret_str))
2813               {
2814                 if(configname)
2815                   log_error(_("%s:%d: invalid keyserver options\n"),
2816                             configname,configlineno);
2817                 else
2818                   log_error(_("invalid keyserver options\n"));
2819               }
2820             break;
2821           case oImportOptions:
2822             if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
2823               {
2824                 if(configname)
2825                   log_error(_("%s:%d: invalid import options\n"),
2826                             configname,configlineno);
2827                 else
2828                   log_error(_("invalid import options\n"));
2829               }
2830             break;
2831           case oExportOptions:
2832             if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
2833               {
2834                 if(configname)
2835                   log_error(_("%s:%d: invalid export options\n"),
2836                             configname,configlineno);
2837                 else
2838                   log_error(_("invalid export options\n"));
2839               }
2840             break;
2841           case oListOptions:
2842             if(!parse_list_options(pargs.r.ret_str))
2843               {
2844                 if(configname)
2845                   log_error(_("%s:%d: invalid list options\n"),
2846                             configname,configlineno);
2847                 else
2848                   log_error(_("invalid list options\n"));
2849               }
2850             break;
2851           case oVerifyOptions:
2852             {
2853               struct parse_options vopts[]=
2854                 {
2855                   {"show-photos",VERIFY_SHOW_PHOTOS,NULL,
2856                    N_("display photo IDs during signature verification")},
2857                   {"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL,
2858                    N_("show policy URLs during signature verification")},
2859                   {"show-notations",VERIFY_SHOW_NOTATIONS,NULL,
2860                    N_("show all notations during signature verification")},
2861                   {"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
2862                    N_("show IETF standard notations during signature verification")},
2863                   {"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
2864                    NULL},
2865                   {"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL,
2866                    N_("show user-supplied notations during signature verification")},
2867                   {"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL,
2868                    N_("show preferred keyserver URLs during signature verification")},
2869                   {"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL,
2870                    N_("show user ID validity during signature verification")},
2871                   {"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL,
2872                    N_("show revoked and expired user IDs in signature verification")},
2873                   {"show-primary-uid-only",VERIFY_SHOW_PRIMARY_UID_ONLY,NULL,
2874                    N_("show only the primary user ID in signature verification")},
2875                   {"pka-lookups",VERIFY_PKA_LOOKUPS,NULL,
2876                    N_("validate signatures with PKA data")},
2877                   {"pka-trust-increase",VERIFY_PKA_TRUST_INCREASE,NULL,
2878                    N_("elevate the trust of signatures with valid PKA data")},
2879                   {NULL,0,NULL,NULL}
2880                 };
2881
2882               if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
2883                 {
2884                   if(configname)
2885                     log_error(_("%s:%d: invalid verify options\n"),
2886                               configname,configlineno);
2887                   else
2888                     log_error(_("invalid verify options\n"));
2889                 }
2890             }
2891             break;
2892           case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
2893           case oExecPath:
2894             if(set_exec_path(pargs.r.ret_str))
2895               log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
2896             else
2897               opt.exec_path_set=1;
2898             break;
2899           case oSetNotation:
2900             add_notation_data( pargs.r.ret_str, 0 );
2901             add_notation_data( pargs.r.ret_str, 1 );
2902             break;
2903           case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
2904           case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
2905           case oShowNotation:
2906             deprecated_warning(configname,configlineno,"--show-notation",
2907                                "--list-options ","show-notations");
2908             deprecated_warning(configname,configlineno,"--show-notation",
2909                                "--verify-options ","show-notations");
2910             opt.list_options|=LIST_SHOW_NOTATIONS;
2911             opt.verify_options|=VERIFY_SHOW_NOTATIONS;
2912             break;
2913           case oNoShowNotation:
2914             deprecated_warning(configname,configlineno,"--no-show-notation",
2915                                "--list-options ","no-show-notations");
2916             deprecated_warning(configname,configlineno,"--no-show-notation",
2917                                "--verify-options ","no-show-notations");
2918             opt.list_options&=~LIST_SHOW_NOTATIONS;
2919             opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
2920             break;
2921           case oUtf8Strings: utf8_strings = 1; break;
2922           case oNoUtf8Strings: utf8_strings = 0; break;
2923           case oDisableCipherAlgo:
2924             {
2925               int algo = string_to_cipher_algo (pargs.r.ret_str);
2926               gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
2927             }
2928             break;
2929           case oDisablePubkeyAlgo:
2930             {
2931               int algo = gcry_pk_map_name (pargs.r.ret_str);
2932               gcry_pk_ctl (GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
2933             }
2934             break;
2935           case oNoSigCache: opt.no_sig_cache = 1; break;
2936           case oNoSigCreateCheck: opt.no_sig_create_check = 1; break;
2937           case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
2938           case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
2939           case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
2940           case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
2941           case oNoLiteral: opt.no_literal = 1; break;
2942           case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
2943           case oHonorHttpProxy:
2944                 add_to_strlist(&opt.keyserver_options.other,"http-proxy");
2945                 deprecated_warning(configname,configlineno,
2946                                    "--honor-http-proxy",
2947                                    "--keyserver-options ","http-proxy");
2948                 break;
2949           case oFastListMode: opt.fast_list_mode = 1; break;
2950           case oFixedListMode: /* Dummy */ break;
2951           case oLegacyListMode: opt.legacy_list_mode = 1; break;
2952           case oListOnly: opt.list_only=1; break;
2953           case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
2954           case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
2955           case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
2956           case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
2957           case oNoRandomSeedFile: use_random_seed = 0; break;
2958           case oAutoKeyRetrieve:
2959           case oNoAutoKeyRetrieve:
2960                 if(pargs.r_opt==oAutoKeyRetrieve)
2961                   opt.keyserver_options.options|=KEYSERVER_AUTO_KEY_RETRIEVE;
2962                 else
2963                   opt.keyserver_options.options&=~KEYSERVER_AUTO_KEY_RETRIEVE;
2964
2965                 deprecated_warning(configname,configlineno,
2966                            pargs.r_opt==oAutoKeyRetrieve?"--auto-key-retrieve":
2967                                "--no-auto-key-retrieve","--keyserver-options ",
2968                            pargs.r_opt==oAutoKeyRetrieve?"auto-key-retrieve":
2969                                "no-auto-key-retrieve");
2970                 break;
2971           case oShowSessionKey: opt.show_session_key = 1; break;
2972           case oOverrideSessionKey:
2973                 opt.override_session_key = pargs.r.ret_str;
2974                 break;
2975           case oMergeOnly:
2976                 deprecated_warning(configname,configlineno,"--merge-only",
2977                                    "--import-options ","merge-only");
2978                 opt.import_options|=IMPORT_MERGE_ONLY;
2979             break;
2980           case oAllowSecretKeyImport: /* obsolete */ break;
2981           case oTryAllSecrets: opt.try_all_secrets = 1; break;
2982           case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
2983           case oEnableSpecialFilenames:
2984             iobuf_enable_special_filenames (1);
2985             break;
2986           case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
2987           case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
2988           case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
2989           case oPreservePermissions: opt.preserve_permissions=1; break;
2990           case oDefaultPreferenceList:
2991             opt.def_preference_list = pargs.r.ret_str;
2992             break;
2993           case oDefaultKeyserverURL:
2994             {
2995               keyserver_spec_t keyserver;
2996               keyserver = parse_keyserver_uri (pargs.r.ret_str,1,
2997                                                configname,configlineno);
2998               if (!keyserver)
2999                 log_error (_("could not parse keyserver URL\n"));
3000               else
3001                 free_keyserver_spec (keyserver);
3002
3003               opt.def_keyserver_url = pargs.r.ret_str;
3004             }
3005             break;
3006           case oPersonalCipherPreferences:
3007             pers_cipher_list=pargs.r.ret_str;
3008             break;
3009           case oPersonalDigestPreferences:
3010             pers_digest_list=pargs.r.ret_str;
3011             break;
3012           case oPersonalCompressPreferences:
3013             pers_compress_list=pargs.r.ret_str;
3014             break;
3015           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
3016           case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
3017
3018           case oDisplay:
3019             set_opt_session_env ("DISPLAY", pargs.r.ret_str);
3020             break;
3021           case oTTYname:
3022             set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
3023             break;
3024           case oTTYtype:
3025             set_opt_session_env ("TERM", pargs.r.ret_str);
3026             break;
3027           case oXauthority:
3028             set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
3029             break;
3030
3031           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
3032           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
3033
3034           case oGroup: add_group(pargs.r.ret_str); break;
3035           case oUnGroup: rm_group(pargs.r.ret_str); break;
3036           case oNoGroups:
3037             while(opt.grouplist)
3038               {
3039                 struct groupitem *iter=opt.grouplist;
3040                 free_strlist(iter->values);
3041                 opt.grouplist=opt.grouplist->next;
3042                 xfree(iter);
3043               }
3044             break;
3045
3046           case oStrict:
3047           case oNoStrict:
3048             /* Not used */
3049             break;
3050
3051           case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
3052           case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
3053           case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
3054           case oMultifile: multifile=1; break;
3055           case oKeyidFormat:
3056             if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
3057               opt.keyid_format=KF_SHORT;
3058             else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
3059               opt.keyid_format=KF_LONG;
3060             else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
3061               opt.keyid_format=KF_0xSHORT;
3062             else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
3063               opt.keyid_format=KF_0xLONG;
3064             else
3065               log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
3066             break;
3067
3068           case oExitOnStatusWriteError:
3069             opt.exit_on_status_write_error = 1;
3070             break;
3071
3072           case oLimitCardInsertTries:
3073             opt.limit_card_insert_tries = pargs.r.ret_int;
3074             break;
3075
3076           case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
3077           case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
3078
3079           case oAutoKeyLocate:
3080             if(!parse_auto_key_locate(pargs.r.ret_str))
3081               {
3082                 if(configname)
3083                   log_error(_("%s:%d: invalid auto-key-locate list\n"),
3084                             configname,configlineno);
3085                 else
3086                   log_error(_("invalid auto-key-locate list\n"));
3087               }
3088             break;
3089           case oNoAutoKeyLocate:
3090             release_akl();
3091             break;
3092
3093           case oEnableLargeRSA:
3094 #if SECMEM_BUFFER_SIZE >= 65536
3095             opt.flags.large_rsa=1;
3096 #else
3097             if (configname)
3098               log_info("%s:%d: WARNING: gpg not built with large secure "
3099                          "memory buffer.  Ignoring enable-large-rsa\n",
3100                         configname,configlineno);
3101             else
3102               log_info("WARNING: gpg not built with large secure "
3103                          "memory buffer.  Ignoring --enable-large-rsa\n");
3104 #endif /* SECMEM_BUFFER_SIZE >= 65536 */
3105             break;
3106           case oDisableLargeRSA: opt.flags.large_rsa=0;
3107             break;
3108
3109           case oEnableDSA2: opt.flags.dsa2=1; break;
3110           case oDisableDSA2: opt.flags.dsa2=0; break;
3111
3112           case oAllowMultisigVerification:
3113           case oAllowMultipleMessages:
3114             opt.flags.allow_multiple_messages=1;
3115             break;
3116
3117           case oNoAllowMultipleMessages:
3118             opt.flags.allow_multiple_messages=0;
3119             break;
3120
3121           case oAllowWeakDigestAlgos:
3122             opt.flags.allow_weak_digest_algos = 1;
3123             break;
3124
3125           case oFakedSystemTime:
3126             {
3127               time_t faked_time = isotime2epoch (pargs.r.ret_str);
3128               if (faked_time == (time_t)(-1))
3129                 faked_time = (time_t)strtoul (pargs.r.ret_str, NULL, 10);
3130               gnupg_set_time (faked_time, 0);
3131             }
3132             break;
3133
3134           case oNoAutostart: opt.autostart = 0; break;
3135
3136           case oNoop: break;
3137
3138           default:
3139             pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
3140             break;
3141           }
3142       }
3143
3144     if (configfp)
3145       {
3146         fclose( configfp );
3147         configfp = NULL;
3148         /* Remember the first config file name. */
3149         if (!save_configname)
3150           save_configname = configname;
3151         else
3152           xfree(configname);
3153         configname = NULL;
3154         goto next_pass;
3155       }
3156     xfree(configname); configname = NULL;
3157     if (log_get_errorcount (0))
3158       g10_exit(2);
3159
3160     /* The command --gpgconf-list is pretty simple and may be called
3161        directly after the option parsing. */
3162     if (cmd == aGPGConfList)
3163       {
3164         gpgconf_list (save_configname ? save_configname : default_configname);
3165         g10_exit (0);
3166       }
3167     xfree (save_configname);
3168     xfree (default_configname);
3169
3170     if( nogreeting )
3171         greeting = 0;
3172
3173     if( greeting )
3174       {
3175         es_fprintf (es_stderr, "%s %s; %s\n",
3176                     strusage(11), strusage(13), strusage(14) );
3177         es_fprintf (es_stderr, "%s\n", strusage(15) );
3178       }
3179 #ifdef IS_DEVELOPMENT_VERSION
3180     if (!opt.batch)
3181       {
3182         const char *s;
3183
3184         if((s=strusage(25)))
3185           log_info("%s\n",s);
3186         if((s=strusage(26)))
3187           log_info("%s\n",s);
3188         if((s=strusage(27)))
3189           log_info("%s\n",s);
3190       }
3191 #endif
3192
3193     /* FIXME: We should use logging to a file only in server mode;
3194        however we have not yet implemetyed that.  Thus we try to get
3195        away with --batch as indication for logging to file
3196        required. */
3197     if (logfile && opt.batch)
3198       {
3199         log_set_file (logfile);
3200         log_set_prefix (NULL, 1|2|4);
3201       }
3202
3203     if (opt.verbose > 2)
3204         log_info ("using character set '%s'\n", get_native_charset ());
3205
3206     if( may_coredump && !opt.quiet )
3207         log_info(_("WARNING: program may create a core file!\n"));
3208
3209     if (eyes_only) {
3210       if (opt.set_filename)
3211           log_info(_("WARNING: %s overrides %s\n"),
3212                    "--for-your-eyes-only","--set-filename");
3213
3214       opt.set_filename="_CONSOLE";
3215     }
3216
3217     if (opt.no_literal) {
3218         log_info(_("Note: %s is not for normal use!\n"), "--no-literal");
3219         if (opt.textmode)
3220             log_error(_("%s not allowed with %s!\n"),
3221                        "--textmode", "--no-literal" );
3222         if (opt.set_filename)
3223             log_error(_("%s makes no sense with %s!\n"),
3224                         eyes_only?"--for-your-eyes-only":"--set-filename",
3225                         "--no-literal" );
3226     }
3227
3228
3229     if (opt.set_filesize)
3230         log_info(_("Note: %s is not for normal use!\n"), "--set-filesize");
3231     if( opt.batch )
3232         tty_batchmode( 1 );
3233
3234     if (gnupg_faked_time_p ())
3235       {
3236         gnupg_isotime_t tbuf;
3237
3238         log_info (_("WARNING: running with faked system time: "));
3239         gnupg_get_isotime (tbuf);
3240         dump_isotime (tbuf);
3241         log_printf ("\n");
3242       }
3243
3244     /* Print a warning if an argument looks like an option.  */
3245     if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
3246       {
3247         int i;
3248
3249         for (i=0; i < argc; i++)
3250           if (argv[i][0] == '-' && argv[i][1] == '-')
3251             log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
3252       }
3253
3254
3255     gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
3256
3257     if(require_secmem && !got_secmem)
3258       {
3259         log_info(_("will not run with insecure memory due to %s\n"),
3260                  "--require-secmem");
3261         g10_exit(2);
3262       }
3263
3264     set_debug (debug_level);
3265     if (DBG_CLOCK)
3266       log_clock ("start");
3267
3268     /* Do these after the switch(), so they can override settings. */
3269     if(PGP6)
3270       {
3271         /* That does not anymore work becuase we have no more support
3272            for v3 signatures.  */
3273         opt.disable_mdc=1;
3274         opt.escape_from=1;
3275         opt.ask_sig_expire=0;
3276       }
3277     else if(PGP7)
3278       {
3279         /* That does not anymore work because we have no more support
3280            for v3 signatures.  */
3281         opt.escape_from=1;
3282         opt.ask_sig_expire=0;
3283       }
3284     else if(PGP8)
3285       {
3286         opt.escape_from=1;
3287       }
3288
3289
3290     if( def_cipher_string ) {
3291         opt.def_cipher_algo = string_to_cipher_algo (def_cipher_string);
3292         xfree(def_cipher_string); def_cipher_string = NULL;
3293         if ( openpgp_cipher_test_algo (opt.def_cipher_algo) )
3294             log_error(_("selected cipher algorithm is invalid\n"));
3295     }
3296     if( def_digest_string ) {
3297         opt.def_digest_algo = string_to_digest_algo (def_digest_string);
3298         xfree(def_digest_string); def_digest_string = NULL;
3299         if ( openpgp_md_test_algo (opt.def_digest_algo) )
3300             log_error(_("selected digest algorithm is invalid\n"));
3301     }
3302     if( compress_algo_string ) {
3303         opt.compress_algo = string_to_compress_algo(compress_algo_string);
3304         xfree(compress_algo_string); compress_algo_string = NULL;
3305         if( check_compress_algo(opt.compress_algo) )
3306           log_error(_("selected compression algorithm is invalid\n"));
3307     }
3308     if( cert_digest_string ) {
3309         opt.cert_digest_algo = string_to_digest_algo (cert_digest_string);
3310         xfree(cert_digest_string); cert_digest_string = NULL;
3311         if (openpgp_md_test_algo(opt.cert_digest_algo))
3312           log_error(_("selected certification digest algorithm is invalid\n"));
3313     }
3314     if( s2k_cipher_string ) {
3315         opt.s2k_cipher_algo = string_to_cipher_algo (s2k_cipher_string);
3316         xfree(s2k_cipher_string); s2k_cipher_string = NULL;
3317         if (openpgp_cipher_test_algo (opt.s2k_cipher_algo))
3318           log_error(_("selected cipher algorithm is invalid\n"));
3319     }
3320     if( s2k_digest_string ) {
3321         opt.s2k_digest_algo = string_to_digest_algo (s2k_digest_string);
3322         xfree(s2k_digest_string); s2k_digest_string = NULL;
3323         if (openpgp_md_test_algo(opt.s2k_digest_algo))
3324           log_error(_("selected digest algorithm is invalid\n"));
3325     }
3326     if( opt.completes_needed < 1 )
3327       log_error(_("completes-needed must be greater than 0\n"));
3328     if( opt.marginals_needed < 2 )
3329       log_error(_("marginals-needed must be greater than 1\n"));
3330     if( opt.max_cert_depth < 1 || opt.max_cert_depth > 255 )
3331       log_error(_("max-cert-depth must be in the range from 1 to 255\n"));
3332     if(opt.def_cert_level<0 || opt.def_cert_level>3)
3333       log_error(_("invalid default-cert-level; must be 0, 1, 2, or 3\n"));
3334     if( opt.min_cert_level < 1 || opt.min_cert_level > 3 )
3335       log_error(_("invalid min-cert-level; must be 1, 2, or 3\n"));
3336     switch( opt.s2k_mode ) {
3337       case 0:
3338         log_info(_("Note: simple S2K mode (0) is strongly discouraged\n"));
3339         break;
3340       case 1: case 3: break;
3341       default:
3342         log_error(_("invalid S2K mode; must be 0, 1 or 3\n"));
3343     }
3344
3345     /* This isn't actually needed, but does serve to error out if the
3346        string is invalid. */
3347     if(opt.def_preference_list &&
3348         keygen_set_std_prefs(opt.def_preference_list,0))
3349       log_error(_("invalid default preferences\n"));
3350
3351     if(pers_cipher_list &&
3352        keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
3353       log_error(_("invalid personal cipher preferences\n"));
3354
3355     if(pers_digest_list &&
3356        keygen_set_std_prefs(pers_digest_list,PREFTYPE_HASH))
3357       log_error(_("invalid personal digest preferences\n"));
3358
3359     if(pers_compress_list &&
3360        keygen_set_std_prefs(pers_compress_list,PREFTYPE_ZIP))
3361       log_error(_("invalid personal compress preferences\n"));
3362
3363     /* We don't support all possible commands with multifile yet */
3364     if(multifile)
3365       {
3366         char *cmdname;
3367
3368         switch(cmd)
3369           {
3370           case aSign:
3371             cmdname="--sign";
3372             break;
3373           case aClearsign:
3374             cmdname="--clearsign";
3375             break;
3376           case aDetachedSign:
3377             cmdname="--detach-sign";
3378             break;
3379           case aSym:
3380             cmdname="--symmetric";
3381             break;
3382           case aEncrSym:
3383             cmdname="--symmetric --encrypt";
3384             break;
3385           case aStore:
3386             cmdname="--store";
3387             break;
3388           default:
3389             cmdname=NULL;
3390             break;
3391           }
3392
3393         if(cmdname)
3394           log_error(_("%s does not yet work with %s\n"),cmdname,"--multifile");
3395       }
3396
3397     if( log_get_errorcount(0) )
3398         g10_exit(2);
3399
3400     if(opt.compress_level==0)
3401       opt.compress_algo=COMPRESS_ALGO_NONE;
3402
3403     /* Check our chosen algorithms against the list of legal
3404        algorithms. */
3405
3406     if(!GNUPG)
3407       {
3408         const char *badalg=NULL;
3409         preftype_t badtype=PREFTYPE_NONE;
3410
3411         if(opt.def_cipher_algo
3412            && !algo_available(PREFTYPE_SYM,opt.def_cipher_algo,NULL))
3413           {
3414             badalg = openpgp_cipher_algo_name (opt.def_cipher_algo);
3415             badtype = PREFTYPE_SYM;
3416           }
3417         else if(opt.def_digest_algo
3418                 && !algo_available(PREFTYPE_HASH,opt.def_digest_algo,NULL))
3419           {
3420             badalg = gcry_md_algo_name (opt.def_digest_algo);
3421             badtype = PREFTYPE_HASH;
3422           }
3423         else if(opt.cert_digest_algo
3424                 && !algo_available(PREFTYPE_HASH,opt.cert_digest_algo,NULL))
3425           {
3426             badalg = gcry_md_algo_name (opt.cert_digest_algo);
3427             badtype = PREFTYPE_HASH;
3428           }
3429         else if(opt.compress_algo!=-1
3430                 && !algo_available(PREFTYPE_ZIP,opt.compress_algo,NULL))
3431           {
3432             badalg = compress_algo_to_string(opt.compress_algo);
3433             badtype = PREFTYPE_ZIP;
3434           }
3435
3436         if(badalg)
3437           {
3438             switch(badtype)
3439               {
3440               case PREFTYPE_SYM:
3441                 log_info(_("you may not use cipher algorithm '%s'"
3442                            " while in %s mode\n"),
3443                          badalg,compliance_option_string());
3444                 break;
3445               case PREFTYPE_HASH:
3446                 log_info(_("you may not use digest algorithm '%s'"
3447                            " while in %s mode\n"),
3448                          badalg,compliance_option_string());
3449                 break;
3450               case PREFTYPE_ZIP:
3451                 log_info(_("you may not use compression algorithm '%s'"
3452                            " while in %s mode\n"),
3453                          badalg,compliance_option_string());
3454                 break;
3455               default:
3456                 BUG();
3457               }
3458
3459             compliance_failure();
3460           }
3461       }
3462
3463     /* Set the random seed file. */
3464     if( use_random_seed ) {
3465         char *p = make_filename(opt.homedir, "random_seed", NULL );
3466         gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
3467         if (!access (p, F_OK))
3468           register_secured_file (p);
3469         xfree(p);
3470     }
3471
3472     /* If there is no command but the --fingerprint is given, default
3473        to the --list-keys command.  */
3474     if (!cmd && fpr_maybe_cmd)
3475       {
3476         set_cmd (&cmd, aListKeys);
3477       }
3478
3479
3480     if( opt.verbose > 1 )
3481         set_packet_list_mode(1);
3482
3483     /* Add the keyrings, but not for some special commands.
3484        We always need to add the keyrings if we are running under
3485        SELinux, this is so that the rings are added to the list of
3486        secured files. */
3487     if( ALWAYS_ADD_KEYRINGS
3488         || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest) )
3489       {
3490         if (!nrings || default_keyring)  /* Add default ring. */
3491             keydb_add_resource ("pubring" EXTSEP_S GPGEXT_GPG,
3492                                 KEYDB_RESOURCE_FLAG_DEFAULT);
3493         for (sl = nrings; sl; sl = sl->next )
3494           keydb_add_resource (sl->d, sl->flags);
3495       }
3496     FREE_STRLIST(nrings);
3497
3498     if (cmd == aGPGConfTest)
3499       g10_exit(0);
3500
3501
3502     if( pwfd != -1 )  /* Read the passphrase now. */
3503         read_passphrase_from_fd( pwfd );
3504
3505     fname = argc? *argv : NULL;
3506
3507     if(fname && utf8_strings)
3508       opt.flags.utf8_filename=1;
3509
3510     ctrl = xcalloc (1, sizeof *ctrl);
3511     gpg_init_default_ctrl (ctrl);
3512
3513 #ifndef NO_TRUST_MODELS
3514     switch (cmd)
3515       {
3516       case aPrimegen:
3517       case aPrintMD:
3518       case aPrintMDs:
3519       case aGenRandom:
3520       case aDeArmor:
3521       case aEnArmor:
3522         break;
3523       case aFixTrustDB:
3524       case aExportOwnerTrust:
3525         rc = setup_trustdb (0, trustdb_name);
3526         break;
3527       case aListTrustDB:
3528         rc = setup_trustdb (argc? 1:0, trustdb_name);
3529         break;
3530       default:
3531         /* If we are using TM_ALWAYS, we do not need to create the
3532            trustdb.  */
3533         rc = setup_trustdb (opt.trust_model != TM_ALWAYS, trustdb_name);
3534         break;
3535       }
3536     if (rc)
3537       log_error (_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
3538 #endif /*!NO_TRUST_MODELS*/
3539
3540     switch (cmd)
3541       {
3542       case aStore:
3543       case aSym:
3544       case aSign:
3545       case aSignSym:
3546       case aClearsign:
3547         if (!opt.quiet && any_explicit_recipient)
3548           log_info (_("WARNING: recipients (-r) given "
3549                       "without using public key encryption\n"));
3550         break;
3551       default:
3552         break;
3553       }
3554
3555
3556     /* Check for certain command whether we need to migrate a
3557        secring.gpg to the gpg-agent. */
3558     switch (cmd)
3559       {
3560       case aListSecretKeys:
3561       case aSign:
3562       case aSignEncr:
3563       case aSignEncrSym:
3564       case aSignSym:
3565       case aClearsign:
3566       case aDecrypt:
3567       case aSignKey:
3568       case aLSignKey:
3569       case aEditKey:
3570       case aPasswd:
3571       case aDeleteSecretKeys:
3572       case aDeleteSecretAndPublicKeys:
3573       case aQuickKeygen:
3574       case aFullKeygen:
3575       case aKeygen:
3576       case aImport:
3577       case aExportSecret:
3578       case aExportSecretSub:
3579       case aGenRevoke:
3580       case aDesigRevoke:
3581       case aCardEdit:
3582       case aChangePIN:
3583         migrate_secring (ctrl);
3584         break;
3585       case aListKeys:
3586         if (opt.with_secret)
3587           migra