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