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