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