gpg: Remove PGP-2 related cruft.
[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
383     oNoop
384   };
385
386
387 static ARGPARSE_OPTS opts[] = {
388
389   ARGPARSE_group (300, N_("@Commands:\n ")),
390
391   ARGPARSE_c (aSign, "sign", N_("make a signature")),
392   ARGPARSE_c (aClearsign, "clearsign", N_("make a clear text signature")),
393   ARGPARSE_c (aDetachedSign, "detach-sign", N_("make a detached signature")),
394   ARGPARSE_c (aEncr, "encrypt",   N_("encrypt data")),
395   ARGPARSE_c (aEncrFiles, "encrypt-files", "@"),
396   ARGPARSE_c (aSym, "symmetric", N_("encryption only with symmetric cipher")),
397   ARGPARSE_c (aStore, "store",     "@"),
398   ARGPARSE_c (aDecrypt, "decrypt",   N_("decrypt data (default)")),
399   ARGPARSE_c (aDecryptFiles, "decrypt-files", "@"),
400   ARGPARSE_c (aVerify, "verify"   , N_("verify a signature")),
401   ARGPARSE_c (aVerifyFiles, "verify-files" , "@" ),
402   ARGPARSE_c (aListKeys, "list-keys", N_("list keys")),
403   ARGPARSE_c (aListKeys, "list-public-keys", "@" ),
404   ARGPARSE_c (aListSigs, "list-sigs", N_("list keys and signatures")),
405   ARGPARSE_c (aCheckKeys, "check-sigs",N_("list and check key signatures")),
406   ARGPARSE_c (oFingerprint, "fingerprint", N_("list keys and fingerprints")),
407   ARGPARSE_c (aListSecretKeys, "list-secret-keys", N_("list secret keys")),
408   ARGPARSE_c (aKeygen,      "gen-key",
409               N_("generate a new key pair")),
410   ARGPARSE_c (aQuickKeygen, "quick-gen-key" ,
411               N_("quickly generate a new key pair")),
412   ARGPARSE_c (aFullKeygen,  "full-gen-key" ,
413               N_("full featured key pair generation")),
414   ARGPARSE_c (aGenRevoke, "gen-revoke",N_("generate a revocation certificate")),
415   ARGPARSE_c (aDeleteKeys,"delete-keys",
416               N_("remove keys from the public keyring")),
417   ARGPARSE_c (aDeleteSecretKeys, "delete-secret-keys",
418               N_("remove keys from the secret keyring")),
419   ARGPARSE_c (aQuickSignKey,  "quick-sign-key" ,
420               N_("quickly sign a key")),
421   ARGPARSE_c (aQuickLSignKey, "quick-lsign-key",
422               N_("quickly sign a key locally")),
423   ARGPARSE_c (aSignKey,  "sign-key"   ,N_("sign a key")),
424   ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
425   ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
426   ARGPARSE_c (aEditKey,  "key-edit"   ,"@"),
427   ARGPARSE_c (aPasswd,   "passwd",     N_("change a passphrase")),
428   ARGPARSE_c (aDesigRevoke, "desig-revoke","@" ),
429   ARGPARSE_c (aExport, "export"           , N_("export keys") ),
430   ARGPARSE_c (aSendKeys, "send-keys"     , N_("export keys to a key server") ),
431   ARGPARSE_c (aRecvKeys, "recv-keys"     , N_("import keys from a key server") ),
432   ARGPARSE_c (aSearchKeys, "search-keys" ,
433               N_("search for keys on a key server") ),
434   ARGPARSE_c (aRefreshKeys, "refresh-keys",
435               N_("update all keys from a keyserver")),
436   ARGPARSE_c (aLocateKeys, "locate-keys", "@"),
437   ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
438   ARGPARSE_c (aExportSecret, "export-secret-keys" , "@" ),
439   ARGPARSE_c (aExportSecretSub, "export-secret-subkeys" , "@" ),
440   ARGPARSE_c (aImport, "import", N_("import/merge keys")),
441   ARGPARSE_c (aFastImport, "fast-import", "@"),
442 #ifdef ENABLE_CARD_SUPPORT
443   ARGPARSE_c (aCardStatus,  "card-status", N_("print the card status")),
444   ARGPARSE_c (aCardEdit,   "card-edit",  N_("change data on a card")),
445   ARGPARSE_c (aChangePIN,  "change-pin", N_("change a card's PIN")),
446 #endif
447   ARGPARSE_c (aListConfig, "list-config", "@"),
448   ARGPARSE_c (aGPGConfList, "gpgconf-list", "@" ),
449   ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@" ),
450   ARGPARSE_c (aListPackets, "list-packets","@"),
451
452 #ifndef NO_TRUST_MODELS
453   ARGPARSE_c (aExportOwnerTrust, "export-ownertrust", "@"),
454   ARGPARSE_c (aImportOwnerTrust, "import-ownertrust", "@"),
455   ARGPARSE_c (aUpdateTrustDB,"update-trustdb",
456               N_("update the trust database")),
457   ARGPARSE_c (aCheckTrustDB, "check-trustdb", "@"),
458   ARGPARSE_c (aFixTrustDB, "fix-trustdb", "@"),
459 #endif
460
461   ARGPARSE_c (aDeArmor, "dearmor", "@"),
462   ARGPARSE_c (aDeArmor, "dearmour", "@"),
463   ARGPARSE_c (aEnArmor, "enarmor", "@"),
464   ARGPARSE_c (aEnArmor, "enarmour", "@"),
465   ARGPARSE_c (aPrintMD, "print-md", N_("print message digests")),
466   ARGPARSE_c (aPrimegen, "gen-prime", "@" ),
467   ARGPARSE_c (aGenRandom,"gen-random", "@" ),
468   ARGPARSE_c (aServer,   "server",  N_("run in server mode")),
469
470   ARGPARSE_group (301, N_("@\nOptions:\n ")),
471
472   ARGPARSE_s_n (oArmor, "armor", N_("create ascii armored output")),
473   ARGPARSE_s_n (oArmor, "armour", "@"),
474
475   ARGPARSE_s_s (oRecipient, "recipient", N_("|USER-ID|encrypt for USER-ID")),
476   ARGPARSE_s_s (oHiddenRecipient, "hidden-recipient", "@"),
477   ARGPARSE_s_s (oRecipient, "remote-user", "@"),  /* (old option name) */
478   ARGPARSE_s_s (oDefRecipient, "default-recipient", "@"),
479   ARGPARSE_s_n (oDefRecipientSelf,  "default-recipient-self", "@"),
480   ARGPARSE_s_n (oNoDefRecipient, "no-default-recipient", "@"),
481
482   ARGPARSE_s_s (oTempDir,  "temp-directory", "@"),
483   ARGPARSE_s_s (oExecPath, "exec-path", "@"),
484   ARGPARSE_s_s (oEncryptTo,      "encrypt-to", "@"),
485   ARGPARSE_s_n (oNoEncryptTo, "no-encrypt-to", "@"),
486   ARGPARSE_s_s (oHiddenEncryptTo, "hidden-encrypt-to", "@"),
487   ARGPARSE_s_s (oLocalUser, "local-user",
488                 N_("|USER-ID|use USER-ID to sign or decrypt")),
489
490   ARGPARSE_s_s (oTrySecretKey, "try-secret-key", "@"),
491
492   ARGPARSE_s_i (oCompress, NULL,
493                 N_("|N|set compress level to N (0 disables)")),
494   ARGPARSE_s_i (oCompressLevel, "compress-level", "@"),
495   ARGPARSE_s_i (oBZ2CompressLevel, "bzip2-compress-level", "@"),
496   ARGPARSE_s_n (oBZ2DecompressLowmem, "bzip2-decompress-lowmem", "@"),
497
498   ARGPARSE_s_n (oTextmodeShort, NULL, "@"),
499   ARGPARSE_s_n (oTextmode,      "textmode", N_("use canonical text mode")),
500   ARGPARSE_s_n (oNoTextmode, "no-textmode", "@"),
501
502   ARGPARSE_s_n (oExpert,      "expert", "@"),
503   ARGPARSE_s_n (oNoExpert, "no-expert", "@"),
504
505   ARGPARSE_s_s (oDefSigExpire, "default-sig-expire", "@"),
506   ARGPARSE_s_n (oAskSigExpire,      "ask-sig-expire", "@"),
507   ARGPARSE_s_n (oNoAskSigExpire, "no-ask-sig-expire", "@"),
508   ARGPARSE_s_s (oDefCertExpire, "default-cert-expire", "@"),
509   ARGPARSE_s_n (oAskCertExpire,      "ask-cert-expire", "@"),
510   ARGPARSE_s_n (oNoAskCertExpire, "no-ask-cert-expire", "@"),
511   ARGPARSE_s_i (oDefCertLevel, "default-cert-level", "@"),
512   ARGPARSE_s_i (oMinCertLevel, "min-cert-level", "@"),
513   ARGPARSE_s_n (oAskCertLevel,      "ask-cert-level", "@"),
514   ARGPARSE_s_n (oNoAskCertLevel, "no-ask-cert-level", "@"),
515
516   ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
517   ARGPARSE_p_u (oMaxOutput, "max-output", "@"),
518
519   ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
520   ARGPARSE_s_n (oQuiet,   "quiet",   "@"),
521   ARGPARSE_s_n (oNoTTY,   "no-tty",  "@"),
522
523   ARGPARSE_s_n (oForceMDC, "force-mdc", "@"),
524   ARGPARSE_s_n (oNoForceMDC, "no-force-mdc", "@"),
525   ARGPARSE_s_n (oDisableMDC, "disable-mdc", "@"),
526   ARGPARSE_s_n (oNoDisableMDC, "no-disable-mdc", "@"),
527
528   ARGPARSE_s_n (oDryRun, "dry-run", N_("do not make any changes")),
529   ARGPARSE_s_n (oInteractive, "interactive", N_("prompt before overwriting")),
530
531   ARGPARSE_s_n (oBatch, "batch", "@"),
532   ARGPARSE_s_n (oAnswerYes, "yes", "@"),
533   ARGPARSE_s_n (oAnswerNo, "no", "@"),
534   ARGPARSE_s_s (oKeyring, "keyring", "@"),
535   ARGPARSE_s_s (oPrimaryKeyring, "primary-keyring", "@"),
536   ARGPARSE_s_s (oSecretKeyring, "secret-keyring", "@"),
537   ARGPARSE_s_n (oShowKeyring, "show-keyring", "@"),
538   ARGPARSE_s_s (oDefaultKey, "default-key", "@"),
539
540   ARGPARSE_s_s (oKeyServer, "keyserver", "@"),
541   ARGPARSE_s_s (oKeyServerOptions, "keyserver-options", "@"),
542   ARGPARSE_s_s (oImportOptions, "import-options", "@"),
543   ARGPARSE_s_s (oExportOptions, "export-options", "@"),
544   ARGPARSE_s_s (oListOptions,   "list-options", "@"),
545   ARGPARSE_s_s (oVerifyOptions, "verify-options", "@"),
546
547   ARGPARSE_s_s (oDisplayCharset, "display-charset", "@"),
548   ARGPARSE_s_s (oDisplayCharset, "charset", "@"),
549   ARGPARSE_s_s (oOptions, "options", "@"),
550
551   ARGPARSE_p_u (oDebug, "debug", "@"),
552   ARGPARSE_s_s (oDebugLevel, "debug-level", "@"),
553   ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
554   ARGPARSE_s_i (oStatusFD, "status-fd", "@"),
555   ARGPARSE_s_s (oStatusFile, "status-file", "@"),
556   ARGPARSE_s_i (oAttributeFD, "attribute-fd", "@"),
557   ARGPARSE_s_s (oAttributeFile, "attribute-file", "@"),
558
559   ARGPARSE_s_i (oCompletesNeeded, "completes-needed", "@"),
560   ARGPARSE_s_i (oMarginalsNeeded, "marginals-needed", "@"),
561   ARGPARSE_s_i (oMaxCertDepth,  "max-cert-depth", "@" ),
562   ARGPARSE_s_s (oTrustedKey, "trusted-key", "@"),
563
564   ARGPARSE_s_s (oLoadExtension, "load-extension", "@"),  /* Dummy.  */
565
566   ARGPARSE_s_n (oGnuPG, "gnupg",   "@"),
567   ARGPARSE_s_n (oGnuPG, "no-pgp2", "@"),
568   ARGPARSE_s_n (oGnuPG, "no-pgp6", "@"),
569   ARGPARSE_s_n (oGnuPG, "no-pgp7", "@"),
570   ARGPARSE_s_n (oGnuPG, "no-pgp8", "@"),
571   ARGPARSE_s_n (oRFC2440, "rfc2440", "@"),
572   ARGPARSE_s_n (oRFC4880, "rfc4880", "@"),
573   ARGPARSE_s_n (oOpenPGP, "openpgp", N_("use strict OpenPGP behavior")),
574   ARGPARSE_s_n (oPGP6, "pgp6", "@"),
575   ARGPARSE_s_n (oPGP7, "pgp7", "@"),
576   ARGPARSE_s_n (oPGP8, "pgp8", "@"),
577
578   ARGPARSE_s_n (oRFC2440Text,      "rfc2440-text", "@"),
579   ARGPARSE_s_n (oNoRFC2440Text, "no-rfc2440-text", "@"),
580   ARGPARSE_s_i (oS2KMode, "s2k-mode", "@"),
581   ARGPARSE_s_s (oS2KDigest, "s2k-digest-algo", "@"),
582   ARGPARSE_s_s (oS2KCipher, "s2k-cipher-algo", "@"),
583   ARGPARSE_s_i (oS2KCount, "s2k-count", "@"),
584   ARGPARSE_s_s (oCipherAlgo, "cipher-algo", "@"),
585   ARGPARSE_s_s (oDigestAlgo, "digest-algo", "@"),
586   ARGPARSE_s_s (oCertDigestAlgo, "cert-digest-algo", "@"),
587   ARGPARSE_s_s (oCompressAlgo,"compress-algo", "@"),
588   ARGPARSE_s_s (oCompressAlgo, "compression-algo", "@"), /* Alias */
589   ARGPARSE_s_n (oThrowKeyids, "throw-keyid", "@"),
590   ARGPARSE_s_n (oThrowKeyids, "throw-keyids", "@"),
591   ARGPARSE_s_n (oNoThrowKeyids, "no-throw-keyid", "@"),
592   ARGPARSE_s_n (oNoThrowKeyids, "no-throw-keyids", "@"),
593   ARGPARSE_s_n (oShowPhotos,   "show-photos", "@"),
594   ARGPARSE_s_n (oNoShowPhotos, "no-show-photos", "@"),
595   ARGPARSE_s_s (oPhotoViewer,  "photo-viewer", "@"),
596   ARGPARSE_s_s (oSetNotation,  "set-notation", "@"),
597   ARGPARSE_s_s (oSetNotation,  "notation-data", "@"), /* Alias */
598   ARGPARSE_s_s (oSigNotation,  "sig-notation", "@"),
599   ARGPARSE_s_s (oCertNotation, "cert-notation", "@"),
600
601   ARGPARSE_group (302, N_(
602   "@\n(See the man page for a complete listing of all commands and options)\n"
603                       )),
604
605   ARGPARSE_group (303, N_("@\nExamples:\n\n"
606     " -se -r Bob [file]          sign and encrypt for user Bob\n"
607     " --clearsign [file]         make a clear text signature\n"
608     " --detach-sign [file]       make a detached signature\n"
609     " --list-keys [names]        show keys\n"
610     " --fingerprint [names]      show fingerprints\n")),
611
612   /* More hidden commands and options. */
613   ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
614 #ifndef NO_TRUST_MODELS
615   ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
616 #endif
617
618   /* Not yet used:
619      ARGPARSE_c (aListTrustPath, "list-trust-path", "@"), */
620   ARGPARSE_c (aDeleteSecretAndPublicKeys,
621               "delete-secret-and-public-keys", "@"),
622   ARGPARSE_c (aRebuildKeydbCaches, "rebuild-keydb-caches", "@"),
623
624   ARGPARSE_s_s (oPassphrase,      "passphrase", "@"),
625   ARGPARSE_s_i (oPassphraseFD,    "passphrase-fd", "@"),
626   ARGPARSE_s_s (oPassphraseFile,  "passphrase-file", "@"),
627   ARGPARSE_s_i (oPassphraseRepeat,"passphrase-repeat", "@"),
628   ARGPARSE_s_s (oPinentryMode,    "pinentry-mode", "@"),
629   ARGPARSE_s_i (oCommandFD, "command-fd", "@"),
630   ARGPARSE_s_s (oCommandFile, "command-file", "@"),
631   ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
632   ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
633
634 #ifndef NO_TRUST_MODELS
635   ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
636   ARGPARSE_s_n (oAutoCheckTrustDB, "auto-check-trustdb", "@"),
637   ARGPARSE_s_n (oNoAutoCheckTrustDB, "no-auto-check-trustdb", "@"),
638   ARGPARSE_s_s (oForceOwnertrust, "force-ownertrust", "@"),
639 #endif
640
641   ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
642   ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
643   ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
644   ARGPARSE_s_n (oNoPermissionWarn, "no-permission-warning", "@"),
645   ARGPARSE_s_n (oNoMDCWarn, "no-mdc-warning", "@"),
646   ARGPARSE_s_n (oNoArmor, "no-armor", "@"),
647   ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
648   ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
649   ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
650   ARGPARSE_s_n (oNoOptions, "no-options", "@"),
651   ARGPARSE_s_s (oHomedir, "homedir", "@"),
652   ARGPARSE_s_n (oNoBatch, "no-batch", "@"),
653   ARGPARSE_s_n (oWithColons, "with-colons", "@"),
654   ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
655   ARGPARSE_s_n (oWithSigList,"with-sig-list", "@"),
656   ARGPARSE_s_n (oWithSigCheck,"with-sig-check", "@"),
657   ARGPARSE_s_n (aListKeys, "list-key", "@"),   /* alias */
658   ARGPARSE_s_n (aListSigs, "list-sig", "@"),   /* alias */
659   ARGPARSE_s_n (aCheckKeys, "check-sig", "@"), /* alias */
660   ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
661   ARGPARSE_s_n (oSkipHiddenRecipients, "skip-hidden-recipients", "@"),
662   ARGPARSE_s_n (oNoSkipHiddenRecipients, "no-skip-hidden-recipients", "@"),
663   ARGPARSE_s_i (oDefCertLevel, "default-cert-check-level", "@"), /* old */
664   ARGPARSE_s_n (oAlwaysTrust, "always-trust", "@"),
665   ARGPARSE_s_s (oTrustModel, "trust-model", "@"),
666   ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
667   ARGPARSE_s_n (oForYourEyesOnly, "for-your-eyes-only", "@"),
668   ARGPARSE_s_n (oNoForYourEyesOnly, "no-for-your-eyes-only", "@"),
669   ARGPARSE_s_s (oSetPolicyURL,  "set-policy-url", "@"),
670   ARGPARSE_s_s (oSigPolicyURL,  "sig-policy-url", "@"),
671   ARGPARSE_s_s (oCertPolicyURL, "cert-policy-url", "@"),
672   ARGPARSE_s_n (oShowPolicyURL,      "show-policy-url", "@"),
673   ARGPARSE_s_n (oNoShowPolicyURL, "no-show-policy-url", "@"),
674   ARGPARSE_s_s (oSigKeyserverURL, "sig-keyserver-url", "@"),
675   ARGPARSE_s_n (oShowNotation,      "show-notation", "@"),
676   ARGPARSE_s_n (oNoShowNotation, "no-show-notation", "@"),
677   ARGPARSE_s_s (oComment, "comment", "@"),
678   ARGPARSE_s_n (oDefaultComment, "default-comment", "@"),
679   ARGPARSE_s_n (oNoComments, "no-comments", "@"),
680   ARGPARSE_s_n (oEmitVersion,      "emit-version", "@"),
681   ARGPARSE_s_n (oNoEmitVersion, "no-emit-version", "@"),
682   ARGPARSE_s_n (oNoEmitVersion, "no-version", "@"), /* alias */
683   ARGPARSE_s_n (oNotDashEscaped, "not-dash-escaped", "@"),
684   ARGPARSE_s_n (oEscapeFrom,      "escape-from-lines", "@"),
685   ARGPARSE_s_n (oNoEscapeFrom, "no-escape-from-lines", "@"),
686   ARGPARSE_s_n (oLockOnce,     "lock-once", "@"),
687   ARGPARSE_s_n (oLockMultiple, "lock-multiple", "@"),
688   ARGPARSE_s_n (oLockNever,    "lock-never", "@"),
689   ARGPARSE_s_i (oLoggerFD,   "logger-fd", "@"),
690   ARGPARSE_s_s (oLoggerFile, "log-file", "@"),
691   ARGPARSE_s_s (oLoggerFile, "logger-file", "@"),  /* 1.4 compatibility.  */
692   ARGPARSE_s_n (oUseEmbeddedFilename,      "use-embedded-filename", "@"),
693   ARGPARSE_s_n (oNoUseEmbeddedFilename, "no-use-embedded-filename", "@"),
694   ARGPARSE_s_n (oUtf8Strings,      "utf8-strings", "@"),
695   ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
696   ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
697   ARGPARSE_s_n (oWithKeygrip,     "with-keygrip", "@"),
698   ARGPARSE_s_n (oWithSecret,      "with-secret", "@"),
699   ARGPARSE_s_s (oDisableCipherAlgo,  "disable-cipher-algo", "@"),
700   ARGPARSE_s_s (oDisablePubkeyAlgo,  "disable-pubkey-algo", "@"),
701   ARGPARSE_s_n (oAllowNonSelfsignedUID,      "allow-non-selfsigned-uid", "@"),
702   ARGPARSE_s_n (oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", "@"),
703   ARGPARSE_s_n (oAllowFreeformUID,      "allow-freeform-uid", "@"),
704   ARGPARSE_s_n (oNoAllowFreeformUID, "no-allow-freeform-uid", "@"),
705   ARGPARSE_s_n (oNoLiteral, "no-literal", "@"),
706   ARGPARSE_p_u (oSetFilesize, "set-filesize", "@"),
707   ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
708   ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
709   ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
710   ARGPARSE_s_n (oLegacyListMode, "legacy-list-mode", "@"),
711   ARGPARSE_s_n (oListOnly, "list-only", "@"),
712   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
713   ARGPARSE_s_n (oIgnoreValidFrom,    "ignore-valid-from", "@"),
714   ARGPARSE_s_n (oIgnoreCrcError, "ignore-crc-error", "@"),
715   ARGPARSE_s_n (oIgnoreMDCError, "ignore-mdc-error", "@"),
716   ARGPARSE_s_n (oShowSessionKey, "show-session-key", "@"),
717   ARGPARSE_s_s (oOverrideSessionKey, "override-session-key", "@"),
718   ARGPARSE_s_n (oNoRandomSeedFile,  "no-random-seed-file", "@"),
719   ARGPARSE_s_n (oAutoKeyRetrieve, "auto-key-retrieve", "@"),
720   ARGPARSE_s_n (oNoAutoKeyRetrieve, "no-auto-key-retrieve", "@"),
721   ARGPARSE_s_n (oNoSigCache,         "no-sig-cache", "@"),
722   ARGPARSE_s_n (oNoSigCreateCheck,   "no-sig-create-check", "@"),
723   ARGPARSE_s_n (oMergeOnly,       "merge-only", "@" ),
724   ARGPARSE_s_n (oAllowSecretKeyImport, "allow-secret-key-import", "@"),
725   ARGPARSE_s_n (oTryAllSecrets,  "try-all-secrets", "@"),
726   ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
727   ARGPARSE_s_n (oNoExpensiveTrustChecks, "no-expensive-trust-checks", "@"),
728   ARGPARSE_s_n (oPreservePermissions, "preserve-permissions", "@"),
729   ARGPARSE_s_s (oDefaultPreferenceList,  "default-preference-list", "@"),
730   ARGPARSE_s_s (oDefaultKeyserverURL,  "default-keyserver-url", "@"),
731   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-preferences","@"),
732   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
733   ARGPARSE_s_s (oPersonalCompressPreferences,
734                                          "personal-compress-preferences", "@"),
735   ARGPARSE_s_s (oFakedSystemTime, "faked-system-time", "@"),
736
737   /* Aliases.  I constantly mistype these, and assume other people do
738      as well. */
739   ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-prefs", "@"),
740   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-prefs", "@"),
741   ARGPARSE_s_s (oPersonalCompressPreferences, "personal-compress-prefs", "@"),
742
743   ARGPARSE_s_s (oAgentProgram, "agent-program", "@"),
744   ARGPARSE_s_s (oDirmngrProgram, "dirmngr-program", "@"),
745   ARGPARSE_s_s (oDisplay,    "display",    "@"),
746   ARGPARSE_s_s (oTTYname,    "ttyname",    "@"),
747   ARGPARSE_s_s (oTTYtype,    "ttytype",    "@"),
748   ARGPARSE_s_s (oLCctype,    "lc-ctype",   "@"),
749   ARGPARSE_s_s (oLCmessages, "lc-messages","@"),
750   ARGPARSE_s_s (oXauthority, "xauthority", "@"),
751   ARGPARSE_s_s (oGroup,      "group",      "@"),
752   ARGPARSE_s_s (oUnGroup,    "ungroup",    "@"),
753   ARGPARSE_s_n (oNoGroups,   "no-groups",  "@"),
754   ARGPARSE_s_n (oStrict,     "strict",     "@"),
755   ARGPARSE_s_n (oNoStrict,   "no-strict",  "@"),
756   ARGPARSE_s_n (oMangleDosFilenames,      "mangle-dos-filenames", "@"),
757   ARGPARSE_s_n (oNoMangleDosFilenames, "no-mangle-dos-filenames", "@"),
758   ARGPARSE_s_n (oEnableProgressFilter, "enable-progress-filter", "@"),
759   ARGPARSE_s_n (oMultifile, "multifile", "@"),
760   ARGPARSE_s_s (oKeyidFormat, "keyid-format", "@"),
761   ARGPARSE_s_n (oExitOnStatusWriteError, "exit-on-status-write-error", "@"),
762   ARGPARSE_s_i (oLimitCardInsertTries, "limit-card-insert-tries", "@"),
763
764   ARGPARSE_s_n (oAllowMultisigVerification,
765                 "allow-multisig-verification", "@"),
766   ARGPARSE_s_n (oEnableLargeRSA, "enable-large-rsa", "@"),
767   ARGPARSE_s_n (oDisableLargeRSA, "disable-large-rsa", "@"),
768   ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
769   ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
770   ARGPARSE_s_n (oAllowMultipleMessages,      "allow-multiple-messages", "@"),
771   ARGPARSE_s_n (oNoAllowMultipleMessages, "no-allow-multiple-messages", "@"),
772   ARGPARSE_s_n (oAllowWeakDigestAlgos, "allow-weak-digest-algos", "@"),
773
774   /* These two are aliases to help users of the PGP command line
775      product use gpg with minimal pain.  Many commands are common
776      already as they seem to have borrowed commands from us.  Now I'm
777      returning the favor. */
778   ARGPARSE_s_s (oLocalUser, "sign-with", "@"),
779   ARGPARSE_s_s (oRecipient, "user", "@"),
780
781   ARGPARSE_s_n (oRequireCrossCert, "require-backsigs", "@"),
782   ARGPARSE_s_n (oRequireCrossCert, "require-cross-certification", "@"),
783   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-backsigs", "@"),
784   ARGPARSE_s_n (oNoRequireCrossCert, "no-require-cross-certification", "@"),
785
786   /* New options.  Fixme: Should go more to the top.  */
787   ARGPARSE_s_s (oAutoKeyLocate, "auto-key-locate", "@"),
788   ARGPARSE_s_n (oNoAutoKeyLocate, "no-auto-key-locate", "@"),
789
790   /* Dummy options with warnings.  */
791   ARGPARSE_s_n (oUseAgent,      "use-agent", "@"),
792   ARGPARSE_s_n (oNoUseAgent, "no-use-agent", "@"),
793   ARGPARSE_s_s (oGpgAgentInfo, "gpg-agent-info", "@"),
794   ARGPARSE_s_s (oReaderPort, "reader-port", "@"),
795   ARGPARSE_s_s (octapiDriver, "ctapi-driver", "@"),
796   ARGPARSE_s_s (opcscDriver, "pcsc-driver", "@"),
797   ARGPARSE_s_n (oDisableCCID, "disable-ccid", "@"),
798
799   /* Dummy options.  */
800   ARGPARSE_s_n (oNoop, "sk-comments", "@"),
801   ARGPARSE_s_n (oNoop, "no-sk-comments", "@"),
802   ARGPARSE_s_n (oNoop, "compress-keys", "@"),
803   ARGPARSE_s_n (oNoop, "compress-sigs", "@"),
804   ARGPARSE_s_n (oNoop, "force-v3-sigs", "@"),
805   ARGPARSE_s_n (oNoop, "no-force-v3-sigs", "@"),
806   ARGPARSE_s_n (oNoop, "force-v4-certs", "@"),
807   ARGPARSE_s_n (oNoop, "no-force-v4-certs", "@"),
808
809   ARGPARSE_end ()
810 };
811
812
813 #ifdef ENABLE_SELINUX_HACKS
814 #define ALWAYS_ADD_KEYRINGS 1
815 #else
816 #define ALWAYS_ADD_KEYRINGS 0
817 #endif
818
819
820 int g10_errors_seen = 0;
821
822 static int utf8_strings = 0;
823 static int maybe_setuid = 1;
824
825 static char *build_list( const char *text, char letter,
826                          const char *(*mapf)(int), int (*chkf)(int) );
827 static void set_cmd( enum cmd_and_opt_values *ret_cmd,
828                         enum cmd_and_opt_values new_cmd );
829 static void print_mds( const char *fname, int algo );
830 static void add_notation_data( const char *string, int which );
831 static void add_policy_url( const char *string, int which );
832 static void add_keyserver_url( const char *string, int which );
833 static void emergency_cleanup (void);
834
835
836 static char *
837 make_libversion (const char *libname, const char *(*getfnc)(const char*))
838 {
839   const char *s;
840   char *result;
841
842   if (maybe_setuid)
843     {
844       gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
845       maybe_setuid = 0;
846     }
847   s = getfnc (NULL);
848   result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
849   strcpy (stpcpy (stpcpy (result, libname), " "), s);
850   return result;
851 }
852
853
854 static int
855 build_list_pk_test_algo (int algo)
856 {
857   /* Show only one "RSA" string.  If RSA_E or RSA_S is available RSA
858      is also available.  */
859   if (algo == PUBKEY_ALGO_RSA_E
860       || algo == PUBKEY_ALGO_RSA_S)
861     return GPG_ERR_DIGEST_ALGO;
862
863   return openpgp_pk_test_algo (algo);
864 }
865
866 static const char *
867 build_list_pk_algo_name (int algo)
868 {
869   return openpgp_pk_algo_name (algo);
870 }
871
872 static int
873 build_list_cipher_test_algo (int algo)
874 {
875   return openpgp_cipher_test_algo (algo);
876 }
877
878 static const char *
879 build_list_cipher_algo_name (int algo)
880 {
881   return openpgp_cipher_algo_name (algo);
882 }
883
884 static int
885 build_list_md_test_algo (int algo)
886 {
887   /* By default we do not accept MD5 based signatures.  To avoid
888      confusion we do not announce support for it either.  */
889   if (algo == DIGEST_ALGO_MD5)
890     return GPG_ERR_DIGEST_ALGO;
891
892   return openpgp_md_test_algo (algo);
893 }
894
895 static const char *
896 build_list_md_algo_name (int algo)
897 {
898   return openpgp_md_algo_name (algo);
899 }
900
901
902 static const char *
903 my_strusage( int level )
904 {
905   static char *digests, *pubkeys, *ciphers, *zips, *ver_gcry;
906   const char *p;
907
908     switch( level ) {
909       case 11: p = "@GPG@ (@GNUPG@)";
910         break;
911       case 13: p = VERSION; break;
912       case 17: p = PRINTABLE_OS_NAME; break;
913       case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
914
915     case 20:
916       if (!ver_gcry)
917         ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
918       p = ver_gcry;
919       break;
920
921 #ifdef IS_DEVELOPMENT_VERSION
922       case 25:
923         p="NOTE: THIS IS A DEVELOPMENT VERSION!";
924         break;
925       case 26:
926         p="It is only intended for test purposes and should NOT be";
927         break;
928       case 27:
929         p="used in a production environment or with production keys!";
930         break;
931 #endif
932
933       case 1:
934       case 40:  p =
935             _("Usage: @GPG@ [options] [files] (-h for help)");
936         break;
937       case 41:  p =
938             _("Syntax: @GPG@ [options] [files]\n"
939               "Sign, check, encrypt or decrypt\n"
940               "Default operation depends on the input data\n");
941         break;
942
943       case 31: p = "\nHome: "; break;
944 #ifndef __riscos__
945       case 32: p = opt.homedir; break;
946 #else /* __riscos__ */
947       case 32: p = make_filename(opt.homedir, NULL); break;
948 #endif /* __riscos__ */
949       case 33: p = _("\nSupported algorithms:\n"); break;
950       case 34:
951         if (!pubkeys)
952             pubkeys = build_list (_("Pubkey: "), 1,
953                                   build_list_pk_algo_name,
954                                   build_list_pk_test_algo );
955         p = pubkeys;
956         break;
957       case 35:
958         if( !ciphers )
959             ciphers = build_list(_("Cipher: "), 'S',
960                                  build_list_cipher_algo_name,
961                                  build_list_cipher_test_algo );
962         p = ciphers;
963         break;
964       case 36:
965         if( !digests )
966             digests = build_list(_("Hash: "), 'H',
967                                  build_list_md_algo_name,
968                                  build_list_md_test_algo );
969         p = digests;
970         break;
971       case 37:
972         if( !zips )
973             zips = build_list(_("Compression: "),'Z',
974                               compress_algo_to_string,
975                               check_compress_algo);
976         p = zips;
977         break;
978
979       default:  p = NULL;
980     }
981     return p;
982 }
983
984
985 static char *
986 build_list (const char *text, char letter,
987             const char * (*mapf)(int), int (*chkf)(int))
988 {
989   membuf_t mb;
990   int indent;
991   int i, j, len;
992   const char *s;
993   char *string;
994
995   if (maybe_setuid)
996     gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
997
998   indent = utf8_charcount (text);
999   len = 0;
1000   init_membuf (&mb, 512);
1001
1002   for (i=0; i <= 110; i++ )
1003     {
1004       if (!chkf (i) && (s = mapf (i)))
1005         {
1006           if (mb.len - len > 60)
1007             {
1008               put_membuf_str (&mb, ",\n");
1009               len = mb.len;
1010               for (j=0; j < indent; j++)
1011                 put_membuf_str (&mb, " ");
1012             }
1013           else if (mb.len)
1014             put_membuf_str (&mb, ", ");
1015           else
1016             put_membuf_str (&mb, text);
1017
1018           put_membuf_str (&mb, s);
1019           if (opt.verbose && letter)
1020             {
1021               char num[20];
1022               if (letter == 1)
1023                 snprintf (num, sizeof num, " (%d)", i);
1024               else
1025                 snprintf (num, sizeof num, " (%c%d)", letter, i);
1026               put_membuf_str (&mb, num);
1027             }
1028         }
1029     }
1030   if (mb.len)
1031     put_membuf_str (&mb, "\n");
1032   put_membuf (&mb, "", 1);
1033
1034   string = get_membuf (&mb, NULL);
1035   return xrealloc (string, strlen (string)+1);
1036 }
1037
1038
1039 static void
1040 wrong_args( const char *text)
1041 {
1042   fprintf (stderr, _("usage: %s [options] %s\n"), GPG_NAME, text);
1043   g10_exit(2);
1044 }
1045
1046
1047 static char *
1048 make_username( const char *string )
1049 {
1050     char *p;
1051     if( utf8_strings )
1052         p = xstrdup(string);
1053     else
1054         p = native_to_utf8( string );
1055     return p;
1056 }
1057
1058
1059 static void
1060 set_opt_session_env (const char *name, const char *value)
1061 {
1062   gpg_error_t err;
1063
1064   err = session_env_setenv (opt.session_env, name, value);
1065   if (err)
1066     log_fatal ("error setting session environment: %s\n",
1067                gpg_strerror (err));
1068 }
1069
1070 /* Setup the debugging.  With a LEVEL of NULL only the active debug
1071    flags are propagated to the subsystems.  With LEVEL set, a specific
1072    set of debug flags is set; thus overriding all flags already
1073    set. */
1074 static void
1075 set_debug (const char *level)
1076 {
1077   int numok = (level && digitp (level));
1078   int numlvl = numok? atoi (level) : 0;
1079
1080   if (!level)
1081     ;
1082   else if (!strcmp (level, "none") || (numok && numlvl < 1))
1083     opt.debug = 0;
1084   else if (!strcmp (level, "basic") || (numok && numlvl <= 2))
1085     opt.debug = DBG_MEMSTAT_VALUE;
1086   else if (!strcmp (level, "advanced") || (numok && numlvl <= 5))
1087     opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE;
1088   else if (!strcmp (level, "expert")  || (numok && numlvl <= 8))
1089     opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE
1090                  |DBG_CACHE_VALUE|DBG_FILTER_VALUE|DBG_PACKET_VALUE);
1091   else if (!strcmp (level, "guru") || numok)
1092     {
1093       opt.debug = ~0;
1094       /* Unless the "guru" string has been used we don't want to allow
1095          hashing debugging.  The rationale is that people tend to
1096          select the highest debug value and would then clutter their
1097          disk with debug files which may reveal confidential data.  */
1098       if (numok)
1099         opt.debug &= ~(DBG_HASHING_VALUE);
1100     }
1101   else
1102     {
1103       log_error (_("invalid debug-level '%s' given\n"), level);
1104       g10_exit (2);
1105     }
1106
1107   if (opt.debug & DBG_MEMORY_VALUE )
1108     memory_debug_mode = 1;
1109   if (opt.debug & DBG_MEMSTAT_VALUE )
1110     memory_stat_debug_mode = 1;
1111   if (opt.debug & DBG_MPI_VALUE)
1112     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 2);
1113   if (opt.debug & DBG_CIPHER_VALUE )
1114     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
1115   if (opt.debug & DBG_IOBUF_VALUE )
1116     iobuf_debug_mode = 1;
1117   gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
1118
1119   if (opt.debug)
1120     log_info ("enabled debug flags:%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
1121               (opt.debug & DBG_PACKET_VALUE )? " packet":"",
1122               (opt.debug & DBG_MPI_VALUE    )? " mpi":"",
1123               (opt.debug & DBG_CIPHER_VALUE )? " cipher":"",
1124               (opt.debug & DBG_FILTER_VALUE )? " filter":"",
1125               (opt.debug & DBG_IOBUF_VALUE  )? " iobuf":"",
1126               (opt.debug & DBG_MEMORY_VALUE )? " memory":"",
1127               (opt.debug & DBG_CACHE_VALUE  )? " cache":"",
1128               (opt.debug & DBG_MEMSTAT_VALUE)? " memstat":"",
1129               (opt.debug & DBG_TRUST_VALUE  )? " trust":"",
1130               (opt.debug & DBG_HASHING_VALUE)? " hashing":"",
1131               (opt.debug & DBG_EXTPROG_VALUE)? " extprog":"",
1132               (opt.debug & DBG_CARD_IO_VALUE)? " cardio":"",
1133               (opt.debug & DBG_ASSUAN_VALUE )? " assuan":"",
1134               (opt.debug & DBG_CLOCK_VALUE  )? " clock":"");
1135 }
1136
1137
1138
1139 /* We need the home directory also in some other directories, so make
1140    sure that both variables are always in sync. */
1141 static void
1142 set_homedir (const char *dir)
1143 {
1144   if (!dir)
1145     dir = "";
1146   opt.homedir = dir;
1147 }
1148
1149
1150 /* We set the screen dimensions for UI purposes.  Do not allow screens
1151    smaller than 80x24 for the sake of simplicity. */
1152 static void
1153 set_screen_dimensions(void)
1154 {
1155 #ifndef HAVE_W32_SYSTEM
1156   char *str;
1157
1158   str=getenv("COLUMNS");
1159   if(str)
1160     opt.screen_columns=atoi(str);
1161
1162   str=getenv("LINES");
1163   if(str)
1164     opt.screen_lines=atoi(str);
1165 #endif
1166
1167   if(opt.screen_columns<80 || opt.screen_columns>255)
1168     opt.screen_columns=80;
1169
1170   if(opt.screen_lines<24 || opt.screen_lines>255)
1171     opt.screen_lines=24;
1172 }
1173
1174
1175 /* Helper to open a file FNAME either for reading or writing to be
1176    used with --status-file etc functions.  Not generally useful but it
1177    avoids the riscos specific functions and well some Windows people
1178    might like it too.  Prints an error message and returns -1 on
1179    error.  On success the file descriptor is returned.  */
1180 static int
1181 open_info_file (const char *fname, int for_write, int binary)
1182 {
1183 #ifdef __riscos__
1184   return riscos_fdopenfile (fname, for_write);
1185 #elif defined (ENABLE_SELINUX_HACKS)
1186   /* We can't allow these even when testing for a secured filename
1187      because files to be secured might not yet been secured.  This is
1188      similar to the option file but in that case it is unlikely that
1189      sensitive information may be retrieved by means of error
1190      messages.  */
1191   (void)fname;
1192   (void)for_write;
1193   (void)binary;
1194   return -1;
1195 #else
1196   int fd;
1197
1198   if (binary)
1199     binary = MY_O_BINARY;
1200
1201 /*   if (is_secured_filename (fname)) */
1202 /*     { */
1203 /*       fd = -1; */
1204 /*       gpg_err_set_errno (EPERM); */
1205 /*     } */
1206 /*   else */
1207 /*     { */
1208       do
1209         {
1210           if (for_write)
1211             fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY | binary,
1212                         S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
1213           else
1214             fd = open (fname, O_RDONLY | binary);
1215         }
1216       while (fd == -1 && errno == EINTR);
1217 /*     } */
1218   if ( fd == -1)
1219     log_error ( for_write? _("can't create '%s': %s\n")
1220                          : _("can't open '%s': %s\n"), fname, strerror(errno));
1221
1222   return fd;
1223 #endif
1224 }
1225
1226 static void
1227 set_cmd( enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd )
1228 {
1229     enum cmd_and_opt_values cmd = *ret_cmd;
1230
1231     if( !cmd || cmd == new_cmd )
1232         cmd = new_cmd;
1233     else if( cmd == aSign && new_cmd == aEncr )
1234         cmd = aSignEncr;
1235     else if( cmd == aEncr && new_cmd == aSign )
1236         cmd = aSignEncr;
1237     else if( cmd == aSign && new_cmd == aSym )
1238         cmd = aSignSym;
1239     else if( cmd == aSym && new_cmd == aSign )
1240         cmd = aSignSym;
1241     else if( cmd == aSym && new_cmd == aEncr )
1242         cmd = aEncrSym;
1243     else if( cmd == aEncr && new_cmd == aSym )
1244         cmd = aEncrSym;
1245     else if (cmd == aSignEncr && new_cmd == aSym)
1246         cmd = aSignEncrSym;
1247     else if (cmd == aSignSym && new_cmd == aEncr)
1248         cmd = aSignEncrSym;
1249     else if (cmd == aEncrSym && new_cmd == aSign)
1250         cmd = aSignEncrSym;
1251     else if(    ( cmd == aSign     && new_cmd == aClearsign )
1252              || ( cmd == aClearsign && new_cmd == aSign )  )
1253         cmd = aClearsign;
1254     else {
1255         log_error(_("conflicting commands\n"));
1256         g10_exit(2);
1257     }
1258
1259     *ret_cmd = cmd;
1260 }
1261
1262
1263 static void
1264 add_group(char *string)
1265 {
1266   char *name,*value;
1267   struct groupitem *item;
1268
1269   /* Break off the group name */
1270   name=strsep(&string,"=");
1271   if(string==NULL)
1272     {
1273       log_error(_("no = sign found in group definition '%s'\n"),name);
1274       return;
1275     }
1276
1277   trim_trailing_ws(name,strlen(name));
1278
1279   /* Does this group already exist? */
1280   for(item=opt.grouplist;item;item=item->next)
1281     if(strcasecmp(item->name,name)==0)
1282       break;
1283
1284   if(!item)
1285     {
1286       item=xmalloc(sizeof(struct groupitem));
1287       item->name=name;
1288       item->next=opt.grouplist;
1289       item->values=NULL;
1290       opt.grouplist=item;
1291     }
1292
1293   /* Break apart the values */
1294   while ((value= strsep(&string," \t")))
1295     {
1296       if (*value)
1297         add_to_strlist2(&item->values,value,utf8_strings);
1298     }
1299 }
1300
1301
1302 static void
1303 rm_group(char *name)
1304 {
1305   struct groupitem *item,*last=NULL;
1306
1307   trim_trailing_ws(name,strlen(name));
1308
1309   for(item=opt.grouplist;item;last=item,item=item->next)
1310     {
1311       if(strcasecmp(item->name,name)==0)
1312         {
1313           if(last)
1314             last->next=item->next;
1315           else
1316             opt.grouplist=item->next;
1317
1318           free_strlist(item->values);
1319           xfree(item);
1320           break;
1321         }
1322     }
1323 }
1324
1325
1326 /* We need to check three things.
1327
1328    0) The homedir.  It must be x00, a directory, and owned by the
1329    user.
1330
1331    1) The options/gpg.conf file.  Okay unless it or its containing
1332    directory is group or other writable or not owned by us.  Disable
1333    exec in this case.
1334
1335    2) Extensions.  Same as #1.
1336
1337    Returns true if the item is unsafe. */
1338 static int
1339 check_permissions (const char *path, int item)
1340 {
1341 #if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
1342   static int homedir_cache=-1;
1343   char *tmppath,*dir;
1344   struct stat statbuf,dirbuf;
1345   int homedir=0,ret=0,checkonly=0;
1346   int perm=0,own=0,enc_dir_perm=0,enc_dir_own=0;
1347
1348   if(opt.no_perm_warn)
1349     return 0;
1350
1351   assert(item==0 || item==1 || item==2);
1352
1353   /* extensions may attach a path */
1354   if(item==2 && path[0]!=DIRSEP_C)
1355     {
1356       if(strchr(path,DIRSEP_C))
1357         tmppath=make_filename(path,NULL);
1358       else
1359         tmppath=make_filename(gnupg_libdir (),path,NULL);
1360     }
1361   else
1362     tmppath=xstrdup(path);
1363
1364   /* If the item is located in the homedir, but isn't the homedir,
1365      don't continue if we already checked the homedir itself.  This is
1366      to avoid user confusion with an extra options file warning which
1367      could be rectified if the homedir itself had proper
1368      permissions. */
1369   if(item!=0 && homedir_cache>-1
1370      && ascii_strncasecmp(opt.homedir,tmppath,strlen(opt.homedir))==0)
1371     {
1372       ret=homedir_cache;
1373       goto end;
1374     }
1375
1376   /* It's okay if the file or directory doesn't exist */
1377   if(stat(tmppath,&statbuf)!=0)
1378     {
1379       ret=0;
1380       goto end;
1381     }
1382
1383   /* Now check the enclosing directory.  Theoretically, we could walk
1384      this test up to the root directory /, but for the sake of sanity,
1385      I'm stopping at one level down. */
1386   dir=make_dirname(tmppath);
1387
1388   if(stat(dir,&dirbuf)!=0 || !S_ISDIR(dirbuf.st_mode))
1389     {
1390       /* Weird error */
1391       ret=1;
1392       goto end;
1393     }
1394
1395   xfree(dir);
1396
1397   /* Assume failure */
1398   ret=1;
1399
1400   if(item==0)
1401     {
1402       /* The homedir must be x00, a directory, and owned by the user. */
1403
1404       if(S_ISDIR(statbuf.st_mode))
1405         {
1406           if(statbuf.st_uid==getuid())
1407             {
1408               if((statbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
1409                 ret=0;
1410               else
1411                 perm=1;
1412             }
1413           else
1414             own=1;
1415
1416           homedir_cache=ret;
1417         }
1418     }
1419   else if(item==1 || item==2)
1420     {
1421       /* The options or extension file.  Okay unless it or its
1422          containing directory is group or other writable or not owned
1423          by us or root. */
1424
1425       if(S_ISREG(statbuf.st_mode))
1426         {
1427           if(statbuf.st_uid==getuid() || statbuf.st_uid==0)
1428             {
1429               if((statbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
1430                 {
1431                   /* it's not writable, so make sure the enclosing
1432                      directory is also not writable */
1433                   if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
1434                     {
1435                       if((dirbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
1436                         ret=0;
1437                       else
1438                         enc_dir_perm=1;
1439                     }
1440                   else
1441                     enc_dir_own=1;
1442                 }
1443               else
1444                 {
1445                   /* it's writable, so the enclosing directory had
1446                      better not let people get to it. */
1447                   if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
1448                     {
1449                       if((dirbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
1450                         ret=0;
1451                       else
1452                         perm=enc_dir_perm=1; /* unclear which one to fix! */
1453                     }
1454                   else
1455                     enc_dir_own=1;
1456                 }
1457             }
1458           else
1459             own=1;
1460         }
1461     }
1462   else
1463     BUG();
1464
1465   if(!checkonly)
1466     {
1467       if(own)
1468         {
1469           if(item==0)
1470             log_info(_("WARNING: unsafe ownership on"
1471                        " homedir '%s'\n"),tmppath);
1472           else if(item==1)
1473             log_info(_("WARNING: unsafe ownership on"
1474                        " configuration file '%s'\n"),tmppath);
1475           else
1476             log_info(_("WARNING: unsafe ownership on"
1477                        " extension '%s'\n"),tmppath);
1478         }
1479       if(perm)
1480         {
1481           if(item==0)
1482             log_info(_("WARNING: unsafe permissions on"
1483                        " homedir '%s'\n"),tmppath);
1484           else if(item==1)
1485             log_info(_("WARNING: unsafe permissions on"
1486                        " configuration file '%s'\n"),tmppath);
1487           else
1488             log_info(_("WARNING: unsafe permissions on"
1489                        " extension '%s'\n"),tmppath);
1490         }
1491       if(enc_dir_own)
1492         {
1493           if(item==0)
1494             log_info(_("WARNING: unsafe enclosing directory ownership on"
1495                        " homedir '%s'\n"),tmppath);
1496           else if(item==1)
1497             log_info(_("WARNING: unsafe enclosing directory ownership on"
1498                        " configuration file '%s'\n"),tmppath);
1499           else
1500             log_info(_("WARNING: unsafe enclosing directory ownership on"
1501                        " extension '%s'\n"),tmppath);
1502         }
1503       if(enc_dir_perm)
1504         {
1505           if(item==0)
1506             log_info(_("WARNING: unsafe enclosing directory permissions on"
1507                        " homedir '%s'\n"),tmppath);
1508           else if(item==1)
1509             log_info(_("WARNING: unsafe enclosing directory permissions on"
1510                        " configuration file '%s'\n"),tmppath);
1511           else
1512             log_info(_("WARNING: unsafe enclosing directory permissions on"
1513                        " extension '%s'\n"),tmppath);
1514         }
1515     }
1516
1517  end:
1518   xfree(tmppath);
1519
1520   if(homedir)
1521     homedir_cache=ret;
1522
1523   return ret;
1524
1525 #else /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
1526   (void)path;
1527   (void)item;
1528   return 0;
1529 #endif /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
1530 }
1531
1532
1533 /* Print the OpenPGP defined algo numbers.  */
1534 static void
1535 print_algo_numbers(int (*checker)(int))
1536 {
1537   int i,first=1;
1538
1539   for(i=0;i<=110;i++)
1540     {
1541       if(!checker(i))
1542         {
1543           if(first)
1544             first=0;
1545           else
1546             es_printf (";");
1547           es_printf ("%d",i);
1548         }
1549     }
1550 }
1551
1552
1553 static void
1554 print_algo_names(int (*checker)(int),const char *(*mapper)(int))
1555 {
1556   int i,first=1;
1557
1558   for(i=0;i<=110;i++)
1559     {
1560       if(!checker(i))
1561         {
1562           if(first)
1563             first=0;
1564           else
1565             es_printf (";");
1566           es_printf ("%s",mapper(i));
1567         }
1568     }
1569 }
1570
1571 /* In the future, we can do all sorts of interesting configuration
1572    output here.  For now, just give "group" as the Enigmail folks need
1573    it, and pubkey, cipher, hash, and compress as they may be useful
1574    for frontends. */
1575 static void
1576 list_config(char *items)
1577 {
1578   int show_all=(items==NULL);
1579   char *name=NULL;
1580
1581   if(!opt.with_colons)
1582     return;
1583
1584   while(show_all || (name=strsep(&items," ")))
1585     {
1586       int any=0;
1587
1588       if(show_all || ascii_strcasecmp(name,"group")==0)
1589         {
1590           struct groupitem *iter;
1591
1592           for(iter=opt.grouplist;iter;iter=iter->next)
1593             {
1594               strlist_t sl;
1595
1596               es_fprintf (es_stdout, "cfg:group:");
1597               es_write_sanitized (es_stdout, iter->name, strlen(iter->name),
1598                                   ":", NULL);
1599               es_putc (':', es_stdout);
1600
1601               for(sl=iter->values;sl;sl=sl->next)
1602                 {
1603                   print_sanitized_string2 (stdout, sl->d, ':',';');
1604                   if(sl->next)
1605                     es_printf(";");
1606                 }
1607
1608               es_printf("\n");
1609             }
1610
1611           any=1;
1612         }
1613
1614       if(show_all || ascii_strcasecmp(name,"version")==0)
1615         {
1616           es_printf("cfg:version:");
1617           es_write_sanitized (es_stdout, VERSION, strlen(VERSION), ":", NULL);
1618           es_printf ("\n");
1619           any=1;
1620         }
1621
1622       if(show_all || ascii_strcasecmp(name,"pubkey")==0)
1623         {
1624           es_printf ("cfg:pubkey:");
1625           print_algo_numbers (build_list_pk_test_algo);
1626           es_printf ("\n");
1627           any=1;
1628         }
1629
1630       if(show_all || ascii_strcasecmp(name,"pubkeyname")==0)
1631         {
1632           es_printf ("cfg:pubkeyname:");
1633           print_algo_names (build_list_pk_test_algo,
1634                             build_list_pk_algo_name);
1635           es_printf ("\n");
1636           any=1;
1637         }
1638
1639       if(show_all || ascii_strcasecmp(name,"cipher")==0)
1640         {
1641           es_printf ("cfg:cipher:");
1642           print_algo_numbers (build_list_cipher_test_algo);
1643           es_printf ("\n");
1644           any=1;
1645         }
1646
1647       if (show_all || !ascii_strcasecmp (name,"ciphername"))
1648         {
1649           es_printf ("cfg:ciphername:");
1650           print_algo_names (build_list_cipher_test_algo,
1651                             build_list_cipher_algo_name);
1652           es_printf ("\n");
1653           any = 1;
1654         }
1655
1656       if(show_all
1657          || ascii_strcasecmp(name,"digest")==0
1658          || ascii_strcasecmp(name,"hash")==0)
1659         {
1660           es_printf ("cfg:digest:");
1661           print_algo_numbers (build_list_md_test_algo);
1662           es_printf ("\n");
1663           any=1;
1664         }
1665
1666       if (show_all
1667           || !ascii_strcasecmp(name,"digestname")
1668           || !ascii_strcasecmp(name,"hashname"))
1669         {
1670           es_printf ("cfg:digestname:");
1671           print_algo_names (build_list_md_test_algo,
1672                             build_list_md_algo_name);
1673           es_printf ("\n");
1674           any=1;
1675         }
1676
1677       if(show_all || ascii_strcasecmp(name,"compress")==0)
1678         {
1679           es_printf ("cfg:compress:");
1680           print_algo_numbers(check_compress_algo);
1681           es_printf ("\n");
1682           any=1;
1683         }
1684
1685       if(show_all || ascii_strcasecmp(name,"ccid-reader-id")==0)
1686         {
1687 #if defined(ENABLE_CARD_SUPPORT) && defined(HAVE_LIBUSB) \
1688     && GNUPG_MAJOR_VERSION == 1
1689
1690           char *p, *p2, *list = ccid_get_reader_list ();
1691
1692           for (p=list; p && (p2 = strchr (p, '\n')); p = p2+1)
1693             {
1694               *p2 = 0;
1695               es_printf ("cfg:ccid-reader-id:%s\n", p);
1696             }
1697           free (list);
1698 #endif
1699           any=1;
1700         }
1701
1702       if(show_all)
1703         break;
1704
1705       if(!any)
1706         log_error(_("unknown configuration item '%s'\n"),name);
1707     }
1708 }
1709
1710
1711 /* List options and default values in the GPG Conf format.  This is a
1712    new tool distributed with gnupg 1.9.x but we also want some limited
1713    support in older gpg versions.  The output is the name of the
1714    configuration file and a list of options available for editing by
1715    gpgconf.  */
1716 static void
1717 gpgconf_list (const char *configfile)
1718 {
1719   char *configfile_esc = percent_escape (configfile, NULL);
1720
1721   es_printf ("%s-%s.conf:%lu:\"%s\n",
1722              GPGCONF_NAME, GPG_NAME,
1723              GC_OPT_FLAG_DEFAULT,
1724              configfile_esc ? configfile_esc : "/dev/null");
1725   es_printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
1726   es_printf ("quiet:%lu:\n",   GC_OPT_FLAG_NONE);
1727   es_printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
1728   es_printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
1729   es_printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE);
1730   es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
1731   es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE);
1732   es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
1733   es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
1734   es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
1735   es_printf ("group:%lu:\n", GC_OPT_FLAG_NONE);
1736
1737   /* The next one is an info only item and should match the macros at
1738      the top of keygen.c  */
1739   es_printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
1740              "RSA-2048");
1741
1742   xfree (configfile_esc);
1743 }
1744
1745
1746 static int
1747 parse_subpacket_list(char *list)
1748 {
1749   char *tok;
1750   byte subpackets[128],i;
1751   int count=0;
1752
1753   if(!list)
1754     {
1755       /* No arguments means all subpackets */
1756       memset(subpackets+1,1,sizeof(subpackets)-1);
1757       count=127;
1758     }
1759   else
1760     {
1761       memset(subpackets,0,sizeof(subpackets));
1762
1763       /* Merge with earlier copy */
1764       if(opt.show_subpackets)
1765         {
1766           byte *in;
1767
1768           for(in=opt.show_subpackets;*in;in++)
1769             {
1770               if(*in>127 || *in<1)
1771                 BUG();
1772
1773               if(!subpackets[*in])
1774                 count++;
1775               subpackets[*in]=1;
1776             }
1777         }
1778
1779       while((tok=strsep(&list," ,")))
1780         {
1781           if(!*tok)
1782             continue;
1783
1784           i=atoi(tok);
1785           if(i>127 || i<1)
1786             return 0;
1787
1788           if(!subpackets[i])
1789             count++;
1790           subpackets[i]=1;
1791         }
1792     }
1793
1794   xfree(opt.show_subpackets);
1795   opt.show_subpackets=xmalloc(count+1);
1796   opt.show_subpackets[count--]=0;
1797
1798   for(i=1;i<128 && count>=0;i++)
1799     if(subpackets[i])
1800       opt.show_subpackets[count--]=i;
1801
1802   return 1;
1803 }
1804
1805
1806 static int
1807 parse_list_options(char *str)
1808 {
1809   char *subpackets=""; /* something that isn't NULL */
1810   struct parse_options lopts[]=
1811     {
1812       {"show-photos",LIST_SHOW_PHOTOS,NULL,
1813        N_("display photo IDs during key listings")},
1814       {"show-usage",LIST_SHOW_USAGE,NULL,
1815        N_("show key usage information during key listings")},
1816       {"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL,
1817        N_("show policy URLs during signature listings")},
1818       {"show-notations",LIST_SHOW_NOTATIONS,NULL,
1819        N_("show all notations during signature listings")},
1820       {"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1821        N_("show IETF standard notations during signature listings")},
1822       {"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL,
1823        NULL},
1824       {"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL,
1825        N_("show user-supplied notations during signature listings")},
1826       {"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL,
1827        N_("show preferred keyserver URLs during signature listings")},
1828       {"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL,
1829        N_("show user ID validity during key listings")},
1830       {"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL,
1831        N_("show revoked and expired user IDs in key listings")},
1832       {"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL,
1833        N_("show revoked and expired subkeys in key listings")},
1834       {"show-keyring",LIST_SHOW_KEYRING,NULL,
1835        N_("show the keyring name in key listings")},
1836       {"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL,
1837        N_("show expiration dates during signature listings")},
1838       {"show-sig-subpackets",LIST_SHOW_SIG_SUBPACKETS,NULL,
1839        NULL},
1840       {NULL,0,NULL,NULL}
1841     };
1842
1843   /* C99 allows for non-constant initializers, but we'd like to
1844      compile everywhere, so fill in the show-sig-subpackets argument
1845      here.  Note that if the parse_options array changes, we'll have
1846      to change the subscript here. */
1847   lopts[12].value=&subpackets;
1848
1849   if(parse_options(str,&opt.list_options,lopts,1))
1850     {
1851       if(opt.list_options&LIST_SHOW_SIG_SUBPACKETS)
1852         {
1853           /* Unset so users can pass multiple lists in. */
1854           opt.list_options&=~LIST_SHOW_SIG_SUBPACKETS;
1855           if(!parse_subpacket_list(subpackets))
1856             return 0;
1857         }
1858       else if(subpackets==NULL && opt.show_subpackets)
1859         {
1860           /* User did 'no-show-subpackets' */
1861           xfree(opt.show_subpackets);
1862           opt.show_subpackets=NULL;
1863         }
1864
1865       return 1;
1866     }
1867   else
1868     return 0;
1869 }
1870
1871
1872 /* Collapses argc/argv into a single string that must be freed */
1873 static char *
1874 collapse_args(int argc,char *argv[])
1875 {
1876   char *str=NULL;
1877   int i,first=1,len=0;
1878
1879   for(i=0;i<argc;i++)
1880     {
1881       len+=strlen(argv[i])+2;
1882       str=xrealloc(str,len);
1883       if(first)
1884         {
1885           str[0]='\0';
1886           first=0;
1887         }
1888       else
1889         strcat(str," ");
1890
1891       strcat(str,argv[i]);
1892     }
1893
1894   return str;
1895 }
1896
1897
1898 #ifndef NO_TRUST_MODELS
1899 static void
1900 parse_trust_model(const char *model)
1901 {
1902   if(ascii_strcasecmp(model,"pgp")==0)
1903     opt.trust_model=TM_PGP;
1904   else if(ascii_strcasecmp(model,"classic")==0)
1905     opt.trust_model=TM_CLASSIC;
1906   else if(ascii_strcasecmp(model,"always")==0)
1907     opt.trust_model=TM_ALWAYS;
1908   else if(ascii_strcasecmp(model,"direct")==0)
1909     opt.trust_model=TM_DIRECT;
1910   else if(ascii_strcasecmp(model,"auto")==0)
1911     opt.trust_model=TM_AUTO;
1912   else
1913     log_error("unknown trust model '%s'\n",model);
1914 }
1915 #endif /*NO_TRUST_MODELS*/
1916
1917
1918 /* This fucntion called to initialized a new control object.  It is
1919    assumed that this object has been zeroed out before calling this
1920    function. */
1921 static void
1922 gpg_init_default_ctrl (ctrl_t ctrl)
1923 {
1924   (void)ctrl;
1925 }
1926
1927
1928 /* This function is called to deinitialize a control object.  It is
1929    not deallocated. */
1930 static void
1931 gpg_deinit_default_ctrl (ctrl_t ctrl)
1932 {
1933   gpg_dirmngr_deinit_session_data (ctrl);
1934 }
1935
1936
1937 char *
1938 get_default_configname (void)
1939 {
1940   char *configname = NULL;
1941   char *name = xstrdup (GPG_NAME EXTSEP_S "conf-" SAFE_VERSION);
1942   char *ver = &name[strlen (GPG_NAME EXTSEP_S "conf-")];
1943
1944   do
1945     {
1946       if (configname)
1947         {
1948           char *tok;
1949
1950           xfree (configname);
1951           configname = NULL;
1952
1953           if ((tok = strrchr (ver, SAFE_VERSION_DASH)))
1954             *tok='\0';
1955           else if ((tok = strrchr (ver, SAFE_VERSION_DOT)))
1956             *tok='\0';
1957           else
1958             break;
1959         }
1960
1961       configname = make_filename (opt.homedir, name, NULL);
1962     }
1963   while (access (configname, R_OK));
1964
1965   xfree(name);
1966
1967   if (! configname)
1968     configname = make_filename (opt.homedir, GPG_NAME EXTSEP_S "conf", NULL);
1969   if (! access (configname, R_OK))
1970     {
1971       /* Print a warning when both config files are present.  */
1972       char *p = make_filename (opt.homedir, "options", NULL);
1973       if (! access (p, R_OK))
1974         log_info (_("Note: old default options file '%s' ignored\n"), p);
1975       xfree (p);
1976     }
1977   else
1978     {
1979       /* Use the old default only if it exists.  */
1980       char *p = make_filename (opt.homedir, "options", NULL);
1981       if (!access (p, R_OK))
1982         {
1983           xfree (configname);
1984           configname = p;
1985         }
1986       else
1987         xfree (p);
1988     }
1989
1990   return configname;
1991 }
1992
1993
1994 int
1995 main (int argc, char **argv)
1996 {
1997     ARGPARSE_ARGS pargs;
1998     IOBUF a;
1999     int rc=0;
2000     int orig_argc;
2001     char **orig_argv;
2002     const char *fname;
2003     char *username;
2004     int may_coredump;
2005     strlist_t sl, remusr= NULL, locusr=NULL;
2006     strlist_t nrings = NULL;
2007     armor_filter_context_t *afx = NULL;
2008     int detached_sig = 0;
2009     FILE *configfp = NULL;
2010     char *configname = NULL;
2011     char *save_configname = NULL;
2012     char *default_configname = NULL;
2013     unsigned configlineno;
2014     int parse_debug = 0;
2015     int default_config = 1;
2016     int default_keyring = 1;
2017     int greeting = 0;
2018     int nogreeting = 0;
2019     char *logfile = NULL;
2020     int use_random_seed = 1;
2021     enum cmd_and_opt_values cmd = 0;
2022     const char *debug_level = NULL;
2023 #ifndef NO_TRUST_MODELS
2024     const char *trustdb_name = NULL;
2025 #endif /*!NO_TRUST_MODELS*/
2026     char *def_cipher_string = NULL;
2027     char *def_digest_string = NULL;
2028     char *compress_algo_string = NULL;
2029     char *cert_digest_string = NULL;
2030     char *s2k_cipher_string = NULL;
2031     char *s2k_digest_string = NULL;
2032     char *pers_cipher_list = NULL;
2033     char *pers_digest_list = NULL;
2034     char *pers_compress_list = NULL;
2035     int eyes_only=0;
2036     int multifile=0;
2037     int pwfd = -1;
2038     int fpr_maybe_cmd = 0; /* --fingerprint maybe a command.  */
2039     int any_explicit_recipient = 0;
2040     int require_secmem=0,got_secmem=0;
2041     struct assuan_malloc_hooks malloc_hooks;
2042     ctrl_t ctrl;
2043
2044 #ifdef __riscos__
2045     opt.lock_once = 1;
2046 #endif /* __riscos__ */
2047
2048
2049     /* Please note that we may running SUID(ROOT), so be very CAREFUL
2050        when adding any stuff between here and the call to
2051        secmem_init() somewhere after the option parsing. */
2052     gnupg_reopen_std (GPG_NAME);
2053     trap_unaligned ();
2054     gnupg_rl_initialize ();
2055     set_strusage (my_strusage);
2056     gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
2057     log_set_prefix (GPG_NAME, 1);
2058
2059     /* Make sure that our subsystems are ready.  */
2060     i18n_init();
2061     init_common_subsystems (&argc, &argv);
2062
2063     /* Check that the libraries are suitable.  Do it right here because the
2064        option parsing may need services of the library.  */
2065     if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) )
2066       {
2067         log_fatal ( _("libgcrypt is too old (need %s, have %s)\n"),
2068                     NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
2069       }
2070
2071     /* Use our own logging handler for Libcgrypt.  */
2072     setup_libgcrypt_logging ();
2073
2074     /* Put random number into secure memory */
2075     gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
2076
2077     may_coredump = disable_core_dumps();
2078
2079     gnupg_init_signals (0, emergency_cleanup);
2080
2081     dotlock_create (NULL, 0); /* Register lock file cleanup. */
2082
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_keyid = 1; break;
2612           case oNoThrowKeyids: opt.throw_keyid = 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 oNoop: break;
3135
3136           default:
3137             pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
3138             break;
3139           }
3140       }
3141
3142     if (configfp)
3143       {
3144         fclose( configfp );
3145         configfp = NULL;
3146         /* Remember the first config file name. */
3147         if (!save_configname)
3148           save_configname = configname;
3149         else
3150           xfree(configname);
3151         configname = NULL;
3152         goto next_pass;
3153       }
3154     xfree(configname); configname = NULL;
3155     if (log_get_errorcount (0))
3156       g10_exit(2);
3157
3158     /* The command --gpgconf-list is pretty simple and may be called
3159        directly after the option parsing. */
3160     if (cmd == aGPGConfList)
3161       {
3162         gpgconf_list (save_configname ? save_configname : default_configname);
3163         g10_exit (0);
3164       }
3165     xfree (save_configname);
3166     xfree (default_configname);
3167
3168     if( nogreeting )
3169         greeting = 0;
3170
3171     if( greeting )
3172       {
3173         es_fprintf (es_stderr, "%s %s; %s\n",
3174                     strusage(11), strusage(13), strusage(14) );
3175         es_fprintf (es_stderr, "%s\n", strusage(15) );
3176       }
3177 #ifdef IS_DEVELOPMENT_VERSION
3178     if (!opt.batch)
3179       {
3180         const char *s;
3181
3182         if((s=strusage(25)))
3183           log_info("%s\n",s);
3184         if((s=strusage(26)))
3185           log_info("%s\n",s);
3186         if((s=strusage(27)))
3187           log_info("%s\n",s);
3188       }
3189 #endif
3190
3191     /* FIXME: We should use logging to a file only in server mode;
3192        however we have not yet implemetyed that.  Thus we try to get
3193        away with --batch as indication for logging to file
3194        required. */
3195     if (logfile && opt.batch)
3196       {
3197         log_set_file (logfile);
3198         log_set_prefix (NULL, 1|2|4);
3199       }
3200
3201     if (opt.verbose > 2)
3202         log_info ("using character set '%s'\n", get_native_charset ());
3203
3204     if( may_coredump && !opt.quiet )
3205         log_info(_("WARNING: program may create a core file!\n"));
3206
3207     if (eyes_only) {
3208       if (opt.set_filename)
3209           log_info(_("WARNING: %s overrides %s\n"),
3210                    "--for-your-eyes-only","--set-filename");
3211
3212       opt.set_filename="_CONSOLE";
3213     }
3214
3215     if (opt.no_literal) {
3216         log_info(_("Note: %s is not for normal use!\n"), "--no-literal");
3217         if (opt.textmode)
3218             log_error(_("%s not allowed with %s!\n"),
3219                        "--textmode", "--no-literal" );
3220         if (opt.set_filename)
3221             log_error(_("%s makes no sense with %s!\n"),
3222                         eyes_only?"--for-your-eyes-only":"--set-filename",
3223                         "--no-literal" );
3224     }
3225
3226
3227     if (opt.set_filesize)
3228         log_info(_("Note: %s is not for normal use!\n"), "--set-filesize");
3229     if( opt.batch )
3230         tty_batchmode( 1 );
3231
3232     if (gnupg_faked_time_p ())
3233       {
3234         gnupg_isotime_t tbuf;
3235
3236         log_info (_("WARNING: running with faked system time: "));
3237         gnupg_get_isotime (tbuf);
3238         dump_isotime (tbuf);
3239         log_printf ("\n");
3240       }
3241
3242     /* Print a warning if an argument looks like an option.  */
3243     if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
3244       {
3245         int i;
3246
3247         for (i=0; i < argc; i++)
3248           if (argv[i][0] == '-' && argv[i][1] == '-')
3249             log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
3250       }
3251
3252
3253     gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
3254
3255     if(require_secmem && !got_secmem)
3256       {
3257         log_info(_("will not run with insecure memory due to %s\n"),
3258                  "--require-secmem");
3259         g10_exit(2);
3260       }
3261
3262     set_debug (debug_level);
3263     if (DBG_CLOCK)
3264       log_clock ("start");
3265
3266     /* Do these after the switch(), so they can override settings. */
3267     if(PGP6)
3268       {
3269         /* That does not anymore work becuase we have no more support
3270            for v3 signatures.  */
3271         opt.disable_mdc=1;
3272         opt.escape_from=1;
3273         opt.ask_sig_expire=0;
3274       }
3275     else if(PGP7)
3276       {
3277         /* That does not anymore work because we have no more support
3278            for v3 signatures.  */
3279         opt.escape_from=1;
3280         opt.ask_sig_expire=0;
3281       }
3282     else if(PGP8)
3283       {
3284         opt.escape_from=1;
3285       }
3286
3287
3288     if( def_cipher_string ) {
3289         opt.def_cipher_algo = string_to_cipher_algo (def_cipher_string);
3290         xfree(def_cipher_string); def_cipher_string = NULL;
3291         if ( openpgp_cipher_test_algo (opt.def_cipher_algo) )
3292             log_error(_("selected cipher algorithm is invalid\n"));
3293     }
3294     if( def_digest_string ) {
3295         opt.def_digest_algo = string_to_digest_algo (def_digest_string);
3296         xfree(def_digest_string); def_digest_string = NULL;
3297         if ( openpgp_md_test_algo (opt.def_digest_algo) )
3298             log_error(_("selected digest algorithm is invalid\n"));
3299     }
3300     if( compress_algo_string ) {
3301         opt.compress_algo = string_to_compress_algo(compress_algo_string);
3302         xfree(compress_algo_string); compress_algo_string = NULL;
3303         if( check_compress_algo(opt.compress_algo) )
3304           log_error(_("selected compression algorithm is invalid\n"));
3305     }
3306     if( cert_digest_string ) {
3307         opt.cert_digest_algo = string_to_digest_algo (cert_digest_string);
3308         xfree(cert_digest_string); cert_digest_string = NULL;
3309         if (openpgp_md_test_algo(opt.cert_digest_algo))
3310           log_error(_("selected certification digest algorithm is invalid\n"));
3311     }
3312     if( s2k_cipher_string ) {
3313         opt.s2k_cipher_algo = string_to_cipher_algo (s2k_cipher_string);
3314         xfree(s2k_cipher_string); s2k_cipher_string = NULL;
3315         if (openpgp_cipher_test_algo (opt.s2k_cipher_algo))
3316           log_error(_("selected cipher algorithm is invalid\n"));
3317     }
3318     if( s2k_digest_string ) {
3319         opt.s2k_digest_algo = string_to_digest_algo (s2k_digest_string);
3320         xfree(s2k_digest_string); s2k_digest_string = NULL;
3321         if (openpgp_md_test_algo(opt.s2k_digest_algo))
3322           log_error(_("selected digest algorithm is invalid\n"));
3323     }
3324     if( opt.completes_needed < 1 )
3325       log_error(_("completes-needed must be greater than 0\n"));
3326     if( opt.marginals_needed < 2 )
3327       log_error(_("marginals-needed must be greater than 1\n"));
3328     if( opt.max_cert_depth < 1 || opt.max_cert_depth > 255 )
3329       log_error(_("max-cert-depth must be in the range from 1 to 255\n"));
3330     if(opt.def_cert_level<0 || opt.def_cert_level>3)
3331       log_error(_("invalid default-cert-level; must be 0, 1, 2, or 3\n"));
3332     if( opt.min_cert_level < 1 || opt.min_cert_level > 3 )
3333       log_error(_("invalid min-cert-level; must be 1, 2, or 3\n"));
3334     switch( opt.s2k_mode ) {
3335       case 0:
3336         log_info(_("Note: simple S2K mode (0) is strongly discouraged\n"));
3337         break;
3338       case 1: case 3: break;
3339       default:
3340         log_error(_("invalid S2K mode; must be 0, 1 or 3\n"));
3341     }
3342
3343     /* This isn't actually needed, but does serve to error out if the
3344        string is invalid. */
3345     if(opt.def_preference_list &&
3346         keygen_set_std_prefs(opt.def_preference_list,0))
3347       log_error(_("invalid default preferences\n"));
3348
3349     if(pers_cipher_list &&
3350        keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
3351       log_error(_("invalid personal cipher preferences\n"));
3352
3353     if(pers_digest_list &&
3354        keygen_set_std_prefs(pers_digest_list,PREFTYPE_HASH))
3355       log_error(_("invalid personal digest preferences\n"));
3356
3357     if(pers_compress_list &&
3358        keygen_set_std_prefs(pers_compress_list,PREFTYPE_ZIP))
3359       log_error(_("invalid personal compress preferences\n"));
3360
3361     /* We don't support all possible commands with multifile yet */
3362     if(multifile)
3363       {
3364         char *cmdname;
3365
3366         switch(cmd)
3367           {
3368           case aSign:
3369             cmdname="--sign";
3370             break;
3371           case aClearsign:
3372             cmdname="--clearsign";
3373             break;
3374           case aDetachedSign:
3375             cmdname="--detach-sign";
3376             break;
3377           case aSym:
3378             cmdname="--symmetric";
3379             break;
3380           case aEncrSym:
3381             cmdname="--symmetric --encrypt";
3382             break;
3383           case aStore:
3384             cmdname="--store";
3385             break;
3386           default:
3387             cmdname=NULL;
3388             break;
3389           }
3390
3391         if(cmdname)
3392           log_error(_("%s does not yet work with %s\n"),cmdname,"--multifile");
3393       }
3394
3395     if( log_get_errorcount(0) )
3396         g10_exit(2);
3397
3398     if(opt.compress_level==0)
3399       opt.compress_algo=COMPRESS_ALGO_NONE;
3400
3401     /* Check our chosen algorithms against the list of legal
3402        algorithms. */
3403
3404     if(!GNUPG)
3405       {
3406         const char *badalg=NULL;
3407         preftype_t badtype=PREFTYPE_NONE;
3408
3409         if(opt.def_cipher_algo
3410            && !algo_available(PREFTYPE_SYM,opt.def_cipher_algo,NULL))
3411           {
3412             badalg = openpgp_cipher_algo_name (opt.def_cipher_algo);
3413             badtype = PREFTYPE_SYM;
3414           }
3415         else if(opt.def_digest_algo
3416                 && !algo_available(PREFTYPE_HASH,opt.def_digest_algo,NULL))
3417           {
3418             badalg = gcry_md_algo_name (opt.def_digest_algo);
3419             badtype = PREFTYPE_HASH;
3420           }
3421         else if(opt.cert_digest_algo
3422                 && !algo_available(PREFTYPE_HASH,opt.cert_digest_algo,NULL))
3423           {
3424             badalg = gcry_md_algo_name (opt.cert_digest_algo);
3425             badtype = PREFTYPE_HASH;
3426           }
3427         else if(opt.compress_algo!=-1
3428                 && !algo_available(PREFTYPE_ZIP,opt.compress_algo,NULL))
3429           {
3430             badalg = compress_algo_to_string(opt.compress_algo);
3431             badtype = PREFTYPE_ZIP;
3432           }
3433
3434         if(badalg)
3435           {
3436             switch(badtype)
3437               {
3438               case PREFTYPE_SYM:
3439                 log_info(_("you may not use cipher algorithm '%s'"
3440                            " while in %s mode\n"),
3441                          badalg,compliance_option_string());
3442                 break;
3443               case PREFTYPE_HASH:
3444                 log_info(_("you may not use digest algorithm '%s'"
3445                            " while in %s mode\n"),
3446                          badalg,compliance_option_string());
3447                 break;
3448               case PREFTYPE_ZIP:
3449                 log_info(_("you may not use compression algorithm '%s'"
3450                            " while in %s mode\n"),
3451                          badalg,compliance_option_string());
3452                 break;
3453               default:
3454                 BUG();
3455               }
3456
3457             compliance_failure();
3458           }
3459       }
3460
3461     /* Set the random seed file. */
3462     if( use_random_seed ) {
3463         char *p = make_filename(opt.homedir, "random_seed", NULL );
3464         gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
3465         if (!access (p, F_OK))
3466           register_secured_file (p);
3467         xfree(p);
3468     }
3469
3470     /* If there is no command but the --fingerprint is given, default
3471        to the --list-keys command.  */
3472     if (!cmd && fpr_maybe_cmd)
3473       {
3474         set_cmd (&cmd, aListKeys);
3475       }
3476
3477
3478     if( opt.verbose > 1 )
3479         set_packet_list_mode(1);
3480
3481     /* Add the keyrings, but not for some special commands.
3482        We always need to add the keyrings if we are running under
3483        SELinux, this is so that the rings are added to the list of
3484        secured files. */
3485     if( ALWAYS_ADD_KEYRINGS
3486         || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest) )
3487       {
3488         if (!nrings || default_keyring)  /* Add default ring. */
3489             keydb_add_resource ("pubring" EXTSEP_S GPGEXT_GPG,
3490                                 KEYDB_RESOURCE_FLAG_DEFAULT);
3491         for (sl = nrings; sl; sl = sl->next )
3492           keydb_add_resource (sl->d, sl->flags);
3493       }
3494     FREE_STRLIST(nrings);
3495
3496     if (cmd == aGPGConfTest)
3497       g10_exit(0);
3498
3499
3500     if( pwfd != -1 )  /* Read the passphrase now. */
3501         read_passphrase_from_fd( pwfd );
3502
3503     fname = argc? *argv : NULL;
3504
3505     if(fname && utf8_strings)
3506       opt.flags.utf8_filename=1;
3507
3508     ctrl = xcalloc (1, sizeof *ctrl);
3509     gpg_init_default_ctrl (ctrl);
3510
3511 #ifndef NO_TRUST_MODELS
3512     switch (cmd)
3513       {
3514       case aPrimegen:
3515       case aPrintMD:
3516       case aPrintMDs:
3517       case aGenRandom:
3518       case aDeArmor:
3519       case aEnArmor:
3520         break;
3521       case aFixTrustDB:
3522       case aExportOwnerTrust:
3523         rc = setup_trustdb (0, trustdb_name);
3524         break;
3525       case aListTrustDB:
3526         rc = setup_trustdb (argc? 1:0, trustdb_name);
3527         break;
3528       default:
3529         /* If we are using TM_ALWAYS, we do not need to create the
3530            trustdb.  */
3531         rc = setup_trustdb (opt.trust_model != TM_ALWAYS, trustdb_name);
3532         break;
3533       }
3534     if (rc)
3535       log_error (_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
3536 #endif /*!NO_TRUST_MODELS*/
3537
3538     switch (cmd)
3539       {
3540       case aStore:
3541       case aSym:
3542       case aSign:
3543       case aSignSym:
3544       case aClearsign:
3545         if (!opt.quiet && any_explicit_recipient)
3546           log_info (_("WARNING: recipients (-r) given "
3547                       "without using public key encryption\n"));
3548         break;
3549       default:
3550         break;
3551       }
3552
3553
3554     /* Check for certain command whether we need to migrate a
3555        secring.gpg to the gpg-agent. */
3556     switch (cmd)
3557       {
3558       case aListSecretKeys:
3559       case aSign:
3560       case aSignEncr:
3561       case aSignEncrSym:
3562       case aSignSym:
3563       case aClearsign:
3564       case aDecrypt:
3565       case aSignKey:
3566       case aLSignKey:
3567       case aEditKey:
3568       case aPasswd:
3569       case aDeleteSecretKeys:
3570       case aDeleteSecretAndPublicKeys:
3571       case aQuickKeygen:
3572       case aFullKeygen:
3573       case aKeygen:
3574       case aImport:
3575       case aExportSecret:
3576       case aExportSecretSub:
3577       case aGenRevoke:
3578       case aDesigRevoke:
3579       case aCardEdit:
3580       case aChangePIN:
3581         migrate_secring (ctrl);
3582         break;