gpg: Obsolete some keyserver helper options.
[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     gnupg_reopen_std (GPG_NAME);
2052     trap_unaligned ();
2053     gnupg_rl_initialize ();
2054     set_strusage (my_strusage);
2055     gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
2056     log_set_prefix (GPG_NAME, 1);
2057
2058     /* Make sure that our subsystems are ready.  */
2059     i18n_init();
2060     init_common_subsystems (&argc, &argv);
2061
2062     /* Check that the libraries are suitable.  Do it right here because the
2063        option parsing may need services of the library.  */
2064     if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) )
2065       {
2066         log_fatal ( _("libgcrypt is too old (need %s, have %s)\n"),
2067                     NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
2068       }
2069
2070     /* Use our own logging handler for Libcgrypt.  */
2071     setup_libgcrypt_logging ();
2072
2073     /* Put random number into secure memory */
2074     gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
2075
2076     may_coredump = disable_core_dumps();
2077
2078     gnupg_init_signals (0, emergency_cleanup);
2079
2080     dotlock_create (NULL, 0); /* Register lock file cleanup. */
2081
2082     opt.autostart = 1;
2083     opt.session_env = session_env_new ();
2084     if (!opt.session_env)
2085       log_fatal ("error allocating session environment block: %s\n",
2086                  strerror (errno));
2087
2088     opt.command_fd = -1; /* no command fd */
2089     opt.compress_level = -1; /* defaults to standard compress level */
2090     opt.bz2_compress_level = -1; /* defaults to standard compress level */
2091     /* note: if you change these lines, look at oOpenPGP */
2092     opt.def_cipher_algo = 0;
2093     opt.def_digest_algo = 0;
2094     opt.cert_digest_algo = 0;
2095     opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
2096     opt.s2k_mode = 3; /* iterated+salted */
2097     opt.s2k_count = 0; /* Auto-calibrate when needed.  */
2098     opt.s2k_cipher_algo = DEFAULT_CIPHER_ALGO;
2099     opt.completes_needed = 1;
2100     opt.marginals_needed = 3;
2101     opt.max_cert_depth = 5;
2102     opt.escape_from = 1;
2103     opt.flags.require_cross_cert = 1;
2104     opt.import_options = 0;
2105     opt.export_options = EXPORT_ATTRIBUTES;
2106     opt.keyserver_options.import_options = IMPORT_REPAIR_PKS_SUBKEY_BUG;
2107     opt.keyserver_options.export_options = EXPORT_ATTRIBUTES;
2108     opt.keyserver_options.options = (KEYSERVER_HONOR_KEYSERVER_URL
2109                                      | KEYSERVER_HONOR_PKA_RECORD );
2110     opt.verify_options = (LIST_SHOW_UID_VALIDITY
2111                           | VERIFY_SHOW_POLICY_URLS
2112                           | VERIFY_SHOW_STD_NOTATIONS
2113                           | VERIFY_SHOW_KEYSERVER_URLS);
2114     opt.list_options   = LIST_SHOW_UID_VALIDITY;
2115 #ifdef NO_TRUST_MODELS
2116     opt.trust_model = TM_ALWAYS;
2117 #else
2118     opt.trust_model = TM_AUTO;
2119 #endif
2120     opt.mangle_dos_filenames = 0;
2121     opt.min_cert_level = 2;
2122     set_screen_dimensions ();
2123     opt.keyid_format = KF_SHORT;
2124     opt.def_sig_expire = "0";
2125     opt.def_cert_expire = "0";
2126     set_homedir (default_homedir ());
2127     opt.passphrase_repeat = 1;
2128     opt.emit_version = 1; /* Limit to the major number.  */
2129
2130     /* Check whether we have a config file on the command line.  */
2131     orig_argc = argc;
2132     orig_argv = argv;
2133     pargs.argc = &argc;
2134     pargs.argv = &argv;
2135     pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
2136     while( arg_parse( &pargs, opts) ) {
2137         if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
2138             parse_debug++;
2139         else if( pargs.r_opt == oOptions ) {
2140             /* yes there is one, so we do not try the default one, but
2141              * read the option file when it is encountered at the commandline
2142              */
2143             default_config = 0;
2144         }
2145         else if( pargs.r_opt == oNoOptions )
2146           {
2147             default_config = 0; /* --no-options */
2148             opt.no_homedir_creation = 1;
2149           }
2150         else if( pargs.r_opt == oHomedir )
2151             set_homedir ( pargs.r.ret_str );
2152         else if( pargs.r_opt == oNoPermissionWarn )
2153             opt.no_perm_warn=1;
2154         else if (pargs.r_opt == oStrict )
2155           {
2156             /* Not used */
2157           }
2158         else if (pargs.r_opt == oNoStrict )
2159           {
2160             /* Not used */
2161           }
2162     }
2163
2164 #ifdef HAVE_DOSISH_SYSTEM
2165     if ( strchr (opt.homedir,'\\') ) {
2166         char *d, *buf = xmalloc (strlen (opt.homedir)+1);
2167         const char *s = opt.homedir;
2168         for (d=buf,s=opt.homedir; *s; s++)
2169           {
2170             *d++ = *s == '\\'? '/': *s;
2171 #ifdef HAVE_W32_SYSTEM
2172             if (s[1] && IsDBCSLeadByte (*s))
2173               *d++ = *++s;
2174 #endif
2175           }
2176         *d = 0;
2177         set_homedir (buf);
2178     }
2179 #endif
2180
2181     /* Initialize the secure memory. */
2182     if (!gcry_control (GCRYCTL_INIT_SECMEM, SECMEM_BUFFER_SIZE, 0))
2183       got_secmem = 1;
2184 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
2185     /* There should be no way to get to this spot while still carrying
2186        setuid privs.  Just in case, bomb out if we are. */
2187     if ( getuid () != geteuid () )
2188       BUG ();
2189 #endif
2190     maybe_setuid = 0;
2191
2192     /* Okay, we are now working under our real uid */
2193
2194     /* malloc hooks go here ... */
2195     malloc_hooks.malloc = gcry_malloc;
2196     malloc_hooks.realloc = gcry_realloc;
2197     malloc_hooks.free = gcry_free;
2198     assuan_set_malloc_hooks (&malloc_hooks);
2199     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
2200     setup_libassuan_logging (&opt.debug);
2201
2202     /* Try for a version specific config file first */
2203     default_configname = get_default_configname ();
2204     if (default_config)
2205       configname = xstrdup (default_configname);
2206
2207     argc = orig_argc;
2208     argv = orig_argv;
2209     pargs.argc = &argc;
2210     pargs.argv = &argv;
2211     pargs.flags= ARGPARSE_FLAG_KEEP;
2212
2213     /* By this point we have a homedir, and cannot change it. */
2214     check_permissions(opt.homedir,0);
2215
2216   next_pass:
2217     if( configname ) {
2218       if(check_permissions(configname,1))
2219         {
2220           /* If any options file is unsafe, then disable any external
2221              programs for keyserver calls or photo IDs.  Since the
2222              external program to call is set in the options file, a
2223              unsafe options file can lead to an arbitrary program
2224              being run. */
2225
2226           opt.exec_disable=1;
2227         }
2228
2229         configlineno = 0;
2230         configfp = fopen( configname, "r" );
2231         if (configfp && is_secured_file (fileno (configfp)))
2232           {
2233             fclose (configfp);
2234             configfp = NULL;
2235             gpg_err_set_errno (EPERM);
2236           }
2237         if( !configfp ) {
2238             if( default_config ) {
2239                 if( parse_debug )
2240                     log_info(_("Note: no default option file '%s'\n"),
2241                                                             configname );
2242             }
2243             else {
2244                 log_error(_("option file '%s': %s\n"),
2245                                     configname, strerror(errno) );
2246                 g10_exit(2);
2247             }
2248             xfree(configname); configname = NULL;
2249         }
2250         if( parse_debug && configname )
2251             log_info(_("reading options from '%s'\n"), configname );
2252         default_config = 0;
2253     }
2254
2255     while( optfile_parse( configfp, configname, &configlineno,
2256                                                 &pargs, opts) )
2257       {
2258         switch( pargs.r_opt )
2259           {
2260           case aCheckKeys:
2261           case aListConfig:
2262           case aGPGConfList:
2263           case aGPGConfTest:
2264           case aListPackets:
2265           case aImport:
2266           case aFastImport:
2267           case aSendKeys:
2268           case aRecvKeys:
2269           case aSearchKeys:
2270           case aRefreshKeys:
2271           case aFetchKeys:
2272           case aExport:
2273 #ifdef ENABLE_CARD_SUPPORT
2274           case aCardStatus:
2275           case aCardEdit:
2276           case aChangePIN:
2277 #endif /* ENABLE_CARD_SUPPORT*/
2278           case aListKeys:
2279           case aLocateKeys:
2280           case aListSigs:
2281           case aExportSecret:
2282           case aExportSecretSub:
2283           case aSym:
2284           case aClearsign:
2285           case aGenRevoke:
2286           case aDesigRevoke:
2287           case aPrimegen:
2288           case aGenRandom:
2289           case aPrintMD:
2290           case aPrintMDs:
2291           case aListTrustDB:
2292           case aCheckTrustDB:
2293           case aUpdateTrustDB:
2294           case aFixTrustDB:
2295           case aListTrustPath:
2296           case aDeArmor:
2297           case aEnArmor:
2298           case aSign:
2299           case aQuickSignKey:
2300           case aQuickLSignKey:
2301           case aSignKey:
2302           case aLSignKey:
2303           case aStore:
2304           case aQuickKeygen:
2305           case aExportOwnerTrust:
2306           case aImportOwnerTrust:
2307           case aRebuildKeydbCaches:
2308             set_cmd (&cmd, pargs.r_opt);
2309             break;
2310
2311           case aKeygen:
2312           case aFullKeygen:
2313           case aEditKey:
2314           case aDeleteSecretKeys:
2315           case aDeleteSecretAndPublicKeys:
2316           case aDeleteKeys:
2317           case aPasswd:
2318             set_cmd (&cmd, pargs.r_opt);
2319             greeting=1;
2320             break;
2321
2322           case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
2323
2324           case aDecryptFiles: multifile=1; /* fall through */
2325           case aDecrypt: set_cmd( &cmd, aDecrypt); break;
2326
2327           case aEncrFiles: multifile=1; /* fall through */
2328           case aEncr: set_cmd( &cmd, aEncr); break;
2329
2330           case aVerifyFiles: multifile=1; /* fall through */
2331           case aVerify: set_cmd( &cmd, aVerify); break;
2332
2333           case aServer:
2334             set_cmd (&cmd, pargs.r_opt);
2335             opt.batch = 1;
2336             break;
2337
2338           case oArmor: opt.armor = 1; opt.no_armor=0; break;
2339           case oOutput: opt.outfile = pargs.r.ret_str; break;
2340           case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
2341           case oQuiet: opt.quiet = 1; break;
2342           case oNoTTY: tty_no_terminal(1); break;
2343           case oDryRun: opt.dry_run = 1; break;
2344           case oInteractive: opt.interactive = 1; break;
2345           case oVerbose:
2346             opt.verbose++;
2347             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2348             opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
2349             opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
2350             break;
2351
2352           case oBatch:
2353             opt.batch = 1;
2354             nogreeting = 1;
2355             break;
2356
2357           case oUseAgent: /* Dummy. */
2358             break;
2359
2360           case oNoUseAgent:
2361             obsolete_option (configname, configlineno, "no-use-agent");
2362             break;
2363           case oGpgAgentInfo:
2364             obsolete_option (configname, configlineno, "gpg-agent-info");
2365             break;
2366           case oReaderPort:
2367             obsolete_scdaemon_option (configname, configlineno, "reader-port");
2368             break;
2369           case octapiDriver:
2370             obsolete_scdaemon_option (configname, configlineno, "ctapi-driver");
2371             break;
2372           case opcscDriver:
2373             obsolete_scdaemon_option (configname, configlineno, "pcsc-driver");
2374             break;
2375           case oDisableCCID:
2376             obsolete_scdaemon_option (configname, configlineno, "disable-ccid");
2377             break;
2378           case oHonorHttpProxy:
2379             obsolete_option (configname, configlineno, "honor-http-proxy");
2380             break;
2381
2382           case oAnswerYes: opt.answer_yes = 1; break;
2383           case oAnswerNo: opt.answer_no = 1; break;
2384           case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
2385           case oPrimaryKeyring:
2386             sl = append_to_strlist (&nrings, pargs.r.ret_str);
2387             sl->flags = KEYDB_RESOURCE_FLAG_PRIMARY;
2388             break;
2389           case oShowKeyring:
2390             deprecated_warning(configname,configlineno,"--show-keyring",
2391                                "--list-options ","show-keyring");
2392             opt.list_options|=LIST_SHOW_KEYRING;
2393             break;
2394
2395           case oDebug: opt.debug |= pargs.r.ret_ulong; break;
2396           case oDebugAll: opt.debug = ~0; break;
2397           case oDebugLevel: debug_level = pargs.r.ret_str; break;
2398
2399           case oStatusFD:
2400             set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2401             break;
2402           case oStatusFile:
2403             set_status_fd ( open_info_file (pargs.r.ret_str, 1, 0) );
2404             break;
2405           case oAttributeFD:
2406             set_attrib_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
2407             break;
2408           case oAttributeFile:
2409             set_attrib_fd ( open_info_file (pargs.r.ret_str, 1, 1) );
2410             break;
2411           case oLoggerFD:
2412             log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
2413             break;
2414           case oLoggerFile:
2415             logfile = pargs.r.ret_str;
2416             break;
2417
2418           case oWithFingerprint:
2419             opt.with_fingerprint = 1;
2420             opt.fingerprint++;
2421             break;
2422           case oFingerprint:
2423             opt.fingerprint++;
2424             fpr_maybe_cmd = 1;
2425             break;
2426
2427           case oWithKeygrip:
2428             opt.with_keygrip = 1;
2429             break;
2430
2431           case oWithSecret:
2432             opt.with_secret = 1;
2433             break;
2434
2435           case oSecretKeyring:
2436             /* Ignore this old option.  */
2437             break;
2438
2439           case oOptions:
2440             /* config files may not be nested (silently ignore them) */
2441             if( !configfp ) {
2442                 xfree(configname);
2443                 configname = xstrdup(pargs.r.ret_str);
2444                 goto next_pass;
2445             }
2446             break;
2447           case oNoArmor: opt.no_armor=1; opt.armor=0; break;
2448           case oNoDefKeyring: default_keyring = 0; break;
2449           case oNoGreeting: nogreeting = 1; break;
2450           case oNoVerbose:
2451             opt.verbose = 0;
2452             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
2453             opt.list_sigs=0;
2454             break;
2455           case oQuickRandom:
2456             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
2457             break;
2458           case oEmitVersion: opt.emit_version++; break;
2459           case oNoEmitVersion: opt.emit_version=0; break;
2460           case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
2461           case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
2462           case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
2463
2464 #ifndef NO_TRUST_MODELS
2465           case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
2466
2467 #endif /*!NO_TRUST_MODELS*/
2468           case oDefaultKey: opt.def_secret_key = pargs.r.ret_str; break;
2469           case oDefRecipient:
2470             if( *pargs.r.ret_str )
2471               opt.def_recipient = make_username(pargs.r.ret_str);
2472             break;
2473           case oDefRecipientSelf:
2474             xfree(opt.def_recipient); opt.def_recipient = NULL;
2475             opt.def_recipient_self = 1;
2476             break;
2477           case oNoDefRecipient:
2478             xfree(opt.def_recipient); opt.def_recipient = NULL;
2479             opt.def_recipient_self = 0;
2480             break;
2481           case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
2482           case oHomedir: break;
2483           case oNoBatch: opt.batch = 0; break;
2484
2485           case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
2486           case oWithColons: opt.with_colons=':'; break;
2487
2488           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
2489           case oWithSigList: opt.list_sigs = 1; break;
2490
2491           case oSkipVerify: opt.skip_verify=1; break;
2492
2493           case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
2494           case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
2495
2496           case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
2497
2498 #ifndef NO_TRUST_MODELS
2499             /* There are many programs (like mutt) that call gpg with
2500                --always-trust so keep this option around for a long
2501                time. */
2502           case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
2503           case oTrustModel:
2504             parse_trust_model(pargs.r.ret_str);
2505             break;
2506 #endif /*!NO_TRUST_MODELS*/
2507
2508           case oForceOwnertrust:
2509             log_info(_("Note: %s is not for normal use!\n"),
2510                      "--force-ownertrust");
2511             opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
2512             if(opt.force_ownertrust==-1)
2513               {
2514                 log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
2515                 opt.force_ownertrust=0;
2516               }
2517             break;
2518           case oLoadExtension:
2519             /* Dummy so that gpg 1.4 conf files can work. Should
2520                eventually be removed.  */
2521             break;
2522           case oOpenPGP:
2523           case oRFC4880:
2524             /* This is effectively the same as RFC2440, but with
2525                "--enable-dsa2 --no-rfc2440-text --escape-from-lines
2526                --require-cross-certification". */
2527             opt.compliance = CO_RFC4880;
2528             opt.flags.dsa2 = 1;
2529             opt.flags.require_cross_cert = 1;
2530             opt.rfc2440_text = 0;
2531             opt.allow_non_selfsigned_uid = 1;
2532             opt.allow_freeform_uid = 1;
2533             opt.escape_from = 1;
2534             opt.not_dash_escaped = 0;
2535             opt.def_cipher_algo = 0;
2536             opt.def_digest_algo = 0;
2537             opt.cert_digest_algo = 0;
2538             opt.compress_algo = -1;
2539             opt.s2k_mode = 3; /* iterated+salted */
2540             opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2541             opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2542             break;
2543           case oRFC2440:
2544             opt.compliance = CO_RFC2440;
2545             opt.flags.dsa2 = 0;
2546             opt.rfc2440_text = 1;
2547             opt.allow_non_selfsigned_uid = 1;
2548             opt.allow_freeform_uid = 1;
2549             opt.escape_from = 0;
2550             opt.not_dash_escaped = 0;
2551             opt.def_cipher_algo = 0;
2552             opt.def_digest_algo = 0;
2553             opt.cert_digest_algo = 0;
2554             opt.compress_algo = -1;
2555             opt.s2k_mode = 3; /* iterated+salted */
2556             opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
2557             opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
2558             break;
2559           case oPGP6:  opt.compliance = CO_PGP6;  break;
2560           case oPGP7:  opt.compliance = CO_PGP7;  break;
2561           case oPGP8:  opt.compliance = CO_PGP8;  break;
2562           case oGnuPG: opt.compliance = CO_GNUPG; break;
2563           case oRFC2440Text: opt.rfc2440_text=1; break;
2564           case oNoRFC2440Text: opt.rfc2440_text=0; break;
2565           case oSetFilename:
2566             if(utf8_strings)
2567               opt.set_filename = pargs.r.ret_str;
2568             else
2569               opt.set_filename = native_to_utf8(pargs.r.ret_str);
2570             break;
2571           case oForYourEyesOnly: eyes_only = 1; break;
2572           case oNoForYourEyesOnly: eyes_only = 0; break;
2573           case oSetPolicyURL:
2574             add_policy_url(pargs.r.ret_str,0);
2575             add_policy_url(pargs.r.ret_str,1);
2576             break;
2577           case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
2578           case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
2579           case oShowPolicyURL:
2580             deprecated_warning(configname,configlineno,"--show-policy-url",
2581                                "--list-options ","show-policy-urls");
2582             deprecated_warning(configname,configlineno,"--show-policy-url",
2583                                "--verify-options ","show-policy-urls");
2584             opt.list_options|=LIST_SHOW_POLICY_URLS;
2585             opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
2586             break;
2587           case oNoShowPolicyURL:
2588             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2589                                "--list-options ","no-show-policy-urls");
2590             deprecated_warning(configname,configlineno,"--no-show-policy-url",
2591                                "--verify-options ","no-show-policy-urls");
2592             opt.list_options&=~LIST_SHOW_POLICY_URLS;
2593             opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
2594             break;
2595           case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
2596           case oUseEmbeddedFilename:
2597             opt.flags.use_embedded_filename=1;
2598             break;
2599           case oNoUseEmbeddedFilename:
2600             opt.flags.use_embedded_filename=0;
2601             break;
2602           case oComment:
2603             if(pargs.r.ret_str[0])
2604               append_to_strlist(&opt.comments,pargs.r.ret_str);
2605             break;
2606           case oDefaultComment:
2607             deprecated_warning(configname,configlineno,
2608                                "--default-comment","--no-comments","");
2609             /* fall through */
2610           case oNoComments:
2611             free_strlist(opt.comments);
2612             opt.comments=NULL;
2613             break;
2614           case oThrowKeyids: opt.throw_keyids = 1; break;
2615           case oNoThrowKeyids: opt.throw_keyids = 0; break;
2616           case oShowPhotos:
2617             deprecated_warning(configname,configlineno,"--show-photos",
2618                                "--list-options ","show-photos");
2619             deprecated_warning(configname,configlineno,"--show-photos",
2620                                "--verify-options ","show-photos");
2621             opt.list_options|=LIST_SHOW_PHOTOS;
2622             opt.verify_options|=VERIFY_SHOW_PHOTOS;
2623             break;
2624           case oNoShowPhotos:
2625             deprecated_warning(configname,configlineno,"--no-show-photos",
2626                                "--list-options ","no-show-photos");
2627             deprecated_warning(configname,configlineno,"--no-show-photos",
2628                                "--verify-options ","no-show-photos");
2629             opt.list_options&=~LIST_SHOW_PHOTOS;
2630             opt.verify_options&=~VERIFY_SHOW_PHOTOS;
2631             break;
2632           case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
2633
2634           case oForceMDC: opt.force_mdc = 1; break;
2635           case oNoForceMDC: opt.force_mdc = 0; break;
2636           case oDisableMDC: opt.disable_mdc = 1; break;
2637           case oNoDisableMDC: opt.disable_mdc = 0; break;
2638           case oS2KMode:   opt.s2k_mode = pargs.r.ret_int; break;
2639           case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
2640           case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
2641           case oS2KCount:
2642             if (pargs.r.ret_int)
2643               opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
2644             else
2645               opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
2646             break;
2647           case oNoEncryptTo: opt.no_encrypt_to = 1; break;
2648           case oEncryptTo: /* store the recipient in the second list */
2649             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2650             sl->flags = 1;
2651             break;
2652           case oHiddenEncryptTo: /* store the recipient in the second list */
2653             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2654             sl->flags = 1|2;
2655             break;
2656           case oRecipient: /* store the recipient */
2657             add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2658             any_explicit_recipient = 1;
2659             break;
2660           case oHiddenRecipient: /* store the recipient with a flag */
2661             sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
2662             sl->flags = 2;
2663             any_explicit_recipient = 1;
2664             break;
2665
2666           case oTrySecretKey:
2667             add_to_strlist2 (&opt.secret_keys_to_try,
2668                              pargs.r.ret_str, utf8_strings);
2669             break;
2670
2671           case oTextmodeShort: opt.textmode = 2; break;
2672           case oTextmode: opt.textmode=1;  break;
2673           case oNoTextmode: opt.textmode=0;  break;
2674           case oExpert: opt.expert = 1; break;
2675           case oNoExpert: opt.expert = 0; break;
2676           case oDefSigExpire:
2677             if(*pargs.r.ret_str!='\0')
2678               {
2679                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
2680                   log_error(_("'%s' is not a valid signature expiration\n"),
2681                             pargs.r.ret_str);
2682                 else
2683                   opt.def_sig_expire=pargs.r.ret_str;
2684               }
2685             break;
2686           case oAskSigExpire: opt.ask_sig_expire = 1; break;
2687           case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
2688           case oDefCertExpire:
2689             if(*pargs.r.ret_str!='\0')
2690               {
2691                 if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
2692                   log_error(_("'%s' is not a valid signature expiration\n"),
2693                             pargs.r.ret_str);
2694                 else
2695                   opt.def_cert_expire=pargs.r.ret_str;
2696               }
2697             break;
2698           case oAskCertExpire: opt.ask_cert_expire = 1; break;
2699           case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
2700           case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
2701           case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
2702           case oAskCertLevel: opt.ask_cert_level = 1; break;
2703           case oNoAskCertLevel: opt.ask_cert_level = 0; break;
2704           case oLocalUser: /* store the local users */
2705             add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
2706             break;
2707           case oCompress:
2708             /* this is the -z command line option */
2709             opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
2710             break;
2711           case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
2712           case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
2713           case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
2714           case oPassphrase:
2715             set_passphrase_from_string(pargs.r.ret_str);
2716             break;
2717           case oPassphraseFD:
2718             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
2719             break;
2720           case oPassphraseFile:
2721             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
2722             break;
2723           case oPassphraseRepeat:
2724             opt.passphrase_repeat = pargs.r.ret_int;
2725             break;
2726
2727           case oPinentryMode:
2728             opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
2729             if (opt.pinentry_mode == -1)
2730               log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
2731             break;
2732
2733           case oCommandFD:
2734             opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
2735             break;
2736           case oCommandFile:
2737             opt.command_fd = open_info_file (pargs.r.ret_str, 0, 1);
2738             break;
2739           case oCipherAlgo:
2740             def_cipher_string = xstrdup(pargs.r.ret_str);
2741             break;
2742           case oDigestAlgo:
2743             def_digest_string = xstrdup(pargs.r.ret_str);
2744             break;
2745           case oCompressAlgo:
2746             /* If it is all digits, stick a Z in front of it for
2747                later.  This is for backwards compatibility with
2748                versions that took the compress algorithm number. */
2749             {
2750               char *pt=pargs.r.ret_str;
2751               while(*pt)
2752                 {
2753                   if (!isascii (*pt) || !isdigit (*pt))
2754                     break;
2755
2756                   pt++;
2757                 }
2758
2759               if(*pt=='\0')
2760                 {
2761                   compress_algo_string=xmalloc(strlen(pargs.r.ret_str)+2);
2762                   strcpy(compress_algo_string,"Z");
2763                   strcat(compress_algo_string,pargs.r.ret_str);
2764                 }
2765               else
2766                 compress_algo_string = xstrdup(pargs.r.ret_str);
2767             }
2768             break;
2769           case oCertDigestAlgo:
2770             cert_digest_string = xstrdup(pargs.r.ret_str);
2771             break;
2772
2773           case oNoSecmemWarn:
2774             gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
2775             break;
2776
2777           case oRequireSecmem: require_secmem=1; break;
2778           case oNoRequireSecmem: require_secmem=0; break;
2779           case oNoPermissionWarn: opt.no_perm_warn=1; break;
2780           case oNoMDCWarn: opt.no_mdc_warn=1; break;
2781           case oDisplayCharset:
2782             if( set_native_charset( pargs.r.ret_str ) )
2783                 log_error(_("'%s' is not a valid character set\n"),
2784                           pargs.r.ret_str);
2785             break;
2786           case oNotDashEscaped: opt.not_dash_escaped = 1; break;
2787           case oEscapeFrom: opt.escape_from = 1; break;
2788           case oNoEscapeFrom: opt.escape_from = 0; break;
2789           case oLockOnce: opt.lock_once = 1; break;
2790           case oLockNever:
2791             dotlock_disable ();
2792             break;
2793           case oLockMultiple:
2794 #ifndef __riscos__
2795             opt.lock_once = 0;
2796 #else /* __riscos__ */
2797             riscos_not_implemented("lock-multiple");
2798 #endif /* __riscos__ */
2799             break;
2800           case oKeyServer:
2801             {
2802               keyserver_spec_t keyserver;
2803               keyserver = parse_keyserver_uri (pargs.r.ret_str,0,
2804                                                configname,configlineno);
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                                                configname,configlineno);
2995               if (!keyserver)
2996                 log_error (_("could not parse keyserver URL\n"));
2997               else
2998                 free_keyserver_spec (keyserver);
2999
3000               opt.def_keyserver_url = pargs.r.ret_str;
3001             }
3002             break;
3003           case oPersonalCipherPreferences:
3004             pers_cipher_list=pargs.r.ret_str;
3005             break;
3006           case oPersonalDigestPreferences:
3007             pers_digest_list=pargs.r.ret_str;
3008             break;
3009           case oPersonalCompressPreferences:
3010             pers_compress_list=pargs.r.ret_str;
3011             break;
3012           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
3013           case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str; break;
3014
3015           case oDisplay:
3016             set_opt_session_env ("DISPLAY", pargs.r.ret_str);
3017             break;
3018           case oTTYname:
3019             set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
3020             break;
3021           case oTTYtype:
3022             set_opt_session_env ("TERM", pargs.r.ret_str);
3023             break;
3024           case oXauthority:
3025             set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
3026             break;
3027
3028           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
3029           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
3030
3031           case oGroup: add_group(pargs.r.ret_str); break;
3032           case oUnGroup: rm_group(pargs.r.ret_str); break;
3033           case oNoGroups:
3034             while(opt.grouplist)
3035               {
3036                 struct groupitem *iter=opt.grouplist;
3037                 free_strlist(iter->values);
3038                 opt.grouplist=opt.grouplist->next;
3039                 xfree(iter);
3040               }
3041             break;
3042
3043           case oStrict:
3044           case oNoStrict:
3045             /* Not used */
3046             break;
3047
3048           case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
3049           case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
3050           case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
3051           case oMultifile: multifile=1; break;
3052           case oKeyidFormat:
3053             if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
3054               opt.keyid_format=KF_SHORT;
3055             else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
3056               opt.keyid_format=KF_LONG;
3057             else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
3058               opt.keyid_format=KF_0xSHORT;
3059             else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
3060               opt.keyid_format=KF_0xLONG;
3061             else
3062               log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
3063             break;
3064
3065           case oExitOnStatusWriteError:
3066             opt.exit_on_status_write_error = 1;
3067             break;
3068
3069           case oLimitCardInsertTries:
3070             opt.limit_card_insert_tries = pargs.r.ret_int;
3071             break;
3072
3073           case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
3074           case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
3075
3076           case oAutoKeyLocate:
3077             if(!parse_auto_key_locate(pargs.r.ret_str))
3078               {
3079                 if(configname)
3080                   log_error(_("%s:%d: invalid auto-key-locate list\n"),
3081                             configname,configlineno);
3082                 else
3083                   log_error(_("invalid auto-key-locate list\n"));
3084               }
3085             break;
3086           case oNoAutoKeyLocate:
3087             release_akl();
3088             break;
3089
3090           case oEnableLargeRSA:
3091 #if SECMEM_BUFFER_SIZE >= 65536
3092             opt.flags.large_rsa=1;
3093 #else
3094             if (configname)
3095               log_info("%s:%d: WARNING: gpg not built with large secure "
3096                          "memory buffer.  Ignoring enable-large-rsa\n",
3097                         configname,configlineno);
3098             else
3099               log_info("WARNING: gpg not built with large secure "
3100                          "memory buffer.  Ignoring --enable-large-rsa\n");
3101 #endif /* SECMEM_BUFFER_SIZE >= 65536 */
3102             break;
3103           case oDisableLargeRSA: opt.flags.large_rsa=0;
3104             break;
3105
3106           case oEnableDSA2: opt.flags.dsa2=1; break;
3107           case oDisableDSA2: opt.flags.dsa2=0; break;
3108
3109           case oAllowMultisigVerification:
3110           case oAllowMultipleMessages:
3111             opt.flags.allow_multiple_messages=1;
3112             break;
3113
3114           case oNoAllowMultipleMessages:
3115             opt.flags.allow_multiple_messages=0;
3116             break;
3117
3118           case oAllowWeakDigestAlgos:
3119             opt.flags.allow_weak_digest_algos = 1;
3120             break;
3121
3122           case oFakedSystemTime:
3123             {
3124               time_t faked_time = isotime2epoch (pargs.r.ret_str);
3125               if (faked_time == (time_t)(-1))
3126                 faked_time = (time_t)strtoul (pargs.r.ret_str, NULL, 10);
3127               gnupg_set_time (faked_time, 0);
3128             }
3129             break;
3130
3131           case oNoAutostart: opt.autostart = 0; break;
3132
3133           case oNoop: break;
3134
3135           default:
3136             pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
3137             break;
3138           }
3139       }
3140
3141     if (configfp)
3142       {
3143         fclose( configfp );
3144         configfp = NULL;
3145         /* Remember the first config file name. */
3146         if (!save_configname)
3147           save_configname = configname;
3148         else
3149           xfree(configname);
3150         configname = NULL;
3151         goto next_pass;
3152       }
3153     xfree(configname); configname = NULL;
3154     if (log_get_errorcount (0))
3155       g10_exit(2);
3156
3157     /* The command --gpgconf-list is pretty simple and may be called
3158        directly after the option parsing. */
3159     if (cmd == aGPGConfList)
3160       {
3161         gpgconf_list (save_configname ? save_configname : default_configname);
3162         g10_exit (0);
3163       }
3164     xfree (save_configname);
3165     xfree (default_configname);
3166
3167     if( nogreeting )
3168         greeting = 0;
3169
3170     if( greeting )
3171       {
3172         es_fprintf (es_stderr, "%s %s; %s\n",
3173                     strusage(11), strusage(13), strusage(14) );
3174         es_fprintf (es_stderr, "%s\n", strusage(15) );
3175       }
3176 #ifdef IS_DEVELOPMENT_VERSION
3177     if (!opt.batch)
3178       {
3179         const char *s;
3180
3181         if((s=strusage(25)))
3182           log_info("%s\n",s);
3183         if((s=strusage(26)))
3184           log_info("%s\n",s);
3185         if((s=strusage(27)))
3186           log_info("%s\n",s);
3187       }
3188 #endif
3189
3190     /* FIXME: We should use logging to a file only in server mode;
3191        however we have not yet implemetyed that.  Thus we try to get
3192        away with --batch as indication for logging to file
3193        required. */
3194     if (logfile && opt.batch)
3195       {
3196         log_set_file (logfile);
3197         log_set_prefix (NULL, 1|2|4);
3198       }
3199
3200     if (opt.verbose > 2)
3201         log_info ("using character set '%s'\n", get_native_charset ());
3202
3203     if( may_coredump && !opt.quiet )
3204         log_info(_("WARNING: program may create a core file!\n"));
3205
3206     if (eyes_only) {
3207       if (opt.set_filename)
3208           log_info(_("WARNING: %s overrides %s\n"),
3209                    "--for-your-eyes-only","--set-filename");
3210
3211       opt.set_filename="_CONSOLE";
3212     }
3213
3214     if (opt.no_literal) {
3215         log_info(_("Note: %s is not for normal use!\n"), "--no-literal");
3216         if (opt.textmode)
3217             log_error(_("%s not allowed with %s!\n"),
3218                        "--textmode", "--no-literal" );
3219         if (opt.set_filename)
3220             log_error(_("%s makes no sense with %s!\n"),
3221                         eyes_only?"--for-your-eyes-only":"--set-filename",
3222                         "--no-literal" );
3223     }
3224
3225
3226     if (opt.set_filesize)
3227         log_info(_("Note: %s is not for normal use!\n"), "--set-filesize");
3228     if( opt.batch )
3229         tty_batchmode( 1 );
3230
3231     if (gnupg_faked_time_p ())
3232       {
3233         gnupg_isotime_t tbuf;
3234
3235         log_info (_("WARNING: running with faked system time: "));
3236         gnupg_get_isotime (tbuf);
3237         dump_isotime (tbuf);
3238         log_printf ("\n");
3239       }
3240
3241     /* Print a warning if an argument looks like an option.  */
3242     if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
3243       {
3244         int i;
3245
3246         for (i=0; i < argc; i++)
3247           if (argv[i][0] == '-' && argv[i][1] == '-')
3248             log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
3249       }
3250
3251
3252     gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
3253
3254     if(require_secmem && !got_secmem)
3255       {
3256         log_info(_("will not run with insecure memory due to %s\n"),
3257                  "--require-secmem");
3258         g10_exit(2);
3259       }
3260
3261     set_debug (debug_level);
3262     if (DBG_CLOCK)
3263       log_clock ("start");
3264
3265     /* Do these after the switch(), so they can override settings. */
3266     if(PGP6)
3267       {
3268         /* That does not anymore work becuase we have no more support
3269            for v3 signatures.  */
3270         opt.disable_mdc=1;
3271         opt.escape_from=1;
3272         opt.ask_sig_expire=0;
3273       }
3274     else if(PGP7)
3275       {
3276         /* That does not anymore work because we have no more support
3277            for v3 signatures.  */
3278         opt.escape_from=1;
3279         opt.ask_sig_expire=0;
3280       }
3281     else if(PGP8)
3282       {
3283         opt.escape_from=1;
3284       }
3285
3286
3287     if( def_cipher_string ) {
3288         opt.def_cipher_algo = string_to_cipher_algo (def_cipher_string);
3289         xfree(def_cipher_string); def_cipher_string = NULL;
3290         if ( openpgp_cipher_test_algo (opt.def_cipher_algo) )
3291             log_error(_("selected cipher algorithm is invalid\n"));
3292     }
3293     if( def_digest_string ) {
3294         opt.def_digest_algo = string_to_digest_algo (def_digest_string);
3295         xfree(def_digest_string); def_digest_string = NULL;
3296         if ( openpgp_md_test_algo (opt.def_digest_algo) )
3297             log_error(_("selected digest algorithm is invalid\n"));
3298     }
3299     if( compress_algo_string ) {
3300         opt.compress_algo = string_to_compress_algo(compress_algo_string);
3301         xfree(compress_algo_string); compress_algo_string = NULL;
3302         if( check_compress_algo(opt.compress_algo) )
3303           log_error(_("selected compression algorithm is invalid\n"));
3304     }
3305     if( cert_digest_string ) {
3306         opt.cert_digest_algo = string_to_digest_algo (cert_digest_string);
3307         xfree(cert_digest_string); cert_digest_string = NULL;
3308         if (openpgp_md_test_algo(opt.cert_digest_algo))
3309           log_error(_("selected certification digest algorithm is invalid\n"));
3310     }
3311     if( s2k_cipher_string ) {
3312         opt.s2k_cipher_algo = string_to_cipher_algo (s2k_cipher_string);
3313         xfree(s2k_cipher_string); s2k_cipher_string = NULL;
3314         if (openpgp_cipher_test_algo (opt.s2k_cipher_algo))
3315           log_error(_("selected cipher algorithm is invalid\n"));
3316     }
3317     if( s2k_digest_string ) {
3318         opt.s2k_digest_algo = string_to_digest_algo (s2k_digest_string);
3319         xfree(s2k_digest_string); s2k_digest_string = NULL;
3320         if (openpgp_md_test_algo(opt.s2k_digest_algo))
3321           log_error(_("selected digest algorithm is invalid\n"));
3322     }
3323     if( opt.completes_needed < 1 )
3324       log_error(_("completes-needed must be greater than 0\n"));
3325     if( opt.marginals_needed < 2 )
3326       log_error(_("marginals-needed must be greater than 1\n"));
3327     if( opt.max_cert_depth < 1 || opt.max_cert_depth > 255 )
3328       log_error(_("max-cert-depth must be in the range from 1 to 255\n"));
3329     if(opt.def_cert_level<0 || opt.def_cert_level>3)
3330       log_error(_("invalid default-cert-level; must be 0, 1, 2, or 3\n"));
3331     if( opt.min_cert_level < 1 || opt.min_cert_level > 3 )
3332       log_error(_("invalid min-cert-level; must be 1, 2, or 3\n"));
3333     switch( opt.s2k_mode ) {
3334       case 0:
3335         log_info(_("Note: simple S2K mode (0) is strongly discouraged\n"));
3336         break;
3337       case 1: case 3: break;
3338       default:
3339         log_error(_("invalid S2K mode; must be 0, 1 or 3\n"));
3340     }
3341
3342     /* This isn't actually needed, but does serve to error out if the
3343        string is invalid. */
3344     if(opt.def_preference_list &&
3345         keygen_set_std_prefs(opt.def_preference_list,0))
3346       log_error(_("invalid default preferences\n"));
3347
3348     if(pers_cipher_list &&
3349        keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
3350       log_error(_("invalid personal cipher preferences\n"));
3351
3352     if(pers_digest_list &&
3353        keygen_set_std_prefs(pers_digest_list,PREFTYPE_HASH))
3354       log_error(_("invalid personal digest preferences\n"));
3355
3356     if(pers_compress_list &&
3357        keygen_set_std_prefs(pers_compress_list,PREFTYPE_ZIP))
3358       log_error(_("invalid personal compress preferences\n"));
3359
3360     /* We don't support all possible commands with multifile yet */
3361     if(multifile)
3362       {
3363         char *cmdname;
3364
3365         switch(cmd)
3366           {
3367           case aSign:
3368             cmdname="--sign";
3369             break;
3370           case aClearsign:
3371             cmdname="--clearsign";
3372             break;
3373           case aDetachedSign:
3374             cmdname="--detach-sign";
3375             break;
3376           case aSym:
3377             cmdname="--symmetric";
3378             break;
3379           case aEncrSym:
3380             cmdname="--symmetric --encrypt";
3381             break;
3382           case aStore:
3383             cmdname="--store";
3384             break;
3385           default:
3386             cmdname=NULL;
3387             break;
3388           }
3389
3390         if(cmdname)
3391           log_error(_("%s does not yet work with %s\n"),cmdname,"--multifile");
3392       }
3393
3394     if( log_get_errorcount(0) )
3395         g10_exit(2);
3396
3397     if(opt.compress_level==0)
3398       opt.compress_algo=COMPRESS_ALGO_NONE;
3399
3400     /* Check our chosen algorithms against the list of legal
3401        algorithms. */
3402
3403     if(!GNUPG)
3404       {
3405         const char *badalg=NULL;
3406         preftype_t badtype=PREFTYPE_NONE;
3407
3408         if(opt.def_cipher_algo
3409            && !algo_available(PREFTYPE_SYM,opt.def_cipher_algo,NULL))
3410           {
3411             badalg = openpgp_cipher_algo_name (opt.def_cipher_algo);
3412             badtype = PREFTYPE_SYM;
3413           }
3414         else if(opt.def_digest_algo
3415                 && !algo_available(PREFTYPE_HASH,opt.def_digest_algo,NULL))
3416           {
3417             badalg = gcry_md_algo_name (opt.def_digest_algo);
3418             badtype = PREFTYPE_HASH;
3419           }
3420         else if(opt.cert_digest_algo
3421                 && !algo_available(PREFTYPE_HASH,opt.cert_digest_algo,NULL))
3422           {
3423             badalg = gcry_md_algo_name (opt.cert_digest_algo);
3424             badtype = PREFTYPE_HASH;
3425           }
3426         else if(opt.compress_algo!=-1
3427                 && !algo_available(PREFTYPE_ZIP,opt.compress_algo,NULL))
3428           {
3429             badalg = compress_algo_to_string(opt.compress_algo);
3430             badtype = PREFTYPE_ZIP;
3431           }
3432
3433         if(badalg)
3434           {
3435             switch(badtype)
3436               {
3437               case PREFTYPE_SYM:
3438                 log_info(_("you may not use cipher algorithm '%s'"
3439                            " while in %s mode\n"),
3440                          badalg,compliance_option_string());
3441                 break;
3442               case PREFTYPE_HASH:
3443                 log_info(_("you may not use digest algorithm '%s'"
3444                            " while in %s mode\n"),
3445                          badalg,compliance_option_string());
3446                 break;
3447               case PREFTYPE_ZIP:
3448                 log_info(_("you may not use compression algorithm '%s'"
3449                            " while in %s mode\n"),
3450                          badalg,compliance_option_string());
3451                 break;
3452               default:
3453                 BUG();
3454               }
3455
3456             compliance_failure();
3457           }
3458       }
3459
3460     /* Set the random seed file. */
3461     if( use_random_seed ) {
3462         char *p = make_filename(opt.homedir, "random_seed", NULL );
3463         gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
3464         if (!access (p, F_OK))
3465           register_secured_file (p);
3466         xfree(p);
3467     }
3468
3469     /* If there is no command but the --fingerprint is given, default
3470        to the --list-keys command.  */
3471     if (!cmd && fpr_maybe_cmd)
3472       {
3473         set_cmd (&cmd, aListKeys);
3474       }
3475
3476
3477     if( opt.verbose > 1 )
3478         set_packet_list_mode(1);
3479
3480     /* Add the keyrings, but not for some special commands.
3481        We always need to add the keyrings if we are running under
3482        SELinux, this is so that the rings are added to the list of
3483        secured files. */
3484     if( ALWAYS_ADD_KEYRINGS
3485         || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest) )
3486       {
3487         if (!nrings || default_keyring)  /* Add default ring. */
3488             keydb_add_resource ("pubring" EXTSEP_S GPGEXT_GPG,
3489                                 KEYDB_RESOURCE_FLAG_DEFAULT);
3490         for (sl = nrings; sl; sl = sl->next )
3491           keydb_add_resource (sl->d, sl->flags);
3492       }
3493     FREE_STRLIST(nrings);
3494
3495     if (cmd == aGPGConfTest)
3496       g10_exit(0);
3497
3498
3499     if( pwfd != -1 )  /* Read the passphrase now. */
3500         read_passphrase_from_fd( pwfd );
3501
3502     fname = argc? *argv : NULL;
3503
3504     if(fname && utf8_strings)
3505       opt.flags.utf8_filename=1;
3506
3507     ctrl = xcalloc (1, sizeof *ctrl);
3508     gpg_init_default_ctrl (ctrl);
3509
3510 #ifndef NO_TRUST_MODELS
3511     switch (cmd)
3512       {
3513       case aPrimegen:
3514       case aPrintMD:
3515       case aPrintMDs:
3516       case aGenRandom:
3517       case aDeArmor:
3518       case aEnArmor:
3519         break;
3520       case aFixTrustDB:
3521       case aExportOwnerTrust:
3522         rc = setup_trustdb (0, trustdb_name);
3523         break;
3524       case aListTrustDB:
3525         rc = setup_trustdb (argc? 1:0, trustdb_name);
3526         break;
3527       default:
3528         /* If we are using TM_ALWAYS, we do not need to create the
3529            trustdb.  */
3530         rc = setup_trustdb (opt.trust_model != TM_ALWAYS, trustdb_name);
3531         break;
3532       }
3533     if (rc)
3534       log_error (_("failed to initialize the TrustDB: %s\n"), g10_errstr(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),g10_errstr(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),g10_errstr(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), g10_errstr(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), g10_errstr(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", g10_errstr(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), g10_errstr(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), g10_errstr(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), g10_errstr(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), g10_errstr(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", g10_errstr(rc) );
3728           }
3729         else
3730           {
3731             if ((rc = verify_signatures (ctrl, argc, argv)))
3732               log_error("verify signatures failed: %s\n", g10_errstr(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", g10_errstr(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"),g10_errstr(rc));
3918             else if(cmd==aRecvKeys)
3919               log_error(_("keyserver receive failed: %s\n"),g10_errstr(rc));
3920             else
3921               log_error(_("key export failed: %s\n"),g10_errstr(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"),g10_errstr(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",g10_errstr(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"), g10_errstr(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"), g10_errstr(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     &nb