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