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