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