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