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