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