gpg,sm: New option --request-origin.
[gnupg.git] / g10 / gpg.c
1 /* gpg.c - The GnuPG utility (main for gpg)
2  * Copyright (C) 1998-2011 Free Software Foundation, Inc.
3  * Copyright (C) 1997-2017 Werner Koch
4  * Copyright (C) 2015-2017 g10 Code GmbH
5  *
6  * This file is part of GnuPG.
7  *
8  * GnuPG is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * GnuPG is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, see <https://www.gnu.org/licenses/>.
20  */
21
22 #include <config.h>
23 #include <errno.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <ctype.h>
28 #include <unistd.h>
29 #ifdef HAVE_STAT
30 #include <sys/stat.h> /* for stat() */
31 #endif
32 #include <fcntl.h>
33 #ifdef HAVE_W32_SYSTEM
34 # ifdef HAVE_WINSOCK2_H
35 #  include <winsock2.h>
36 # endif
37 # include <windows.h>
38 #endif
39
40 #define INCLUDED_BY_MAIN_MODULE 1
41 #include "gpg.h"
42 #include <assuan.h>
43 #include "../common/iobuf.h"
44 #include "../common/util.h"
45 #include "packet.h"
46 #include "../common/membuf.h"
47 #include "main.h"
48 #include "options.h"
49 #include "keydb.h"
50 #include "trustdb.h"
51 #include "filter.h"
52 #include "../common/ttyio.h"
53 #include "../common/i18n.h"
54 #include "../common/sysutils.h"
55 #include "../common/status.h"
56 #include "keyserver-internal.h"
57 #include "exec.h"
58 #include "../common/gc-opt-flags.h"
59 #include "../common/asshelp.h"
60 #include "call-dirmngr.h"
61 #include "tofu.h"
62 #include "../common/init.h"
63 #include "../common/mbox-util.h"
64 #include "../common/shareddefs.h"
65 #include "../common/compliance.h"
66
67 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
68 #define MY_O_BINARY  O_BINARY
69 #ifndef S_IRGRP
70 # define S_IRGRP 0
71 # define S_IWGRP 0
72 #endif
73 #else
74 #define MY_O_BINARY  0
75 #endif
76
77 #ifdef __MINGW32__
78 int _dowildcard = -1;
79 #endif
80
81 enum cmd_and_opt_values
82   {
83     aNull = 0,
84     oArmor        = 'a',
85     aDetachedSign = 'b',
86     aSym          = 'c',
87     aDecrypt      = 'd',
88     aEncr         = 'e',
89     oRecipientFile       = 'f',
90     oHiddenRecipientFile = 'F',
91     oInteractive  = 'i',
92     aListKeys     = 'k',
93     oDryRun       = 'n',
94     oOutput       = 'o',
95     oQuiet        = 'q',
96     oRecipient    = 'r',
97     oHiddenRecipient = 'R',
98     aSign         = 's',
99     oTextmodeShort= 't',
100     oLocalUser    = 'u',
101     oVerbose      = 'v',
102     oCompress     = 'z',
103     oSetNotation  = 'N',
104     aListSecretKeys = 'K',
105     oBatch        = 500,
106     oMaxOutput,
107     oInputSizeHint,
108     oSigNotation,
109     oCertNotation,
110     oShowNotation,
111     oNoShowNotation,
112     aEncrFiles,
113     aEncrSym,
114     aDecryptFiles,
115     aClearsign,
116     aStore,
117     aQuickKeygen,
118     aFullKeygen,
119     aKeygen,
120     aSignEncr,
121     aSignEncrSym,
122     aSignSym,
123     aSignKey,
124     aLSignKey,
125     aQuickSignKey,
126     aQuickLSignKey,
127     aQuickAddUid,
128     aQuickAddKey,
129     aQuickRevUid,
130     aQuickSetExpire,
131     aQuickSetPrimaryUid,
132     aListConfig,
133     aListGcryptConfig,
134     aGPGConfList,
135     aGPGConfTest,
136     aListPackets,
137     aEditKey,
138     aDeleteKeys,
139     aDeleteSecretKeys,
140     aDeleteSecretAndPublicKeys,
141     aImport,
142     aFastImport,
143     aVerify,
144     aVerifyFiles,
145     aListSigs,
146     aSendKeys,
147     aRecvKeys,
148     aLocateKeys,
149     aSearchKeys,
150     aRefreshKeys,
151     aFetchKeys,
152     aExport,
153     aExportSecret,
154     aExportSecretSub,
155     aExportSshKey,
156     aCheckKeys,
157     aGenRevoke,
158     aDesigRevoke,
159     aPrimegen,
160     aPrintMD,
161     aPrintMDs,
162     aCheckTrustDB,
163     aUpdateTrustDB,
164     aFixTrustDB,
165     aListTrustDB,
166     aListTrustPath,
167     aExportOwnerTrust,
168     aImportOwnerTrust,
169     aDeArmor,
170     aEnArmor,
171     aGenRandom,
172     aRebuildKeydbCaches,
173     aCardStatus,
174     aCardEdit,
175     aChangePIN,
176     aPasswd,
177     aServer,
178     aTOFUPolicy,
179
180     oMimemode,
181     oTextmode,
182     oNoTextmode,
183     oExpert,
184     oNoExpert,
185     oDefSigExpire,
186     oAskSigExpire,
187     oNoAskSigExpire,
188     oDefCertExpire,
189     oAskCertExpire,
190     oNoAskCertExpire,
191     oDefCertLevel,
192     oMinCertLevel,
193     oAskCertLevel,
194     oNoAskCertLevel,
195     oFingerprint,
196     oWithFingerprint,
197     oWithSubkeyFingerprint,
198     oWithICAOSpelling,
199     oWithKeygrip,
200     oWithSecret,
201     oWithWKDHash,
202     oWithColons,
203     oWithKeyData,
204     oWithKeyOrigin,
205     oWithTofuInfo,
206     oWithSigList,
207     oWithSigCheck,
208     oAnswerYes,
209     oAnswerNo,
210     oKeyring,
211     oPrimaryKeyring,
212     oSecretKeyring,
213     oShowKeyring,
214     oDefaultKey,
215     oDefRecipient,
216     oDefRecipientSelf,
217     oNoDefRecipient,
218     oTrySecretKey,
219     oOptions,
220     oDebug,
221     oDebugLevel,
222     oDebugAll,
223     oDebugIOLBF,
224     oStatusFD,
225     oStatusFile,
226     oAttributeFD,
227     oAttributeFile,
228     oEmitVersion,
229     oNoEmitVersion,
230     oCompletesNeeded,
231     oMarginalsNeeded,
232     oMaxCertDepth,
233     oLoadExtension,
234     oCompliance,
235     oGnuPG,
236     oRFC2440,
237     oRFC4880,
238     oRFC4880bis,
239     oOpenPGP,
240     oPGP6,
241     oPGP7,
242     oPGP8,
243     oDE_VS,
244     oRFC2440Text,
245     oNoRFC2440Text,
246     oCipherAlgo,
247     oDigestAlgo,
248     oCertDigestAlgo,
249     oCompressAlgo,
250     oCompressLevel,
251     oBZ2CompressLevel,
252     oBZ2DecompressLowmem,
253     oPassphrase,
254     oPassphraseFD,
255     oPassphraseFile,
256     oPassphraseRepeat,
257     oPinentryMode,
258     oCommandFD,
259     oCommandFile,
260     oQuickRandom,
261     oNoVerbose,
262     oTrustDBName,
263     oNoSecmemWarn,
264     oRequireSecmem,
265     oNoRequireSecmem,
266     oNoPermissionWarn,
267     oNoMDCWarn,
268     oNoArmor,
269     oNoDefKeyring,
270     oNoKeyring,
271     oNoGreeting,
272     oNoTTY,
273     oNoOptions,
274     oNoBatch,
275     oHomedir,
276     oSkipVerify,
277     oSkipHiddenRecipients,
278     oNoSkipHiddenRecipients,
279     oAlwaysTrust,
280     oTrustModel,
281     oForceOwnertrust,
282     oSetFilename,
283     oForYourEyesOnly,
284     oNoForYourEyesOnly,
285     oSetPolicyURL,
286     oSigPolicyURL,
287     oCertPolicyURL,
288     oShowPolicyURL,
289     oNoShowPolicyURL,
290     oSigKeyserverURL,
291     oUseEmbeddedFilename,
292     oNoUseEmbeddedFilename,
293     oComment,
294     oDefaultComment,
295     oNoComments,
296     oThrowKeyids,
297     oNoThrowKeyids,
298     oShowPhotos,
299     oNoShowPhotos,
300     oPhotoViewer,
301     oForceMDC,
302     oNoForceMDC,
303     oDisableMDC,
304     oNoDisableMDC,
305     oS2KMode,
306     oS2KDigest,
307     oS2KCipher,
308     oS2KCount,
309     oDisplayCharset,
310     oNotDashEscaped,
311     oEscapeFrom,
312     oNoEscapeFrom,
313     oLockOnce,
314     oLockMultiple,
315     oLockNever,
316     oKeyServer,
317     oKeyServerOptions,
318     oImportOptions,
319     oImportFilter,
320     oExportOptions,
321     oExportFilter,
322     oListOptions,
323     oVerifyOptions,
324     oTempDir,
325     oExecPath,
326     oEncryptTo,
327     oHiddenEncryptTo,
328     oNoEncryptTo,
329     oEncryptToDefaultKey,
330     oLoggerFD,
331     oLoggerFile,
332     oUtf8Strings,
333     oNoUtf8Strings,
334     oDisableCipherAlgo,
335     oDisablePubkeyAlgo,
336     oAllowNonSelfsignedUID,
337     oNoAllowNonSelfsignedUID,
338     oAllowFreeformUID,
339     oNoAllowFreeformUID,
340     oAllowSecretKeyImport,
341     oEnableSpecialFilenames,
342     oNoLiteral,
343     oSetFilesize,
344     oHonorHttpProxy,
345     oFastListMode,
346     oListOnly,
347     oIgnoreTimeConflict,
348     oIgnoreValidFrom,
349     oIgnoreCrcError,
350     oIgnoreMDCError,
351     oShowSessionKey,
352     oOverrideSessionKey,
353     oOverrideSessionKeyFD,
354     oNoRandomSeedFile,
355     oAutoKeyRetrieve,
356     oNoAutoKeyRetrieve,
357     oUseAgent,
358     oNoUseAgent,
359     oGpgAgentInfo,
360     oMergeOnly,
361     oTryAllSecrets,
362     oTrustedKey,
363     oNoExpensiveTrustChecks,
364     oFixedListMode,
365     oLegacyListMode,
366     oNoSigCache,
367     oAutoCheckTrustDB,
368     oNoAutoCheckTrustDB,
369     oPreservePermissions,
370     oDefaultPreferenceList,
371     oDefaultKeyserverURL,
372     oPersonalCipherPreferences,
373     oPersonalDigestPreferences,
374     oPersonalCompressPreferences,
375     oAgentProgram,
376     oDirmngrProgram,
377     oDisableDirmngr,
378     oDisplay,
379     oTTYname,
380     oTTYtype,
381     oLCctype,
382     oLCmessages,
383     oXauthority,
384     oGroup,
385     oUnGroup,
386     oNoGroups,
387     oStrict,
388     oNoStrict,
389     oMangleDosFilenames,
390     oNoMangleDosFilenames,
391     oEnableProgressFilter,
392     oMultifile,
393     oKeyidFormat,
394     oExitOnStatusWriteError,
395     oLimitCardInsertTries,
396     oReaderPort,
397     octapiDriver,
398     opcscDriver,
399     oDisableCCID,
400     oRequireCrossCert,
401     oNoRequireCrossCert,
402     oAutoKeyLocate,
403     oNoAutoKeyLocate,
404     oAllowMultisigVerification,
405     oEnableLargeRSA,
406     oDisableLargeRSA,
407     oEnableDSA2,
408     oDisableDSA2,
409     oAllowMultipleMessages,
410     oNoAllowMultipleMessages,
411     oAllowWeakDigestAlgos,
412     oFakedSystemTime,
413     oNoAutostart,
414     oPrintPKARecords,
415     oPrintDANERecords,
416     oTOFUDefaultPolicy,
417     oTOFUDBFormat,
418     oDefaultNewKeyAlgo,
419     oWeakDigest,
420     oUnwrap,
421     oOnlySignTextIDs,
422     oDisableSignerUID,
423     oSender,
424     oKeyOrigin,
425     oRequestOrigin,
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_s (oRequestOrigin,   "request-origin", "@"),
713   ARGPARSE_s_i (oCommandFD, "command-fd", "@"),
714   ARGPARSE_s_s (oCommandFile, "command-file", "@"),
715   ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
716   ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
717
718 #ifndef NO_TRUST_MODELS
719   ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
720   ARGPARSE_s_n (oAutoCheckTrustDB, "auto-check-trustdb", "@"),
721   ARGPARSE_s_n (oNoAutoCheckTrustDB, "no-auto-check-trustdb", "@"),
722   ARGPARSE_s_s (oForceOwnertrust, "force-ownertrust", "@"),
723 #endif
724
725   ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
726   ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
727   ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
728   ARGPARSE_s_n (oNoPermissionWarn, "no-permission-warning", "@"),
729   ARGPARSE_s_n (oNoMDCWarn, "no-mdc-warning", "@"),
730   ARGPARSE_s_n (oNoArmor, "no-armor", "@"),
731   ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
732   ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
733   ARGPARSE_s_n (oNoKeyring, "no-keyring", "@"),
734   ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
735   ARGPARSE_s_n (oNoOptions, "no-options", "@"),
736   ARGPARSE_s_s (oHomedir, "homedir", "@"),
737   ARGPARSE_s_n (oNoBatch, "no-batch", "@"),
738   ARGPARSE_s_n (oWithColons, "with-colons", "@"),
739   ARGPARSE_s_n (oWithTofuInfo,"with-tofu-info", "@"),
740   ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
741   ARGPARSE_s_n (oWithSigList,"with-sig-list", "@"),
742   ARGPARSE_s_n (oWithSigCheck,"with-sig-check", "@"),
743   ARGPARSE_c (aListKeys, "list-key", "@"),   /* alias */
744   ARGPARSE_c (aListSigs, "list-sig", "@"),   /* alias */
745   ARGPARSE_c (aCheckKeys, "check-sig", "@"), /* alias */
746   ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
747   ARGPARSE_s_n (oSkipHiddenRecipients, "skip-hidden-recipients", "@"),
748   ARGPARSE_s_n (oNoSkipHiddenRecipients, "no-skip-hidden-recipients", "@"),
749   ARGPARSE_s_i (oDefCertLevel, "default-cert-check-level", "@"), /* old */
750 #ifndef NO_TRUST_MODELS
751   ARGPARSE_s_n (oAlwaysTrust, "always-trust", "@"),
752 #endif
753   ARGPARSE_s_s (oTrustModel, "trust-model", "@"),
754   ARGPARSE_s_s (oTOFUDefaultPolicy, "tofu-default-policy", "@"),
755   ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
756   ARGPARSE_s_n (oForYourEyesOnly, "for-your-eyes-only", "@"),
757   ARGPARSE_s_n (oNoForYourEyesOnly, "no-for-your-eyes-only", "@"),
758   ARGPARSE_s_s (oSetPolicyURL,  "set-policy-url", "@"),
759   ARGPARSE_s_s (oSigPolicyURL,  "sig-policy-url", "@"),
760   ARGPARSE_s_s (oCertPolicyURL, "cert-policy-url", "@"),
761   ARGPARSE_s_n (oShowPolicyURL,      "show-policy-url", "@"),
762   ARGPARSE_s_n (oNoShowPolicyURL, "no-show-policy-url", "@"),
763   ARGPARSE_s_s (oSigKeyserverURL, "sig-keyserver-url", "@"),
764   ARGPARSE_s_n (oShowNotation,      "show-notation", "@"),
765   ARGPARSE_s_n (oNoShowNotation, "no-show-notation", "@"),
766   ARGPARSE_s_s (oComment, "comment", "@"),
767   ARGPARSE_s_n (oDefaultComment, "default-comment", "@"),
768   ARGPARSE_s_n (oNoComments, "no-comments", "@"),
769   ARGPARSE_s_n (oEmitVersion,      "emit-version", "@"),
770   ARGPARSE_s_n (oNoEmitVersion, "no-emit-version", "@"),
771   ARGPARSE_s_n (oNoEmitVersion, "no-version", "@"), /* alias */
772   ARGPARSE_s_n (oNotDashEscaped, "not-dash-escaped", "@"),
773   ARGPARSE_s_n (oEscapeFrom,      "escape-from-lines", "@"),
774   ARGPARSE_s_n (oNoEscapeFrom, "no-escape-from-lines", "@"),
775   ARGPARSE_s_n (oLockOnce,     "lock-once", "@"),
776   ARGPARSE_s_n (oLockMultiple, "lock-multiple", "@"),
777   ARGPARSE_s_n (oLockNever,    "lock-never", "@"),
778   ARGPARSE_s_i (oLoggerFD,   "logger-fd", "@"),
779   ARGPARSE_s_s (oLoggerFile, "log-file", "@"),
780   ARGPARSE_s_s (oLoggerFile, "logger-file", "@"),  /* 1.4 compatibility.  */
781   ARGPARSE_s_n (oUseEmbeddedFilename,      "use-embedded-filename", "@"),
782   ARGPARSE_s_n (oNoUseEmbeddedFilename, "no-use-embedded-filename", "@"),
783   ARGPARSE_s_n (oUtf8Strings,      "utf8-strings", "@"),
784   ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
785   ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
786   ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprint", "@"),
787   ARGPARSE_s_n (oWithSubkeyFingerprint, "with-subkey-fingerprints", "@"),
788   ARGPARSE_s_n (oWithICAOSpelling, "with-icao-spelling", "@"),
789   ARGPARSE_s_n (oWithKeygrip,     "with-keygrip", "@"),
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 oWithSecret:
2743             opt.with_secret = 1;
2744             break;
2745
2746           case oWithWKDHash:
2747             opt.with_wkd_hash = 1;
2748             break;
2749
2750           case oWithKeyOrigin:
2751             opt.with_key_origin = 1;
2752             break;
2753
2754           case oSecretKeyring:
2755             /* Ignore this old option.  */
2756             break;
2757
2758           case oOptions:
2759             /* config files may not be nested (silently ignore them) */
2760             if( !configfp ) {
2761                 xfree(configname);
2762                 configname = xstrdup(pargs.r.ret_str);
2763                 goto next_pass;
2764             }
2765             break;
2766           case oNoArmor: opt.no_armor=1; opt.armor=0; break;
2767
2768           case oNoDefKeyring:
2769             if (default_keyring > 0)
2770               default_keyring = 0;
2771             break;
2772           case oNoKeyring:
2773             default_keyring = -1;
2774             break;
2775
2776           case oNoGreeting: nogreeting = 1; break;
2777           case oNoVerbose:
2778             opt.verbose = 0;
2779             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2780             opt.list_sigs=0;
2781             break;
2782           case oQuickRandom:
2783             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
2784             break;
2785           case oEmitVersion: opt.emit_version++; break;
2786           case oNoEmitVersion: opt.emit_version=0; break;
2787           case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
2788           case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
2789           case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
2790
2791 #ifndef NO_TRUST_MODELS
2792           case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
2793
2794 #endif /*!NO_TRUST_MODELS*/
2795           case oDefaultKey:
2796             sl = add_to_strlist (&opt.def_secret_key, pargs.r.ret_str);
2797             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
2798             if (configfp)
2799               sl->flags |= PK_LIST_CONFIG;
2800             break;
2801           case oDefRecipient:
2802             if( *pargs.r.ret_str )
2803               {
2804                 xfree (opt.def_recipient);
2805                 opt.def_recipient = make_username(pargs.r.ret_str);
2806               }
2807             break;
2808           case oDefRecipientSelf:
2809             xfree(opt.def_recipient); opt.def_recipient = NULL;
2810             opt.def_recipient_self = 1;
2811             break;
2812           case oNoDefRecipient:
2813             xfree(opt.def_recipient); opt.def_recipient = NULL;
2814             opt.def_recipient_self = 0;
2815             break;
2816           case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
2817           case oHomedir: break;
2818           case oNoBatch: opt.batch = 0; break;
2819
2820           case oWithTofuInfo: opt.with_tofu_info = 1; break;
2821
2822           case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
2823           case oWithColons: opt.with_colons=':'; break;
2824
2825           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
2826           case oWithSigList: opt.list_sigs = 1; break;
2827
2828           case oSkipVerify: opt.skip_verify=1; break;
2829
2830           case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
2831           case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
2832
2833           case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
2834
2835 #ifndef NO_TRUST_MODELS
2836             /* There are many programs (like mutt) that call gpg with
2837                --always-trust so keep this option around for a long
2838                time. */
2839           case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
2840           case oTrustModel:
2841             parse_trust_model(pargs.r.ret_str);
2842             break;
2843 #endif /*!NO_TRUST_MODELS*/
2844           case oTOFUDefaultPolicy:
2845             opt.tofu_default_policy = parse_tofu_policy (pargs.r.ret_str);
2846             break;
2847           case oTOFUDBFormat:
2848             obsolete_option (configname, configlineno, "tofu-db-format");
2849             break;
2850
2851           case oForceOwnertrust:
2852             log_info(_("Note: %s is not for normal use!\n"),
2853                      "--force-ownertrust");
2854             opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
2855             if(opt.force_ownertrust==-1)
2856               {
2857                 log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
2858                 opt.force_ownertrust=0;
2859               }
2860             break;
2861           case oLoadExtension:
2862             /* Dummy so that gpg 1.4 conf files can work. Should
2863                eventually be removed.  */
2864             break;
2865
2866           case oCompliance:
2867             {
2868               int compliance = gnupg_parse_compliance_option
2869                 (pargs.r.ret_str,
2870                  compliance_options, DIM (compliance_options),
2871                  opt.quiet);
2872               if (compliance < 0)
2873                 g10_exit (1);
2874               set_compliance_option (compliance);
2875             }
2876             break;
2877           case oOpenPGP:
2878           case oRFC2440:
2879           case oRFC4880:
2880           case oRFC4880bis:
2881           case oPGP6:
2882           case oPGP7:
2883           case oPGP8:
2884           case oGnuPG:
2885             set_compliance_option (pargs.r_opt);
2886             break;
2887
2888           case oRFC2440Text: opt.rfc2440_text=1; break;
2889           case oNoRFC2440Text: opt.rfc2440_text=0; break;
2890
2891           case oSetFilename:
2892             if(utf8_strings)
2893               opt.set_filename = pargs.r.ret_str;
2894             else
2895               opt.set_filename = native_to_utf8(pargs.r.ret_str);
2896             break;
2897           case oForYourEyesOnly: eyes_only = 1; break;
2898           case oNoForYourEyesOnly: eyes_only = 0; break;
2899           case oSetPolicyURL:
2900             add_policy_url(pargs.r.ret_str,0);
2901             add_policy_url(pargs.r.ret_str,1);
2902             break;
2903           case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
2904           case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
2905           case oShowPolicyURL:
2906             deprecated_warning(configname,configlineno,"--show-policy-url",
2907                                "--list-options ","show-policy-urls");
2908             deprecated_warning(configname,configlineno,"--show-policy-url",
2909                                "--verify-options ","show-policy-urls");
2910             opt.list_options|=LIST_SHOW_POLICY_URLS;
2911             opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
2912             break;
2913           case oNoShowPolicyURL:
2914             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2915                                "--list-options ","no-show-policy-urls");
2916             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2917                                "--verify-options ","no-show-policy-urls");
2918             opt.list_options&=~LIST_SHOW_POLICY_URLS;
2919             opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
2920             break;
2921           case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
2922           case oUseEmbeddedFilename:
2923             opt.flags.use_embedded_filename=1;
2924             break;
2925           case oNoUseEmbeddedFilename:
2926             opt.flags.use_embedded_filename=0;
2927             break;
2928           case oComment:
2929             if(pargs.r.ret_str[0])
2930               append_to_strlist(&opt.comments,pargs.r.ret_str);
2931             break;
2932           case oDefaultComment:
2933             deprecated_warning(configname,configlineno,
2934                                "--default-comment","--no-comments","");
2935             /* fall through */
2936           case oNoComments:
2937             free_strlist(opt.comments);
2938             opt.comments=NULL;
2939             break;
2940           case oThrowKeyids: opt.throw_keyids = 1; break;
2941           case oNoThrowKeyids: opt.throw_keyids = 0; break;
2942           case oShowPhotos:
2943             deprecated_warning(configname,configlineno,"--show-photos",
2944                                "--list-options ","show-photos");
2945             deprecated_warning(configname,configlineno,"--show-photos",
2946                                "--verify-options ","show-photos");
2947             opt.list_options|=LIST_SHOW_PHOTOS;
2948             opt.verify_options|=VERIFY_SHOW_PHOTOS;
2949             break;
2950           case oNoShowPhotos:
2951             deprecated_warning(configname,configlineno,"--no-show-photos",
2952                                "--list-options ","no-show-photos");
2953             deprecated_warning(configname,configlineno,"--no-show-photos",
2954                                "--verify-options ","no-show-photos");
2955             opt.list_options&=~LIST_SHOW_PHOTOS;
2956             opt.verify_options&=~VERIFY_SHOW_PHOTOS;
2957             break;
2958           case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
2959
2960           case oForceMDC: opt.force_mdc = 1; break;
2961           case oNoForceMDC: opt.force_mdc = 0; break;
2962           case oDisableMDC: opt.disable_mdc = 1; break;
2963           case oNoDisableMDC: opt.disable_mdc = 0; break;
2964
2965           case oDisableSignerUID: opt.flags.disable_signer_uid = 1; break;
2966
2967           case oS2KMode:   opt.s2k_mode = pargs.r.ret_int; break;
2968           case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
2969           case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
2970           case oS2KCount:
2971             if (pargs.r.ret_int)
2972               opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
2973             else
2974               opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
2975             break;
2976
2977           case oRecipient:
2978           case oHiddenRecipient:
2979           case oRecipientFile:
2980           case oHiddenRecipientFile:
2981             /* Store the recipient.  Note that we also store the
2982              * option as private data in the flags.  This is achieved
2983              * by shifting the option value to the left so to keep
2984              * enough space for the flags.  */
2985             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2986             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
2987             if (configfp)
2988               sl->flags |= PK_LIST_CONFIG;
2989             if (pargs.r_opt == oHiddenRecipient
2990                 || pargs.r_opt == oHiddenRecipientFile)
2991               sl->flags |= PK_LIST_HIDDEN;
2992             if (pargs.r_opt == oRecipientFile
2993                 || pargs.r_opt == oHiddenRecipientFile)
2994               sl->flags |= PK_LIST_FROM_FILE;
2995             any_explicit_recipient = 1;
2996             break;
2997
2998           case oEncryptTo:
2999           case oHiddenEncryptTo:
3000             /* Store an additional recipient.  */
3001             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
3002             sl->flags = ((pargs.r_opt << PK_LIST_SHIFT) | PK_LIST_ENCRYPT_TO);
3003             if (configfp)
3004               sl->flags |= PK_LIST_CONFIG;
3005             if (pargs.r_opt == oHiddenEncryptTo)
3006               sl->flags |= PK_LIST_HIDDEN;
3007             break;
3008
3009           case oNoEncryptTo:
3010             opt.no_encrypt_to = 1;
3011             break;
3012           case oEncryptToDefaultKey:
3013             opt.encrypt_to_default_key = configfp ? 2 : 1;
3014             break;
3015
3016           case oTrySecretKey:
3017             add_to_strlist2 (&opt.secret_keys_to_try,
3018                              pargs.r.ret_str, utf8_strings);
3019             break;
3020
3021           case oMimemode: opt.mimemode = opt.textmode = 1; break;
3022           case oTextmodeShort: opt.textmode = 2; break;
3023           case oTextmode: opt.textmode=1;  break;
3024           case oNoTextmode: opt.textmode=opt.mimemode=0;  break;
3025
3026           case oExpert: opt.expert = 1; break;
3027           case oNoExpert: opt.expert = 0; break;
3028           case oDefSigExpire:
3029             if(*pargs.r.ret_str!='\0')
3030               {
3031                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3032                   log_error(_("'%s' is not a valid signature expiration\n"),
3033                             pargs.r.ret_str);
3034                 else
3035                   opt.def_sig_expire=pargs.r.ret_str;
3036               }
3037             break;
3038           case oAskSigExpire: opt.ask_sig_expire = 1; break;
3039           case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
3040           case oDefCertExpire:
3041             if(*pargs.r.ret_str!='\0')
3042               {
3043                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
3044                   log_error(_("'%s' is not a valid signature expiration\n"),
3045                             pargs.r.ret_str);
3046                 else
3047                   opt.def_cert_expire=pargs.r.ret_str;
3048               }
3049             break;
3050           case oAskCertExpire: opt.ask_cert_expire = 1; break;
3051           case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
3052           case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
3053           case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
3054           case oAskCertLevel: opt.ask_cert_level = 1; break;
3055           case oNoAskCertLevel: opt.ask_cert_level = 0; break;
3056           case oLocalUser: /* store the local users */
3057             sl = add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
3058             sl->flags = (pargs.r_opt << PK_LIST_SHIFT);
3059             if (configfp)
3060               sl->flags |= PK_LIST_CONFIG;
3061             break;
3062           case oSender:
3063             {
3064               char *mbox = mailbox_from_userid (pargs.r.ret_str);
3065               if (!mbox)
3066                 log_error (_("\"%s\" is not a proper mail address\n"),
3067                            pargs.r.ret_str);
3068               else
3069                 {
3070                   add_to_strlist (&opt.sender_list, mbox);
3071                   xfree (mbox);
3072                 }
3073             }
3074             break;
3075           case oCompress:
3076             /* this is the -z command line option */
3077             opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
3078             break;
3079           case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
3080           case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
3081           case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
3082           case oPassphrase:
3083             set_passphrase_from_string(pargs.r.ret_str);
3084             break;
3085           case oPassphraseFD:
3086             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3087             break;
3088           case oPassphraseFile:
3089             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
3090             break;
3091           case oPassphraseRepeat:
3092             opt.passphrase_repeat = pargs.r.ret_int;
3093             break;
3094
3095           case oPinentryMode:
3096             opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
3097             if (opt.pinentry_mode == -1)
3098               log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
3099             break;
3100
3101           case oRequestOrigin:
3102             opt.request_origin = parse_request_origin (pargs.r.ret_str);
3103             if (opt.request_origin == -1)
3104               log_error (_("invalid request origin '%s'\n"), pargs.r.ret_str);
3105             break;
3106
3107           case oCommandFD:
3108             opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3109             if (! gnupg_fd_valid (opt.command_fd))
3110               log_fatal ("command-fd is invalid: %s\n", strerror (errno));
3111             break;
3112           case oCommandFile:
3113             opt.command_fd = open_info_file (pargs.r.ret_str, 0, 1);
3114             break;
3115           case oCipherAlgo:
3116             def_cipher_string = xstrdup(pargs.r.ret_str);
3117             break;
3118           case oDigestAlgo:
3119             def_digest_string = xstrdup(pargs.r.ret_str);
3120             break;
3121           case oCompressAlgo:
3122             /* If it is all digits, stick a Z in front of it for
3123                later.  This is for backwards compatibility with
3124                versions that took the compress algorithm number. */
3125             {
3126               char *pt=pargs.r.ret_str;
3127               while(*pt)
3128                 {
3129                   if (!isascii (*pt) || !isdigit (*pt))
3130                     break;
3131
3132                   pt++;
3133                 }
3134
3135               if(*pt=='\0')
3136                 {
3137                   compress_algo_string=xmalloc(strlen(pargs.r.ret_str)+2);
3138                   strcpy(compress_algo_string,"Z");
3139                   strcat(compress_algo_string,pargs.r.ret_str);
3140                 }
3141               else
3142                 compress_algo_string = xstrdup(pargs.r.ret_str);
3143             }
3144             break;
3145           case oCertDigestAlgo:
3146             cert_digest_string = xstrdup(pargs.r.ret_str);
3147             break;
3148
3149           case oNoSecmemWarn:
3150             gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
3151             break;
3152
3153           case oRequireSecmem: require_secmem=1; break;
3154           case oNoRequireSecmem: require_secmem=0; break;
3155           case oNoPermissionWarn: opt.no_perm_warn=1; break;
3156           case oNoMDCWarn: opt.no_mdc_warn=1; break;
3157           case oDisplayCharset:
3158             if( set_native_charset( pargs.r.ret_str ) )
3159                 log_error(_("'%s' is not a valid character set\n"),
3160                           pargs.r.ret_str);
3161             break;
3162           case oNotDashEscaped: opt.not_dash_escaped = 1; break;
3163           case oEscapeFrom: opt.escape_from = 1; break;
3164           case oNoEscapeFrom: opt.escape_from = 0; break;
3165           case oLockOnce: opt.lock_once = 1; break;
3166           case oLockNever:
3167             dotlock_disable ();
3168             break;
3169           case oLockMultiple:
3170 #ifndef __riscos__
3171             opt.lock_once = 0;
3172 #else /* __riscos__ */
3173             riscos_not_implemented("lock-multiple");
3174 #endif /* __riscos__ */
3175             break;
3176           case oKeyServer:
3177             {
3178               keyserver_spec_t keyserver;
3179               keyserver = parse_keyserver_uri (pargs.r.ret_str, 0);
3180               if (!keyserver)
3181                 log_error (_("could not parse keyserver URL\n"));
3182               else
3183                 {
3184                   /* We only support a single keyserver.  Later ones
3185                      override earlier ones.  (Since we parse the
3186                      config file first and then the command line
3187                      arguments, the command line takes
3188                      precedence.)  */
3189                   if (opt.keyserver)
3190                     free_keyserver_spec (opt.keyserver);
3191                   opt.keyserver = keyserver;
3192                 }
3193             }
3194             break;
3195           case oKeyServerOptions:
3196             if(!parse_keyserver_options(pargs.r.ret_str))
3197               {
3198                 if(configname)
3199                   log_error(_("%s:%d: invalid keyserver options\n"),
3200                             configname,configlineno);
3201                 else
3202                   log_error(_("invalid keyserver options\n"));
3203               }
3204             break;
3205           case oImportOptions:
3206             if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
3207               {
3208                 if(configname)
3209                   log_error(_("%s:%d: invalid import options\n"),
3210                             configname,configlineno);
3211                 else
3212                   log_error(_("invalid import options\n"));
3213               }
3214             break;
3215           case oImportFilter:
3216             rc = parse_and_set_import_filter (pargs.r.ret_str);
3217             if (rc)
3218               log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3219             break;
3220           case oExportOptions:
3221             if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
3222               {
3223                 if(configname)
3224                   log_error(_("%s:%d: invalid export options\n"),
3225                             configname,configlineno);
3226                 else
3227                   log_error(_("invalid export options\n"));
3228               }
3229             break;
3230           case oExportFilter:
3231             rc = parse_and_set_export_filter (pargs.r.ret_str);
3232             if (rc)
3233               log_error (_("invalid filter option: %s\n"), gpg_strerror (rc));
3234             break;
3235           case oListOptions:
3236             if(!parse_list_options(pargs.r.ret_str))
3237               {
3238                 if(configname)
3239                   log_error(_("%s:%d: invalid list options\n"),
3240                             configname,configlineno);
3241                 else
3242                   log_error(_("invalid list options\n"));
3243               }
3244             break;
3245           case oVerifyOptions:
3246             {
3247               struct parse_options vopts[]=
3248                 {
3249                   {"show-photos",VERIFY_SHOW_PHOTOS,NULL,
3250                    N_("display photo IDs during signature verification")},
3251                   {"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL,
3252                    N_("show policy URLs during signature verification")},
3253                   {"show-notations",VERIFY_SHOW_NOTATIONS,NULL,
3254                    N_("show all notations during signature verification")},
3255                   {"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3256                    N_("show IETF standard notations during signature verification")},
3257                   {"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
3258                    NULL},
3259                   {"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL,
3260                    N_("show user-supplied notations during signature verification")},
3261                   {"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL,
3262                    N_("show preferred keyserver URLs during signature verification")},
3263                   {"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL,
3264                    N_("show user ID validity during signature verification")},
3265                   {"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL,
3266                    N_("show revoked and expired user IDs in signature verification")},
3267                   {"show-primary-uid-only",VERIFY_SHOW_PRIMARY_UID_ONLY,NULL,
3268                    N_("show only the primary user ID in signature verification")},
3269                   {"pka-lookups",VERIFY_PKA_LOOKUPS,NULL,
3270                    N_("validate signatures with PKA data")},
3271                   {"pka-trust-increase",VERIFY_PKA_TRUST_INCREASE,NULL,
3272                    N_("elevate the trust of signatures with valid PKA data")},
3273                   {NULL,0,NULL,NULL}
3274                 };
3275
3276               if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
3277                 {
3278                   if(configname)
3279                     log_error(_("%s:%d: invalid verify options\n"),
3280                               configname,configlineno);
3281                   else
3282                     log_error(_("invalid verify options\n"));
3283                 }
3284             }
3285             break;
3286           case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
3287           case oExecPath:
3288             if(set_exec_path(pargs.r.ret_str))
3289               log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
3290             else
3291               opt.exec_path_set=1;
3292             break;
3293           case oSetNotation:
3294             add_notation_data( pargs.r.ret_str, 0 );
3295             add_notation_data( pargs.r.ret_str, 1 );
3296             break;
3297           case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
3298           case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
3299           case oShowNotation:
3300             deprecated_warning(configname,configlineno,"--show-notation",
3301                                "--list-options ","show-notations");
3302             deprecated_warning(configname,configlineno,"--show-notation",
3303                                "--verify-options ","show-notations");
3304             opt.list_options|=LIST_SHOW_NOTATIONS;
3305             opt.verify_options|=VERIFY_SHOW_NOTATIONS;
3306             break;
3307           case oNoShowNotation:
3308             deprecated_warning(configname,configlineno,"--no-show-notation",
3309                                "--list-options ","no-show-notations");
3310             deprecated_warning(configname,configlineno,"--no-show-notation",
3311                                "--verify-options ","no-show-notations");
3312             opt.list_options&=~LIST_SHOW_NOTATIONS;
3313             opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
3314             break;
3315           case oUtf8Strings: utf8_strings = 1; break;
3316           case oNoUtf8Strings: utf8_strings = 0; break;
3317           case oDisableCipherAlgo:
3318             {
3319               int algo = string_to_cipher_algo (pargs.r.ret_str);
3320               gcry_cipher_ctl (NULL, GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3321             }
3322             break;
3323           case oDisablePubkeyAlgo:
3324             {
3325               int algo = gcry_pk_map_name (pargs.r.ret_str);
3326               gcry_pk_ctl (GCRYCTL_DISABLE_ALGO, &algo, sizeof algo);
3327             }
3328             break;
3329           case oNoSigCache: opt.no_sig_cache = 1; break;
3330           case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
3331           case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
3332           case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
3333           case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
3334           case oNoLiteral: opt.no_literal = 1; break;
3335           case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
3336           case oFastListMode: opt.fast_list_mode = 1; break;
3337           case oFixedListMode: /* Dummy */ break;
3338           case oLegacyListMode: opt.legacy_list_mode = 1; break;
3339           case oPrintPKARecords: print_pka_records = 1; break;
3340           case oPrintDANERecords: print_dane_records = 1; break;
3341           case oListOnly: opt.list_only=1; break;
3342           case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
3343           case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
3344           case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
3345           case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
3346           case oNoRandomSeedFile: use_random_seed = 0; break;
3347
3348           case oAutoKeyRetrieve:
3349             opt.keyserver_options.options |= KEYSERVER_AUTO_KEY_RETRIEVE;
3350             break;
3351           case oNoAutoKeyRetrieve:
3352             opt.keyserver_options.options &= ~KEYSERVER_AUTO_KEY_RETRIEVE;
3353             break;
3354
3355           case oShowSessionKey: opt.show_session_key = 1; break;
3356           case oOverrideSessionKey:
3357                 opt.override_session_key = pargs.r.ret_str;
3358                 break;
3359           case oOverrideSessionKeyFD:
3360                 ovrseskeyfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
3361                 break;
3362           case oMergeOnly:
3363                 deprecated_warning(configname,configlineno,"--merge-only",
3364                                    "--import-options ","merge-only");
3365                 opt.import_options|=IMPORT_MERGE_ONLY;
3366             break;
3367           case oAllowSecretKeyImport: /* obsolete */ break;
3368           case oTryAllSecrets: opt.try_all_secrets = 1; break;
3369           case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
3370
3371           case oEnableSpecialFilenames:
3372             enable_special_filenames ();
3373             break;
3374
3375           case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
3376           case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
3377           case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
3378           case oPreservePermissions: opt.preserve_permissions=1; break;
3379           case oDefaultPreferenceList:
3380             opt.def_preference_list = pargs.r.ret_str;
3381             break;
3382           case oDefaultKeyserverURL:
3383             {
3384               keyserver_spec_t keyserver;
3385               keyserver = parse_keyserver_uri (pargs.r.ret_str,1 );
3386               if (!keyserver)
3387                 log_error (_("could not parse keyserver URL\n"));
3388               else
3389                 free_keyserver_spec (keyserver);
3390
3391               opt.def_keyserver_url = pargs.r.ret_str;
3392             }
3393             break;
3394           case oPersonalCipherPreferences:
3395             pers_cipher_list=pargs.r.ret_str;
3396             break;
3397           case oPersonalDigestPreferences:
3398             pers_digest_list=pargs.r.ret_str;
3399             break;
3400           case oPersonalCompressPreferences:
3401             pers_compress_list=pargs.r.ret_str;
3402             break;
3403           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
3404           case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
3405           case oDisableDirmngr: opt.disable_dirmngr = 1;  break;
3406           case oWeakDigest:
3407             additional_weak_digest(pargs.r.ret_str);
3408             break;
3409           case oUnwrap:
3410             opt.unwrap_encryption = 1;
3411             break;
3412           case oOnlySignTextIDs:
3413             opt.only_sign_text_ids = 1;
3414             break;
3415
3416           case oDisplay:
3417             set_opt_session_env ("DISPLAY", pargs.r.ret_str);
3418             break;
3419           case oTTYname:
3420             set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
3421             break;
3422           case oTTYtype:
3423             set_opt_session_env ("TERM", pargs.r.ret_str);
3424             break;
3425           case oXauthority:
3426             set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
3427             break;
3428
3429           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
3430           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
3431
3432           case oGroup: add_group(pargs.r.ret_str); break;
3433           case oUnGroup: rm_group(pargs.r.ret_str); break;
3434           case oNoGroups:
3435             while(opt.grouplist)
3436               {
3437                 struct groupitem *iter=opt.grouplist;
3438                 free_strlist(iter->values);
3439                 opt.grouplist=opt.grouplist->next;
3440                 xfree(iter);
3441               }
3442             break;
3443
3444           case oStrict:
3445           case oNoStrict:
3446             /* Not used */
3447             break;
3448
3449           case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
3450           case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
3451           case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
3452           case oMultifile: multifile=1; break;
3453           case oKeyidFormat:
3454             if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
3455               opt.keyid_format=KF_SHORT;
3456             else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
3457               opt.keyid_format=KF_LONG;
3458             else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
3459               opt.keyid_format=KF_0xSHORT;
3460             else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
3461               opt.keyid_format=KF_0xLONG;
3462             else if(ascii_strcasecmp(pargs.r.ret_str,"none")==0)
3463               opt.keyid_format = KF_NONE;
3464             else
3465               log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
3466             break;
3467
3468           case oExitOnStatusWriteError:
3469             opt.exit_on_status_write_error = 1;
3470             break;
3471
3472           case oLimitCardInsertTries:
3473             opt.limit_card_insert_tries = pargs.r.ret_int;
3474             break;
3475
3476           case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
3477           case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
3478
3479           case oAutoKeyLocate:
3480             if (default_akl)
3481               {
3482                 /* This is the first time --aito-key-locate is seen.
3483                  * We need to reset the default akl.  */
3484                 default_akl = 0;
3485                 release_akl();
3486               }
3487             if(!parse_auto_key_locate(pargs.r.ret_str))
3488               {
3489                 if(configname)
3490                   log_error(_("%s:%d: invalid auto-key-locate list\n"),
3491                             configname,configlineno);
3492                 else
3493                   log_error(_("invalid auto-key-locate list\n"));
3494               }
3495             break;
3496           case oNoAutoKeyLocate:
3497             release_akl();
3498             break;
3499
3500           case oKeyOrigin:
3501             if(!parse_key_origin (pargs.r.ret_str))
3502               log_error (_("invalid argument for option \"%.50s\"\n"),
3503                          "--key-origin");
3504             break;
3505
3506           case oEnableLargeRSA:
3507 #if SECMEM_BUFFER_SIZE >= 65536
3508             opt.flags.large_rsa=1;
3509 #else
3510             if (configname)
3511               log_info("%s:%d: WARNING: gpg not built with large secure "
3512                          "memory buffer.  Ignoring enable-large-rsa\n",
3513                         configname,configlineno);
3514             else
3515               log_info("WARNING: gpg not built with large secure "
3516                          "memory buffer.  Ignoring --enable-large-rsa\n");
3517 #endif /* SECMEM_BUFFER_SIZE >= 65536 */
3518             break;
3519           case oDisableLargeRSA: opt.flags.large_rsa=0;
3520             break;
3521
3522           case oEnableDSA2: opt.flags.dsa2=1; break;
3523           case oDisableDSA2: opt.flags.dsa2=0; break;
3524
3525           case oAllowMultisigVerification:
3526           case oAllowMultipleMessages:
3527             opt.flags.allow_multiple_messages=1;
3528             break;
3529
3530           case oNoAllowMultipleMessages:
3531             opt.flags.allow_multiple_messages=0;
3532             break;
3533
3534           case oAllowWeakDigestAlgos:
3535             opt.flags.allow_weak_digest_algos = 1;
3536             break;
3537
3538           case oFakedSystemTime:
3539             {
3540               size_t len = strlen (pargs.r.ret_str);
3541               int freeze = 0;
3542               time_t faked_time;
3543
3544               if (len > 0 && pargs.r.ret_str[len-1] == '!')
3545                 {
3546                   freeze = 1;
3547                   pargs.r.ret_str[len-1] = '\0';
3548                 }
3549
3550               faked_time = isotime2epoch (pargs.r.ret_str);
3551               if (faked_time == (time_t)(-1))
3552                 faked_time = (time_t)strtoul (pargs.r.ret_str, NULL, 10);
3553               gnupg_set_time (faked_time, freeze);
3554             }
3555             break;
3556
3557           case oNoAutostart: opt.autostart = 0; break;
3558
3559           case oDefaultNewKeyAlgo:
3560             opt.def_new_key_algo = pargs.r.ret_str;
3561             break;
3562
3563           case oNoop: break;
3564
3565           default:
3566             pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
3567             break;
3568           }
3569       }
3570
3571     if (configfp)
3572       {
3573         fclose( configfp );
3574         configfp = NULL;
3575         /* Remember the first config file name. */
3576         if (!save_configname)
3577           save_configname = configname;
3578         else
3579           xfree(configname);
3580         configname = NULL;
3581         goto next_pass;
3582       }
3583     xfree(configname); configname = NULL;
3584     if (log_get_errorcount (0))
3585       g10_exit(2);
3586
3587     /* The command --gpgconf-list is pretty simple and may be called
3588        directly after the option parsing. */
3589     if (cmd == aGPGConfList)
3590       {