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