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