gpg: Improve perceived speed of secret key listings.
[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.pgp2_workarounds = 1;
2103     opt.escape_from = 1;
2104     opt.flags.require_cross_cert = 1;
2105     opt.import_options = 0;
2106     opt.export_options = EXPORT_ATTRIBUTES;
2107     opt.keyserver_options.import_options = IMPORT_REPAIR_PKS_SUBKEY_BUG;
2108     opt.keyserver_options.export_options = EXPORT_ATTRIBUTES;
2109     opt.keyserver_options.options = (KEYSERVER_HONOR_KEYSERVER_URL
2110                                      | KEYSERVER_HONOR_PKA_RECORD );
2111     opt.verify_options = (LIST_SHOW_UID_VALIDITY
2112                           | VERIFY_SHOW_POLICY_URLS
2113                           | VERIFY_SHOW_STD_NOTATIONS
2114                           | VERIFY_SHOW_KEYSERVER_URLS);
2115     opt.list_options   = LIST_SHOW_UID_VALIDITY;
2116 #ifdef NO_TRUST_MODELS
2117     opt.trust_model = TM_ALWAYS;
2118 #else
2119     opt.trust_model = TM_AUTO;
2120 #endif
2121     opt.mangle_dos_filenames = 0;
2122     opt.min_cert_level = 2;
2123     set_screen_dimensions ();
2124     opt.keyid_format = KF_SHORT;
2125     opt.def_sig_expire = "0";
2126     opt.def_cert_expire = "0";
2127     set_homedir (default_homedir ());
2128     opt.passphrase_repeat = 1;
2129     opt.emit_version = 1; /* Limit to the major number.  */
2130
2131     /* Check whether we have a config file on the command line.  */
2132     orig_argc = argc;
2133     orig_argv = argv;
2134     pargs.argc = &argc;
2135     pargs.argv = &argv;
2136     pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
2137     while( arg_parse( &pargs, opts) ) {
2138         if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
2139             parse_debug++;
2140         else if( pargs.r_opt == oOptions ) {
2141             /* yes there is one, so we do not try the default one, but
2142              * read the option file when it is encountered at the commandline
2143              */
2144             default_config = 0;
2145         }
2146         else if( pargs.r_opt == oNoOptions )
2147           {
2148             default_config = 0; /* --no-options */
2149             opt.no_homedir_creation = 1;
2150           }
2151         else if( pargs.r_opt == oHomedir )
2152             set_homedir ( pargs.r.ret_str );
2153         else if( pargs.r_opt == oNoPermissionWarn )
2154             opt.no_perm_warn=1;
2155         else if (pargs.r_opt == oStrict )
2156           {
2157             /* Not used */
2158           }
2159         else if (pargs.r_opt == oNoStrict )
2160           {
2161             /* Not used */
2162           }
2163     }
2164
2165 #ifdef HAVE_DOSISH_SYSTEM
2166     if ( strchr (opt.homedir,'\\') ) {
2167         char *d, *buf = xmalloc (strlen (opt.homedir)+1);
2168         const char *s = opt.homedir;
2169         for (d=buf,s=opt.homedir; *s; s++)
2170           {
2171             *d++ = *s == '\\'? '/': *s;
2172 #ifdef HAVE_W32_SYSTEM
2173             if (s[1] && IsDBCSLeadByte (*s))
2174               *d++ = *++s;
2175 #endif
2176           }
2177         *d = 0;
2178         set_homedir (buf);
2179     }
2180 #endif
2181
2182     /* Initialize the secure memory. */
2183     if (!gcry_control (GCRYCTL_INIT_SECMEM, SECMEM_BUFFER_SIZE, 0))
2184       got_secmem = 1;
2185 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
2186     /* There should be no way to get to this spot while still carrying
2187        setuid privs.  Just in case, bomb out if we are. */
2188     if ( getuid () != geteuid () )
2189       BUG ();
2190 #endif
2191     maybe_setuid = 0;
2192
2193     /* Okay, we are now working under our real uid */
2194
2195     /* malloc hooks go here ... */
2196     malloc_hooks.malloc = gcry_malloc;
2197     malloc_hooks.realloc = gcry_realloc;
2198     malloc_hooks.free = gcry_free;
2199     assuan_set_malloc_hooks (&malloc_hooks);
2200     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
2201     setup_libassuan_logging (&opt.debug);
2202
2203     /* Try for a version specific config file first */
2204     default_configname = get_default_configname ();
2205     if (default_config)
2206       configname = xstrdup (default_configname);
2207
2208     argc = orig_argc;
2209     argv = orig_argv;
2210     pargs.argc = &argc;
2211     pargs.argv = &argv;
2212     pargs.flags= ARGPARSE_FLAG_KEEP;
2213
2214     /* By this point we have a homedir, and cannot change it. */
2215     check_permissions(opt.homedir,0);
2216
2217   next_pass:
2218     if( configname ) {
2219       if(check_permissions(configname,1))
2220         {
2221           /* If any options file is unsafe, then disable any external
2222              programs for keyserver calls or photo IDs.  Since the
2223              external program to call is set in the options file, a
2224              unsafe options file can lead to an arbitrary program
2225              being run. */
2226
2227           opt.exec_disable=1;
2228         }
2229
2230         configlineno = 0;
2231         configfp = fopen( configname, "r" );
2232         if (configfp && is_secured_file (fileno (configfp)))
2233           {
2234             fclose (configfp);
2235             configfp = NULL;
2236             gpg_err_set_errno (EPERM);
2237           }
2238         if( !configfp ) {
2239             if( default_config ) {
2240                 if( parse_debug )
2241                     log_info(_("Note: no default option file '%s'\n"),
2242                                                             configname );
2243             }
2244             else {
2245                 log_error(_("option file '%s': %s\n"),
2246                                     configname, strerror(errno) );
2247                 g10_exit(2);
2248             }
2249             xfree(configname); configname = NULL;
2250         }
2251         if( parse_debug && configname )
2252             log_info(_("reading options from '%s'\n"), configname );
2253         default_config = 0;
2254     }
2255
2256     while( optfile_parse( configfp, configname, &configlineno,
2257                                                 &pargs, opts) )
2258       {
2259         switch( pargs.r_opt )
2260           {
2261           case aCheckKeys:
2262           case aListConfig:
2263           case aGPGConfList:
2264           case aGPGConfTest:
2265           case aListPackets:
2266           case aImport:
2267           case aFastImport:
2268           case aSendKeys:
2269           case aRecvKeys:
2270           case aSearchKeys:
2271           case aRefreshKeys:
2272           case aFetchKeys:
2273           case aExport:
2274 #ifdef ENABLE_CARD_SUPPORT
2275           case aCardStatus:
2276           case aCardEdit:
2277           case aChangePIN:
2278 #endif /* ENABLE_CARD_SUPPORT*/
2279           case aListKeys:
2280           case aLocateKeys:
2281           case aListSigs:
2282           case aExportSecret:
2283           case aExportSecretSub:
2284           case aSym:
2285           case aClearsign:
2286           case aGenRevoke:
2287           case aDesigRevoke:
2288           case aPrimegen:
2289           case aGenRandom:
2290           case aPrintMD:
2291           case aPrintMDs:
2292           case aListTrustDB:
2293           case aCheckTrustDB:
2294           case aUpdateTrustDB:
2295           case aFixTrustDB:
2296           case aListTrustPath:
2297           case aDeArmor:
2298           case aEnArmor:
2299           case aSign:
2300           case aQuickSignKey:
2301           case aQuickLSignKey:
2302           case aSignKey:
2303           case aLSignKey:
2304           case aStore:
2305           case aQuickKeygen:
2306           case aExportOwnerTrust:
2307           case aImportOwnerTrust:
2308           case aRebuildKeydbCaches:
2309             set_cmd (&cmd, pargs.r_opt);
2310             break;
2311
2312           case aKeygen:
2313           case aFullKeygen:
2314           case aEditKey:
2315           case aDeleteSecretKeys:
2316           case aDeleteSecretAndPublicKeys:
2317           case aDeleteKeys:
2318           case aPasswd:
2319             set_cmd (&cmd, pargs.r_opt);
2320             greeting=1;
2321             break;
2322
2323           case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
2324
2325           case aDecryptFiles: multifile=1; /* fall through */
2326           case aDecrypt: set_cmd( &cmd, aDecrypt); break;
2327
2328           case aEncrFiles: multifile=1; /* fall through */
2329           case aEncr: set_cmd( &cmd, aEncr); break;
2330
2331           case aVerifyFiles: multifile=1; /* fall through */
2332           case aVerify: set_cmd( &cmd, aVerify); break;
2333
2334           case aServer:
2335             set_cmd (&cmd, pargs.r_opt);
2336             opt.batch = 1;
2337             break;
2338
2339           case oArmor: opt.armor = 1; opt.no_armor=0; break;
2340           case oOutput: opt.outfile = pargs.r.ret_str; break;
2341           case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
2342           case oQuiet: opt.quiet = 1; break;
2343           case oNoTTY: tty_no_terminal(1); break;
2344           case oDryRun: opt.dry_run = 1; break;
2345           case oInteractive: opt.interactive = 1; break;
2346           case oVerbose:
2347             opt.verbose++;
2348             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2349             opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
2350             opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
2351             break;
2352
2353           case oBatch:
2354             opt.batch = 1;
2355             nogreeting = 1;
2356             break;
2357
2358           case oUseAgent: /* Dummy. */
2359             break;
2360
2361           case oNoUseAgent:
2362             obsolete_option (configname, configlineno, "no-use-agent");
2363             break;
2364           case oGpgAgentInfo:
2365             obsolete_option (configname, configlineno, "gpg-agent-info");
2366             break;
2367           case oReaderPort:
2368             obsolete_scdaemon_option (configname, configlineno, "reader-port");
2369             break;
2370           case octapiDriver:
2371             obsolete_scdaemon_option (configname, configlineno, "ctapi-driver");
2372             break;
2373           case opcscDriver:
2374             obsolete_scdaemon_option (configname, configlineno, "pcsc-driver");
2375             break;
2376           case oDisableCCID:
2377             obsolete_scdaemon_option (configname, configlineno, "disable-ccid");
2378             break;
2379
2380           case oAnswerYes: opt.answer_yes = 1; break;
2381           case oAnswerNo: opt.answer_no = 1; break;
2382           case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
2383           case oPrimaryKeyring:
2384             sl = append_to_strlist (&nrings, pargs.r.ret_str);
2385             sl->flags = KEYDB_RESOURCE_FLAG_PRIMARY;
2386             break;
2387           case oShowKeyring:
2388             deprecated_warning(configname,configlineno,"--show-keyring",
2389                                "--list-options ","show-keyring");
2390             opt.list_options|=LIST_SHOW_KEYRING;
2391             break;
2392
2393           case oDebug: opt.debug |= pargs.r.ret_ulong; break;
2394           case oDebugAll: opt.debug = ~0; break;
2395           case oDebugLevel: debug_level = pargs.r.ret_str; break;
2396
2397           case oStatusFD:
2398             set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2399             break;
2400           case oStatusFile:
2401             set_status_fd ( open_info_file (pargs.r.ret_str, 1, 0) );
2402             break;
2403           case oAttributeFD:
2404             set_attrib_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2405             break;
2406           case oAttributeFile:
2407             set_attrib_fd ( open_info_file (pargs.r.ret_str, 1, 1) );
2408             break;
2409           case oLoggerFD:
2410             log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
2411             break;
2412           case oLoggerFile:
2413             logfile = pargs.r.ret_str;
2414             break;
2415
2416           case oWithFingerprint:
2417             opt.with_fingerprint = 1;
2418             opt.fingerprint++;
2419             break;
2420           case oFingerprint:
2421             opt.fingerprint++;
2422             fpr_maybe_cmd = 1;
2423             break;
2424
2425           case oWithKeygrip:
2426             opt.with_keygrip = 1;
2427             break;
2428
2429           case oWithSecret:
2430             opt.with_secret = 1;
2431             break;
2432
2433           case oSecretKeyring:
2434             /* Ignore this old option.  */
2435             break;
2436
2437           case oOptions:
2438             /* config files may not be nested (silently ignore them) */
2439             if( !configfp ) {
2440                 xfree(configname);
2441                 configname = xstrdup(pargs.r.ret_str);
2442                 goto next_pass;
2443             }
2444             break;
2445           case oNoArmor: opt.no_armor=1; opt.armor=0; break;
2446           case oNoDefKeyring: default_keyring = 0; break;
2447           case oNoGreeting: nogreeting = 1; break;
2448           case oNoVerbose:
2449             opt.verbose = 0;
2450             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2451             opt.list_sigs=0;
2452             break;
2453           case oQuickRandom:
2454             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
2455             break;
2456           case oEmitVersion: opt.emit_version++; break;
2457           case oNoEmitVersion: opt.emit_version=0; break;
2458           case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
2459           case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
2460           case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
2461
2462 #ifndef NO_TRUST_MODELS
2463           case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
2464
2465 #endif /*!NO_TRUST_MODELS*/
2466           case oDefaultKey: opt.def_secret_key = pargs.r.ret_str; break;
2467           case oDefRecipient:
2468             if( *pargs.r.ret_str )
2469               opt.def_recipient = make_username(pargs.r.ret_str);
2470             break;
2471           case oDefRecipientSelf:
2472             xfree(opt.def_recipient); opt.def_recipient = NULL;
2473             opt.def_recipient_self = 1;
2474             break;
2475           case oNoDefRecipient:
2476             xfree(opt.def_recipient); opt.def_recipient = NULL;
2477             opt.def_recipient_self = 0;
2478             break;
2479           case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
2480           case oHomedir: break;
2481           case oNoBatch: opt.batch = 0; break;
2482
2483           case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
2484           case oWithColons: opt.with_colons=':'; break;
2485
2486           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
2487           case oWithSigList: opt.list_sigs = 1; break;
2488
2489           case oSkipVerify: opt.skip_verify=1; break;
2490
2491           case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
2492           case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
2493
2494           case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
2495
2496 #ifndef NO_TRUST_MODELS
2497             /* There are many programs (like mutt) that call gpg with
2498                --always-trust so keep this option around for a long
2499                time. */
2500           case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
2501           case oTrustModel:
2502             parse_trust_model(pargs.r.ret_str);
2503             break;
2504 #endif /*!NO_TRUST_MODELS*/
2505
2506           case oForceOwnertrust:
2507             log_info(_("Note: %s is not for normal use!\n"),
2508                      "--force-ownertrust");
2509             opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
2510             if(opt.force_ownertrust==-1)
2511               {
2512                 log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
2513                 opt.force_ownertrust=0;
2514               }
2515             break;
2516           case oLoadExtension:
2517             /* Dummy so that gpg 1.4 conf files can work. Should
2518                eventually be removed.  */
2519             break;
2520           case oOpenPGP:
2521           case oRFC4880:
2522             /* This is effectively the same as RFC2440, but with
2523                "--enable-dsa2 --no-rfc2440-text --escape-from-lines
2524                --require-cross-certification". */
2525             opt.compliance = CO_RFC4880;
2526             opt.flags.dsa2 = 1;
2527             opt.flags.require_cross_cert = 1;
2528             opt.rfc2440_text = 0;
2529             opt.allow_non_selfsigned_uid = 1;
2530             opt.allow_freeform_uid = 1;
2531             opt.pgp2_workarounds = 0;
2532             opt.escape_from = 1;
2533             opt.not_dash_escaped = 0;
2534             opt.def_cipher_algo = 0;
2535             opt.def_digest_algo = 0;
2536             opt.cert_digest_algo = 0;
2537             opt.compress_algo = -1;
2538             opt.s2k_mode = 3; /* iterated+salted */
2539             opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2540             opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2541             break;
2542           case oRFC2440:
2543             opt.compliance = CO_RFC2440;
2544             opt.flags.dsa2 = 0;
2545             opt.rfc2440_text = 1;
2546             opt.allow_non_selfsigned_uid = 1;
2547             opt.allow_freeform_uid = 1;
2548             opt.pgp2_workarounds = 0;
2549             opt.escape_from = 0;
2550             opt.not_dash_escaped = 0;
2551             opt.def_cipher_algo = 0;
2552             opt.def_digest_algo = 0;
2553             opt.cert_digest_algo = 0;
2554             opt.compress_algo = -1;
2555             opt.s2k_mode = 3; /* iterated+salted */
2556             opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2557             opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2558             break;
2559           case oPGP6:  opt.compliance = CO_PGP6;  break;
2560           case oPGP7:  opt.compliance = CO_PGP7;  break;
2561           case oPGP8:  opt.compliance = CO_PGP8;  break;
2562           case oGnuPG: opt.compliance = CO_GNUPG; break;
2563           case oRFC2440Text: opt.rfc2440_text=1; break;
2564           case oNoRFC2440Text: opt.rfc2440_text=0; break;
2565           case oSetFilename:
2566             if(utf8_strings)
2567               opt.set_filename = pargs.r.ret_str;
2568             else
2569               opt.set_filename = native_to_utf8(pargs.r.ret_str);
2570             break;
2571           case oForYourEyesOnly: eyes_only = 1; break;
2572           case oNoForYourEyesOnly: eyes_only = 0; break;
2573           case oSetPolicyURL:
2574             add_policy_url(pargs.r.ret_str,0);
2575             add_policy_url(pargs.r.ret_str,1);
2576             break;
2577           case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
2578           case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
2579           case oShowPolicyURL:
2580             deprecated_warning(configname,configlineno,"--show-policy-url",
2581                                "--list-options ","show-policy-urls");
2582             deprecated_warning(configname,configlineno,"--show-policy-url",
2583                                "--verify-options ","show-policy-urls");
2584             opt.list_options|=LIST_SHOW_POLICY_URLS;
2585             opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
2586             break;
2587           case oNoShowPolicyURL:
2588             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2589                                "--list-options ","no-show-policy-urls");
2590             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2591                                "--verify-options ","no-show-policy-urls");
2592             opt.list_options&=~LIST_SHOW_POLICY_URLS;
2593             opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
2594             break;
2595           case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
2596           case oUseEmbeddedFilename:
2597             opt.flags.use_embedded_filename=1;
2598             break;
2599           case oNoUseEmbeddedFilename:
2600             opt.flags.use_embedded_filename=0;
2601             break;
2602           case oComment:
2603             if(pargs.r.ret_str[0])
2604               append_to_strlist(&opt.comments,pargs.r.ret_str);
2605             break;
2606           case oDefaultComment:
2607             deprecated_warning(configname,configlineno,
2608                                "--default-comment","--no-comments","");
2609             /* fall through */
2610           case oNoComments:
2611             free_strlist(opt.comments);
2612             opt.comments=NULL;
2613             break;
2614           case oThrowKeyids: opt.throw_keyid = 1; break;
2615           case oNoThrowKeyids: opt.throw_keyid = 0; break;
2616           case oShowPhotos:
2617             deprecated_warning(configname,configlineno,"--show-photos",
2618                                "--list-options ","show-photos");
2619             deprecated_warning(configname,configlineno,"--show-photos",
2620                                "--verify-options ","show-photos");
2621             opt.list_options|=LIST_SHOW_PHOTOS;
2622             opt.verify_options|=VERIFY_SHOW_PHOTOS;
2623             break;
2624           case oNoShowPhotos:
2625             deprecated_warning(configname,configlineno,"--no-show-photos",
2626                                "--list-options ","no-show-photos");
2627             deprecated_warning(configname,configlineno,"--no-show-photos",
2628                                "--verify-options ","no-show-photos");
2629             opt.list_options&=~LIST_SHOW_PHOTOS;
2630             opt.verify_options&=~VERIFY_SHOW_PHOTOS;
2631             break;
2632           case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
2633
2634           case oForceMDC: opt.force_mdc = 1; break;
2635           case oNoForceMDC: opt.force_mdc = 0; break;
2636           case oDisableMDC: opt.disable_mdc = 1; break;
2637           case oNoDisableMDC: opt.disable_mdc = 0; break;
2638           case oS2KMode:   opt.s2k_mode = pargs.r.ret_int; break;
2639           case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
2640           case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
2641           case oS2KCount:
2642             if (pargs.r.ret_int)
2643               opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
2644             else
2645               opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
2646             break;
2647           case oNoEncryptTo: opt.no_encrypt_to = 1; break;
2648           case oEncryptTo: /* store the recipient in the second list */
2649             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2650             sl->flags = 1;
2651             break;
2652           case oHiddenEncryptTo: /* store the recipient in the second list */
2653             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2654             sl->flags = 1|2;
2655             break;
2656           case oRecipient: /* store the recipient */
2657             add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2658             any_explicit_recipient = 1;
2659             break;
2660           case oHiddenRecipient: /* store the recipient with a flag */
2661             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2662             sl->flags = 2;
2663             any_explicit_recipient = 1;
2664             break;
2665
2666           case oTrySecretKey:
2667             add_to_strlist2 (&opt.secret_keys_to_try,
2668                              pargs.r.ret_str, utf8_strings);
2669             break;
2670
2671           case oTextmodeShort: opt.textmode = 2; break;
2672           case oTextmode: opt.textmode=1;  break;
2673           case oNoTextmode: opt.textmode=0;  break;
2674           case oExpert: opt.expert = 1; break;
2675           case oNoExpert: opt.expert = 0; break;
2676           case oDefSigExpire:
2677             if(*pargs.r.ret_str!='\0')
2678               {
2679                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
2680                   log_error(_("'%s' is not a valid signature expiration\n"),
2681                             pargs.r.ret_str);
2682                 else
2683                   opt.def_sig_expire=pargs.r.ret_str;
2684               }
2685             break;
2686           case oAskSigExpire: opt.ask_sig_expire = 1; break;
2687           case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
2688           case oDefCertExpire:
2689             if(*pargs.r.ret_str!='\0')
2690               {
2691                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
2692                   log_error(_("'%s' is not a valid signature expiration\n"),
2693                             pargs.r.ret_str);
2694                 else
2695                   opt.def_cert_expire=pargs.r.ret_str;
2696               }
2697             break;
2698           case oAskCertExpire: opt.ask_cert_expire = 1; break;
2699           case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
2700           case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
2701           case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
2702           case oAskCertLevel: opt.ask_cert_level = 1; break;
2703           case oNoAskCertLevel: opt.ask_cert_level = 0; break;
2704           case oLocalUser: /* store the local users */
2705             add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
2706             break;
2707           case oCompress:
2708             /* this is the -z command line option */
2709             opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
2710             break;
2711           case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
2712           case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
2713           case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
2714           case oPassphrase:
2715             set_passphrase_from_string(pargs.r.ret_str);
2716             break;
2717           case oPassphraseFD:
2718             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
2719             break;
2720           case oPassphraseFile:
2721             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
2722             break;
2723           case oPassphraseRepeat:
2724             opt.passphrase_repeat = pargs.r.ret_int;
2725             break;
2726
2727           case oPinentryMode:
2728             opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
2729             if (opt.pinentry_mode == -1)
2730               log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
2731             break;
2732
2733           case oCommandFD:
2734             opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
2735             break;
2736           case oCommandFile:
2737             opt.command_fd = open_info_file (pargs.r.ret_str, 0, 1);
2738             break;
2739           case oCipherAlgo:
2740             def_cipher_string = xstrdup(pargs.r.ret_str);
2741             break;
2742           case oDigestAlgo:
2743             def_digest_string = xstrdup(pargs.r.ret_str);
2744             break;
2745           case oCompressAlgo:
2746             /* If it is all digits, stick a Z in front of it for
2747                later.  This is for backwards compatibility with
2748                versions that took the compress algorithm number. */
2749             {
2750               char *pt=pargs.r.ret_str;
2751               while(*pt)
2752                 {
2753                   if (!isascii (*pt) || !isdigit (*pt))
2754                     break;
2755
2756                   pt++;
2757                 }
2758
2759               if(*pt=='\0')
2760                 {
2761                   compress_algo_string=xmalloc(strlen(pargs.r.ret_str)+2);
2762                   strcpy(compress_algo_string,"Z");
2763                   strcat(compress_algo_string,pargs.r.ret_str);
2764                 }
2765               else
2766                 compress_algo_string = xstrdup(pargs.r.ret_str);
2767             }
2768             break;
2769           case oCertDigestAlgo:
2770             cert_digest_string = xstrdup(pargs.r.ret_str);
2771             break;
2772
2773           case oNoSecmemWarn:
2774             gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
2775             break;
2776
2777           case oRequireSecmem: require_secmem=1; break;
2778           case oNoRequireSecmem: require_secmem=0; break;
2779           case oNoPermissionWarn: opt.no_perm_warn=1; break;
2780           case oNoMDCWarn: opt.no_mdc_warn=1; break;
2781           case oDisplayCharset:
2782             if( set_native_charset( pargs.r.ret_str ) )
2783                 log_error(_("'%s' is not a valid character set\n"),
2784                           pargs.r.ret_str);
2785             break;
2786           case oNotDashEscaped: opt.not_dash_escaped = 1; break;
2787           case oEscapeFrom: opt.escape_from = 1; break;
2788           case oNoEscapeFrom: opt.escape_from = 0; break;
2789           case oLockOnce: opt.lock_once = 1; break;
2790           case oLockNever:
2791             dotlock_disable ();
2792             break;
2793           case oLockMultiple:
2794 #ifndef __riscos__
2795             opt.lock_once = 0;
2796 #else /* __riscos__ */
2797             riscos_not_implemented("lock-multiple");
2798 #endif /* __riscos__ */
2799             break;
2800           case oKeyServer:
2801             {
2802               keyserver_spec_t keyserver;
2803               keyserver = parse_keyserver_uri (pargs.r.ret_str,0,
2804                                                configname,configlineno);
2805               if (!keyserver)
2806                 log_error (_("could not parse keyserver URL\n"));
2807               else
2808                 {
2809                   keyserver->next = opt.keyserver;
2810                   opt.keyserver = keyserver;
2811                 }
2812             }
2813             break;
2814           case oKeyServerOptions:
2815             if(!parse_keyserver_options(pargs.r.ret_str))
2816               {
2817                 if(configname)
2818                   log_error(_("%s:%d: invalid keyserver options\n"),
2819                             configname,configlineno);
2820                 else
2821                   log_error(_("invalid keyserver options\n"));
2822               }
2823             break;
2824           case oImportOptions:
2825             if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
2826               {
2827                 if(configname)
2828                   log_error(_("%s:%d: invalid import options\n"),
2829                             configname,configlineno);
2830                 else
2831                   log_error(_("invalid import options\n"));
2832               }
2833             break;
2834           case oExportOptions:
2835             if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
2836               {
2837                 if(configname)
2838                   log_error(_("%s:%d: invalid export options\n"),
2839                             configname,configlineno);
2840                 else
2841                   log_error(_("invalid export options\n"));
2842               }
2843             break;
2844           case oListOptions:
2845             if(!parse_list_options(pargs.r.ret_str))
2846               {
2847                 if(configname)
2848                   log_error(_("%s:%d: invalid list options\n"),
2849                             configname,configlineno);
2850                 else
2851                   log_error(_("invalid list options\n"));
2852               }
2853             break;
2854           case oVerifyOptions:
2855             {
2856               struct parse_options vopts[]=
2857                 {
2858                   {"show-photos",VERIFY_SHOW_PHOTOS,NULL,
2859                    N_("display photo IDs during signature verification")},
2860                   {"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL,
2861                    N_("show policy URLs during signature verification")},
2862                   {"show-notations",VERIFY_SHOW_NOTATIONS,NULL,
2863                    N_("show all notations during signature verification")},
2864                   {"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
2865                    N_("show IETF standard notations during signature verification")},
2866                   {"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
2867                    NULL},
2868                   {"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL,
2869                    N_("show user-supplied notations during signature verification")},
2870                   {"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL,
2871                    N_("show preferred keyserver URLs during signature verification")},
2872                   {"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL,
2873                    N_("show user ID validity during signature verification")},
2874                   {"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL,
2875                    N_("show revoked and expired user IDs in signature verification")},
2876                   {"show-primary-uid-only",VERIFY_SHOW_PRIMARY_UID_ONLY,NULL,
2877                    N_("show only the primary user ID in signature verification")},
2878                   {"pka-lookups",VERIFY_PKA_LOOKUPS,NULL,
2879                    N_("validate signatures with PKA data")},
2880                   {"pka-trust-increase",VERIFY_PKA_TRUST_INCREASE,NULL,
2881                    N_("elevate the trust of signatures with valid PKA data")},
2882                   {NULL,0,NULL,NULL}
2883                 };
2884
2885               if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
2886                 {
2887                   if(configname)
2888                     log_error(_("%s:%d: invalid verify options\n"),
2889                               configname,configlineno);
2890                   else
2891                     log_error(_("invalid verify options\n"));
2892                 }
2893             }
2894             break;
2895           case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
2896           case oExecPath:
2897             if(set_exec_path(pargs.r.ret_str))
2898               log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
2899             else
2900               opt.exec_path_set=1;
2901             break;
2902           case oSetNotation:
2903             add_notation_data( pargs.r.ret_str, 0 );
2904             add_notation_data( pargs.r.ret_str, 1 );
2905             break;
2906           case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
2907           case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
2908           case oShowNotation:
2909             deprecated_warning(configname,configlineno,"--show-notation",
2910                                "--list-options ","show-notations");
2911             deprecated_warning(configname,configlineno,"--show-notation",
2912                                "--verify-options ","show-notations");
2913             opt.list_options|=LIST_SHOW_NOTATIONS;
2914             opt.verify_options|=VERIFY_SHOW_NOTATIONS;
2915             break;
2916           case oNoShowNotation:
2917             deprecated_warning(configname,configlineno,"--no-show-notation",
2918                                "--list-options ","no-show-notations");
2919             deprecated_warning(configname,configlineno,"--no-show-notation",
2920                                "--verify-options ","no-show-notations");
2921             opt.list_options&=~LIST_SHOW_NOTATIONS;
2922             opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
2923             break;
2924           case oUtf8Strings: utf8_strings = 1; break;
2925           case oNoUtf8Strings: utf8_strings = 0; break;
2926           case oDisableCipherAlgo:
2927             {
2928               int algo = string_to_cipher_algo (pargs.r.ret_str);
2929               gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
2930             }
2931             break;
2932           case oDisablePubkeyAlgo:
2933             {
2934               int algo = gcry_pk_map_name (pargs.r.ret_str);
2935               gcry_pk_ctl (GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
2936             }
2937             break;
2938           case oNoSigCache: opt.no_sig_cache = 1; break;
2939           case oNoSigCreateCheck: opt.no_sig_create_check = 1; break;
2940           case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
2941           case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
2942           case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
2943           case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
2944           case oNoLiteral: opt.no_literal = 1; break;
2945           case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
2946           case oHonorHttpProxy:
2947                 add_to_strlist(&opt.keyserver_options.other,"http-proxy");
2948                 deprecated_warning(configname,configlineno,
2949                                    "--honor-http-proxy",
2950                                    "--keyserver-options ","http-proxy");
2951                 break;
2952           case oFastListMode: opt.fast_list_mode = 1; break;
2953           case oFixedListMode: /* Dummy */ break;
2954           case oLegacyListMode: opt.legacy_list_mode = 1; break;
2955           case oListOnly: opt.list_only=1; break;
2956           case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
2957           case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
2958           case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
2959           case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
2960           case oNoRandomSeedFile: use_random_seed = 0; break;
2961           case oAutoKeyRetrieve:
2962           case oNoAutoKeyRetrieve:
2963                 if(pargs.r_opt==oAutoKeyRetrieve)
2964                   opt.keyserver_options.options|=KEYSERVER_AUTO_KEY_RETRIEVE;
2965                 else
2966                   opt.keyserver_options.options&=~KEYSERVER_AUTO_KEY_RETRIEVE;
2967
2968                 deprecated_warning(configname,configlineno,
2969                            pargs.r_opt==oAutoKeyRetrieve?"--auto-key-retrieve":
2970                                "--no-auto-key-retrieve","--keyserver-options ",
2971                            pargs.r_opt==oAutoKeyRetrieve?"auto-key-retrieve":
2972                                "no-auto-key-retrieve");
2973                 break;
2974           case oShowSessionKey: opt.show_session_key = 1; break;
2975           case oOverrideSessionKey:
2976                 opt.override_session_key = pargs.r.ret_str;
2977                 break;
2978           case oMergeOnly:
2979                 deprecated_warning(configname,configlineno,"--merge-only",
2980                                    "--import-options ","merge-only");
2981                 opt.import_options|=IMPORT_MERGE_ONLY;
2982             break;
2983           case oAllowSecretKeyImport: /* obsolete */ break;
2984           case oTryAllSecrets: opt.try_all_secrets = 1; break;
2985           case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
2986           case oEnableSpecialFilenames:
2987             iobuf_enable_special_filenames (1);
2988             break;
2989           case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
2990           case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
2991           case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
2992           case oPreservePermissions: opt.preserve_permissions=1; break;
2993           case oDefaultPreferenceList:
2994             opt.def_preference_list = pargs.r.ret_str;
2995             break;
2996           case oDefaultKeyserverURL:
2997             {
2998               keyserver_spec_t keyserver;
2999               keyserver = parse_keyserver_uri (pargs.r.ret_str,1,
3000                                                configname,configlineno);
3001               if (!keyserver)
3002                 log_error (_("could not parse keyserver URL\n"));
3003               else
3004                 free_keyserver_spec (keyserver);
3005
3006               opt.def_keyserver_url = pargs.r.ret_str;
3007             }
3008             break;
3009           case oPersonalCipherPreferences:
3010             pers_cipher_list=pargs.r.ret_str;
3011             break;
3012           case oPersonalDigestPreferences:
3013             pers_digest_list=pargs.r.ret_str;
3014             break;
3015           case oPersonalCompressPreferences:
3016             pers_compress_list=pargs.r.ret_str;
3017             break;
3018           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
3019           case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
3020
3021           case oDisplay:
3022             set_opt_session_env ("DISPLAY", pargs.r.ret_str);
3023             break;
3024           case oTTYname:
3025             set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
3026             break;
3027           case oTTYtype:
3028             set_opt_session_env ("TERM", pargs.r.ret_str);
3029             break;
3030           case oXauthority:
3031             set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
3032             break;
3033
3034           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
3035           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
3036
3037           case oGroup: add_group(pargs.r.ret_str); break;
3038           case oUnGroup: rm_group(pargs.r.ret_str); break;
3039           case oNoGroups:
3040             while(opt.grouplist)
3041               {
3042                 struct groupitem *iter=opt.grouplist;
3043                 free_strlist(iter->values);
3044                 opt.grouplist=opt.grouplist->next;
3045                 xfree(iter);
3046               }
3047             break;
3048
3049           case oStrict:
3050           case oNoStrict:
3051             /* Not used */
3052             break;
3053
3054           case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
3055           case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
3056           case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
3057           case oMultifile: multifile=1; break;
3058           case oKeyidFormat:
3059             if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
3060               opt.keyid_format=KF_SHORT;
3061             else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
3062               opt.keyid_format=KF_LONG;
3063             else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
3064               opt.keyid_format=KF_0xSHORT;
3065             else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
3066               opt.keyid_format=KF_0xLONG;
3067             else
3068               log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
3069             break;
3070
3071           case oExitOnStatusWriteError:
3072             opt.exit_on_status_write_error = 1;
3073             break;
3074
3075           case oLimitCardInsertTries:
3076             opt.limit_card_insert_tries = pargs.r.ret_int;
3077             break;
3078
3079           case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
3080           case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
3081
3082           case oAutoKeyLocate:
3083             if(!parse_auto_key_locate(pargs.r.ret_str))
3084               {
3085                 if(configname)
3086                   log_error(_("%s:%d: invalid auto-key-locate list\n"),
3087                             configname,configlineno);
3088                 else
3089                   log_error(_("invalid auto-key-locate list\n"));
3090               }
3091             break;
3092           case oNoAutoKeyLocate:
3093             release_akl();
3094             break;
3095
3096           case oEnableLargeRSA:
3097 #if SECMEM_BUFFER_SIZE >= 65536
3098             opt.flags.large_rsa=1;
3099 #else
3100             if (configname)
3101               log_info("%s:%d: WARNING: gpg not built with large secure "
3102                          "memory buffer.  Ignoring enable-large-rsa\n",
3103                         configname,configlineno);
3104             else
3105               log_info("WARNING: gpg not built with large secure "
3106                          "memory buffer.  Ignoring --enable-large-rsa\n");
3107 #endif /* SECMEM_BUFFER_SIZE >= 65536 */
3108             break;
3109           case oDisableLargeRSA: opt.flags.large_rsa=0;
3110             break;
3111
3112           case oEnableDSA2: opt.flags.dsa2=1; break;
3113           case oDisableDSA2: opt.flags.dsa2=0; break;
3114
3115           case oAllowMultisigVerification:
3116           case oAllowMultipleMessages:
3117             opt.flags.allow_multiple_messages=1;
3118             break;
3119
3120           case oNoAllowMultipleMessages:
3121             opt.flags.allow_multiple_messages=0;
3122             break;
3123
3124           case oAllowWeakDigestAlgos:
3125             opt.flags.allow_weak_digest_algos = 1;
3126             break;
3127
3128           case oFakedSystemTime:
3129             {
3130               time_t faked_time = isotime2epoch (pargs.r.ret_str);
3131               if (faked_time == (time_t)(-1))
3132                 faked_time = (time_t)strtoul (pargs.r.ret_str, NULL, 10);
3133               gnupg_set_time (faked_time, 0);
3134             }
3135             break;
3136
3137           case oNoop: break;
3138
3139           default:
3140             pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
3141             break;
3142           }
3143       }
3144
3145     if (configfp)
3146       {
3147         fclose( configfp );
3148         configfp = NULL;
3149         /* Remember the first config file name. */
3150         if (!save_configname)
3151           save_configname = configname;
3152         else
3153           xfree(configname);
3154         configname = NULL;
3155         goto next_pass;
3156       }
3157     xfree(configname); configname = NULL;
3158     if (log_get_errorcount (0))
3159       g10_exit(2);
3160
3161     /* The command --gpgconf-list is pretty simple and may be called
3162        directly after the option parsing. */
3163     if (cmd == aGPGConfList)
3164       {
3165         gpgconf_list (save_configname ? save_configname : default_configname);
3166         g10_exit (0);
3167       }
3168     xfree (save_configname);
3169     xfree (default_configname);
3170
3171     if( nogreeting )
3172         greeting = 0;
3173
3174     if( greeting )
3175       {
3176         es_fprintf (es_stderr, "%s %s; %s\n",
3177                     strusage(11), strusage(13), strusage(14) );
3178         es_fprintf (es_stderr, "%s\n", strusage(15) );
3179       }
3180 #ifdef IS_DEVELOPMENT_VERSION
3181     if (!opt.batch)
3182       {
3183         const char *s;
3184
3185         if((s=strusage(25)))
3186           log_info("%s\n",s);
3187         if((s=strusage(26)))
3188           log_info("%s\n",s);
3189         if((s=strusage(27)))
3190           log_info("%s\n",s);
3191       }
3192 #endif
3193
3194     /* FIXME: We should use logging to a file only in server mode;
3195        however we have not yet implemetyed that.  Thus we try to get
3196        away with --batch as indication for logging to file
3197        required. */
3198     if (logfile && opt.batch)
3199       {
3200         log_set_file (logfile);
3201         log_set_prefix (NULL, 1|2|4);
3202       }
3203
3204     if (opt.verbose > 2)
3205         log_info ("using character set '%s'\n", get_native_charset ());
3206
3207     if( may_coredump && !opt.quiet )
3208         log_info(_("WARNING: program may create a core file!\n"));
3209
3210     if (eyes_only) {
3211       if (opt.set_filename)
3212           log_info(_("WARNING: %s overrides %s\n"),
3213                    "--for-your-eyes-only","--set-filename");
3214
3215       opt.set_filename="_CONSOLE";
3216     }
3217
3218     if (opt.no_literal) {
3219         log_info(_("Note: %s is not for normal use!\n"), "--no-literal");
3220         if (opt.textmode)
3221             log_error(_("%s not allowed with %s!\n"),
3222                        "--textmode", "--no-literal" );
3223         if (opt.set_filename)
3224             log_error(_("%s makes no sense with %s!\n"),
3225                         eyes_only?"--for-your-eyes-only":"--set-filename",
3226                         "--no-literal" );
3227     }
3228
3229
3230     if (opt.set_filesize)
3231         log_info(_("Note: %s is not for normal use!\n"), "--set-filesize");
3232     if( opt.batch )
3233         tty_batchmode( 1 );
3234
3235     if (gnupg_faked_time_p ())
3236       {
3237         gnupg_isotime_t tbuf;
3238
3239         log_info (_("WARNING: running with faked system time: "));
3240         gnupg_get_isotime (tbuf);
3241         dump_isotime (tbuf);
3242         log_printf ("\n");
3243       }
3244
3245     /* Print a warning if an argument looks like an option.  */
3246     if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
3247       {
3248         int i;
3249
3250         for (i=0; i < argc; i++)
3251           if (argv[i][0] == '-' && argv[i][1] == '-')
3252             log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
3253       }
3254
3255
3256     gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
3257
3258     if(require_secmem && !got_secmem)
3259       {
3260         log_info(_("will not run with insecure memory due to %s\n"),
3261                  "--require-secmem");
3262         g10_exit(2);
3263       }
3264
3265     set_debug (debug_level);
3266     if (DBG_CLOCK)
3267       log_clock ("start");
3268
3269     /* Do these after the switch(), so they can override settings. */
3270     if(PGP6)
3271       {
3272         /* That does not anymore work becuase we have no more support
3273            for v3 signatures.  */
3274         opt.disable_mdc=1;
3275         opt.escape_from=1;
3276         opt.ask_sig_expire=0;
3277       }
3278     else if(PGP7)
3279       {
3280         /* That does not anymore work because we have no more support
3281            for v3 signatures.  */
3282         opt.escape_from=1;
3283         opt.ask_sig_expire=0;
3284       }
3285     else if(PGP8)
3286       {
3287         opt.escape_from=1;
3288       }
3289
3290
3291     if( def_cipher_string ) {
3292         opt.def_cipher_algo = string_to_cipher_algo (def_cipher_string);
3293         xfree(def_cipher_string); def_cipher_string = NULL;
3294         if ( openpgp_cipher_test_algo (opt.def_cipher_algo) )
3295             log_error(_("selected cipher algorithm is invalid\n"));
3296     }
3297     if( def_digest_string ) {
3298         opt.def_digest_algo = string_to_digest_algo (def_digest_string);
3299         xfree(def_digest_string); def_digest_string = NULL;
3300         if ( openpgp_md_test_algo (opt.def_digest_algo) )
3301             log_error(_("selected digest algorithm is invalid\n"));
3302     }
3303     if( compress_algo_string ) {
3304         opt.compress_algo = string_to_compress_algo(compress_algo_string);
3305         xfree(compress_algo_string); compress_algo_string = NULL;
3306         if( check_compress_algo(opt.compress_algo) )
3307           log_error(_("selected compression algorithm is invalid\n"));
3308     }
3309     if( cert_digest_string ) {
3310         opt.cert_digest_algo = string_to_digest_algo (cert_digest_string);
3311         xfree(cert_digest_string); cert_digest_string = NULL;
3312         if (openpgp_md_test_algo(opt.cert_digest_algo))
3313           log_error(_("selected certification digest algorithm is invalid\n"));
3314     }
3315     if( s2k_cipher_string ) {
3316         opt.s2k_cipher_algo = string_to_cipher_algo (s2k_cipher_string);
3317         xfree(s2k_cipher_string); s2k_cipher_string = NULL;
3318         if (openpgp_cipher_test_algo (opt.s2k_cipher_algo))
3319           log_error(_("selected cipher algorithm is invalid\n"));
3320     }
3321     if( s2k_digest_string ) {
3322         opt.s2k_digest_algo = string_to_digest_algo (s2k_digest_string);
3323         xfree(s2k_digest_string); s2k_digest_string = NULL;
3324         if (openpgp_md_test_algo(opt.s2k_digest_algo))
3325           log_error(_("selected digest algorithm is invalid\n"));
3326     }
3327     if( opt.completes_needed < 1 )
3328       log_error(_("completes-needed must be greater than 0\n"));
3329     if( opt.marginals_needed < 2 )
3330       log_error(_("marginals-needed must be greater than 1\n"));
3331     if( opt.max_cert_depth < 1 || opt.max_cert_depth > 255 )
3332       log_error(_("max-cert-depth must be in the range from 1 to 255\n"));
3333     if(opt.def_cert_level<0 || opt.def_cert_level>3)
3334       log_error(_("invalid default-cert-level; must be 0, 1, 2, or 3\n"));
3335     if( opt.min_cert_level < 1 || opt.min_cert_level > 3 )
3336       log_error(_("invalid min-cert-level; must be 1, 2, or 3\n"));
3337     switch( opt.s2k_mode ) {
3338       case 0:
3339         log_info(_("Note: simple S2K mode (0) is strongly discouraged\n"));
3340         break;
3341       case 1: case 3: break;
3342       default:
3343         log_error(_("invalid S2K mode; must be 0, 1 or 3\n"));
3344     }
3345
3346     /* This isn't actually needed, but does serve to error out if the
3347        string is invalid. */
3348     if(opt.def_preference_list &&
3349         keygen_set_std_prefs(opt.def_preference_list,0))
3350       log_error(_("invalid default preferences\n"));
3351
3352     if(pers_cipher_list &&
3353        keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
3354       log_error(_("invalid personal cipher preferences\n"));
3355
3356     if(pers_digest_list &&
3357        keygen_set_std_prefs(pers_digest_list,PREFTYPE_HASH))
3358       log_error(_("invalid personal digest preferences\n"));
3359
3360     if(pers_compress_list &&
3361        keygen_set_std_prefs(pers_compress_list,PREFTYPE_ZIP))
3362       log_error(_("invalid personal compress preferences\n"));
3363
3364     /* We don't support all possible commands with multifile yet */
3365     if(multifile)
3366       {
3367         char *cmdname;
3368
3369         switch(cmd)
3370           {
3371           case aSign:
3372             cmdname="--sign";
3373             break;
3374           case aClearsign:
3375             cmdname="--clearsign";
3376             break;
3377           case aDetachedSign:
3378             cmdname="--detach-sign";
3379             break;
3380           case aSym:
3381             cmdname="--symmetric";
3382             break;
3383           case aEncrSym:
3384             cmdname="--symmetric --encrypt";
3385             break;
3386           case aStore:
3387             cmdname="--store";
3388             break;
3389           default:
3390             cmdname=NULL;
3391             break;
3392           }
3393
3394         if(cmdname)
3395           log_error(_("%s does not yet work with %s\n"),cmdname,"--multifile");
3396       }
3397
3398     if( log_get_errorcount(0) )
3399         g10_exit(2);
3400
3401     if(opt.compress_level==0)
3402       opt.compress_algo=COMPRESS_ALGO_NONE;
3403
3404     /* Check our chosen algorithms against the list of legal
3405        algorithms. */
3406
3407     if(!GNUPG)
3408       {
3409         const char *badalg=NULL;
3410         preftype_t badtype=PREFTYPE_NONE;
3411
3412         if(opt.def_cipher_algo
3413            && !algo_available(PREFTYPE_SYM,opt.def_cipher_algo,NULL))
3414           {
3415             badalg = openpgp_cipher_algo_name (opt.def_cipher_algo);
3416             badtype = PREFTYPE_SYM;
3417           }
3418         else if(opt.def_digest_algo
3419                 && !algo_available(PREFTYPE_HASH,opt.def_digest_algo,NULL))
3420           {
3421             badalg = gcry_md_algo_name (opt.def_digest_algo);
3422             badtype = PREFTYPE_HASH;
3423           }
3424         else if(opt.cert_digest_algo
3425                 && !algo_available(PREFTYPE_HASH,opt.cert_digest_algo,NULL))
3426           {
3427             badalg = gcry_md_algo_name (opt.cert_digest_algo);
3428             badtype = PREFTYPE_HASH;
3429           }
3430         else if(opt.compress_algo!=-1
3431                 && !algo_available(PREFTYPE_ZIP,opt.compress_algo,NULL))
3432           {
3433             badalg = compress_algo_to_string(opt.compress_algo);
3434             badtype = PREFTYPE_ZIP;
3435           }
3436
3437         if(badalg)
3438           {
3439             switch(badtype)
3440               {
3441               case PREFTYPE_SYM:
3442                 log_info(_("you may not use cipher algorithm '%s'"
3443                            " while in %s mode\n"),
3444                          badalg,compliance_option_string());
3445                 break;
3446               case PREFTYPE_HASH:
3447                 log_info(_("you may not use digest algorithm '%s'"
3448                            " while in %s mode\n"),
3449                          badalg,compliance_option_string());
3450                 break;
3451               case PREFTYPE_ZIP:
3452                 log_info(_("you may not use compression algorithm '%s'"
3453                            " while in %s mode\n"),
3454                          badalg,compliance_option_string());
3455                 break;
3456               default:
3457                 BUG();
3458               }
3459
3460             compliance_failure();
3461           }
3462       }
3463
3464     /* Set the random seed file. */
3465     if( use_random_seed ) {
3466         char *p = make_filename(opt.homedir, "random_seed", NULL );
3467         gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
3468         if (!access (p, F_OK))
3469           register_secured_file (p);
3470         xfree(p);
3471     }
3472
3473     /* If there is no command but the --fingerprint is given, default
3474        to the --list-keys command.  */
3475     if (!cmd && fpr_maybe_cmd)
3476       {
3477         set_cmd (&cmd, aListKeys);
3478       }
3479
3480
3481     if( opt.verbose > 1 )
3482         set_packet_list_mode(1);
3483
3484     /* Add the keyrings, but not for some special commands.
3485        We always need to add the keyrings if we are running under
3486        SELinux, this is so that the rings are added to the list of
3487        secured files. */
3488     if( ALWAYS_ADD_KEYRINGS
3489         || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest) )
3490       {
3491         if (!nrings || default_keyring)  /* Add default ring. */
3492             keydb_add_resource ("pubring" EXTSEP_S GPGEXT_GPG,
3493                                 KEYDB_RESOURCE_FLAG_DEFAULT);
3494         for (sl = nrings; sl; sl = sl->next )
3495           keydb_add_resource (sl->d, sl->flags);
3496       }
3497     FREE_STRLIST(nrings);
3498
3499     if (cmd == aGPGConfTest)
3500       g10_exit(0);
3501
3502
3503     if( pwfd != -1 )  /* Read the passphrase now. */
3504         read_passphrase_from_fd( pwfd );
3505
3506     fname = argc? *argv : NULL;
3507
3508     if(fname && utf8_strings)
3509       opt.flags.utf8_filename=1;
3510
3511     ctrl = xcalloc (1, sizeof *ctrl);
3512     gpg_init_default_ctrl (ctrl);
3513
3514 #ifndef NO_TRUST_MODELS
3515     switch (cmd)
3516       {
3517       case aPrimegen:
3518       case aPrintMD:
3519       case aPrintMDs:
3520       case aGenRandom:
3521       case aDeArmor:
3522       case aEnArmor:
3523         break;
3524       case aFixTrustDB:
3525       case aExportOwnerTrust:
3526         rc = setup_trustdb (0, trustdb_name);
3527         break;
3528       case aListTrustDB:
3529         rc = setup_trustdb (argc? 1:0, trustdb_name);
3530         break;
3531       default:
3532         /* If we are using TM_ALWAYS, we do not need to create the
3533            trustdb.  */
3534         rc = setup_trustdb (opt.trust_model != TM_ALWAYS, trustdb_name);
3535         break;
3536       }
3537     if (rc)
3538       log_error (_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
3539 #endif /*!NO_TRUST_MODELS*/
3540
3541     switch (cmd)
3542       {
3543       case aStore:
3544       case aSym:
3545       case aSign:
3546       case aSignSym:
3547       case aClearsign:
3548         if (!opt.quiet && any_explicit_recipient)
3549           log_info (_("WARNING: recipients (-r) given "
3550                       "without using public key encryption\n"));
3551         break;
3552       default:
3553         break;
3554       }
3555
3556
3557     /* Check for certain command whether we need to migrate a
3558        secring.gpg to the gpg-agent. */
3559     switch (cmd)
3560       {
3561       case aListSecretKeys:
3562       case aSign:
3563       case aSignEncr:
3564       case aSignEncrSym:
3565       case aSignSym:
3566       case aClearsign:
3567       case aDecrypt:
3568       case aSignKey:
3569       case aLSignKey:
3570       case aEditKey:
3571       case aPasswd:
3572       case aDeleteSecretKeys:
3573       case aDeleteSecretAndPublicKeys:
3574       case aQuickKeygen:
3575       case aFullKeygen:
3576       case aKeygen:
3577       case aImport:
3578       case aExportSecret:
3579       case aExportSecretSub:
3580       case aGenRevoke:
3581       case aDesigRevoke:
3582       case aCardEdit: