Changed default hash algorithm preferences
[gnupg.git] / g10 / gpg.c
index a0fc176..d7ac019 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -1,6 +1,6 @@
 /* gpg.c - The GnuPG utility (main for gpg)
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
- *               2006 Free Software Foundation, Inc.
+ *               2006, 2007, 2008, 2009 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -26,9 +26,6 @@
 #include <ctype.h>
 #include <unistd.h>
 #include <assert.h>
-#ifdef HAVE_DOSISH_SYSTEM
-#include <fcntl.h> /* for setmode() */
-#endif
 #ifdef HAVE_STAT
 #include <sys/stat.h> /* for stat() */
 #endif
@@ -55,7 +52,7 @@
 #include "status.h"
 #include "keyserver-internal.h"
 #include "exec.h"
-
+#include "gc-opt-flags.h"
 
 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
 #define MY_O_BINARY  O_BINARY
@@ -122,6 +119,7 @@ enum cmd_and_opt_values
     aListSigs,
     aSendKeys,
     aRecvKeys,
+    aLocateKeys,
     aSearchKeys,
     aRefreshKeys,
     aFetchKeys,
@@ -194,6 +192,7 @@ enum cmd_and_opt_values
     oGnuPG,
     oRFC1991,
     oRFC2440,
+    oRFC4880,
     oOpenPGP,
     oPGP2,
     oPGP6,
@@ -231,6 +230,8 @@ enum cmd_and_opt_values
     oHomedir,
     oWithColons,
     oWithKeyData,
+    oWithSigList,
+    oWithSigCheck,
     oSkipVerify,
     oCompressKeys,
     oCompressSigs,
@@ -337,6 +338,7 @@ enum cmd_and_opt_values
     oTTYtype,
     oLCctype,
     oLCmessages,
+    oXauthority,
     oGroup,
     oUnGroup,
     oNoGroups,
@@ -365,351 +367,388 @@ enum cmd_and_opt_values
 
 static ARGPARSE_OPTS opts[] = {
 
-    { 300, NULL, 0, N_("@Commands:\n ") },
-
-    { aSign, "sign",      256, N_("|[file]|make a signature")},
-    { aClearsign, "clearsign", 256, N_("|[file]|make a clear text signature")},
-    { aDetachedSign, "detach-sign", 256, N_("make a detached signature")},
-    { aEncr, "encrypt",   256, N_("encrypt data")},
-    { aEncrFiles, "encrypt-files", 256, "@"},
-    { aSym, "symmetric", 256, N_("encryption only with symmetric cipher")},
-    { aStore, "store",     256, "@"},
-    { aDecrypt, "decrypt",   256, N_("decrypt data (default)")},
-    { aDecryptFiles, "decrypt-files", 256, "@"},
-    { aVerify, "verify"   , 256, N_("verify a signature")},
-    { aVerifyFiles, "verify-files" , 256, "@" },
-    { aListKeys, "list-keys", 256, N_("list keys")},
-    { aListKeys, "list-public-keys", 256, "@" },
-    { aListSigs, "list-sigs", 256, N_("list keys and signatures")},
-    { aCheckKeys, "check-sigs",256, N_("list and check key signatures")},
-    { oFingerprint, "fingerprint", 256, N_("list keys and fingerprints")},
-    { aListSecretKeys, "list-secret-keys", 256, N_("list secret keys")},
-    { aKeygen,    "gen-key",  256, N_("generate a new key pair")},
-    { aDeleteKeys,"delete-keys",256,N_("remove keys from the public keyring")},
-    { aDeleteSecretKeys, "delete-secret-keys",256,
-                                   N_("remove keys from the secret keyring")},
-    { aSignKey,  "sign-key"   ,256, N_("sign a key")},
-    { aLSignKey, "lsign-key"  ,256, N_("sign a key locally")},
-    { aEditKey,  "edit-key"   ,256, N_("sign or edit a key")},
-    { aGenRevoke, "gen-revoke",256, N_("generate a revocation certificate")},
-    { aDesigRevoke, "desig-revoke",256, "@" },
-    { aExport, "export"           , 256, N_("export keys") },
-    { aSendKeys, "send-keys"     , 256, N_("export keys to a key server") },
-    { aRecvKeys, "recv-keys"     , 256, N_("import keys from a key server") },
-    { aSearchKeys, "search-keys" , 256,
-                                    N_("search for keys on a key server") },
-    { aRefreshKeys, "refresh-keys", 256,
-                                    N_("update all keys from a keyserver")},
-    { aFetchKeys, "fetch-keys" , 256, "@" },
-    { aExportSecret, "export-secret-keys" , 256, "@" },
-    { aExportSecretSub, "export-secret-subkeys" , 256, "@" },
-    { aImport, "import",      256     , N_("import/merge keys")},
-    { aFastImport, "fast-import",  256 , "@"},
+  ARGPARSE_group (300, N_("@Commands:\n ")),
+
+  ARGPARSE_c (aSign, "sign", N_("make a signature")),
+  ARGPARSE_c (aClearsign, "clearsign", N_("make a clear text signature")),
+  ARGPARSE_c (aDetachedSign, "detach-sign", N_("make a detached signature")),
+  ARGPARSE_c (aEncr, "encrypt",   N_("encrypt data")),
+  ARGPARSE_c (aEncrFiles, "encrypt-files", "@"),
+  ARGPARSE_c (aSym, "symmetric", N_("encryption only with symmetric cipher")),
+  ARGPARSE_c (aStore, "store",     "@"),
+  ARGPARSE_c (aDecrypt, "decrypt",   N_("decrypt data (default)")),
+  ARGPARSE_c (aDecryptFiles, "decrypt-files", "@"),
+  ARGPARSE_c (aVerify, "verify"   , N_("verify a signature")),
+  ARGPARSE_c (aVerifyFiles, "verify-files" , "@" ),
+  ARGPARSE_c (aListKeys, "list-keys", N_("list keys")),
+  ARGPARSE_c (aListKeys, "list-public-keys", "@" ),
+  ARGPARSE_c (aListSigs, "list-sigs", N_("list keys and signatures")),
+  ARGPARSE_c (aCheckKeys, "check-sigs",N_("list and check key signatures")),
+  ARGPARSE_c (oFingerprint, "fingerprint", N_("list keys and fingerprints")),
+  ARGPARSE_c (aListSecretKeys, "list-secret-keys", N_("list secret keys")),
+  ARGPARSE_c (aKeygen,    "gen-key",  N_("generate a new key pair")),
+  ARGPARSE_c (aDeleteKeys,"delete-keys", 
+              N_("remove keys from the public keyring")),
+  ARGPARSE_c (aDeleteSecretKeys, "delete-secret-keys",
+              N_("remove keys from the secret keyring")),
+  ARGPARSE_c (aSignKey,  "sign-key"   ,N_("sign a key")),
+  ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
+  ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
+  ARGPARSE_c (aGenRevoke, "gen-revoke",N_("generate a revocation certificate")),
+  ARGPARSE_c (aDesigRevoke, "desig-revoke","@" ),
+  ARGPARSE_c (aExport, "export"           , N_("export keys") ),
+  ARGPARSE_c (aSendKeys, "send-keys"     , N_("export keys to a key server") ),
+  ARGPARSE_c (aRecvKeys, "recv-keys"     , N_("import keys from a key server") ),
+  ARGPARSE_c (aSearchKeys, "search-keys" , 
+              N_("search for keys on a key server") ),
+  ARGPARSE_c (aRefreshKeys, "refresh-keys", 
+              N_("update all keys from a keyserver")),
+  ARGPARSE_c (aLocateKeys, "locate-keys", "@"),
+  ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
+  ARGPARSE_c (aExportSecret, "export-secret-keys" , "@" ),
+  ARGPARSE_c (aExportSecretSub, "export-secret-subkeys" , "@" ),
+  ARGPARSE_c (aImport, "import", N_("import/merge keys")),
+  ARGPARSE_c (aFastImport, "fast-import", "@"),
 #ifdef ENABLE_CARD_SUPPORT
-    { aCardStatus,  "card-status", 256, N_("print the card status")},
-    { aCardEdit,   "card-edit",  256, N_("change data on a card")},
-    { aChangePIN,  "change-pin", 256, N_("change a card's PIN")},
+  ARGPARSE_c (aCardStatus,  "card-status", N_("print the card status")),
+  ARGPARSE_c (aCardEdit,   "card-edit",  N_("change data on a card")),
+  ARGPARSE_c (aChangePIN,  "change-pin", N_("change a card's PIN")),
 #endif
-    { aListConfig, "list-config", 256, "@"},
-    { aGPGConfList, "gpgconf-list", 256, "@" },
-    { aGPGConfTest, "gpgconf-test", 256, "@" },
-    { aListPackets, "list-packets",256, "@"},
-    { aExportOwnerTrust, "export-ownertrust", 256, "@"},
-    { aImportOwnerTrust, "import-ownertrust", 256, "@"},
-    { aUpdateTrustDB,
-             "update-trustdb",0 , N_("update the trust database")},
-    { aCheckTrustDB, "check-trustdb", 0, "@"},
-    { aFixTrustDB, "fix-trustdb", 0, "@"},
-    { aDeArmor, "dearmor", 256, "@"},
-    { aDeArmor, "dearmour", 256, "@"},
-    { aEnArmor, "enarmor", 256, "@"},
-    { aEnArmor, "enarmour", 256, "@"},
-    { aPrintMD,  "print-md" , 256, N_("|algo [files]|print message digests")},
-    { aPrimegen, "gen-prime" , 256, "@" },
-    { aGenRandom, "gen-random", 256, "@" },
-    { aServer,   "server",      256, N_("run in server mode")},
-
-    { 301, NULL, 0, N_("@\nOptions:\n ") },
-
-    { oArmor, "armor",     0, N_("create ascii armored output")},
-    { oArmor, "armour",     0, "@" },
-    { oRecipient, "recipient", 2, N_("|NAME|encrypt for NAME")},
-    { oHiddenRecipient, "hidden-recipient", 2, "@" },
-    { oRecipient, "remote-user", 2, "@"},  /* old option name */
-    { oDefRecipient, "default-recipient", 2, "@"},
-    { oDefRecipientSelf, "default-recipient-self", 0, "@"},
-    { oNoDefRecipient, "no-default-recipient", 0, "@" },
-    { oTempDir, "temp-directory", 2, "@" },
-    { oExecPath, "exec-path", 2, "@" },
-    { oEncryptTo, "encrypt-to", 2, "@" },
-    { oHiddenEncryptTo, "hidden-encrypt-to", 2, "@" },
-    { oNoEncryptTo, "no-encrypt-to", 0, "@" },
-    { oLocalUser, "local-user",2, N_("use this user-id to sign or decrypt")},
-    { oCompress, NULL, 1, N_("|N|set compress level N (0 disables)") },
-    { oCompressLevel, "compress-level", 1, "@" },
-    { oBZ2CompressLevel, "bzip2-compress-level", 1, "@" },
-    { oBZ2DecompressLowmem, "bzip2-decompress-lowmem", 0, "@" },
-    { oTextmodeShort, NULL,   0, "@"},
-    { oTextmode, "textmode",  0, N_("use canonical text mode")},
-    { oNoTextmode, "no-textmode",  0, "@"},
-    { oExpert, "expert",   0, "@"},
-    { oNoExpert, "no-expert",   0, "@"},
-    { oDefSigExpire, "default-sig-expire", 2, "@"},
-    { oAskSigExpire, "ask-sig-expire",   0, "@"},
-    { oNoAskSigExpire, "no-ask-sig-expire",   0, "@"},
-    { oDefCertExpire, "default-cert-expire", 2, "@"},
-    { oAskCertExpire, "ask-cert-expire",   0, "@"},
-    { oNoAskCertExpire, "no-ask-cert-expire",   0, "@"},
-    { oDefCertLevel, "default-cert-level", 1, "@"},
-    { oMinCertLevel, "min-cert-level", 1, "@"},
-    { oAskCertLevel, "ask-cert-level",   0, "@"},
-    { oNoAskCertLevel, "no-ask-cert-level",   0, "@"},
-    { oOutput, "output",    2, N_("use as output file")},
-    { oMaxOutput, "max-output", 16|4, "@" },
-    { oVerbose, "verbose",   0, N_("verbose") },
-    { oQuiet,  "quiet",   0, "@"},
-    { oNoTTY, "no-tty", 0, "@"},
-    { oForceV3Sigs, "force-v3-sigs", 0, "@"},
-    { oNoForceV3Sigs, "no-force-v3-sigs", 0, "@"},
-    { oForceV4Certs, "force-v4-certs", 0, "@"},
-    { oNoForceV4Certs, "no-force-v4-certs", 0, "@"},
-    { oForceMDC, "force-mdc", 0, "@"},
-    { oNoForceMDC, "no-force-mdc", 0, "@" },
-    { oDisableMDC, "disable-mdc", 0, "@"},
-    { oNoDisableMDC, "no-disable-mdc", 0, "@" },
-    { oDryRun, "dry-run",   0, N_("do not make any changes") },
-    { oInteractive, "interactive", 0, N_("prompt before overwriting") },
-    { oUseAgent, "use-agent",0, "@"},
-    { oNoUseAgent, "no-use-agent",0, "@"},
-    { oGpgAgentInfo, "gpg-agent-info",2, "@"},
-    { oBatch, "batch", 0, "@"},
-    { oAnswerYes, "yes", 0, "@"},
-    { oAnswerNo, "no", 0, "@"},
-    { oKeyring, "keyring", 2, "@"},
-    { oPrimaryKeyring, "primary-keyring",2, "@" },
-    { oSecretKeyring, "secret-keyring", 2, "@"},
-    { oShowKeyring, "show-keyring", 0, "@"},
-    { oDefaultKey, "default-key", 2, "@"},
-    { oKeyServer, "keyserver", 2, "@"},
-    { oKeyServerOptions, "keyserver-options",2,"@"},
-    { oImportOptions, "import-options",2,"@"},
-    { oExportOptions, "export-options",2,"@"},
-    { oListOptions, "list-options",2,"@"},
-    { oVerifyOptions, "verify-options",2,"@"},
-    { oDisplayCharset, "display-charset", 2, "@"},
-    { oDisplayCharset, "charset", 2, "@"},
-    { oOptions, "options", 2, "@"},
-    { oDebug, "debug"     ,4|16, "@"},
-    { oDebugLevel, "debug-level" ,2, "@"},
-    { oDebugAll, "debug-all" ,0, "@"},
-    { oStatusFD, "status-fd" ,1, "@"},
-    { oStatusFile, "status-file" ,2, "@"},
-    { oAttributeFD, "attribute-fd" ,1, "@" },
-    { oAttributeFile, "attribute-file" ,2, "@" },
-    { oNoop, "sk-comments", 0,   "@"},
-    { oNoop, "no-sk-comments", 0,   "@"},
-    { oCompletesNeeded, "completes-needed", 1, "@"},
-    { oMarginalsNeeded, "marginals-needed", 1, "@"},
-    { oMaxCertDepth,   "max-cert-depth", 1, "@" },
-    { oTrustedKey, "trusted-key", 2, "@"},
-    { oLoadExtension, "load-extension", 2, "@"},
-    { oGnuPG, "gnupg",   0, "@"},
-    { oGnuPG, "no-pgp2", 0, "@"},
-    { oGnuPG, "no-pgp6", 0, "@"},
-    { oGnuPG, "no-pgp7", 0, "@"},
-    { oGnuPG, "no-pgp8", 0, "@"},
-    { oRFC1991, "rfc1991",   0, "@"},
-    { oRFC2440, "rfc2440", 0, "@" },
-    { oOpenPGP, "openpgp", 0, N_("use strict OpenPGP behavior")},
-    { oPGP2, "pgp2", 0, N_("generate PGP 2.x compatible messages")},
-    { oPGP6, "pgp6", 0, "@"},
-    { oPGP7, "pgp7", 0, "@"},
-    { oPGP8, "pgp8", 0, "@"},
-    { oRFC2440Text, "rfc2440-text", 0, "@"},
-    { oNoRFC2440Text, "no-rfc2440-text", 0, "@"},
-    { oS2KMode, "s2k-mode", 1, "@"},
-    { oS2KDigest, "s2k-digest-algo", 2, "@"},
-    { oS2KCipher, "s2k-cipher-algo", 2, "@"},
-    { oS2KCount, "s2k-count", 1, "@"},
-    { oSimpleSKChecksum, "simple-sk-checksum", 0, "@"},
-    { oCipherAlgo, "cipher-algo", 2, "@"},
-    { oDigestAlgo, "digest-algo", 2, "@"},
-    { oCertDigestAlgo, "cert-digest-algo", 2 , "@" },
-    { oCompressAlgo,"compress-algo", 2, "@"},
-    { oCompressAlgo, "compression-algo", 2, "@"}, /* Alias */
-    { oThrowKeyids, "throw-keyid", 0, "@"},
-    { oThrowKeyids, "throw-keyids", 0, "@"},
-    { oNoThrowKeyids, "no-throw-keyid", 0, "@" },
-    { oNoThrowKeyids, "no-throw-keyids", 0, "@" },
-    { oShowPhotos,   "show-photos", 0, "@" },
-    { oNoShowPhotos, "no-show-photos", 0, "@" },
-    { oPhotoViewer,  "photo-viewer", 2, "@" },
-    { oSetNotation,  "set-notation", 2, "@" },
-    { oSetNotation,  "notation-data", 2, "@" }, /* Alias */
-    { oSigNotation,  "sig-notation", 2, "@" },
-    { oCertNotation, "cert-notation", 2, "@" },
-
-    { 302, NULL, 0, N_(
+  ARGPARSE_c (aListConfig, "list-config", "@"),
+  ARGPARSE_c (aGPGConfList, "gpgconf-list", "@" ),
+  ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@" ),
+  ARGPARSE_c (aListPackets, "list-packets","@"),
+  ARGPARSE_c (aExportOwnerTrust, "export-ownertrust", "@"),
+  ARGPARSE_c (aImportOwnerTrust, "import-ownertrust", "@"),
+  ARGPARSE_c (aUpdateTrustDB,"update-trustdb",
+              N_("update the trust database")),
+  ARGPARSE_c (aCheckTrustDB, "check-trustdb", "@"),
+  ARGPARSE_c (aFixTrustDB, "fix-trustdb", "@"),
+  ARGPARSE_c (aDeArmor, "dearmor", "@"),
+  ARGPARSE_c (aDeArmor, "dearmour", "@"),
+  ARGPARSE_c (aEnArmor, "enarmor", "@"),
+  ARGPARSE_c (aEnArmor, "enarmour", "@"),
+  ARGPARSE_c (aPrintMD, "print-md", N_("print message digests")),
+  ARGPARSE_c (aPrimegen, "gen-prime", "@" ),
+  ARGPARSE_c (aGenRandom,"gen-random", "@" ),
+  ARGPARSE_c (aServer,   "server",  N_("run in server mode")),
+
+  ARGPARSE_group (301, N_("@\nOptions:\n ")),
+
+  ARGPARSE_s_n (oArmor, "armor", N_("create ascii armored output")),
+  ARGPARSE_s_n (oArmor, "armour", "@"),
+
+  ARGPARSE_s_s (oRecipient, "recipient", N_("|USER-ID|encrypt for USER-ID")),
+  ARGPARSE_s_s (oHiddenRecipient, "hidden-recipient", "@"),
+  ARGPARSE_s_s (oRecipient, "remote-user", "@"),  /* (old option name) */
+  ARGPARSE_s_s (oDefRecipient, "default-recipient", "@"),
+  ARGPARSE_s_n (oDefRecipientSelf,  "default-recipient-self", "@"),
+  ARGPARSE_s_n (oNoDefRecipient, "no-default-recipient", "@"),
+
+  ARGPARSE_s_s (oTempDir,  "temp-directory", "@"),
+  ARGPARSE_s_s (oExecPath, "exec-path", "@"),
+  ARGPARSE_s_s (oEncryptTo,      "encrypt-to", "@"),
+  ARGPARSE_s_n (oNoEncryptTo, "no-encrypt-to", "@"),
+  ARGPARSE_s_s (oHiddenEncryptTo, "hidden-encrypt-to", "@"),
+  ARGPARSE_s_s (oLocalUser, "local-user",
+                N_("|USER-ID|use USER-ID to sign or decrypt")),
+
+  ARGPARSE_s_i (oCompress, NULL,
+                N_("|N|set compress level to N (0 disables)")),
+  ARGPARSE_s_i (oCompressLevel, "compress-level", "@"),
+  ARGPARSE_s_i (oBZ2CompressLevel, "bzip2-compress-level", "@"),
+  ARGPARSE_s_n (oBZ2DecompressLowmem, "bzip2-decompress-lowmem", "@"),
+
+  ARGPARSE_s_n (oTextmodeShort, NULL, "@"),
+  ARGPARSE_s_n (oTextmode,      "textmode", N_("use canonical text mode")),
+  ARGPARSE_s_n (oNoTextmode, "no-textmode", "@"),
+
+  ARGPARSE_s_n (oExpert,      "expert", "@"),
+  ARGPARSE_s_n (oNoExpert, "no-expert", "@"),
+
+  ARGPARSE_s_s (oDefSigExpire, "default-sig-expire", "@"),
+  ARGPARSE_s_n (oAskSigExpire,      "ask-sig-expire", "@"),
+  ARGPARSE_s_n (oNoAskSigExpire, "no-ask-sig-expire", "@"),
+  ARGPARSE_s_s (oDefCertExpire, "default-cert-expire", "@"),
+  ARGPARSE_s_n (oAskCertExpire,      "ask-cert-expire", "@"),
+  ARGPARSE_s_n (oNoAskCertExpire, "no-ask-cert-expire", "@"),
+  ARGPARSE_s_i (oDefCertLevel, "default-cert-level", "@"),
+  ARGPARSE_s_i (oMinCertLevel, "min-cert-level", "@"),
+  ARGPARSE_s_n (oAskCertLevel,      "ask-cert-level", "@"),
+  ARGPARSE_s_n (oNoAskCertLevel, "no-ask-cert-level", "@"),
+
+  ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
+  ARGPARSE_p_u (oMaxOutput, "max-output", "@"),
+
+  ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
+  ARGPARSE_s_n (oQuiet,          "quiet",   "@"),
+  ARGPARSE_s_n (oNoTTY,   "no-tty",  "@"),
+
+  ARGPARSE_s_n (oForceV3Sigs,      "force-v3-sigs", "@"),
+  ARGPARSE_s_n (oNoForceV3Sigs, "no-force-v3-sigs", "@"),
+  ARGPARSE_s_n (oForceV4Certs,     "force-v4-certs", "@"),
+  ARGPARSE_s_n (oNoForceV4Certs, "no-force-v4-certs", "@"),
+  ARGPARSE_s_n (oForceMDC, "force-mdc", "@"),
+  ARGPARSE_s_n (oNoForceMDC, "no-force-mdc", "@"),
+  ARGPARSE_s_n (oDisableMDC, "disable-mdc", "@"),
+  ARGPARSE_s_n (oNoDisableMDC, "no-disable-mdc", "@"),
+
+  ARGPARSE_s_n (oDryRun, "dry-run", N_("do not make any changes")),
+  ARGPARSE_s_n (oInteractive, "interactive", N_("prompt before overwriting")),
+
+  ARGPARSE_s_n (oUseAgent,      "use-agent", "@"),
+  ARGPARSE_s_n (oNoUseAgent, "no-use-agent", "@"),
+  ARGPARSE_s_s (oGpgAgentInfo, "gpg-agent-info", "@"),
+
+  ARGPARSE_s_n (oBatch, "batch", "@"),
+  ARGPARSE_s_n (oAnswerYes, "yes", "@"),
+  ARGPARSE_s_n (oAnswerNo, "no", "@"),
+  ARGPARSE_s_s (oKeyring, "keyring", "@"),
+  ARGPARSE_s_s (oPrimaryKeyring, "primary-keyring", "@"),
+  ARGPARSE_s_s (oSecretKeyring, "secret-keyring", "@"),
+  ARGPARSE_s_n (oShowKeyring, "show-keyring", "@"),
+  ARGPARSE_s_s (oDefaultKey, "default-key", "@"),
+
+  ARGPARSE_s_s (oKeyServer, "keyserver", "@"),
+  ARGPARSE_s_s (oKeyServerOptions, "keyserver-options", "@"),
+  ARGPARSE_s_s (oImportOptions, "import-options", "@"),
+  ARGPARSE_s_s (oExportOptions, "export-options", "@"),
+  ARGPARSE_s_s (oListOptions,   "list-options", "@"),
+  ARGPARSE_s_s (oVerifyOptions, "verify-options", "@"),
+
+  ARGPARSE_s_s (oDisplayCharset, "display-charset", "@"),
+  ARGPARSE_s_s (oDisplayCharset, "charset", "@"),
+  ARGPARSE_s_s (oOptions, "options", "@"),
+
+  ARGPARSE_p_u (oDebug, "debug", "@"),
+  ARGPARSE_s_s (oDebugLevel, "debug-level", "@"),
+  ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
+  ARGPARSE_s_i (oStatusFD, "status-fd", "@"),
+  ARGPARSE_s_s (oStatusFile, "status-file", "@"),
+  ARGPARSE_s_i (oAttributeFD, "attribute-fd", "@"),
+  ARGPARSE_s_s (oAttributeFile, "attribute-file", "@"),
+
+  ARGPARSE_s_n (oNoop, "sk-comments", "@"),
+  ARGPARSE_s_n (oNoop, "no-sk-comments", "@"),
+
+  ARGPARSE_s_i (oCompletesNeeded, "completes-needed", "@"),
+  ARGPARSE_s_i (oMarginalsNeeded, "marginals-needed", "@"),
+  ARGPARSE_s_i (oMaxCertDepth, "max-cert-depth", "@" ),
+  ARGPARSE_s_s (oTrustedKey, "trusted-key", "@"),
+
+  ARGPARSE_s_s (oLoadExtension, "load-extension", "@"),  /* Dummy.  */
+
+  ARGPARSE_s_n (oGnuPG, "gnupg",   "@"),
+  ARGPARSE_s_n (oGnuPG, "no-pgp2", "@"),
+  ARGPARSE_s_n (oGnuPG, "no-pgp6", "@"),
+  ARGPARSE_s_n (oGnuPG, "no-pgp7", "@"),
+  ARGPARSE_s_n (oGnuPG, "no-pgp8", "@"),
+  ARGPARSE_s_n (oRFC1991, "rfc1991", "@"),
+  ARGPARSE_s_n (oRFC2440, "rfc2440", "@"),
+  ARGPARSE_s_n (oRFC4880, "rfc4880", "@"),
+  ARGPARSE_s_n (oOpenPGP, "openpgp", N_("use strict OpenPGP behavior")),
+  ARGPARSE_s_n (oPGP2, "pgp2", "@"),
+  ARGPARSE_s_n (oPGP6, "pgp6", "@"),
+  ARGPARSE_s_n (oPGP7, "pgp7", "@"),
+  ARGPARSE_s_n (oPGP8, "pgp8", "@"),
+
+  ARGPARSE_s_n (oRFC2440Text,      "rfc2440-text", "@"),
+  ARGPARSE_s_n (oNoRFC2440Text, "no-rfc2440-text", "@"),
+  ARGPARSE_s_i (oS2KMode, "s2k-mode", "@"),
+  ARGPARSE_s_s (oS2KDigest, "s2k-digest-algo", "@"),
+  ARGPARSE_s_s (oS2KCipher, "s2k-cipher-algo", "@"),
+  ARGPARSE_s_i (oS2KCount, "s2k-count", "@"),
+  ARGPARSE_s_n (oSimpleSKChecksum, "simple-sk-checksum", "@"),
+  ARGPARSE_s_s (oCipherAlgo, "cipher-algo", "@"),
+  ARGPARSE_s_s (oDigestAlgo, "digest-algo", "@"),
+  ARGPARSE_s_s (oCertDigestAlgo, "cert-digest-algo", "@"),
+  ARGPARSE_s_s (oCompressAlgo,"compress-algo", "@"),
+  ARGPARSE_s_s (oCompressAlgo, "compression-algo", "@"), /* Alias */
+  ARGPARSE_s_n (oThrowKeyids, "throw-keyid", "@"),
+  ARGPARSE_s_n (oThrowKeyids, "throw-keyids", "@"),
+  ARGPARSE_s_n (oNoThrowKeyids, "no-throw-keyid", "@"),
+  ARGPARSE_s_n (oNoThrowKeyids, "no-throw-keyids", "@"),
+  ARGPARSE_s_n (oShowPhotos,   "show-photos", "@"),
+  ARGPARSE_s_n (oNoShowPhotos, "no-show-photos", "@"),
+  ARGPARSE_s_s (oPhotoViewer,  "photo-viewer", "@"),
+  ARGPARSE_s_s (oSetNotation,  "set-notation", "@"),
+  ARGPARSE_s_s (oSetNotation,  "notation-data", "@"), /* Alias */
+  ARGPARSE_s_s (oSigNotation,  "sig-notation", "@"),
+  ARGPARSE_s_s (oCertNotation, "cert-notation", "@"),
+
+  ARGPARSE_group (302, N_(
   "@\n(See the man page for a complete listing of all commands and options)\n"
-                     )},
+                     )),
 
-    { 303, NULL, 0, N_("@\nExamples:\n\n"
+  ARGPARSE_group (303, N_("@\nExamples:\n\n"
     " -se -r Bob [file]          sign and encrypt for user Bob\n"
     " --clearsign [file]         make a clear text signature\n"
     " --detach-sign [file]       make a detached signature\n"
     " --list-keys [names]        show keys\n"
-    " --fingerprint [names]      show fingerprints\n"  ) },
-
-  /* hidden options */
-    { aPrintMDs, "print-mds" , 256, "@"}, /* old */
-    { aListTrustDB, "list-trustdb",0 , "@"},
-    /* Not yet used */
-    /* { aListTrustPath, "list-trust-path",0, "@"}, */
-    { oPasswd, "passphrase",2, "@" },
-    { oPasswdFD, "passphrase-fd",1, "@" },
-    { oPasswdFile, "passphrase-file",2, "@" },
-    { oPasswdRepeat, "passphrase-repeat", 1, "@"},
-    { oCommandFD, "command-fd",1, "@" },
-    { oCommandFile, "command-file",2, "@" },
-    { oQuickRandom, "debug-quick-random", 0, "@"},
-    { oNoVerbose, "no-verbose", 0, "@"},
-    { oTrustDBName, "trustdb-name", 2, "@" },
-    { oNoSecmemWarn, "no-secmem-warning", 0, "@" },
-    { oRequireSecmem,"require-secmem", 0, "@" },
-    { oNoRequireSecmem,"no-require-secmem", 0, "@" },
-    { oNoPermissionWarn, "no-permission-warning", 0, "@" },
-    { oNoMDCWarn, "no-mdc-warning", 0, "@" },
-    { oNoArmor, "no-armor",   0, "@"},
-    { oNoArmor, "no-armour",   0, "@"},
-    { oNoDefKeyring, "no-default-keyring", 0, "@" },
-    { oNoGreeting, "no-greeting", 0, "@" },
-    { oNoOptions, "no-options", 0, "@" }, /* shortcut for --options /dev/null */
-    { oHomedir, "homedir", 2, "@" },   /* defaults to "~/.gnupg" */
-    { oNoBatch, "no-batch", 0, "@" },
-    { oWithColons, "with-colons", 0, "@"},
-    { oWithKeyData,"with-key-data", 0, "@"},
-    { aListKeys, "list-key", 0, "@" }, /* alias */
-    { aListSigs, "list-sig", 0, "@" }, /* alias */
-    { aCheckKeys, "check-sig",0, "@" }, /* alias */
-    { oSkipVerify, "skip-verify",0, "@" },
-    { oCompressKeys, "compress-keys",0, "@"},
-    { oCompressSigs, "compress-sigs",0, "@"},
-    { oDefCertLevel, "default-cert-check-level", 1, "@"}, /* Old option */
-    { oAlwaysTrust, "always-trust", 0, "@"},
-    { oTrustModel, "trust-model", 2, "@"},
-    { oForceOwnertrust, "force-ownertrust", 2, "@"},
-    { oSetFilename, "set-filename", 2, "@" },
-    { oForYourEyesOnly, "for-your-eyes-only", 0, "@" },
-    { oNoForYourEyesOnly, "no-for-your-eyes-only", 0, "@" },
-    { oSetPolicyURL, "set-policy-url", 2, "@" },
-    { oSigPolicyURL, "sig-policy-url", 2, "@" },
-    { oCertPolicyURL, "cert-policy-url", 2, "@" },
-    { oShowPolicyURL, "show-policy-url", 0, "@" },
-    { oNoShowPolicyURL, "no-show-policy-url", 0, "@" },
-    { oSigKeyserverURL, "sig-keyserver-url", 2, "@" },
-    { oShowNotation, "show-notation", 0, "@" },
-    { oNoShowNotation, "no-show-notation", 0, "@" },
-    { oComment, "comment", 2, "@" },
-    { oDefaultComment, "default-comment", 0, "@" },
-    { oNoComments, "no-comments", 0, "@" },
-    { oEmitVersion, "emit-version", 0, "@"},
-    { oNoEmitVersion, "no-emit-version", 0, "@"},
-    { oNoEmitVersion, "no-version", 0, "@"}, /* alias */
-    { oNotDashEscaped, "not-dash-escaped", 0, "@" },
-    { oEscapeFrom, "escape-from-lines", 0, "@" },
-    { oNoEscapeFrom, "no-escape-from-lines", 0, "@" },
-    { oLockOnce, "lock-once", 0, "@" },
-    { oLockMultiple, "lock-multiple", 0, "@" },
-    { oLockNever, "lock-never", 0, "@" },
-    { oLoggerFD, "logger-fd",1, "@" },
-    { oLoggerFile, "log-file",2, "@" },
-    { oUseEmbeddedFilename, "use-embedded-filename", 0, "@" },
-    { oNoUseEmbeddedFilename, "no-use-embedded-filename", 0, "@" },
-    { oUtf8Strings, "utf8-strings", 0, "@" },
-    { oNoUtf8Strings, "no-utf8-strings", 0, "@" },
-    { oWithFingerprint, "with-fingerprint", 0, "@" },
-    { oDisableCipherAlgo,  "disable-cipher-algo", 2, "@" },
-    { oDisablePubkeyAlgo,  "disable-pubkey-algo", 2, "@" },
-    { oAllowNonSelfsignedUID, "allow-non-selfsigned-uid", 0, "@" },
-    { oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", 0, "@" },
-    { oAllowFreeformUID, "allow-freeform-uid", 0, "@" },
-    { oNoAllowFreeformUID, "no-allow-freeform-uid", 0, "@" },
-    { oNoLiteral, "no-literal", 0, "@" },
-    { oSetFilesize, "set-filesize", 20, "@" },
-    { oHonorHttpProxy,"honor-http-proxy", 0, "@" },
-    { oFastListMode,"fast-list-mode", 0, "@" },
-    { oFixedListMode,"fixed-list-mode", 0, "@" },
-    { oListOnly, "list-only", 0, "@"},
-    { oIgnoreTimeConflict, "ignore-time-conflict", 0, "@" },
-    { oIgnoreValidFrom,    "ignore-valid-from",    0, "@" },
-    { oIgnoreCrcError, "ignore-crc-error", 0,"@" },
-    { oIgnoreMDCError, "ignore-mdc-error", 0,"@" },
-    { oShowSessionKey, "show-session-key", 0, "@" },
-    { oOverrideSessionKey, "override-session-key", 2, "@" },
-    { oNoRandomSeedFile,  "no-random-seed-file", 0, "@" },
-    { oAutoKeyRetrieve, "auto-key-retrieve", 0, "@" },
-    { oNoAutoKeyRetrieve, "no-auto-key-retrieve", 0, "@" },
-    { oNoSigCache,         "no-sig-cache", 0, "@" },
-    { oNoSigCreateCheck,   "no-sig-create-check", 0, "@" },
-    { oAutoCheckTrustDB, "auto-check-trustdb", 0, "@"},
-    { oNoAutoCheckTrustDB, "no-auto-check-trustdb", 0, "@"},
-    { oMergeOnly,        "merge-only", 0, "@" },
-    { oAllowSecretKeyImport, "allow-secret-key-import", 0, "@" },
-    { oTryAllSecrets,  "try-all-secrets", 0, "@" },
-    { oEnableSpecialFilenames, "enable-special-filenames", 0, "@" },
-    { oNoExpensiveTrustChecks, "no-expensive-trust-checks", 0, "@" },
-    { aDeleteSecretAndPublicKeys, "delete-secret-and-public-keys",256, "@" },
-    { aRebuildKeydbCaches, "rebuild-keydb-caches", 256, "@"},
-    { oPreservePermissions, "preserve-permissions", 0, "@"},
-    { oDefaultPreferenceList,  "default-preference-list", 2, "@"},
-    { oDefaultKeyserverURL,  "default-keyserver-url", 2, "@"},
-    { oPersonalCipherPreferences,  "personal-cipher-preferences", 2, "@"},
-    { oPersonalDigestPreferences,  "personal-digest-preferences", 2, "@"},
-    { oPersonalCompressPreferences,  "personal-compress-preferences", 2, "@"},
-    /* Aliases.  I constantly mistype these, and assume other people
-       do as well. */
-    { oPersonalCipherPreferences, "personal-cipher-prefs", 2, "@"},
-    { oPersonalDigestPreferences, "personal-digest-prefs", 2, "@"},
-    { oPersonalCompressPreferences, "personal-compress-prefs", 2, "@"},
-    { oAgentProgram, "agent-program", 2 , "@" },
-    { oDisplay,    "display",     2, "@" },
-    { oTTYname,    "ttyname",     2, "@" },
-    { oTTYtype,    "ttytype",     2, "@" },
-    { oLCctype,    "lc-ctype",    2, "@" },
-    { oLCmessages, "lc-messages", 2, "@" },
-    { oGroup,      "group",       2, "@" },
-    { oUnGroup,    "ungroup",     2, "@" },
-    { oNoGroups,   "no-groups",    0, "@" },
-    { oStrict,     "strict",      0, "@" },
-    { oNoStrict,   "no-strict",   0, "@" },
-    { oMangleDosFilenames, "mangle-dos-filenames", 0, "@" },
-    { oNoMangleDosFilenames, "no-mangle-dos-filenames", 0, "@" },
-    { oEnableProgressFilter, "enable-progress-filter", 0, "@" },
-    { oMultifile, "multifile", 0, "@" },
-    { oKeyidFormat, "keyid-format", 2, "@" },
-    { oExitOnStatusWriteError, "exit-on-status-write-error", 0, "@" },
-    { oLimitCardInsertTries, "limit-card-insert-tries", 1, "@"},
-
-    { oAllowMultisigVerification, "allow-multisig-verification", 0, "@"},
-    { oEnableDSA2, "enable-dsa2", 0, "@"},
-    { oDisableDSA2, "disable-dsa2", 0, "@"},
-    { oAllowMultipleMessages, "allow-multiple-messages", 0, "@"},
-    { oNoAllowMultipleMessages, "no-allow-multiple-messages", 0, "@"},
-
-    /* These two are aliases to help users of the PGP command line
-       product use gpg with minimal pain.  Many commands are common
-       already as they seem to have borrowed commands from us.  Now
-       I'm returning the favor. */
-    { oLocalUser, "sign-with", 2, "@" },
-    { oRecipient, "user", 2, "@" },
-    { oRequireCrossCert, "require-backsigs", 0, "@"},
-    { oRequireCrossCert, "require-cross-certification", 0, "@"},
-    { oNoRequireCrossCert, "no-require-backsigs", 0, "@"},
-    { oNoRequireCrossCert, "no-require-cross-certification", 0, "@"},
-    { oAutoKeyLocate, "auto-key-locate", 2, "@"},
-    { oNoAutoKeyLocate, "no-auto-key-locate", 0, "@"},
-
-    {0,NULL,0,NULL}
+    " --fingerprint [names]      show fingerprints\n")),
+
+  /* More hidden commands and options. */
+  ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
+  ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
+  /* Not yet used: 
+     ARGPARSE_c (aListTrustPath, "list-trust-path", "@"), */
+  ARGPARSE_c (aDeleteSecretAndPublicKeys,
+              "delete-secret-and-public-keys", "@"),
+  ARGPARSE_c (aRebuildKeydbCaches, "rebuild-keydb-caches", "@"),
+
+  ARGPARSE_s_s (oPasswd, "passphrase", "@"),
+  ARGPARSE_s_i (oPasswdFD, "passphrase-fd", "@"),
+  ARGPARSE_s_s (oPasswdFile, "passphrase-file", "@"),
+  ARGPARSE_s_i (oPasswdRepeat, "passphrase-repeat", "@"),
+  ARGPARSE_s_i (oCommandFD, "command-fd", "@"),
+  ARGPARSE_s_s (oCommandFile, "command-file", "@"),
+  ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
+  ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
+  ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
+  ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
+  ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
+  ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
+  ARGPARSE_s_n (oNoPermissionWarn, "no-permission-warning", "@"),
+  ARGPARSE_s_n (oNoMDCWarn, "no-mdc-warning", "@"),
+  ARGPARSE_s_n (oNoArmor, "no-armor", "@"),
+  ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
+  ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
+  ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
+  ARGPARSE_s_n (oNoOptions, "no-options", "@"), 
+  ARGPARSE_s_s (oHomedir, "homedir", "@"), 
+  ARGPARSE_s_n (oNoBatch, "no-batch", "@"),
+  ARGPARSE_s_n (oWithColons, "with-colons", "@"),
+  ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
+  ARGPARSE_s_n (oWithSigList,"with-sig-list", "@"),
+  ARGPARSE_s_n (oWithSigCheck,"with-sig-check", "@"),
+  ARGPARSE_s_n (aListKeys, "list-key", "@"),   /* alias */
+  ARGPARSE_s_n (aListSigs, "list-sig", "@"),   /* alias */
+  ARGPARSE_s_n (aCheckKeys, "check-sig", "@"), /* alias */
+  ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
+  ARGPARSE_s_n (oCompressKeys, "compress-keys", "@"),
+  ARGPARSE_s_n (oCompressSigs, "compress-sigs", "@"),
+  ARGPARSE_s_i (oDefCertLevel, "default-cert-check-level", "@"), /* old */
+  ARGPARSE_s_n (oAlwaysTrust, "always-trust", "@"),
+  ARGPARSE_s_s (oTrustModel, "trust-model", "@"),
+  ARGPARSE_s_s (oForceOwnertrust, "force-ownertrust", "@"),
+  ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
+  ARGPARSE_s_n (oForYourEyesOnly, "for-your-eyes-only", "@"),
+  ARGPARSE_s_n (oNoForYourEyesOnly, "no-for-your-eyes-only", "@"),
+  ARGPARSE_s_s (oSetPolicyURL,  "set-policy-url", "@"),
+  ARGPARSE_s_s (oSigPolicyURL,  "sig-policy-url", "@"),
+  ARGPARSE_s_s (oCertPolicyURL, "cert-policy-url", "@"),
+  ARGPARSE_s_n (oShowPolicyURL,      "show-policy-url", "@"),
+  ARGPARSE_s_n (oNoShowPolicyURL, "no-show-policy-url", "@"),
+  ARGPARSE_s_s (oSigKeyserverURL, "sig-keyserver-url", "@"),
+  ARGPARSE_s_n (oShowNotation,      "show-notation", "@"),
+  ARGPARSE_s_n (oNoShowNotation, "no-show-notation", "@"),
+  ARGPARSE_s_s (oComment, "comment", "@"),
+  ARGPARSE_s_n (oDefaultComment, "default-comment", "@"),
+  ARGPARSE_s_n (oNoComments, "no-comments", "@"),
+  ARGPARSE_s_n (oEmitVersion,      "emit-version", "@"),
+  ARGPARSE_s_n (oNoEmitVersion, "no-emit-version", "@"),
+  ARGPARSE_s_n (oNoEmitVersion, "no-version", "@"), /* alias */
+  ARGPARSE_s_n (oNotDashEscaped, "not-dash-escaped", "@"),
+  ARGPARSE_s_n (oEscapeFrom,      "escape-from-lines", "@"),
+  ARGPARSE_s_n (oNoEscapeFrom, "no-escape-from-lines", "@"),
+  ARGPARSE_s_n (oLockOnce,     "lock-once", "@"),
+  ARGPARSE_s_n (oLockMultiple, "lock-multiple", "@"),
+  ARGPARSE_s_n (oLockNever,    "lock-never", "@"),
+  ARGPARSE_s_i (oLoggerFD,   "logger-fd", "@"),
+  ARGPARSE_s_s (oLoggerFile, "log-file", "@"),
+  ARGPARSE_s_s (oLoggerFile, "logger-file", "@"),  /* 1.4 compatibility.  */
+  ARGPARSE_s_n (oUseEmbeddedFilename,      "use-embedded-filename", "@"),
+  ARGPARSE_s_n (oNoUseEmbeddedFilename, "no-use-embedded-filename", "@"),
+  ARGPARSE_s_n (oUtf8Strings,      "utf8-strings", "@"),
+  ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
+  ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
+  ARGPARSE_s_s (oDisableCipherAlgo,  "disable-cipher-algo", "@"),
+  ARGPARSE_s_s (oDisablePubkeyAlgo,  "disable-pubkey-algo", "@"),
+  ARGPARSE_s_n (oAllowNonSelfsignedUID,      "allow-non-selfsigned-uid", "@"),
+  ARGPARSE_s_n (oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", "@"),
+  ARGPARSE_s_n (oAllowFreeformUID,      "allow-freeform-uid", "@"),
+  ARGPARSE_s_n (oNoAllowFreeformUID, "no-allow-freeform-uid", "@"),
+  ARGPARSE_s_n (oNoLiteral, "no-literal", "@"),
+  ARGPARSE_p_u (oSetFilesize, "set-filesize", "@"),
+  ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
+  ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
+  ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
+  ARGPARSE_s_n (oListOnly, "list-only", "@"),
+  ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
+  ARGPARSE_s_n (oIgnoreValidFrom,    "ignore-valid-from", "@"),
+  ARGPARSE_s_n (oIgnoreCrcError, "ignore-crc-error", "@"),
+  ARGPARSE_s_n (oIgnoreMDCError, "ignore-mdc-error", "@"),
+  ARGPARSE_s_n (oShowSessionKey, "show-session-key", "@"),
+  ARGPARSE_s_s (oOverrideSessionKey, "override-session-key", "@"),
+  ARGPARSE_s_n (oNoRandomSeedFile,  "no-random-seed-file", "@"),
+  ARGPARSE_s_n (oAutoKeyRetrieve, "auto-key-retrieve", "@"),
+  ARGPARSE_s_n (oNoAutoKeyRetrieve, "no-auto-key-retrieve", "@"),
+  ARGPARSE_s_n (oNoSigCache,         "no-sig-cache", "@"),
+  ARGPARSE_s_n (oNoSigCreateCheck,   "no-sig-create-check", "@"),
+  ARGPARSE_s_n (oAutoCheckTrustDB, "auto-check-trustdb", "@"),
+  ARGPARSE_s_n (oNoAutoCheckTrustDB, "no-auto-check-trustdb", "@"),
+  ARGPARSE_s_n (oMergeOnly,      "merge-only", "@" ),
+  ARGPARSE_s_n (oAllowSecretKeyImport, "allow-secret-key-import", "@"),
+  ARGPARSE_s_n (oTryAllSecrets,  "try-all-secrets", "@"),
+  ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
+  ARGPARSE_s_n (oNoExpensiveTrustChecks, "no-expensive-trust-checks", "@"),
+  ARGPARSE_s_n (oPreservePermissions, "preserve-permissions", "@"),
+  ARGPARSE_s_s (oDefaultPreferenceList,  "default-preference-list", "@"),
+  ARGPARSE_s_s (oDefaultKeyserverURL,  "default-keyserver-url", "@"),
+  ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-preferences","@"),
+  ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
+  ARGPARSE_s_s (oPersonalCompressPreferences,
+                                         "personal-compress-preferences", "@"),
+
+  /* Aliases.  I constantly mistype these, and assume other people do
+     as well. */
+  ARGPARSE_s_s (oPersonalCipherPreferences, "personal-cipher-prefs", "@"),
+  ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-prefs", "@"),
+  ARGPARSE_s_s (oPersonalCompressPreferences, "personal-compress-prefs", "@"),
+  ARGPARSE_s_s (oAgentProgram, "agent-program", "@"),
+  ARGPARSE_s_s (oDisplay,    "display",    "@"),
+  ARGPARSE_s_s (oTTYname,    "ttyname",    "@"),
+  ARGPARSE_s_s (oTTYtype,    "ttytype",    "@"),
+  ARGPARSE_s_s (oLCctype,    "lc-ctype",   "@"),
+  ARGPARSE_s_s (oLCmessages, "lc-messages","@"),
+  ARGPARSE_s_s (oXauthority, "xauthority", "@"),
+  ARGPARSE_s_s (oGroup,      "group",      "@"),
+  ARGPARSE_s_s (oUnGroup,    "ungroup",    "@"),
+  ARGPARSE_s_n (oNoGroups,   "no-groups",  "@"),
+  ARGPARSE_s_n (oStrict,     "strict",     "@"),
+  ARGPARSE_s_n (oNoStrict,   "no-strict",  "@"),
+  ARGPARSE_s_n (oMangleDosFilenames,      "mangle-dos-filenames", "@"),
+  ARGPARSE_s_n (oNoMangleDosFilenames, "no-mangle-dos-filenames", "@"),
+  ARGPARSE_s_n (oEnableProgressFilter, "enable-progress-filter", "@"),
+  ARGPARSE_s_n (oMultifile, "multifile", "@"),
+  ARGPARSE_s_s (oKeyidFormat, "keyid-format", "@"),
+  ARGPARSE_s_n (oExitOnStatusWriteError, "exit-on-status-write-error", "@"),
+  ARGPARSE_s_i (oLimitCardInsertTries, "limit-card-insert-tries", "@"),
+  
+  ARGPARSE_s_n (oAllowMultisigVerification, 
+                "allow-multisig-verification", "@"),
+  ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
+  ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
+  ARGPARSE_s_n (oAllowMultipleMessages,      "allow-multiple-messages", "@"),
+  ARGPARSE_s_n (oNoAllowMultipleMessages, "no-allow-multiple-messages", "@"),
+
+  /* These two are aliases to help users of the PGP command line
+     product use gpg with minimal pain.  Many commands are common
+     already as they seem to have borrowed commands from us.  Now I'm
+     returning the favor. */
+  ARGPARSE_s_s (oLocalUser, "sign-with", "@"),
+  ARGPARSE_s_s (oRecipient, "user", "@"),
+
+  ARGPARSE_s_n (oRequireCrossCert, "require-backsigs", "@"),
+  ARGPARSE_s_n (oRequireCrossCert, "require-cross-certification", "@"),
+  ARGPARSE_s_n (oNoRequireCrossCert, "no-require-backsigs", "@"),
+  ARGPARSE_s_n (oNoRequireCrossCert, "no-require-cross-certification", "@"),
+
+  /* New options.  Fixme: Should go more to the top.  */
+  ARGPARSE_s_s (oAutoKeyLocate, "auto-key-locate", "@"),
+  ARGPARSE_s_n (oNoAutoKeyLocate, "no-auto-key-locate", "@"),
+
+  ARGPARSE_end ()
 };
 
 
@@ -736,11 +775,30 @@ static void add_keyserver_url( const char *string, int which );
 static void emergency_cleanup (void);
 
 
+static char *
+make_libversion (const char *libname, const char *(*getfnc)(const char*))
+{
+  const char *s;
+  char *result;
+  
+  if (maybe_setuid)
+    {
+      gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
+      maybe_setuid = 0;
+    }
+  s = getfnc (NULL);
+  result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
+  strcpy (stpcpy (stpcpy (result, libname), " "), s);
+  return result;
+}
+
+
 static const char *
 my_strusage( int level )
 {
-  static char *digests, *pubkeys, *ciphers, *zips;
-    const char *p;
+  static char *digests, *pubkeys, *ciphers, *zips, *ver_gcry;
+  const char *p;
+
     switch( level ) {
       case 11: p = "gpg (GnuPG)";
        break;
@@ -750,14 +808,20 @@ my_strusage( int level )
            _("Please report bugs to <gnupg-bugs@gnu.org>.\n");
        break;
 
+    case 20:
+      if (!ver_gcry)
+        ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
+      p = ver_gcry;
+      break;
+
 #ifdef IS_DEVELOPMENT_VERSION
-      case 20:
+      case 25:
        p="NOTE: THIS IS A DEVELOPMENT VERSION!";
        break;
-      case 21:
+      case 26:
        p="It is only intended for test purposes and should NOT be";
        break;
-      case 22:
+      case 27:
        p="used in a production environment or with production keys!";
        break;
 #endif
@@ -789,7 +853,7 @@ my_strusage( int level )
       case 35:
        if( !ciphers )
            ciphers = build_list(_("Cipher: "), 'S', 
-                                 gcry_cipher_algo_name,
+                                 openpgp_cipher_algo_name,
                                  openpgp_cipher_test_algo );
        p = ciphers;
        break;
@@ -891,6 +955,17 @@ make_username( const char *string )
 }
 
 
+static void
+set_opt_session_env (const char *name, const char *value)
+{
+  gpg_error_t err;
+  
+  err = session_env_setenv (opt.session_env, name, value);
+  if (err)
+    log_fatal ("error setting session environment: %s\n",
+               gpg_strerror (err));
+}
+
 /* Setup the debugging.  With a LEVEL of NULL only the active debug
    flags are propagated to the subsystems.  With LEVEL set, a specific
    set of debug flags is set; thus overriding all flags already
@@ -972,9 +1047,9 @@ set_screen_dimensions(void)
    used with --status-file etc functions.  Not generally useful but it
    avoids the riscos specific functions and well some Windows people
    might like it too.  Prints an error message and returns -1 on
-   error. On success the file descriptor is returned.  */
+   error.  On success the file descriptor is returned.  */
 static int
-open_info_file (const char *fname, int for_write)
+open_info_file (const char *fname, int for_write, int binary)
 {
 #ifdef __riscos__
   return riscos_fdopenfile (fname, for_write);
@@ -984,10 +1059,16 @@ open_info_file (const char *fname, int for_write)
      similar to the option file but in that case it is unlikely that
      sensitive information may be retrieved by means of error
      messages.  */
+  (void)fname;
+  (void)for_write;
+  (void)binary;
   return -1;
 #else 
   int fd;
 
+  if (binary)
+    binary = MY_O_BINARY;
+
 /*   if (is_secured_filename (fname)) */
 /*     { */
 /*       fd = -1; */
@@ -998,10 +1079,10 @@ open_info_file (const char *fname, int for_write)
       do
         {
           if (for_write)
-            fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY,
+            fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY | binary,
                         S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
           else
-            fd = open (fname, O_RDONLY | MY_O_BINARY);
+            fd = open (fname, O_RDONLY | binary);
         }
       while (fd == -1 && errno == EINTR);
 /*     } */
@@ -1337,6 +1418,24 @@ print_algo_numbers(int (*checker)(int))
 }
 
 
+static void
+print_algo_names(int (*checker)(int),const char *(*mapper)(int))
+{
+  int i,first=1;
+
+  for(i=0;i<=110;i++)
+    {
+      if(!checker(i))
+       {
+         if(first)
+           first=0;
+         else
+           printf(";");
+         printf("%s",mapper(i));
+       }
+    }
+}
+
 /* In the future, we can do all sorts of interesting configuration
    output here.  For now, just give "group" as the Enigmail folks need
    it, and pubkey, cipher, hash, and compress as they may be useful
@@ -1403,6 +1502,14 @@ list_config(char *items)
          any=1;
        }
 
+      if (show_all || !ascii_strcasecmp (name,"ciphername"))
+       {
+         printf ("cfg:ciphername:");
+         print_algo_names (openpgp_cipher_test_algo,openpgp_cipher_algo_name);
+         printf ("\n");
+         any = 1;
+       }
+
       if(show_all
         || ascii_strcasecmp(name,"digest")==0
         || ascii_strcasecmp(name,"hash")==0)
@@ -1413,6 +1520,16 @@ list_config(char *items)
          any=1;
        }
 
+      if (show_all
+          || !ascii_strcasecmp(name,"digestname")
+          || !ascii_strcasecmp(name,"hashname"))
+       {
+         printf ("cfg:digestname:");
+         print_algo_names (openpgp_md_test_algo, gcry_md_algo_name);
+         printf("\n");
+         any=1;
+       }
+      
       if(show_all || ascii_strcasecmp(name,"compress")==0)
        {
          printf("cfg:compress:");
@@ -1457,10 +1574,6 @@ gpgconf_list (const char *configfile)
 {
   char *configfile_esc = percent_escape (configfile, NULL);
 
-  /* The following definitions are taken from gnupg/tools/gpgconf-comp.c.  */
-#define GC_OPT_FLAG_NONE       0UL
-#define GC_OPT_FLAG_DEFAULT    (1UL << 4)
-
   printf ("gpgconf-gpg.conf:%lu:\"%s\n",
           GC_OPT_FLAG_DEFAULT, configfile_esc ? configfile_esc : "/dev/null");
   printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
@@ -1469,6 +1582,10 @@ gpgconf_list (const char *configfile)
   printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
   printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE);
   printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
+  printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
+  printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
+  printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
+  printf ("group:%lu:\n", GC_OPT_FLAG_NONE);
 
   xfree (configfile_esc);
 }
@@ -1641,76 +1758,6 @@ parse_trust_model(const char *model)
 }
 
 
-
-/* Make sure that the standard file descriptors are opened. Obviously
-   some folks close them before an exec and the next file we open will
-   get one of them assigned and thus any output (i.e. diagnostics) end
-   up in that file (e.g. the trustdb).  Not actually a gpg problem as
-   this will hapenn with almost all utilities when called in a wrong
-   way.  However we try to minimize the damage here and raise
-   awareness of the problem.
-
-   Must be called before we open any files! */
-static void
-reopen_std(void)
-{  
-#if defined(HAVE_STAT) && !defined(HAVE_W32_SYSTEM)
-  struct stat statbuf;
-  int did_stdin=0,did_stdout=0,did_stderr=0;
-  FILE *complain;
-
-  if(fstat(STDIN_FILENO,&statbuf)==-1 && errno==EBADF)
-    {
-      if(open("/dev/null",O_RDONLY)==STDIN_FILENO)
-       did_stdin=1;
-      else
-       did_stdin=2;
-    }
-
-  if(fstat(STDOUT_FILENO,&statbuf)==-1 && errno==EBADF)
-    {
-      if(open("/dev/null",O_WRONLY)==STDOUT_FILENO)
-       did_stdout=1;
-      else
-       did_stdout=2;
-    }
-
-  if(fstat(STDERR_FILENO,&statbuf)==-1 && errno==EBADF)
-    {
-      if(open("/dev/null",O_WRONLY)==STDERR_FILENO)
-       did_stderr=1;
-      else
-       did_stderr=2;
-    }
-
-  /* It's hard to log this sort of thing since the filehandle we would
-     complain to may be closed... */
-  if(did_stderr==0)
-    complain=stderr;
-  else if(did_stdout==0)
-    complain=stdout;
-  else
-    complain=NULL;
-
-  if(complain)
-    {
-      if(did_stdin==1)
-       fprintf(complain,"gpg: WARNING: standard input reopened\n");
-      if(did_stdout==1)
-       fprintf(complain,"gpg: WARNING: standard output reopened\n");
-      if(did_stderr==1)
-       fprintf(complain,"gpg: WARNING: standard error reopened\n");
-
-      if(did_stdin==2 || did_stdout==2 || did_stderr==2)
-       fprintf(complain,"gpg: fatal: unable to reopen standard input,"
-               " output, or error\n");
-    }
-
-  if(did_stdin==2 || did_stdout==2 || did_stderr==2)
-    exit(3);
-#endif /* HAVE_STAT && !HAVE_W32_SYSTEM */
-}
-
 /* Pack an s2k iteration count into the form specified in 2440.  If
    we're in between valid values, round up. */
 static unsigned char
@@ -1744,6 +1791,7 @@ encode_s2k_iterations(int iterations)
 static void
 gpg_init_default_ctrl (ctrl_t ctrl)
 {
+  (void)ctrl;
 }
 
 
@@ -1752,12 +1800,69 @@ gpg_init_default_ctrl (ctrl_t ctrl)
 static void
 gpg_deinit_default_ctrl (ctrl_t ctrl)
 {
+  (void)ctrl;
 }
 
 
+char *
+get_default_configname (void)
+{
+  char *configname = NULL;
+  char *name = xstrdup ("gpg" EXTSEP_S "conf-" SAFE_VERSION);
+  char *ver = &name[strlen ("gpg" EXTSEP_S "conf-")];
+
+  do
+    {
+      if (configname)
+       {
+         char *tok;
+         
+         xfree (configname);
+         configname = NULL;
+
+         if ((tok = strrchr (ver, SAFE_VERSION_DASH)))
+           *tok='\0';
+         else if ((tok = strrchr (ver, SAFE_VERSION_DOT)))
+           *tok='\0';
+         else
+           break;
+       }
+      
+      configname = make_filename (opt.homedir, name, NULL);
+    }
+  while (access (configname, R_OK));
+
+  xfree(name);
+  
+  if (! configname)
+    configname = make_filename (opt.homedir, "gpg" EXTSEP_S "conf", NULL);
+  if (! access (configname, R_OK))
+    {
+      /* Print a warning when both config files are present.  */
+      char *p = make_filename (opt.homedir, "options", NULL);
+      if (! access (p, R_OK))
+       log_info (_("NOTE: old default options file `%s' ignored\n"), p);
+      xfree (p);
+    }
+  else
+    {
+      /* Use the old default only if it exists.  */
+      char *p = make_filename (opt.homedir, "options", NULL);
+      if (!access (p, R_OK))
+       {
+         xfree (configname);
+         configname = p;
+       }
+      else
+       xfree (p);
+    }
+
+  return configname;
+}
+
 
 int
-main (int argc, char **argv )
+main (int argc, char **argv)
 {
     ARGPARSE_ARGS pargs;
     IOBUF a;
@@ -1774,6 +1879,7 @@ main (int argc, char **argv )
     FILE *configfp = NULL;
     char *configname = NULL;
     char *save_configname = NULL;
+    char *default_configname = NULL;
     unsigned configlineno;
     int parse_debug = 0;
     int default_config = 1;
@@ -1797,7 +1903,7 @@ main (int argc, char **argv )
     int eyes_only=0;
     int multifile=0;
     int pwfd = -1;
-    int with_fpr = 0; /* make an option out of --fingerprint */
+    int fpr_maybe_cmd = 0; /* --fingerprint maybe a command.  */
     int any_explicit_recipient = 0;
     int require_secmem=0,got_secmem=0;
 
@@ -1809,7 +1915,7 @@ main (int argc, char **argv )
     /* Please note that we may running SUID(ROOT), so be very CAREFUL
        when adding any stuff between here and the call to
        secmem_init() somewhere after the option parsing. */
-    reopen_std ();
+    gnupg_reopen_std ("gpg");
     trap_unaligned ();
     gnupg_rl_initialize ();
     set_strusage (my_strusage);
@@ -1820,6 +1926,7 @@ main (int argc, char **argv )
     log_set_prefix ("gpg", 1);
 
     /* Make sure that our subsystems are ready.  */
+    i18n_init();
     init_common_subsystems ();
 
     /* Check that the libraries are suitable.  Do it right here because the
@@ -1839,7 +1946,10 @@ main (int argc, char **argv )
 
     create_dotlock(NULL); /* Register locking cleanup. */
 
-    i18n_init();
+    opt.session_env = session_env_new ();
+    if (!opt.session_env)
+      log_fatal ("error allocating session environment block: %s\n",
+                 strerror (errno));
 
     opt.command_fd = -1; /* no command fd */
     opt.compress_level = -1; /* defaults to standard compress level */
@@ -1860,8 +1970,8 @@ main (int argc, char **argv )
     opt.marginals_needed = 3;
     opt.max_cert_depth = 5;
     opt.pgp2_workarounds = 1;
-    opt.force_v3_sigs = 1;
     opt.escape_from = 1;
+    opt.flags.require_cross_cert = 1;
     opt.import_options=IMPORT_SK2PK;
     opt.export_options=EXPORT_ATTRIBUTES;
     opt.keyserver_options.import_options=IMPORT_REPAIR_PKS_SUBKEY_BUG;
@@ -1875,7 +1985,6 @@ main (int argc, char **argv )
     opt.min_cert_level=2;
     set_screen_dimensions();
     opt.keyid_format=KF_SHORT;
-    opt.rfc2440_text=1;
     opt.def_sig_expire="0";
     opt.def_cert_expire="0";
     set_homedir ( default_homedir () );
@@ -1897,8 +2006,11 @@ main (int argc, char **argv )
            default_config = 0;
        }
        else if( pargs.r_opt == oNoOptions )
+          {
            default_config = 0; /* --no-options */
-       else if( pargs.r_opt == oHomedir )
+            opt.no_homedir_creation = 1;
+          }
+        else if( pargs.r_opt == oHomedir )
            set_homedir ( pargs.r.ret_str );
        else if( pargs.r_opt == oNoPermissionWarn )
            opt.no_perm_warn=1;
@@ -1935,8 +2047,8 @@ main (int argc, char **argv )
 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
     /* There should be no way to get to this spot while still carrying
        setuid privs.  Just in case, bomb out if we are. */
-    if(getuid()!=geteuid())
-      BUG();
+    if ( getuid () != geteuid () )
+      BUG ();
 #endif
     maybe_setuid = 0;
 
@@ -1948,49 +2060,10 @@ main (int argc, char **argv )
  
 
     /* Try for a version specific config file first */
-    if( default_config )
-      {
-       char *name=xstrdup("gpg" EXTSEP_S "conf-" SAFE_VERSION);
-       char *ver=&name[strlen("gpg" EXTSEP_S "conf-")];
-
-       do
-         {
-           if(configname)
-             {
-               char *tok;
-
-               xfree(configname);
-               configname=NULL;
+    default_configname = get_default_configname ();
+    if (default_config)
+      configname = xstrdup (default_configname);
 
-               if((tok=strrchr(ver,SAFE_VERSION_DASH)))
-                 *tok='\0';
-               else if((tok=strrchr(ver,SAFE_VERSION_DOT)))
-                 *tok='\0';
-               else
-                 break;
-             }
-
-           configname = make_filename(opt.homedir,name,NULL);
-         }
-       while(access(configname,R_OK));
-
-       xfree(name);
-
-       if(!configname)
-         configname=make_filename(opt.homedir, "gpg" EXTSEP_S "conf", NULL );
-        if (!access (configname, R_OK))
-          { /* Print a warning when both config files are present. */
-            char *p = make_filename(opt.homedir, "options", NULL );
-            if (!access (p, R_OK))
-              log_info (_("NOTE: old default options file `%s' ignored\n"), p);
-            xfree (p);
-          }
-        else
-          { /* Keep on using the old default one. */
-            xfree (configname);
-            configname = make_filename(opt.homedir, "options", NULL );
-          }
-      }
     argc = orig_argc;
     argv = orig_argv;
     pargs.argc = &argc;
@@ -2063,6 +2136,7 @@ main (int argc, char **argv )
           case aChangePIN:
 #endif /* ENABLE_CARD_SUPPORT*/
          case aListKeys: 
+         case aLocateKeys:
          case aListSigs: 
          case aExportSecret: 
          case aExportSecretSub: 
@@ -2162,16 +2236,16 @@ main (int argc, char **argv )
           case oDebugLevel: debug_level = pargs.r.ret_str; break;
 
          case oStatusFD:
-            set_status_fd( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
+            set_status_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
             break;
          case oStatusFile:
-            set_status_fd ( open_info_file (pargs.r.ret_str, 1) );
+            set_status_fd ( open_info_file (pargs.r.ret_str, 1, 0) );
             break;
          case oAttributeFD:
-            set_attrib_fd(translate_sys2libc_fd_int (pargs.r.ret_int, 1));
+            set_attrib_fd ( translate_sys2libc_fd_int (pargs.r.ret_int, 1) );
             break;
          case oAttributeFile:
-            set_attrib_fd ( open_info_file (pargs.r.ret_str, 1) );
+            set_attrib_fd ( open_info_file (pargs.r.ret_str, 1, 1) );
             break;
          case oLoggerFD:
             log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
@@ -2182,8 +2256,13 @@ main (int argc, char **argv )
 
          case oWithFingerprint:
             opt.with_fingerprint = 1;
-            with_fpr=1; /*fall thru*/
-         case oFingerprint: opt.fingerprint++; break;
+            opt.fingerprint++;
+            break;
+         case oFingerprint:
+            opt.fingerprint++;
+            fpr_maybe_cmd = 1;
+            break;
+
          case oSecretKeyring:
             append_to_strlist( &sec_nrings, pargs.r.ret_str);
             break;
@@ -2228,9 +2307,13 @@ main (int argc, char **argv )
          case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
          case oHomedir: break;
          case oNoBatch: opt.batch = 0; break;
-         case oWithKeyData: opt.with_key_data=1; /* fall thru */
+
+         case oWithKeyData: opt.with_key_data=1; /*FALLTHRU*/
          case oWithColons: opt.with_colons=':'; break;
 
+          case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
+          case oWithSigList: opt.list_sigs = 1; break;  
+
          case oSkipVerify: opt.skip_verify=1; break;
          case oCompressKeys: opt.compress_keys = 1; break;
          case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
@@ -2261,11 +2344,34 @@ main (int argc, char **argv )
            opt.escape_from = 1;
            break;
          case oOpenPGP:
+         case oRFC4880:
+           /* This is effectively the same as RFC2440, but with
+              "--enable-dsa2 --no-rfc2440-text --escape-from-lines
+              --require-cross-certification". */
+           opt.compliance = CO_RFC4880;
+           opt.flags.dsa2 = 1;
+           opt.flags.require_cross_cert = 1;
+           opt.rfc2440_text = 0;
+           opt.allow_non_selfsigned_uid = 1;
+           opt.allow_freeform_uid = 1;
+           opt.pgp2_workarounds = 0;
+           opt.escape_from = 1;
+           opt.force_v3_sigs = 0;
+           opt.compress_keys = 0;          /* not mandated, but we do it */
+           opt.compress_sigs = 0;          /* ditto. */
+           opt.not_dash_escaped = 0;
+           opt.def_cipher_algo = 0;
+           opt.def_digest_algo = 0;
+           opt.cert_digest_algo = 0;
+           opt.compress_algo = -1;
+            opt.s2k_mode = 3; /* iterated+salted */
+           opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
+           opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
+           break;
          case oRFC2440:
-           /* TODO: When 2440bis becomes a RFC, set new values for
-              oOpenPGP. */
-           opt.rfc2440_text=1;
            opt.compliance = CO_RFC2440;
+           opt.flags.dsa2 = 0;
+           opt.rfc2440_text = 1;
            opt.allow_non_selfsigned_uid = 1;
            opt.allow_freeform_uid = 1;
            opt.pgp2_workarounds = 0;
@@ -2441,14 +2547,14 @@ main (int argc, char **argv )
             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
             break;
          case oPasswdFile:
-            pwfd = open_info_file (pargs.r.ret_str, 0);
+            pwfd = open_info_file (pargs.r.ret_str, 0, 1);
             break;
          case oPasswdRepeat: opt.passwd_repeat=pargs.r.ret_int; break;
          case oCommandFD:
             opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
             break;
          case oCommandFile:
-            opt.command_fd = open_info_file (pargs.r.ret_str, 0);
+            opt.command_fd = open_info_file (pargs.r.ret_str, 0, 1);
             break;
          case oCipherAlgo: 
             def_cipher_string = xstrdup(pargs.r.ret_str);
@@ -2664,7 +2770,7 @@ main (int argc, char **argv )
                                   "--keyserver-options ","http-proxy");
                break;
          case oFastListMode: opt.fast_list_mode = 1; break;
-         case oFixedListMode: opt.fixed_list_mode = 1; break;
+         case oFixedListMode: /* Dummy */ break;
          case oListOnly: opt.list_only=1; break;
          case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
          case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
@@ -2729,11 +2835,23 @@ main (int argc, char **argv )
            pers_compress_list=pargs.r.ret_str;
            break;
           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
-          case oDisplay: opt.display = pargs.r.ret_str; break;
-          case oTTYname: opt.ttyname = pargs.r.ret_str; break;
-          case oTTYtype: opt.ttytype = pargs.r.ret_str; break;
+
+          case oDisplay:
+            set_opt_session_env ("DISPLAY", pargs.r.ret_str);
+            break;
+          case oTTYname:
+            set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
+            break;
+          case oTTYtype:
+            set_opt_session_env ("TERM", pargs.r.ret_str);
+            break;
+          case oXauthority:
+            set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
+            break;
+
           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
+
          case oGroup: add_group(pargs.r.ret_str); break;
          case oUnGroup: rm_group(pargs.r.ret_str); break;
          case oNoGroups:
@@ -2807,7 +2925,9 @@ main (int argc, char **argv )
 
          case oNoop: break;
 
-         default : pargs.err = configfp? 1:2; break;
+         default: 
+            pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
+            break;
          }
       }
 
@@ -2831,10 +2951,11 @@ main (int argc, char **argv )
        directly after the option parsing. */
     if (cmd == aGPGConfList)
       {
-        gpgconf_list (save_configname);
+        gpgconf_list (save_configname ? save_configname : default_configname);
         g10_exit (0);
       }
     xfree (save_configname);
+    xfree (default_configname);
 
     if( nogreeting )
        greeting = 0;
@@ -2845,15 +2966,15 @@ main (int argc, char **argv )
        fprintf(stderr, "%s\n", strusage(15) );
     }
 #ifdef IS_DEVELOPMENT_VERSION
-    if( !opt.batch )
+    if (!opt.batch)
       {
        const char *s;
 
-       if((s=strusage(20)))
+       if((s=strusage(25)))
          log_info("%s\n",s);
-       if((s=strusage(21)))
+       if((s=strusage(26)))
          log_info("%s\n",s);
-       if((s=strusage(22)))
+       if((s=strusage(27)))
          log_info("%s\n",s);
       }
 #endif
@@ -2868,6 +2989,15 @@ main (int argc, char **argv )
         log_set_prefix (NULL, 1|2|4);
       }
 
+    /* Older Libgcrypts fail with an assertion during DSA key
+       generation.  Better disable DSA2 entirely. */
+    if (opt.flags.dsa2 && !gcry_check_version ("1.4.0") )
+      {
+        log_info ("WARNING: "
+                  "DSA2 is only available with Libgcrypt 1.4 and later\n");
+        opt.flags.dsa2 = 0;
+      }
+
     if (opt.verbose > 2)
         log_info ("using character set `%s'\n", get_native_charset ());
 
@@ -3065,11 +3195,6 @@ main (int argc, char **argv )
        keygen_set_std_prefs(opt.def_preference_list,0))
       log_error(_("invalid default preferences\n"));
 
-    /* We provide defaults for the personal digest list.  This is
-       SHA-1. */
-    if(!pers_digest_list)
-      pers_digest_list="h2";
-
     if(pers_cipher_list &&
        keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
       log_error(_("invalid personal cipher preferences\n"));
@@ -3133,7 +3258,7 @@ main (int argc, char **argv )
        if(opt.def_cipher_algo
           && !algo_available(PREFTYPE_SYM,opt.def_cipher_algo,NULL))
          {
-           badalg = gcry_cipher_algo_name (opt.def_cipher_algo);
+           badalg = openpgp_cipher_algo_name (opt.def_cipher_algo);
            badtype = PREFTYPE_SYM;
          }
        else if(opt.def_digest_algo
@@ -3191,20 +3316,14 @@ main (int argc, char **argv )
        xfree(p);
     }
 
-    if( !cmd && opt.fingerprint && !with_fpr ) {
-       set_cmd( &cmd, aListKeys);
-    }
-
-    /* kludge to let -sat generate a clear text signature */
-    if( opt.textmode == 2 && !detached_sig && opt.armor && cmd == aSign )
+    /* If there is no command but the --fingerprint is given, default
+       to the --list-keys command.  */
+    if (!cmd && fpr_maybe_cmd)
       {
-        log_info ("compatibility note:\n");
-        log_info ("\"-sat\" won't generate clear signed messages in "
-                  "future versions\n");
-        log_info ("Use \"--clearsign\" instead of \"-sat\"\n");
-       cmd = aClearsign;
+       set_cmd (&cmd, aListKeys);
       }
 
+
     if( opt.verbose > 1 )
        set_packet_list_mode(1);
 
@@ -3221,7 +3340,7 @@ main (int argc, char **argv )
       {
         if (ALWAYS_ADD_KEYRINGS
             || (cmd != aCheckKeys && cmd != aListSigs && cmd != aListKeys
-                && cmd != aVerify && cmd != aSym))
+                && cmd != aVerify && cmd != aSym && cmd != aLocateKeys))
           {
             if (!sec_nrings || default_keyring) /* add default secret rings */
               keydb_add_resource ("secring" EXTSEP_S "gpg", 4, 1);
@@ -3462,7 +3581,7 @@ main (int argc, char **argv )
 
        append_to_strlist( &sl, "save" );
        username = make_username( fname );
-       keyedit_menu(fname, locusr, sl, 0, 0 );
+       keyedit_menu (username, locusr, sl, 0, 0 );
        xfree(username);
        free_strlist(sl);
        break;
@@ -3504,7 +3623,7 @@ main (int argc, char **argv )
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
-       public_key_list( sl );
+       public_key_list( sl, 0 );
        free_strlist(sl);
        break;
       case aListSecretKeys:
@@ -3514,6 +3633,13 @@ main (int argc, char **argv )
        secret_key_list( sl );
        free_strlist(sl);
        break;
+      case aLocateKeys:
+       sl = NULL;
+       for (; argc; argc--, argv++)
+          add_to_strlist2( &sl, *argv, utf8_strings );
+       public_key_list (sl, 1);
+       free_strlist (sl);
+       break;
 
       case aKeygen: /* generate a key */
        if( opt.batch ) {
@@ -4058,8 +4184,8 @@ print_mds( const char *fname, int algo )
        gcry_md_enable (md, GCRY_MD_MD5);
        gcry_md_enable (md, GCRY_MD_SHA1);
        gcry_md_enable (md, GCRY_MD_RMD160);
-        if (!openpgp_md_test_algo (DIGEST_ALGO_SHA224))
-          gcry_md_enable (md, DIGEST_ALGO_SHA224);
+        if (!openpgp_md_test_algo (GCRY_MD_SHA224))
+          gcry_md_enable (md, GCRY_MD_SHA224);
         if (!openpgp_md_test_algo (GCRY_MD_SHA256))
           gcry_md_enable (md, GCRY_MD_SHA256);
         if (!openpgp_md_test_algo (GCRY_MD_SHA384))
@@ -4080,9 +4206,10 @@ print_mds( const char *fname, int algo )
             else {
                 print_hashline( md, GCRY_MD_MD5, fname );
                 print_hashline( md, GCRY_MD_SHA1, fname );
-                print_hashline( md, GCRY_MD_RMD160, fname );
-                if (!gcry_md_test_algo (DIGEST_ALGO_SHA224))
-                    print_hashline (md, DIGEST_ALGO_SHA224, fname);
+                if (!gcry_md_test_algo (GCRY_MD_RMD160))
+                    print_hashline( md, GCRY_MD_RMD160, fname );
+                if (!gcry_md_test_algo (GCRY_MD_SHA224))
+                    print_hashline (md, GCRY_MD_SHA224, fname);
                 if (!gcry_md_test_algo (GCRY_MD_SHA256))
                     print_hashline( md, GCRY_MD_SHA256, fname );
                 if (!gcry_md_test_algo (GCRY_MD_SHA384))
@@ -4097,9 +4224,10 @@ print_mds( const char *fname, int algo )
             else {
                 print_hex( md, GCRY_MD_MD5, fname );
                 print_hex( md, GCRY_MD_SHA1, fname );
-                print_hex( md, GCRY_MD_RMD160, fname );
-                if (!gcry_md_test_algo (DIGEST_ALGO_SHA224))
-                    print_hex (md, DIGEST_ALGO_SHA224, fname);
+                if (!gcry_md_test_algo (GCRY_MD_RMD160))
+                    print_hex( md, GCRY_MD_RMD160, fname );
+                if (!gcry_md_test_algo (GCRY_MD_SHA224))
+                    print_hex (md, GCRY_MD_SHA224, fname);
                 if (!gcry_md_test_algo (GCRY_MD_SHA256))
                     print_hex( md, GCRY_MD_SHA256, fname );
                 if (!gcry_md_test_algo (GCRY_MD_SHA384))
@@ -4207,4 +4335,3 @@ add_keyserver_url( const char *string, int which )
   if(critical)
     sl->flags |= 1;    
 }
-