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