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