gpg: Do not require a trustdb with --always-trust.
[gnupg.git] / g10 / gpg.c
index 55ba2cd..65a9cab 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -1,6 +1,6 @@
 /* gpg.c - The GnuPG utility (main for gpg)
 /* gpg.c - The GnuPG utility (main for gpg)
- * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
- *               2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+ *               2008, 2009, 2010, 2011 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
  *
  * This file is part of GnuPG.
  *
 #define INCLUDED_BY_MAIN_MODULE 1
 #include "gpg.h"
 #include <assuan.h>
 #define INCLUDED_BY_MAIN_MODULE 1
 #include "gpg.h"
 #include <assuan.h>
-#include "packet.h"
 #include "../common/iobuf.h"
 #include "util.h"
 #include "../common/iobuf.h"
 #include "util.h"
+#include "packet.h"
+#include "membuf.h"
 #include "main.h"
 #include "options.h"
 #include "keydb.h"
 #include "trustdb.h"
 #include "main.h"
 #include "options.h"
 #include "keydb.h"
 #include "trustdb.h"
-#include "cipher.h"
 #include "filter.h"
 #include "ttyio.h"
 #include "i18n.h"
 #include "filter.h"
 #include "ttyio.h"
 #include "i18n.h"
 #include "keyserver-internal.h"
 #include "exec.h"
 #include "gc-opt-flags.h"
 #include "keyserver-internal.h"
 #include "exec.h"
 #include "gc-opt-flags.h"
+#include "asshelp.h"
+#include "call-dirmngr.h"
+#include "../common/init.h"
+#include "../common/shareddefs.h"
 
 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
 #define MY_O_BINARY  O_BINARY
 
 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
 #define MY_O_BINARY  O_BINARY
@@ -146,6 +150,7 @@ enum cmd_and_opt_values
     aCardStatus,
     aCardEdit,
     aChangePIN,
     aCardStatus,
     aCardEdit,
     aChangePIN,
+    aPasswd,
     aServer,
 
     oTextmode,
     aServer,
 
     oTextmode,
@@ -164,6 +169,7 @@ enum cmd_and_opt_values
     oNoAskCertLevel,
     oFingerprint,
     oWithFingerprint,
     oNoAskCertLevel,
     oFingerprint,
     oWithFingerprint,
+    oWithKeygrip,
     oAnswerYes,
     oAnswerNo,
     oKeyring,
     oAnswerYes,
     oAnswerNo,
     oKeyring,
@@ -174,6 +180,7 @@ enum cmd_and_opt_values
     oDefRecipient,
     oDefRecipientSelf,
     oNoDefRecipient,
     oDefRecipient,
     oDefRecipientSelf,
     oNoDefRecipient,
+    oTrySecretKey,
     oOptions,
     oDebug,
     oDebugLevel,
     oOptions,
     oDebug,
     oDebugLevel,
@@ -207,10 +214,11 @@ enum cmd_and_opt_values
     oCompressLevel,
     oBZ2CompressLevel,
     oBZ2DecompressLowmem,
     oCompressLevel,
     oBZ2CompressLevel,
     oBZ2DecompressLowmem,
-    oPasswd,
-    oPasswdFD,
-    oPasswdFile,
-    oPasswdRepeat,
+    oPassphrase,
+    oPassphraseFD,
+    oPassphraseFile,
+    oPassphraseRepeat,
+    oPinentryMode,
     oCommandFD,
     oCommandFile,
     oQuickRandom,
     oCommandFD,
     oCommandFile,
     oQuickRandom,
@@ -233,6 +241,8 @@ enum cmd_and_opt_values
     oWithSigList,
     oWithSigCheck,
     oSkipVerify,
     oWithSigList,
     oWithSigCheck,
     oSkipVerify,
+    oSkipHiddenRecipients,
+    oNoSkipHiddenRecipients,
     oCompressKeys,
     oCompressSigs,
     oAlwaysTrust,
     oCompressKeys,
     oCompressSigs,
     oAlwaysTrust,
@@ -269,7 +279,6 @@ enum cmd_and_opt_values
     oS2KDigest,
     oS2KCipher,
     oS2KCount,
     oS2KDigest,
     oS2KCipher,
     oS2KCount,
-    oSimpleSKChecksum,                          
     oDisplayCharset,
     oNotDashEscaped,
     oEscapeFrom,
     oDisplayCharset,
     oNotDashEscaped,
     oEscapeFrom,
@@ -298,7 +307,7 @@ enum cmd_and_opt_values
     oNoAllowNonSelfsignedUID,
     oAllowFreeformUID,
     oNoAllowFreeformUID,
     oNoAllowNonSelfsignedUID,
     oAllowFreeformUID,
     oNoAllowFreeformUID,
-    oAllowSecretKeyImport,                      
+    oAllowSecretKeyImport,
     oEnableSpecialFilenames,
     oNoLiteral,
     oSetFilesize,
     oEnableSpecialFilenames,
     oNoLiteral,
     oSetFilesize,
@@ -322,6 +331,7 @@ enum cmd_and_opt_values
     oTrustedKey,
     oNoExpensiveTrustChecks,
     oFixedListMode,
     oTrustedKey,
     oNoExpensiveTrustChecks,
     oFixedListMode,
+    oLegacyListMode,
     oNoSigCache,
     oNoSigCreateCheck,
     oAutoCheckTrustDB,
     oNoSigCache,
     oNoSigCreateCheck,
     oAutoCheckTrustDB,
@@ -360,6 +370,7 @@ enum cmd_and_opt_values
     oDisableDSA2,
     oAllowMultipleMessages,
     oNoAllowMultipleMessages,
     oDisableDSA2,
     oAllowMultipleMessages,
     oNoAllowMultipleMessages,
+    oFakedSystemTime,
 
     oNoop
   };
 
     oNoop
   };
@@ -387,7 +398,8 @@ static ARGPARSE_OPTS opts[] = {
   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 (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", 
+  ARGPARSE_c (aGenRevoke, "gen-revoke",N_("generate a revocation certificate")),
+  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")),
               N_("remove keys from the public keyring")),
   ARGPARSE_c (aDeleteSecretKeys, "delete-secret-keys",
               N_("remove keys from the secret keyring")),
@@ -395,14 +407,14 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
   ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
   ARGPARSE_c (aEditKey,  "key-edit"   ,"@"),
   ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
   ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
   ARGPARSE_c (aEditKey,  "key-edit"   ,"@"),
-  ARGPARSE_c (aGenRevoke, "gen-revoke",N_("generate a revocation certificate")),
+  ARGPARSE_c (aPasswd,   "passwd",     N_("change a passphrase")),
   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 (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" , 
+  ARGPARSE_c (aSearchKeys, "search-keys" ,
               N_("search for keys on a key server") ),
               N_("search for keys on a key server") ),
-  ARGPARSE_c (aRefreshKeys, "refresh-keys", 
+  ARGPARSE_c (aRefreshKeys, "refresh-keys",
               N_("update all keys from a keyserver")),
   ARGPARSE_c (aLocateKeys, "locate-keys", "@"),
   ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
               N_("update all keys from a keyserver")),
   ARGPARSE_c (aLocateKeys, "locate-keys", "@"),
   ARGPARSE_c (aFetchKeys, "fetch-keys" , "@" ),
@@ -419,12 +431,16 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_c (aGPGConfList, "gpgconf-list", "@" ),
   ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@" ),
   ARGPARSE_c (aListPackets, "list-packets","@"),
   ARGPARSE_c (aGPGConfList, "gpgconf-list", "@" ),
   ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@" ),
   ARGPARSE_c (aListPackets, "list-packets","@"),
+
+#ifndef NO_TRUST_MODELS
   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 (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", "@"),
+#endif
+
   ARGPARSE_c (aDeArmor, "dearmor", "@"),
   ARGPARSE_c (aDeArmor, "dearmour", "@"),
   ARGPARSE_c (aEnArmor, "enarmor", "@"),
   ARGPARSE_c (aDeArmor, "dearmor", "@"),
   ARGPARSE_c (aDeArmor, "dearmour", "@"),
   ARGPARSE_c (aEnArmor, "enarmor", "@"),
@@ -454,6 +470,8 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_s (oLocalUser, "local-user",
                 N_("|USER-ID|use USER-ID to sign or decrypt")),
 
   ARGPARSE_s_s (oLocalUser, "local-user",
                 N_("|USER-ID|use USER-ID to sign or decrypt")),
 
+  ARGPARSE_s_s (oTrySecretKey, "try-secret-key", "@"),
+
   ARGPARSE_s_i (oCompress, NULL,
                 N_("|N|set compress level to N (0 disables)")),
   ARGPARSE_s_i (oCompressLevel, "compress-level", "@"),
   ARGPARSE_s_i (oCompress, NULL,
                 N_("|N|set compress level to N (0 disables)")),
   ARGPARSE_s_i (oCompressLevel, "compress-level", "@"),
@@ -559,7 +577,6 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_s (oS2KDigest, "s2k-digest-algo", "@"),
   ARGPARSE_s_s (oS2KCipher, "s2k-cipher-algo", "@"),
   ARGPARSE_s_i (oS2KCount, "s2k-count", "@"),
   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 (oCipherAlgo, "cipher-algo", "@"),
   ARGPARSE_s_s (oDigestAlgo, "digest-algo", "@"),
   ARGPARSE_s_s (oCertDigestAlgo, "cert-digest-algo", "@"),
@@ -590,22 +607,33 @@ static ARGPARSE_OPTS opts[] = {
 
   /* More hidden commands and options. */
   ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
 
   /* More hidden commands and options. */
   ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
+#ifndef NO_TRUST_MODELS
   ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
   ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
-  /* Not yet used: 
+#endif
+
+  /* Not yet used:
      ARGPARSE_c (aListTrustPath, "list-trust-path", "@"), */
   ARGPARSE_c (aDeleteSecretAndPublicKeys,
               "delete-secret-and-public-keys", "@"),
   ARGPARSE_c (aRebuildKeydbCaches, "rebuild-keydb-caches", "@"),
 
      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_s (oPassphrase,      "passphrase", "@"),
+  ARGPARSE_s_i (oPassphraseFD,    "passphrase-fd", "@"),
+  ARGPARSE_s_s (oPassphraseFile,  "passphrase-file", "@"),
+  ARGPARSE_s_i (oPassphraseRepeat,"passphrase-repeat", "@"),
+  ARGPARSE_s_s (oPinentryMode,    "pinentry-mode", "@"),
   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_i (oCommandFD, "command-fd", "@"),
   ARGPARSE_s_s (oCommandFile, "command-file", "@"),
   ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
   ARGPARSE_s_n (oNoVerbose, "no-verbose", "@"),
+
+#ifndef NO_TRUST_MODELS
   ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
   ARGPARSE_s_s (oTrustDBName, "trustdb-name", "@"),
+  ARGPARSE_s_n (oAutoCheckTrustDB, "auto-check-trustdb", "@"),
+  ARGPARSE_s_n (oNoAutoCheckTrustDB, "no-auto-check-trustdb", "@"),
+  ARGPARSE_s_s (oForceOwnertrust, "force-ownertrust", "@"),
+#endif
+
   ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
   ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
   ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
   ARGPARSE_s_n (oNoSecmemWarn, "no-secmem-warning", "@"),
   ARGPARSE_s_n (oRequireSecmem, "require-secmem", "@"),
   ARGPARSE_s_n (oNoRequireSecmem, "no-require-secmem", "@"),
@@ -615,8 +643,8 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_n (oNoArmor, "no-armour", "@"),
   ARGPARSE_s_n (oNoDefKeyring, "no-default-keyring", "@"),
   ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
   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 (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 (oNoBatch, "no-batch", "@"),
   ARGPARSE_s_n (oWithColons, "with-colons", "@"),
   ARGPARSE_s_n (oWithKeyData,"with-key-data", "@"),
@@ -626,12 +654,13 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_n (aListSigs, "list-sig", "@"),   /* alias */
   ARGPARSE_s_n (aCheckKeys, "check-sig", "@"), /* alias */
   ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
   ARGPARSE_s_n (aListSigs, "list-sig", "@"),   /* alias */
   ARGPARSE_s_n (aCheckKeys, "check-sig", "@"), /* alias */
   ARGPARSE_s_n (oSkipVerify, "skip-verify", "@"),
+  ARGPARSE_s_n (oSkipHiddenRecipients, "skip-hidden-recipients", "@"),
+  ARGPARSE_s_n (oNoSkipHiddenRecipients, "no-skip-hidden-recipients", "@"),
   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_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 (oSetFilename, "set-filename", "@"),
   ARGPARSE_s_n (oForYourEyesOnly, "for-your-eyes-only", "@"),
   ARGPARSE_s_n (oNoForYourEyesOnly, "no-for-your-eyes-only", "@"),
@@ -663,6 +692,7 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_n (oUtf8Strings,      "utf8-strings", "@"),
   ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
   ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
   ARGPARSE_s_n (oUtf8Strings,      "utf8-strings", "@"),
   ARGPARSE_s_n (oNoUtf8Strings, "no-utf8-strings", "@"),
   ARGPARSE_s_n (oWithFingerprint, "with-fingerprint", "@"),
+  ARGPARSE_s_n (oWithKeygrip,     "with-keygrip", "@"),
   ARGPARSE_s_s (oDisableCipherAlgo,  "disable-cipher-algo", "@"),
   ARGPARSE_s_s (oDisablePubkeyAlgo,  "disable-pubkey-algo", "@"),
   ARGPARSE_s_n (oAllowNonSelfsignedUID,      "allow-non-selfsigned-uid", "@"),
   ARGPARSE_s_s (oDisableCipherAlgo,  "disable-cipher-algo", "@"),
   ARGPARSE_s_s (oDisablePubkeyAlgo,  "disable-pubkey-algo", "@"),
   ARGPARSE_s_n (oAllowNonSelfsignedUID,      "allow-non-selfsigned-uid", "@"),
@@ -674,6 +704,7 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
   ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
   ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
   ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
   ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
   ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
+  ARGPARSE_s_n (oLegacyListMode, "legacy-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 (oListOnly, "list-only", "@"),
   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
   ARGPARSE_s_n (oIgnoreValidFrom,    "ignore-valid-from", "@"),
@@ -686,8 +717,6 @@ static ARGPARSE_OPTS opts[] = {
   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 (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 (oMergeOnly,      "merge-only", "@" ),
   ARGPARSE_s_n (oAllowSecretKeyImport, "allow-secret-key-import", "@"),
   ARGPARSE_s_n (oTryAllSecrets,  "try-all-secrets", "@"),
@@ -700,6 +729,7 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
   ARGPARSE_s_s (oPersonalCompressPreferences,
                                          "personal-compress-preferences", "@"),
   ARGPARSE_s_s (oPersonalDigestPreferences, "personal-digest-preferences","@"),
   ARGPARSE_s_s (oPersonalCompressPreferences,
                                          "personal-compress-preferences", "@"),
+  ARGPARSE_s_s (oFakedSystemTime, "faked-system-time", "@"),
 
   /* Aliases.  I constantly mistype these, and assume other people do
      as well. */
 
   /* Aliases.  I constantly mistype these, and assume other people do
      as well. */
@@ -725,8 +755,8 @@ static ARGPARSE_OPTS opts[] = {
   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_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, 
+
+  ARGPARSE_s_n (oAllowMultisigVerification,
                 "allow-multisig-verification", "@"),
   ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
   ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
                 "allow-multisig-verification", "@"),
   ARGPARSE_s_n (oEnableDSA2, "enable-dsa2", "@"),
   ARGPARSE_s_n (oDisableDSA2, "disable-dsa2", "@"),
@@ -781,7 +811,7 @@ make_libversion (const char *libname, const char *(*getfnc)(const char*))
 {
   const char *s;
   char *result;
 {
   const char *s;
   char *result;
-  
+
   if (maybe_setuid)
     {
       gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
   if (maybe_setuid)
     {
       gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
@@ -794,6 +824,43 @@ make_libversion (const char *libname, const char *(*getfnc)(const char*))
 }
 
 
 }
 
 
+static int
+build_list_pk_test_algo (int algo)
+{
+  return openpgp_pk_test_algo (algo);
+}
+
+static const char *
+build_list_pk_algo_name (int algo)
+{
+  return openpgp_pk_algo_name (algo);
+}
+
+static int
+build_list_cipher_test_algo (int algo)
+{
+  return openpgp_cipher_test_algo (algo);
+}
+
+static const char *
+build_list_cipher_algo_name (int algo)
+{
+  return openpgp_cipher_algo_name (algo);
+}
+
+static int
+build_list_md_test_algo (int algo)
+{
+  return openpgp_md_test_algo (algo);
+}
+
+static const char *
+build_list_md_algo_name (int algo)
+{
+  return openpgp_md_algo_name (algo);
+}
+
+
 static const char *
 my_strusage( int level )
 {
 static const char *
 my_strusage( int level )
 {
@@ -801,7 +868,7 @@ my_strusage( int level )
   const char *p;
 
     switch( level ) {
   const char *p;
 
     switch( level ) {
-      case 11: p = "gpg (GnuPG)";
+      case 11: p = "@GPG@ (@GNUPG@)";
        break;
       case 13: p = VERSION; break;
       case 17: p = PRINTABLE_OS_NAME; break;
        break;
       case 13: p = VERSION; break;
       case 17: p = PRINTABLE_OS_NAME; break;
@@ -827,12 +894,12 @@ my_strusage( int level )
 
       case 1:
       case 40: p =
 
       case 1:
       case 40: p =
-           _("Usage: gpg [options] [files] (-h for help)");
+           _("Usage: @GPG@ [options] [files] (-h for help)");
        break;
       case 41: p =
        break;
       case 41: p =
-           _("Syntax: gpg [options] [files]\n"
-             "sign, check, encrypt or decrypt\n"
-             "default operation depends on the input data\n");
+           _("Syntax: @GPG@ [options] [files]\n"
+             "Sign, check, encrypt or decrypt\n"
+             "Default operation depends on the input data\n");
        break;
 
       case 31: p = "\nHome: "; break;
        break;
 
       case 31: p = "\nHome: "; break;
@@ -844,23 +911,23 @@ my_strusage( int level )
       case 33: p = _("\nSupported algorithms:\n"); break;
       case 34:
        if (!pubkeys)
       case 33: p = _("\nSupported algorithms:\n"); break;
       case 34:
        if (!pubkeys)
-            pubkeys = build_list (_("Pubkey: "), 0,
-                                  gcry_pk_algo_name,
-                                  openpgp_pk_test_algo );
+            pubkeys = build_list (_("Pubkey: "), 1,
+                                  build_list_pk_algo_name,
+                                  build_list_pk_test_algo );
        p = pubkeys;
        break;
       case 35:
        if( !ciphers )
        p = pubkeys;
        break;
       case 35:
        if( !ciphers )
-           ciphers = build_list(_("Cipher: "), 'S', 
-                                 openpgp_cipher_algo_name,
-                                 openpgp_cipher_test_algo );
+           ciphers = build_list(_("Cipher: "), 'S',
+                                 build_list_cipher_algo_name,
+                                 build_list_cipher_test_algo );
        p = ciphers;
        break;
       case 36:
        if( !digests )
        p = ciphers;
        break;
       case 36:
        if( !digests )
-           digests = build_list(_("Hash: "), 'H', 
-                                 gcry_md_algo_name,
-                                 openpgp_md_test_algo );
+           digests = build_list(_("Hash: "), 'H',
+                                 build_list_md_algo_name,
+                                 build_list_md_test_algo );
        p = digests;
        break;
       case 37:
        p = digests;
        break;
       case 37:
@@ -878,57 +945,56 @@ my_strusage( int level )
 
 
 static char *
 
 
 static char *
-build_listconst char *text, char letter,
-           const char * (*mapf)(int), int (*chkf)(int) )
+build_list (const char *text, char letter,
+           const char * (*mapf)(int), int (*chkf)(int))
 {
 {
-    int i;
-    const char *s;
-    size_t n=strlen(text)+2;
-    char *list, *p, *line=NULL;
-
-    if (maybe_setuid)
-      gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
-
-    for(i=0; i <= 110; i++ )
-       if( !chkf(i) && (s=mapf(i)) )
-           n += strlen(s) + 7 + 2;
-    list = xmalloc( 21 + n ); *list = 0;
-    for(p=NULL, i=0; i <= 110; i++ ) {
-       if( !chkf(i) && (s=mapf(i)) ) {
-           if( !p ) {
-               p = stpcpy( list, text );
-               line=p;
-           }
-           else
-               p = stpcpy( p, ", ");
+  membuf_t mb;
+  int indent;
+  int i, j, len;
+  const char *s;
+  char *string;
 
 
-           if(strlen(line)>60) {
-             int spaces=strlen(text);
+  if (maybe_setuid)
+    gcry_control (GCRYCTL_INIT_SECMEM, 0, 0);  /* Drop setuid. */
 
 
-             list=xrealloc(list,n+spaces+1);
-             /* realloc could move the block, so find the end again */
-             p=list;
-             while(*p)
-               p++;
+  indent = utf8_charcount (text);
+  len = 0;
+  init_membuf (&mb, 512);
 
 
-             p=stpcpy(p, "\n");
-             line=p;
-             for(;spaces;spaces--)
-               p=stpcpy(p, " ");
+  for (i=0; i <= 110; i++ )
+    {
+      if (!chkf (i) && (s = mapf (i)))
+        {
+          if (mb.len - len > 60)
+            {
+              put_membuf_str (&mb, ",\n");
+              len = mb.len;
+              for (j=0; j < indent; j++)
+                put_membuf_str (&mb, " ");
            }
            }
+          else if (mb.len)
+            put_membuf_str (&mb, ", ");
+          else
+            put_membuf_str (&mb, text);
 
 
-           p = stpcpy(p, s );
-           if(opt.verbose && letter)
-             {
-               char num[8];
-               sprintf(num," (%c%d)",letter,i);
-               p = stpcpy(p,num);
-             }
+          put_membuf_str (&mb, s);
+          if (opt.verbose && letter)
+            {
+              char num[20];
+              if (letter == 1)
+                snprintf (num, sizeof num, " (%d)", i);
+              else
+                snprintf (num, sizeof num, " (%c%d)", letter, i);
+              put_membuf_str (&mb, num);
+            }
        }
     }
        }
     }
-    if( p )
-       p = stpcpy(p, "\n" );
-    return list;
+  if (mb.len)
+    put_membuf_str (&mb, "\n");
+  put_membuf (&mb, "", 1);
+
+  string = get_membuf (&mb, NULL);
+  return xrealloc (string, strlen (string)+1);
 }
 
 
 }
 
 
@@ -958,7 +1024,7 @@ static void
 set_opt_session_env (const char *name, const char *value)
 {
   gpg_error_t err;
 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",
   err = session_env_setenv (opt.session_env, name, value);
   if (err)
     log_fatal ("error setting session environment: %s\n",
@@ -972,22 +1038,33 @@ set_opt_session_env (const char *name, const char *value)
 static void
 set_debug (const char *level)
 {
 static void
 set_debug (const char *level)
 {
+  int numok = (level && digitp (level));
+  int numlvl = numok? atoi (level) : 0;
+
   if (!level)
     ;
   if (!level)
     ;
-  else if (!strcmp (level, "none"))
+  else if (!strcmp (level, "none") || (numok && numlvl < 1))
     opt.debug = 0;
     opt.debug = 0;
-  else if (!strcmp (level, "basic"))
+  else if (!strcmp (level, "basic") || (numok && numlvl <= 2))
     opt.debug = DBG_MEMSTAT_VALUE;
     opt.debug = DBG_MEMSTAT_VALUE;
-  else if (!strcmp (level, "advanced"))
+  else if (!strcmp (level, "advanced") || (numok && numlvl <= 5))
     opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE;
     opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE;
-  else if (!strcmp (level, "expert"))
+  else if (!strcmp (level, "expert")  || (numok && numlvl <= 8))
     opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE
                  |DBG_CACHE_VALUE|DBG_FILTER_VALUE|DBG_PACKET_VALUE);
     opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE
                  |DBG_CACHE_VALUE|DBG_FILTER_VALUE|DBG_PACKET_VALUE);
-  else if (!strcmp (level, "guru"))
-    opt.debug = ~0;
+  else if (!strcmp (level, "guru") || numok)
+    {
+      opt.debug = ~0;
+      /* Unless the "guru" string has been used we don't want to allow
+         hashing debugging.  The rationale is that people tend to
+         select the highest debug value and would then clutter their
+         disk with debug files which may reveal confidential data.  */
+      if (numok)
+        opt.debug &= ~(DBG_HASHING_VALUE);
+    }
   else
     {
   else
     {
-      log_error (_("invalid debug-level `%s' given\n"), level);
+      log_error (_("invalid debug-level '%s' given\n"), level);
       g10_exit (2);
     }
 
       g10_exit (2);
     }
 
@@ -1002,6 +1079,23 @@ set_debug (const char *level)
   if (opt.debug & DBG_IOBUF_VALUE )
     iobuf_debug_mode = 1;
   gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
   if (opt.debug & DBG_IOBUF_VALUE )
     iobuf_debug_mode = 1;
   gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
+
+  if (opt.debug)
+    log_info ("enabled debug flags:%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+              (opt.debug & DBG_PACKET_VALUE )? " packet":"",
+              (opt.debug & DBG_MPI_VALUE    )? " mpi":"",
+              (opt.debug & DBG_CIPHER_VALUE )? " cipher":"",
+              (opt.debug & DBG_FILTER_VALUE )? " filter":"",
+              (opt.debug & DBG_IOBUF_VALUE  )? " iobuf":"",
+              (opt.debug & DBG_MEMORY_VALUE )? " memory":"",
+              (opt.debug & DBG_CACHE_VALUE  )? " cache":"",
+              (opt.debug & DBG_MEMSTAT_VALUE)? " memstat":"",
+              (opt.debug & DBG_TRUST_VALUE  )? " trust":"",
+              (opt.debug & DBG_HASHING_VALUE)? " hashing":"",
+              (opt.debug & DBG_EXTPROG_VALUE)? " extprog":"",
+              (opt.debug & DBG_CARD_IO_VALUE)? " cardio":"",
+              (opt.debug & DBG_ASSUAN_VALUE )? " assuan":"",
+              (opt.debug & DBG_CLOCK_VALUE  )? " clock":"");
 }
 
 
 }
 
 
@@ -1062,7 +1156,7 @@ open_info_file (const char *fname, int for_write, int binary)
   (void)for_write;
   (void)binary;
   return -1;
   (void)for_write;
   (void)binary;
   return -1;
-#else 
+#else
   int fd;
 
   if (binary)
   int fd;
 
   if (binary)
@@ -1071,7 +1165,7 @@ open_info_file (const char *fname, int for_write, int binary)
 /*   if (is_secured_filename (fname)) */
 /*     { */
 /*       fd = -1; */
 /*   if (is_secured_filename (fname)) */
 /*     { */
 /*       fd = -1; */
-/*       errno = EPERM; */
+/*       gpg_err_set_errno (EPERM); */
 /*     } */
 /*   else */
 /*     { */
 /*     } */
 /*   else */
 /*     { */
@@ -1086,9 +1180,9 @@ open_info_file (const char *fname, int for_write, int binary)
       while (fd == -1 && errno == EINTR);
 /*     } */
   if ( fd == -1)
       while (fd == -1 && errno == EINTR);
 /*     } */
   if ( fd == -1)
-    log_error ( for_write? _("can't create `%s': %s\n")
-                         : _("can't open `%s': %s\n"), fname, strerror(errno));
-  
+    log_error ( for_write? _("can't create '%s': %s\n")
+                         : _("can't open '%s': %s\n"), fname, strerror(errno));
+
   return fd;
 #endif
 }
   return fd;
 #endif
 }
@@ -1140,7 +1234,7 @@ add_group(char *string)
   name=strsep(&string,"=");
   if(string==NULL)
     {
   name=strsep(&string,"=");
   if(string==NULL)
     {
-      log_error(_("no = sign found in group definition `%s'\n"),name);
+      log_error(_("no = sign found in group definition '%s'\n"),name);
       return;
     }
 
       return;
     }
 
@@ -1206,7 +1300,7 @@ rm_group(char *name)
 
    Returns true if the item is unsafe. */
 static int
 
    Returns true if the item is unsafe. */
 static int
-check_permissions(const char *path,int item)
+check_permissions (const char *path, int item)
 {
 #if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
   static int homedir_cache=-1;
 {
 #if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
   static int homedir_cache=-1;
@@ -1338,49 +1432,49 @@ check_permissions(const char *path,int item)
        {
          if(item==0)
            log_info(_("WARNING: unsafe ownership on"
        {
          if(item==0)
            log_info(_("WARNING: unsafe ownership on"
-                      " homedir `%s'\n"),tmppath);
+                      " homedir '%s'\n"),tmppath);
          else if(item==1)
            log_info(_("WARNING: unsafe ownership on"
          else if(item==1)
            log_info(_("WARNING: unsafe ownership on"
-                      " configuration file `%s'\n"),tmppath);
+                      " configuration file '%s'\n"),tmppath);
          else
            log_info(_("WARNING: unsafe ownership on"
          else
            log_info(_("WARNING: unsafe ownership on"
-                      " extension `%s'\n"),tmppath);
+                      " extension '%s'\n"),tmppath);
        }
       if(perm)
        {
          if(item==0)
            log_info(_("WARNING: unsafe permissions on"
        }
       if(perm)
        {
          if(item==0)
            log_info(_("WARNING: unsafe permissions on"
-                      " homedir `%s'\n"),tmppath);
+                      " homedir '%s'\n"),tmppath);
          else if(item==1)
            log_info(_("WARNING: unsafe permissions on"
          else if(item==1)
            log_info(_("WARNING: unsafe permissions on"
-                      " configuration file `%s'\n"),tmppath);
+                      " configuration file '%s'\n"),tmppath);
          else
            log_info(_("WARNING: unsafe permissions on"
          else
            log_info(_("WARNING: unsafe permissions on"
-                      " extension `%s'\n"),tmppath);
+                      " extension '%s'\n"),tmppath);
        }
       if(enc_dir_own)
        {
          if(item==0)
            log_info(_("WARNING: unsafe enclosing directory ownership on"
        }
       if(enc_dir_own)
        {
          if(item==0)
            log_info(_("WARNING: unsafe enclosing directory ownership on"
-                      " homedir `%s'\n"),tmppath);
+                      " homedir '%s'\n"),tmppath);
          else if(item==1)
            log_info(_("WARNING: unsafe enclosing directory ownership on"
          else if(item==1)
            log_info(_("WARNING: unsafe enclosing directory ownership on"
-                      " configuration file `%s'\n"),tmppath);
+                      " configuration file '%s'\n"),tmppath);
          else
            log_info(_("WARNING: unsafe enclosing directory ownership on"
          else
            log_info(_("WARNING: unsafe enclosing directory ownership on"
-                      " extension `%s'\n"),tmppath);
+                      " extension '%s'\n"),tmppath);
        }
       if(enc_dir_perm)
        {
          if(item==0)
            log_info(_("WARNING: unsafe enclosing directory permissions on"
        }
       if(enc_dir_perm)
        {
          if(item==0)
            log_info(_("WARNING: unsafe enclosing directory permissions on"
-                      " homedir `%s'\n"),tmppath);
+                      " homedir '%s'\n"),tmppath);
          else if(item==1)
            log_info(_("WARNING: unsafe enclosing directory permissions on"
          else if(item==1)
            log_info(_("WARNING: unsafe enclosing directory permissions on"
-                      " configuration file `%s'\n"),tmppath);
+                      " configuration file '%s'\n"),tmppath);
          else
            log_info(_("WARNING: unsafe enclosing directory permissions on"
          else
            log_info(_("WARNING: unsafe enclosing directory permissions on"
-                      " extension `%s'\n"),tmppath);
+                      " extension '%s'\n"),tmppath);
        }
     }
 
        }
     }
 
@@ -1392,12 +1486,15 @@ check_permissions(const char *path,int item)
 
   return ret;
 
 
   return ret;
 
-#endif /* HAVE_STAT && !HAVE_DOSISH_SYSTEM */
-
+#else /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
+  (void)path;
+  (void)item;
   return 0;
   return 0;
+#endif /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
 }
 
 
 }
 
 
+/* Print the OpenPGP defined algo numbers.  */
 static void
 print_algo_numbers(int (*checker)(int))
 {
 static void
 print_algo_numbers(int (*checker)(int))
 {
@@ -1410,8 +1507,8 @@ print_algo_numbers(int (*checker)(int))
          if(first)
            first=0;
          else
          if(first)
            first=0;
          else
-           printf(";");
-         printf("%d",i);
+           es_printf (";");
+         es_printf ("%d",i);
        }
     }
 }
        }
     }
 }
@@ -1429,8 +1526,8 @@ print_algo_names(int (*checker)(int),const char *(*mapper)(int))
          if(first)
            first=0;
          else
          if(first)
            first=0;
          else
-           printf(";");
-         printf("%s",mapper(i));
+           es_printf (";");
+         es_printf ("%s",mapper(i));
        }
     }
 }
        }
     }
 }
@@ -1460,18 +1557,19 @@ list_config(char *items)
            {
              strlist_t sl;
 
            {
              strlist_t sl;
 
-             printf("cfg:group:");
-             print_string(stdout,iter->name,strlen(iter->name),':');
-             printf(":");
+             es_fprintf (es_stdout, "cfg:group:");
+             es_write_sanitized (es_stdout, iter->name, strlen(iter->name),
+                                  ":", NULL);
+             es_putc (':', es_stdout);
 
              for(sl=iter->values;sl;sl=sl->next)
                {
                  print_sanitized_string2 (stdout, sl->d, ':',';');
                  if(sl->next)
 
              for(sl=iter->values;sl;sl=sl->next)
                {
                  print_sanitized_string2 (stdout, sl->d, ':',';');
                  if(sl->next)
-                   printf(";");
+                    es_printf(";");
                }
 
                }
 
-             printf("\n");
+              es_printf("\n");
            }
 
          any=1;
            }
 
          any=1;
@@ -1479,33 +1577,43 @@ list_config(char *items)
 
       if(show_all || ascii_strcasecmp(name,"version")==0)
        {
 
       if(show_all || ascii_strcasecmp(name,"version")==0)
        {
-         printf("cfg:version:");
-         print_string(stdout,VERSION,strlen(VERSION),':');
-         printf("\n");
+         es_printf("cfg:version:");
+         es_write_sanitized (es_stdout, VERSION, strlen(VERSION), ":", NULL);
+          es_printf ("\n");
          any=1;
        }
 
       if(show_all || ascii_strcasecmp(name,"pubkey")==0)
        {
          any=1;
        }
 
       if(show_all || ascii_strcasecmp(name,"pubkey")==0)
        {
-         printf("cfg:pubkey:");
-         print_algo_numbers (openpgp_pk_test_algo);
-         printf("\n");
+         es_printf ("cfg:pubkey:");
+         print_algo_numbers (build_list_pk_test_algo);
+         es_printf ("\n");
+         any=1;
+       }
+
+      if(show_all || ascii_strcasecmp(name,"pubkeyname")==0)
+       {
+         es_printf ("cfg:pubkeyname:");
+         print_algo_names (build_list_pk_test_algo,
+                            build_list_pk_algo_name);
+         es_printf ("\n");
          any=1;
        }
 
       if(show_all || ascii_strcasecmp(name,"cipher")==0)
        {
          any=1;
        }
 
       if(show_all || ascii_strcasecmp(name,"cipher")==0)
        {
-         printf("cfg:cipher:");
-         print_algo_numbers(openpgp_cipher_test_algo);
-         printf("\n");
+         es_printf ("cfg:cipher:");
+         print_algo_numbers (build_list_cipher_test_algo);
+         es_printf ("\n");
          any=1;
        }
 
       if (show_all || !ascii_strcasecmp (name,"ciphername"))
        {
          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");
+         es_printf ("cfg:ciphername:");
+         print_algo_names (build_list_cipher_test_algo,
+                            build_list_cipher_algo_name);
+         es_printf ("\n");
          any = 1;
        }
 
          any = 1;
        }
 
@@ -1513,9 +1621,9 @@ list_config(char *items)
         || ascii_strcasecmp(name,"digest")==0
         || ascii_strcasecmp(name,"hash")==0)
        {
         || ascii_strcasecmp(name,"digest")==0
         || ascii_strcasecmp(name,"hash")==0)
        {
-         printf("cfg:digest:");
-         print_algo_numbers(openpgp_md_test_algo);
-         printf("\n");
+         es_printf ("cfg:digest:");
+         print_algo_numbers (build_list_md_test_algo);
+         es_printf ("\n");
          any=1;
        }
 
          any=1;
        }
 
@@ -1523,17 +1631,18 @@ list_config(char *items)
           || !ascii_strcasecmp(name,"digestname")
           || !ascii_strcasecmp(name,"hashname"))
        {
           || !ascii_strcasecmp(name,"digestname")
           || !ascii_strcasecmp(name,"hashname"))
        {
-         printf ("cfg:digestname:");
-         print_algo_names (openpgp_md_test_algo, gcry_md_algo_name);
-         printf("\n");
+         es_printf ("cfg:digestname:");
+         print_algo_names (build_list_md_test_algo,
+                            build_list_md_algo_name);
+         es_printf ("\n");
          any=1;
        }
          any=1;
        }
-      
+
       if(show_all || ascii_strcasecmp(name,"compress")==0)
        {
       if(show_all || ascii_strcasecmp(name,"compress")==0)
        {
-         printf("cfg:compress:");
+         es_printf ("cfg:compress:");
          print_algo_numbers(check_compress_algo);
          print_algo_numbers(check_compress_algo);
-         printf("\n");
+         es_printf ("\n");
          any=1;
        }
 
          any=1;
        }
 
@@ -1547,7 +1656,7 @@ list_config(char *items)
           for (p=list; p && (p2 = strchr (p, '\n')); p = p2+1)
             {
               *p2 = 0;
           for (p=list; p && (p2 = strchr (p, '\n')); p = p2+1)
             {
               *p2 = 0;
-              printf("cfg:ccid-reader-id:%s\n", p);
+              es_printf ("cfg:ccid-reader-id:%s\n", p);
             }
           free (list);
 #endif
             }
           free (list);
 #endif
@@ -1558,7 +1667,7 @@ list_config(char *items)
        break;
 
       if(!any)
        break;
 
       if(!any)
-       log_error(_("unknown configuration item `%s'\n"),name);
+       log_error(_("unknown configuration item '%s'\n"),name);
     }
 }
 
     }
 }
 
@@ -1573,18 +1682,25 @@ gpgconf_list (const char *configfile)
 {
   char *configfile_esc = percent_escape (configfile, NULL);
 
 {
   char *configfile_esc = percent_escape (configfile, NULL);
 
-  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);
-  printf ("quiet:%lu:\n",   GC_OPT_FLAG_NONE);
-  printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
-  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);
+  es_printf ("gpgconf-gpg.conf:%lu:\"%s\n",
+             GC_OPT_FLAG_DEFAULT,
+             configfile_esc ? configfile_esc : "/dev/null");
+  es_printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
+  es_printf ("quiet:%lu:\n",   GC_OPT_FLAG_NONE);
+  es_printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
+  es_printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
+  es_printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE);
+  es_printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
+  es_printf ("try-secret-key:%lu:\n", GC_OPT_FLAG_NONE);
+  es_printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
+  es_printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
+  es_printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
+  es_printf ("group:%lu:\n", GC_OPT_FLAG_NONE);
+
+  /* The next one is an info only item and should match the macros at
+     the top of keygen.c  */
+  es_printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
+             "RSA-2048");
 
   xfree (configfile_esc);
 }
 
   xfree (configfile_esc);
 }
@@ -1739,6 +1855,8 @@ collapse_args(int argc,char *argv[])
   return str;
 }
 
   return str;
 }
 
+
+#ifndef NO_TRUST_MODELS
 static void
 parse_trust_model(const char *model)
 {
 static void
 parse_trust_model(const char *model)
 {
@@ -1753,35 +1871,9 @@ parse_trust_model(const char *model)
   else if(ascii_strcasecmp(model,"auto")==0)
     opt.trust_model=TM_AUTO;
   else
   else if(ascii_strcasecmp(model,"auto")==0)
     opt.trust_model=TM_AUTO;
   else
-    log_error("unknown trust model `%s'\n",model);
-}
-
-
-/* Pack an s2k iteration count into the form specified in 2440.  If
-   we're in between valid values, round up. */
-static unsigned char
-encode_s2k_iterations(int iterations)
-{
-  unsigned char c=0,result;
-  unsigned int count;
-
-  if(iterations<=1024)
-    return 0;
-
-  if(iterations>=65011712)
-    return 255;
-
-  /* Need count to be in the range 16-31 */
-  for(count=iterations>>6;count>=32;count>>=1)
-    c++;
-
-  result=(c<<4)|(count-16);
-
-  if(S2K_DECODE_COUNT(result)<iterations)
-    result++;
-
-  return result;
+    log_error("unknown trust model '%s'\n",model);
 }
 }
+#endif /*NO_TRUST_MODELS*/
 
 
 /* This fucntion called to initialized a new control object.  It is
 
 
 /* This fucntion called to initialized a new control object.  It is
@@ -1799,7 +1891,7 @@ gpg_init_default_ctrl (ctrl_t ctrl)
 static void
 gpg_deinit_default_ctrl (ctrl_t ctrl)
 {
 static void
 gpg_deinit_default_ctrl (ctrl_t ctrl)
 {
-  (void)ctrl;
+  gpg_dirmngr_deinit_session_data (ctrl);
 }
 
 
 }
 
 
@@ -1807,15 +1899,15 @@ char *
 get_default_configname (void)
 {
   char *configname = NULL;
 get_default_configname (void)
 {
   char *configname = NULL;
-  char *name = xstrdup ("gpg" EXTSEP_S "conf-" SAFE_VERSION);
-  char *ver = &name[strlen ("gpg" EXTSEP_S "conf-")];
+  char *name = xstrdup (GPG_NAME EXTSEP_S "conf-" SAFE_VERSION);
+  char *ver = &name[strlen (GPG_NAME EXTSEP_S "conf-")];
 
   do
     {
       if (configname)
        {
          char *tok;
 
   do
     {
       if (configname)
        {
          char *tok;
-         
+
          xfree (configname);
          configname = NULL;
 
          xfree (configname);
          configname = NULL;
 
@@ -1826,21 +1918,21 @@ get_default_configname (void)
          else
            break;
        }
          else
            break;
        }
-      
+
       configname = make_filename (opt.homedir, name, NULL);
     }
   while (access (configname, R_OK));
 
   xfree(name);
       configname = make_filename (opt.homedir, name, NULL);
     }
   while (access (configname, R_OK));
 
   xfree(name);
-  
+
   if (! configname)
   if (! configname)
-    configname = make_filename (opt.homedir, "gpg" EXTSEP_S "conf", NULL);
+    configname = make_filename (opt.homedir, GPG_NAME 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))
   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);
+       log_info (_("NOTE: old default options file '%s' ignored\n"), p);
       xfree (p);
     }
   else
       xfree (p);
     }
   else
@@ -1872,7 +1964,7 @@ main (int argc, char **argv)
     char *username;
     int may_coredump;
     strlist_t sl, remusr= NULL, locusr=NULL;
     char *username;
     int may_coredump;
     strlist_t sl, remusr= NULL, locusr=NULL;
-    strlist_t nrings=NULL, sec_nrings=NULL;
+    strlist_t nrings = NULL;
     armor_filter_context_t *afx = NULL;
     int detached_sig = 0;
     FILE *configfp = NULL;
     armor_filter_context_t *afx = NULL;
     int detached_sig = 0;
     FILE *configfp = NULL;
@@ -1889,7 +1981,9 @@ main (int argc, char **argv)
     int use_random_seed = 1;
     enum cmd_and_opt_values cmd = 0;
     const char *debug_level = NULL;
     int use_random_seed = 1;
     enum cmd_and_opt_values cmd = 0;
     const char *debug_level = NULL;
+#ifndef NO_TRUST_MODELS
     const char *trustdb_name = NULL;
     const char *trustdb_name = NULL;
+#endif /*!NO_TRUST_MODELS*/
     char *def_cipher_string = NULL;
     char *def_digest_string = NULL;
     char *compress_algo_string = NULL;
     char *def_cipher_string = NULL;
     char *def_digest_string = NULL;
     char *compress_algo_string = NULL;
@@ -1906,6 +2000,7 @@ main (int argc, char **argv)
     int any_explicit_recipient = 0;
     int require_secmem=0,got_secmem=0;
     struct assuan_malloc_hooks malloc_hooks;
     int any_explicit_recipient = 0;
     int require_secmem=0,got_secmem=0;
     struct assuan_malloc_hooks malloc_hooks;
+    ctrl_t ctrl;
 
 #ifdef __riscos__
     opt.lock_once = 1;
 
 #ifdef __riscos__
     opt.lock_once = 1;
@@ -1915,16 +2010,16 @@ 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. */
     /* 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. */
-    gnupg_reopen_std ("gpg");
+    gnupg_reopen_std (GPG_NAME);
     trap_unaligned ();
     gnupg_rl_initialize ();
     set_strusage (my_strusage);
     gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
     trap_unaligned ();
     gnupg_rl_initialize ();
     set_strusage (my_strusage);
     gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
-    log_set_prefix ("gpg", 1);
+    log_set_prefix (GPG_NAME, 1);
 
     /* Make sure that our subsystems are ready.  */
     i18n_init();
 
     /* Make sure that our subsystems are ready.  */
     i18n_init();
-    init_common_subsystems ();
+    init_common_subsystems (&argc, &argv);
 
     /* Check that the libraries are suitable.  Do it right here because the
        option parsing may need services of the library.  */
 
     /* Check that the libraries are suitable.  Do it right here because the
        option parsing may need services of the library.  */
@@ -1934,6 +2029,9 @@ main (int argc, char **argv)
                     NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
       }
 
                     NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
       }
 
+    /* Use our own logging handler for Libcgrypt.  */
+    setup_libgcrypt_logging ();
+
     /* Put random number into secure memory */
     gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
 
     /* Put random number into secure memory */
     gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
 
@@ -1941,7 +2039,7 @@ main (int argc, char **argv)
 
     gnupg_init_signals (0, emergency_cleanup);
 
 
     gnupg_init_signals (0, emergency_cleanup);
 
-    create_dotlock(NULL); /* Register locking cleanup. */
+    dotlock_create (NULL, 0); /* Register lock file cleanup. */
 
     opt.session_env = session_env_new ();
     if (!opt.session_env)
 
     opt.session_env = session_env_new ();
     if (!opt.session_env)
@@ -1957,42 +2055,44 @@ main (int argc, char **argv)
     opt.cert_digest_algo = 0;
     opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
     opt.s2k_mode = 3; /* iterated+salted */
     opt.cert_digest_algo = 0;
     opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
     opt.s2k_mode = 3; /* iterated+salted */
-    opt.s2k_count = 96; /* 65536 iterations */
-#ifdef USE_CAST5
+    opt.s2k_count = 0; /* Auto-calibrate when needed.  */
     opt.s2k_cipher_algo = CIPHER_ALGO_CAST5;
     opt.s2k_cipher_algo = CIPHER_ALGO_CAST5;
-#else
-    opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
-#endif
     opt.completes_needed = 1;
     opt.marginals_needed = 3;
     opt.max_cert_depth = 5;
     opt.pgp2_workarounds = 1;
     opt.escape_from = 1;
     opt.flags.require_cross_cert = 1;
     opt.completes_needed = 1;
     opt.marginals_needed = 3;
     opt.max_cert_depth = 5;
     opt.pgp2_workarounds = 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;
-    opt.keyserver_options.export_options=EXPORT_ATTRIBUTES;
-    opt.keyserver_options.options=
-      KEYSERVER_HONOR_KEYSERVER_URL|KEYSERVER_HONOR_PKA_RECORD;
-    opt.verify_options=
-      VERIFY_SHOW_POLICY_URLS|VERIFY_SHOW_STD_NOTATIONS|VERIFY_SHOW_KEYSERVER_URLS;
-    opt.trust_model=TM_AUTO;
-    opt.mangle_dos_filenames=0;
-    opt.min_cert_level=2;
-    set_screen_dimensions();
-    opt.keyid_format=KF_SHORT;
-    opt.def_sig_expire="0";
-    opt.def_cert_expire="0";
-    set_homedir ( default_homedir () );
-    opt.passwd_repeat=1;
+    opt.import_options = 0;
+    opt.export_options = EXPORT_ATTRIBUTES;
+    opt.keyserver_options.import_options = IMPORT_REPAIR_PKS_SUBKEY_BUG;
+    opt.keyserver_options.export_options = EXPORT_ATTRIBUTES;
+    opt.keyserver_options.options = (KEYSERVER_HONOR_KEYSERVER_URL
+                                     | KEYSERVER_HONOR_PKA_RECORD );
+    opt.verify_options = (VERIFY_SHOW_POLICY_URLS
+                          | VERIFY_SHOW_STD_NOTATIONS
+                          | VERIFY_SHOW_KEYSERVER_URLS);
+#ifdef NO_TRUST_MODELS
+    opt.trust_model = TM_ALWAYS;
+#else
+    opt.trust_model = TM_AUTO;
+#endif
+    opt.mangle_dos_filenames = 0;
+    opt.min_cert_level = 2;
+    set_screen_dimensions ();
+    opt.keyid_format = KF_SHORT;
+    opt.def_sig_expire = "0";
+    opt.def_cert_expire = "0";
+    set_homedir (default_homedir ());
+    opt.passphrase_repeat = 1;
+    opt.emit_version = 1; /* Limit to the major number.  */
 
     /* Check whether we have a config file on the command line.  */
     orig_argc = argc;
     orig_argv = argv;
     pargs.argc = &argc;
     pargs.argv = &argv;
 
     /* Check whether we have a config file on the command line.  */
     orig_argc = argc;
     orig_argv = argv;
     pargs.argc = &argc;
     pargs.argv = &argv;
-    pargs.flags= 1|(1<<6);  /* do not remove the args, ignore version */
+    pargs.flags= (ARGPARSE_FLAG_KEEP | ARGPARSE_FLAG_NOVERSION);
     while( arg_parse( &pargs, opts) ) {
        if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
            parse_debug++;
     while( arg_parse( &pargs, opts) ) {
        if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
            parse_debug++;
@@ -2040,7 +2140,7 @@ main (int argc, char **argv)
 
     /* Initialize the secure memory. */
     if (!gcry_control (GCRYCTL_INIT_SECMEM, 32768, 0))
 
     /* Initialize the secure memory. */
     if (!gcry_control (GCRYCTL_INIT_SECMEM, 32768, 0))
-      got_secmem = 1; 
+      got_secmem = 1;
 #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 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. */
@@ -2056,9 +2156,9 @@ main (int argc, char **argv)
     malloc_hooks.realloc = gcry_realloc;
     malloc_hooks.free = gcry_free;
     assuan_set_malloc_hooks (&malloc_hooks);
     malloc_hooks.realloc = gcry_realloc;
     malloc_hooks.free = gcry_free;
     assuan_set_malloc_hooks (&malloc_hooks);
-    assuan_set_assuan_log_prefix (log_get_prefix (NULL));
     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
+    setup_libassuan_logging (&opt.debug);
+
     /* Try for a version specific config file first */
     default_configname = get_default_configname ();
     if (default_config)
     /* Try for a version specific config file first */
     default_configname = get_default_configname ();
     if (default_config)
@@ -2068,7 +2168,7 @@ main (int argc, char **argv)
     argv = orig_argv;
     pargs.argc = &argc;
     pargs.argv = &argv;
     argv = orig_argv;
     pargs.argc = &argc;
     pargs.argv = &argv;
-    pargs.flags=  1;  /* do not remove the args */
+    pargs.flags= ARGPARSE_FLAG_KEEP;
 
     /* By this point we have a homedir, and cannot change it. */
     check_permissions(opt.homedir,0);
 
     /* By this point we have a homedir, and cannot change it. */
     check_permissions(opt.homedir,0);
@@ -2092,23 +2192,23 @@ main (int argc, char **argv)
           {
             fclose (configfp);
             configfp = NULL;
           {
             fclose (configfp);
             configfp = NULL;
-            errno = EPERM;
+            gpg_err_set_errno (EPERM);
           }
        if( !configfp ) {
            if( default_config ) {
                if( parse_debug )
           }
        if( !configfp ) {
            if( default_config ) {
                if( parse_debug )
-                   log_info(_("NOTE: no default option file `%s'\n"),
+                   log_info(_("NOTE: no default option file '%s'\n"),
                                                            configname );
            }
            else {
                                                            configname );
            }
            else {
-               log_error(_("option file `%s': %s\n"),
+               log_error(_("option file '%s': %s\n"),
                                    configname, strerror(errno) );
                g10_exit(2);
            }
            xfree(configname); configname = NULL;
        }
        if( parse_debug && configname )
                                    configname, strerror(errno) );
                g10_exit(2);
            }
            xfree(configname); configname = NULL;
        }
        if( parse_debug && configname )
-           log_info(_("reading options from `%s'\n"), configname );
+           log_info(_("reading options from '%s'\n"), configname );
        default_config = 0;
     }
 
        default_config = 0;
     }
 
@@ -2117,59 +2217,60 @@ main (int argc, char **argv)
       {
        switch( pargs.r_opt )
          {
       {
        switch( pargs.r_opt )
          {
-         case aCheckKeys: 
+         case aCheckKeys:
          case aListConfig:
           case aGPGConfList:
           case aGPGConfTest:
          case aListPackets:
          case aListConfig:
           case aGPGConfList:
           case aGPGConfTest:
          case aListPackets:
-         case aImport: 
-         case aFastImport: 
-         case aSendKeys: 
-         case aRecvKeys: 
+         case aImport:
+         case aFastImport:
+         case aSendKeys:
+         case aRecvKeys:
          case aSearchKeys:
          case aRefreshKeys:
          case aFetchKeys:
          case aSearchKeys:
          case aRefreshKeys:
          case aFetchKeys:
-         case aExport: 
+         case aExport:
 #ifdef ENABLE_CARD_SUPPORT
           case aCardStatus:
 #ifdef ENABLE_CARD_SUPPORT
           case aCardStatus:
-          case aCardEdit: 
+          case aCardEdit:
           case aChangePIN:
 #endif /* ENABLE_CARD_SUPPORT*/
           case aChangePIN:
 #endif /* ENABLE_CARD_SUPPORT*/
-         case aListKeys: 
+         case aListKeys:
          case aLocateKeys:
          case aLocateKeys:
-         case aListSigs: 
-         case aExportSecret: 
-         case aExportSecretSub: 
+         case aListSigs:
+         case aExportSecret:
+         case aExportSecretSub:
          case aSym:
          case aSym:
-         case aClearsign: 
-         case aGenRevoke: 
-         case aDesigRevoke: 
-         case aPrimegen: 
+         case aClearsign:
+         case aGenRevoke:
+         case aDesigRevoke:
+         case aPrimegen:
          case aGenRandom:
          case aPrintMD:
          case aGenRandom:
          case aPrintMD:
-         case aPrintMDs: 
-         case aListTrustDB: 
+         case aPrintMDs:
+         case aListTrustDB:
          case aCheckTrustDB:
          case aCheckTrustDB:
-         case aUpdateTrustDB: 
-         case aFixTrustDB: 
-         case aListTrustPath: 
-         case aDeArmor: 
-         case aEnArmor: 
-         case aSign: 
-         case aSignKey: 
+         case aUpdateTrustDB:
+         case aFixTrustDB:
+         case aListTrustPath:
+         case aDeArmor:
+         case aEnArmor:
+         case aSign:
+         case aSignKey:
          case aLSignKey:
          case aLSignKey:
-         case aStore: 
-         case aExportOwnerTrust: 
-         case aImportOwnerTrust: 
+         case aStore:
+         case aExportOwnerTrust:
+         case aImportOwnerTrust:
           case aRebuildKeydbCaches:
             set_cmd (&cmd, pargs.r_opt);
             break;
 
           case aRebuildKeydbCaches:
             set_cmd (&cmd, pargs.r_opt);
             break;
 
-         case aKeygen: 
+         case aKeygen:
          case aEditKey:
          case aDeleteSecretKeys:
          case aDeleteSecretAndPublicKeys:
          case aDeleteKeys:
          case aEditKey:
          case aDeleteSecretKeys:
          case aDeleteSecretAndPublicKeys:
          case aDeleteKeys:
+          case aPasswd:
             set_cmd (&cmd, pargs.r_opt);
             greeting=1;
             break;
             set_cmd (&cmd, pargs.r_opt);
             greeting=1;
             break;
@@ -2214,7 +2315,7 @@ main (int argc, char **argv)
           case oNoUseAgent:
            obsolete_option (configname, configlineno, "--no-use-agent");
             break;
           case oNoUseAgent:
            obsolete_option (configname, configlineno, "--no-use-agent");
             break;
-         case oGpgAgentInfo: 
+         case oGpgAgentInfo:
            obsolete_option (configname, configlineno, "--gpg-agent-info");
             break;
 
            obsolete_option (configname, configlineno, "--gpg-agent-info");
             break;
 
@@ -2222,8 +2323,8 @@ main (int argc, char **argv)
          case oAnswerNo: opt.answer_no = 1; break;
          case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
          case oPrimaryKeyring:
          case oAnswerNo: opt.answer_no = 1; break;
          case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
          case oPrimaryKeyring:
-           sl=append_to_strlist( &nrings, pargs.r.ret_str);
-           sl->flags=2;
+           sl = append_to_strlist (&nrings, pargs.r.ret_str);
+           sl->flags = KEYDB_RESOURCE_FLAG_PRIMARY;
            break;
          case oShowKeyring:
            deprecated_warning(configname,configlineno,"--show-keyring",
            break;
          case oShowKeyring:
            deprecated_warning(configname,configlineno,"--show-keyring",
@@ -2263,9 +2364,14 @@ main (int argc, char **argv)
             fpr_maybe_cmd = 1;
             break;
 
             fpr_maybe_cmd = 1;
             break;
 
+         case oWithKeygrip:
+            opt.with_keygrip = 1;
+            break;
+
          case oSecretKeyring:
          case oSecretKeyring:
-            append_to_strlist( &sec_nrings, pargs.r.ret_str);
+            /* Ignore this old option.  */
             break;
             break;
+
          case oOptions:
            /* config files may not be nested (silently ignore them) */
            if( !configfp ) {
          case oOptions:
            /* config files may not be nested (silently ignore them) */
            if( !configfp ) {
@@ -2277,20 +2383,24 @@ main (int argc, char **argv)
          case oNoArmor: opt.no_armor=1; opt.armor=0; break;
          case oNoDefKeyring: default_keyring = 0; break;
          case oNoGreeting: nogreeting = 1; break;
          case oNoArmor: opt.no_armor=1; opt.armor=0; break;
          case oNoDefKeyring: default_keyring = 0; break;
          case oNoGreeting: nogreeting = 1; break;
-         case oNoVerbose: 
+         case oNoVerbose:
             opt.verbose = 0;
             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
             opt.list_sigs=0;
             break;
             opt.verbose = 0;
             gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
             opt.list_sigs=0;
             break;
-          case oQuickRandom: 
+          case oQuickRandom:
             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
             break;
             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
             break;
-         case oEmitVersion: opt.no_version=0; break;
-         case oNoEmitVersion: opt.no_version=1; break;
+         case oEmitVersion: opt.emit_version++; break;
+         case oNoEmitVersion: opt.emit_version=0; break;
          case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
          case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
          case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
          case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
          case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
          case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
+
+#ifndef NO_TRUST_MODELS
          case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
          case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
+
+#endif /*!NO_TRUST_MODELS*/
          case oDefaultKey: opt.def_secret_key = pargs.r.ret_str; break;
          case oDefRecipient:
             if( *pargs.r.ret_str )
          case oDefaultKey: opt.def_secret_key = pargs.r.ret_str; break;
          case oDefRecipient:
             if( *pargs.r.ret_str )
@@ -2312,11 +2422,17 @@ main (int argc, char **argv)
          case oWithColons: opt.with_colons=':'; break;
 
           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
          case oWithColons: opt.with_colons=':'; break;
 
           case oWithSigCheck: opt.check_sigs = 1; /*FALLTHRU*/
-          case oWithSigList: opt.list_sigs = 1; break;  
+          case oWithSigList: opt.list_sigs = 1; break;
 
          case oSkipVerify: opt.skip_verify=1; break;
 
          case oSkipVerify: opt.skip_verify=1; break;
+
+         case oSkipHiddenRecipients: opt.skip_hidden_recipients = 1; break;
+         case oNoSkipHiddenRecipients: opt.skip_hidden_recipients = 0; break;
+
          case oCompressKeys: opt.compress_keys = 1; break;
          case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
          case oCompressKeys: opt.compress_keys = 1; break;
          case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
+
+#ifndef NO_TRUST_MODELS
            /* There are many programs (like mutt) that call gpg with
               --always-trust so keep this option around for a long
               time. */
            /* There are many programs (like mutt) that call gpg with
               --always-trust so keep this option around for a long
               time. */
@@ -2324,13 +2440,15 @@ main (int argc, char **argv)
          case oTrustModel:
            parse_trust_model(pargs.r.ret_str);
            break;
          case oTrustModel:
            parse_trust_model(pargs.r.ret_str);
            break;
+#endif /*!NO_TRUST_MODELS*/
+
          case oForceOwnertrust:
            log_info(_("NOTE: %s is not for normal use!\n"),
                     "--force-ownertrust");
            opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
            if(opt.force_ownertrust==-1)
              {
          case oForceOwnertrust:
            log_info(_("NOTE: %s is not for normal use!\n"),
                     "--force-ownertrust");
            opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
            if(opt.force_ownertrust==-1)
              {
-               log_error("invalid ownertrust `%s'\n",pargs.r.ret_str);
+               log_error("invalid ownertrust '%s'\n",pargs.r.ret_str);
                opt.force_ownertrust=0;
              }
            break;
                opt.force_ownertrust=0;
              }
            break;
@@ -2476,9 +2594,11 @@ main (int argc, char **argv)
          case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
          case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
          case oS2KCount:
          case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
          case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
          case oS2KCount:
-           opt.s2k_count=encode_s2k_iterations(pargs.r.ret_int);
+           if (pargs.r.ret_int)
+              opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
+            else
+              opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
            break;
            break;
-          case oSimpleSKChecksum: opt.simple_sk_checksum = 1; break;
          case oNoEncryptTo: opt.no_encrypt_to = 1; break;
          case oEncryptTo: /* store the recipient in the second list */
            sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
          case oNoEncryptTo: opt.no_encrypt_to = 1; break;
          case oEncryptTo: /* store the recipient in the second list */
            sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
@@ -2497,6 +2617,12 @@ main (int argc, char **argv)
            sl->flags = 2;
             any_explicit_recipient = 1;
            break;
            sl->flags = 2;
             any_explicit_recipient = 1;
            break;
+
+         case oTrySecretKey:
+           add_to_strlist2 (&opt.secret_keys_to_try,
+                             pargs.r.ret_str, utf8_strings);
+           break;
+
          case oTextmodeShort: opt.textmode = 2; break;
          case oTextmode: opt.textmode=1;  break;
          case oNoTextmode: opt.textmode=0;  break;
          case oTextmodeShort: opt.textmode = 2; break;
          case oTextmode: opt.textmode=1;  break;
          case oNoTextmode: opt.textmode=0;  break;
@@ -2506,7 +2632,7 @@ main (int argc, char **argv)
            if(*pargs.r.ret_str!='\0')
              {
                if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
            if(*pargs.r.ret_str!='\0')
              {
                if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
-                 log_error(_("`%s' is not a valid signature expiration\n"),
+                 log_error(_("'%s' is not a valid signature expiration\n"),
                            pargs.r.ret_str);
                else
                  opt.def_sig_expire=pargs.r.ret_str;
                            pargs.r.ret_str);
                else
                  opt.def_sig_expire=pargs.r.ret_str;
@@ -2518,7 +2644,7 @@ main (int argc, char **argv)
            if(*pargs.r.ret_str!='\0')
              {
                if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
            if(*pargs.r.ret_str!='\0')
              {
                if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
-                 log_error(_("`%s' is not a valid signature expiration\n"),
+                 log_error(_("'%s' is not a valid signature expiration\n"),
                            pargs.r.ret_str);
                else
                  opt.def_cert_expire=pargs.r.ret_str;
                            pargs.r.ret_str);
                else
                  opt.def_cert_expire=pargs.r.ret_str;
@@ -2540,23 +2666,32 @@ main (int argc, char **argv)
          case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
          case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
          case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
          case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
          case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
          case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
-         case oPasswd:
+         case oPassphrase:
            set_passphrase_from_string(pargs.r.ret_str);
            break;
            set_passphrase_from_string(pargs.r.ret_str);
            break;
-         case oPasswdFD:
+         case oPassphraseFD:
             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
             break;
             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
             break;
-         case oPasswdFile:
+         case oPassphraseFile:
             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
             break;
             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
             break;
-         case oPasswdRepeat: opt.passwd_repeat=pargs.r.ret_int; break;
+         case oPassphraseRepeat:
+            opt.passphrase_repeat = pargs.r.ret_int;
+            break;
+
+          case oPinentryMode:
+           opt.pinentry_mode = parse_pinentry_mode (pargs.r.ret_str);
+           if (opt.pinentry_mode == -1)
+              log_error (_("invalid pinentry mode '%s'\n"), pargs.r.ret_str);
+           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, 1);
             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, 1);
             break;
-         case oCipherAlgo: 
+         case oCipherAlgo:
             def_cipher_string = xstrdup(pargs.r.ret_str);
             break;
          case oDigestAlgo:
             def_cipher_string = xstrdup(pargs.r.ret_str);
             break;
          case oDigestAlgo:
@@ -2586,12 +2721,12 @@ main (int argc, char **argv)
                compress_algo_string = xstrdup(pargs.r.ret_str);
            }
            break;
                compress_algo_string = xstrdup(pargs.r.ret_str);
            }
            break;
-         case oCertDigestAlgo: 
+         case oCertDigestAlgo:
             cert_digest_string = xstrdup(pargs.r.ret_str);
             break;
 
             cert_digest_string = xstrdup(pargs.r.ret_str);
             break;
 
-         case oNoSecmemWarn: 
-            gcry_control (GCRYCTL_DISABLE_SECMEM_WARN); 
+         case oNoSecmemWarn:
+            gcry_control (GCRYCTL_DISABLE_SECMEM_WARN);
             break;
 
          case oRequireSecmem: require_secmem=1; break;
             break;
 
          case oRequireSecmem: require_secmem=1; break;
@@ -2600,7 +2735,7 @@ main (int argc, char **argv)
          case oNoMDCWarn: opt.no_mdc_warn=1; break;
           case oDisplayCharset:
            if( set_native_charset( pargs.r.ret_str ) )
          case oNoMDCWarn: opt.no_mdc_warn=1; break;
           case oDisplayCharset:
            if( set_native_charset( pargs.r.ret_str ) )
-               log_error(_("`%s' is not a valid character set\n"),
+               log_error(_("'%s' is not a valid character set\n"),
                          pargs.r.ret_str);
            break;
          case oNotDashEscaped: opt.not_dash_escaped = 1; break;
                          pargs.r.ret_str);
            break;
          case oNotDashEscaped: opt.not_dash_escaped = 1; break;
@@ -2608,7 +2743,7 @@ main (int argc, char **argv)
          case oNoEscapeFrom: opt.escape_from = 0; break;
          case oLockOnce: opt.lock_once = 1; break;
          case oLockNever:
          case oNoEscapeFrom: opt.escape_from = 0; break;
          case oLockOnce: opt.lock_once = 1; break;
          case oLockNever:
-            disable_dotlock ();
+            dotlock_disable ();
             break;
          case oLockMultiple:
 #ifndef __riscos__
             break;
          case oLockMultiple:
 #ifndef __riscos__
@@ -2619,15 +2754,15 @@ main (int argc, char **argv)
             break;
          case oKeyServer:
            {
             break;
          case oKeyServer:
            {
-             struct keyserver_spec *keyserver;
-             keyserver=parse_keyserver_uri(pargs.r.ret_str,0,
-                                           configname,configlineno);
-             if(!keyserver)
-               log_error(_("could not parse keyserver URL\n"));
+             keyserver_spec_t keyserver;
+             keyserver = parse_keyserver_uri (pargs.r.ret_str,0,
+                                               configname,configlineno);
+             if (!keyserver)
+               log_error (_("could not parse keyserver URL\n"));
              else
                {
              else
                {
-                 keyserver->next=opt.keyserver;
-                 opt.keyserver=keyserver;
+                 keyserver->next = opt.keyserver;
+                 opt.keyserver = keyserver;
                }
            }
            break;
                }
            }
            break;
@@ -2771,6 +2906,7 @@ main (int argc, char **argv)
                break;
          case oFastListMode: opt.fast_list_mode = 1; break;
          case oFixedListMode: /* Dummy */ break;
                break;
          case oFastListMode: opt.fast_list_mode = 1; break;
          case oFixedListMode: /* Dummy */ break;
+          case oLegacyListMode: opt.legacy_list_mode = 1; break;
          case oListOnly: opt.list_only=1; break;
          case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
          case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
          case oListOnly: opt.list_only=1; break;
          case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
          case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
@@ -2814,13 +2950,13 @@ main (int argc, char **argv)
            break;
          case oDefaultKeyserverURL:
            {
            break;
          case oDefaultKeyserverURL:
            {
-             struct keyserver_spec *keyserver;
-             keyserver=parse_keyserver_uri(pargs.r.ret_str,1,
-                                           configname,configlineno);
-             if(!keyserver)
-               log_error(_("could not parse keyserver URL\n"));
+             keyserver_spec_t keyserver;
+             keyserver = parse_keyserver_uri (pargs.r.ret_str,1,
+                                               configname,configlineno);
+             if (!keyserver)
+               log_error (_("could not parse keyserver URL\n"));
              else
              else
-               free_keyserver_spec(keyserver);
+               free_keyserver_spec (keyserver);
 
              opt.def_keyserver_url = pargs.r.ret_str;
            }
 
              opt.def_keyserver_url = pargs.r.ret_str;
            }
@@ -2864,8 +3000,8 @@ main (int argc, char **argv)
              }
            break;
 
              }
            break;
 
-         case oStrict: 
-         case oNoStrict: 
+         case oStrict:
+         case oNoStrict:
            /* Not used */
             break;
 
            /* Not used */
             break;
 
@@ -2883,15 +3019,15 @@ main (int argc, char **argv)
            else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
              opt.keyid_format=KF_0xLONG;
            else
            else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
              opt.keyid_format=KF_0xLONG;
            else
-             log_error("unknown keyid-format `%s'\n",pargs.r.ret_str);
+             log_error("unknown keyid-format '%s'\n",pargs.r.ret_str);
            break;
 
           case oExitOnStatusWriteError:
             opt.exit_on_status_write_error = 1;
             break;
 
            break;
 
           case oExitOnStatusWriteError:
             opt.exit_on_status_write_error = 1;
             break;
 
-         case oLimitCardInsertTries: 
-            opt.limit_card_insert_tries = pargs.r.ret_int; 
+         case oLimitCardInsertTries:
+            opt.limit_card_insert_tries = pargs.r.ret_int;
             break;
 
          case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
             break;
 
          case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
@@ -2923,16 +3059,25 @@ main (int argc, char **argv)
            opt.flags.allow_multiple_messages=0;
            break;
 
            opt.flags.allow_multiple_messages=0;
            break;
 
+          case oFakedSystemTime:
+            {
+              time_t faked_time = isotime2epoch (pargs.r.ret_str);
+              if (faked_time == (time_t)(-1))
+                faked_time = (time_t)strtoul (pargs.r.ret_str, NULL, 10);
+              gnupg_set_time (faked_time, 0);
+            }
+            break;
+
          case oNoop: break;
 
          case oNoop: break;
 
-         default: 
+         default:
             pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
             break;
          }
       }
 
             pargs.err = configfp? ARGPARSE_PRINT_WARNING:ARGPARSE_PRINT_ERROR;
             break;
          }
       }
 
-
-    if( configfp ) {
+    if (configfp)
+      {
        fclose( configfp );
        configfp = NULL;
         /* Remember the first config file name. */
        fclose( configfp );
        configfp = NULL;
         /* Remember the first config file name. */
@@ -2942,10 +3087,10 @@ main (int argc, char **argv)
           xfree(configname);
         configname = NULL;
        goto next_pass;
           xfree(configname);
         configname = NULL;
        goto next_pass;
-    }
-    xfree( configname ); configname = NULL;
-    if( log_get_errorcount(0) )
-       g10_exit(2);
+      }
+    xfree(configname); configname = NULL;
+    if (log_get_errorcount (0))
+      g10_exit(2);
 
     /* The command --gpgconf-list is pretty simple and may be called
        directly after the option parsing. */
 
     /* The command --gpgconf-list is pretty simple and may be called
        directly after the option parsing. */
@@ -2960,11 +3105,12 @@ main (int argc, char **argv)
     if( nogreeting )
        greeting = 0;
 
     if( nogreeting )
        greeting = 0;
 
-    if( greeting ) {
-       fprintf(stderr, "%s %s; %s\n",
-                       strusage(11), strusage(13), strusage(14) );
-       fprintf(stderr, "%s\n", strusage(15) );
-    }
+    if( greeting )
+      {
+       es_fprintf (es_stderr, "%s %s; %s\n",
+                    strusage(11), strusage(13), strusage(14) );
+       es_fprintf (es_stderr, "%s\n", strusage(15) );
+      }
 #ifdef IS_DEVELOPMENT_VERSION
     if (!opt.batch)
       {
 #ifdef IS_DEVELOPMENT_VERSION
     if (!opt.batch)
       {
@@ -2999,7 +3145,7 @@ main (int argc, char **argv)
       }
 
     if (opt.verbose > 2)
       }
 
     if (opt.verbose > 2)
-        log_info ("using character set `%s'\n", get_native_charset ());
+        log_info ("using character set '%s'\n", get_native_charset ());
 
     if( may_coredump && !opt.quiet )
        log_info(_("WARNING: program may create a core file!\n"));
 
     if( may_coredump && !opt.quiet )
        log_info(_("WARNING: program may create a core file!\n"));
@@ -3029,6 +3175,27 @@ main (int argc, char **argv)
     if( opt.batch )
        tty_batchmode( 1 );
 
     if( opt.batch )
        tty_batchmode( 1 );
 
+    if (gnupg_faked_time_p ())
+      {
+        gnupg_isotime_t tbuf;
+
+        log_info (_("WARNING: running with faked system time: "));
+        gnupg_get_isotime (tbuf);
+        dump_isotime (tbuf);
+        log_printf ("\n");
+      }
+
+    /* Print a warning if an argument looks like an option.  */
+    if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
+      {
+        int i;
+
+        for (i=0; i < argc; i++)
+          if (argv[i][0] == '-' && argv[i][1] == '-')
+            log_info (_("NOTE: '%s' is not considered an option\n"), argv[i]);
+      }
+
+
     gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
 
     if(require_secmem && !got_secmem)
     gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
 
     if(require_secmem && !got_secmem)
@@ -3039,6 +3206,8 @@ main (int argc, char **argv)
       }
 
     set_debug (debug_level);
       }
 
     set_debug (debug_level);
+    if (DBG_CLOCK)
+      log_clock ("start");
 
     /* Do these after the switch(), so they can override settings. */
     if(PGP2)
 
     /* Do these after the switch(), so they can override settings. */
     if(PGP2)
@@ -3074,7 +3243,6 @@ main (int argc, char **argv)
              {
                log_info(_("encrypting a message in --pgp2 mode requires "
                           "the IDEA cipher\n"));
              {
                log_info(_("encrypting a message in --pgp2 mode requires "
                           "the IDEA cipher\n"));
-               idea_cipher_warn(1);
                unusable=1;
              }
            else if(cmd==aSym)
                unusable=1;
              }
            else if(cmd==aSym)
@@ -3133,10 +3301,6 @@ main (int argc, char **argv)
 
     if( def_cipher_string ) {
        opt.def_cipher_algo = string_to_cipher_algo (def_cipher_string);
 
     if( def_cipher_string ) {
        opt.def_cipher_algo = string_to_cipher_algo (def_cipher_string);
-       if(opt.def_cipher_algo==0 &&
-          (ascii_strcasecmp(def_cipher_string,"idea")==0
-           || ascii_strcasecmp(def_cipher_string,"s1")==0))
-         idea_cipher_warn(1);
        xfree(def_cipher_string); def_cipher_string = NULL;
        if ( openpgp_cipher_test_algo (opt.def_cipher_algo) )
            log_error(_("selected cipher algorithm is invalid\n"));
        xfree(def_cipher_string); def_cipher_string = NULL;
        if ( openpgp_cipher_test_algo (opt.def_cipher_algo) )
            log_error(_("selected cipher algorithm is invalid\n"));
@@ -3286,17 +3450,17 @@ main (int argc, char **argv)
            switch(badtype)
              {
              case PREFTYPE_SYM:
            switch(badtype)
              {
              case PREFTYPE_SYM:
-               log_info(_("you may not use cipher algorithm `%s'"
+               log_info(_("you may not use cipher algorithm '%s'"
                           " while in %s mode\n"),
                         badalg,compliance_option_string());
                break;
              case PREFTYPE_HASH:
                           " while in %s mode\n"),
                         badalg,compliance_option_string());
                break;
              case PREFTYPE_HASH:
-               log_info(_("you may not use digest algorithm `%s'"
+               log_info(_("you may not use digest algorithm '%s'"
                           " while in %s mode\n"),
                         badalg,compliance_option_string());
                break;
              case PREFTYPE_ZIP:
                           " while in %s mode\n"),
                         badalg,compliance_option_string());
                break;
              case PREFTYPE_ZIP:
-               log_info(_("you may not use compression algorithm `%s'"
+               log_info(_("you may not use compression algorithm '%s'"
                           " while in %s mode\n"),
                         badalg,compliance_option_string());
                break;
                           " while in %s mode\n"),
                         badalg,compliance_option_string());
                break;
@@ -3328,33 +3492,20 @@ main (int argc, char **argv)
     if( opt.verbose > 1 )
        set_packet_list_mode(1);
 
     if( opt.verbose > 1 )
        set_packet_list_mode(1);
 
-    /* Add the keyrings, but not for some special commands.  Also
-       avoid adding the secret keyring for a couple of commands to
-       avoid unneeded access in case the secrings are stored on a
-       floppy.
-       
+    /* Add the keyrings, but not for some special commands.
        We always need to add the keyrings if we are running under
        SELinux, this is so that the rings are added to the list of
        secured files. */
        We always need to add the keyrings if we are running under
        SELinux, this is so that the rings are added to the list of
        secured files. */
-    if( ALWAYS_ADD_KEYRINGS 
-        || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest) ) 
+    if( ALWAYS_ADD_KEYRINGS
+        || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest) )
       {
       {
-        if (ALWAYS_ADD_KEYRINGS
-            || (cmd != aCheckKeys && cmd != aListSigs && cmd != aListKeys
-                && cmd != aVerify && cmd != aSym && cmd != aLocateKeys))
-          {
-            if (!sec_nrings || default_keyring) /* add default secret rings */
-              keydb_add_resource ("secring" EXTSEP_S "gpg", 4, 1);
-            for (sl = sec_nrings; sl; sl = sl->next)
-              keydb_add_resource ( sl->d, 0, 1 );
-          }
-       if( !nrings || default_keyring )  /* add default ring */
-           keydb_add_resource ("pubring" EXTSEP_S "gpg", 4, 0);
-       for(sl = nrings; sl; sl = sl->next )
-           keydb_add_resource ( sl->d, sl->flags, 0 );
+       if (!nrings || default_keyring)  /* Add default ring. */
+           keydb_add_resource ("pubring" EXTSEP_S GPGEXT_GPG,
+                                KEYDB_RESOURCE_FLAG_DEFAULT);
+       for (sl = nrings; sl; sl = sl->next )
+          keydb_add_resource (sl->d, sl->flags);
       }
     FREE_STRLIST(nrings);
       }
     FREE_STRLIST(nrings);
-    FREE_STRLIST(sec_nrings);
 
     if (cmd == aGPGConfTest)
       g10_exit(0);
 
     if (cmd == aGPGConfTest)
       g10_exit(0);
@@ -3368,7 +3519,12 @@ main (int argc, char **argv)
     if(fname && utf8_strings)
       opt.flags.utf8_filename=1;
 
     if(fname && utf8_strings)
       opt.flags.utf8_filename=1;
 
-    switch( cmd ) {
+    ctrl = xcalloc (1, sizeof *ctrl);
+    gpg_init_default_ctrl (ctrl);
+
+#ifndef NO_TRUST_MODELS
+    switch (cmd)
+      {
       case aPrimegen:
       case aPrintMD:
       case aPrintMDs:
       case aPrimegen:
       case aPrintMD:
       case aPrintMDs:
@@ -3377,21 +3533,29 @@ main (int argc, char **argv)
       case aEnArmor:
        break;
       case aFixTrustDB:
       case aEnArmor:
        break;
       case aFixTrustDB:
-      case aExportOwnerTrust: rc = setup_trustdb( 0, trustdb_name ); break;
-      case aListTrustDB: rc = setup_trustdb( argc? 1:0, trustdb_name ); break;
-      default: rc = setup_trustdb(1, trustdb_name ); break;
-    }
-    if( rc )
-       log_error(_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
-
+      case aExportOwnerTrust:
+        rc = setup_trustdb (0, trustdb_name);
+        break;
+      case aListTrustDB:
+        rc = setup_trustdb (argc? 1:0, trustdb_name);
+        break;
+      default:
+        /* If we are using TM_ALWAYS, we do not need to create the
+           trustdb.  */
+        rc = setup_trustdb (opt.trust_model != TM_ALWAYS, trustdb_name);
+        break;
+      }
+    if (rc)
+      log_error (_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
+#endif /*!NO_TRUST_MODELS*/
 
     switch (cmd)
       {
 
     switch (cmd)
       {
-      case aStore: 
-      case aSym:  
-      case aSign: 
-      case aSignSym: 
-      case aClearsign: 
+      case aStore:
+      case aSym:
+      case aSign:
+      case aSignSym:
+      case aClearsign:
         if (!opt.quiet && any_explicit_recipient)
           log_info (_("WARNING: recipients (-r) given "
                       "without using public key encryption\n"));
         if (!opt.quiet && any_explicit_recipient)
           log_info (_("WARNING: recipients (-r) given "
                       "without using public key encryption\n"));
@@ -3403,39 +3567,32 @@ main (int argc, char **argv)
     switch( cmd )
       {
       case aServer:
     switch( cmd )
       {
       case aServer:
-        {
-          ctrl_t ctrl = xtrycalloc (1, sizeof *ctrl);
-          gpg_init_default_ctrl (ctrl);
-          gpg_server (ctrl);
-          gpg_deinit_default_ctrl (ctrl);
-          xfree (ctrl);
-        }
+        gpg_server (ctrl);
         break;
 
       case aStore: /* only store the file */
        if( argc > 1 )
            wrong_args(_("--store [filename]"));
        if( (rc = encrypt_store(fname)) )
         break;
 
       case aStore: /* only store the file */
        if( argc > 1 )
            wrong_args(_("--store [filename]"));
        if( (rc = encrypt_store(fname)) )
-           log_error ("storing `%s' failed: %s\n",
+           log_error ("storing '%s' failed: %s\n",
                        print_fname_stdin(fname),g10_errstr(rc) );
        break;
       case aSym: /* encrypt the given file only with the symmetric cipher */
        if( argc > 1 )
            wrong_args(_("--symmetric [filename]"));
        if( (rc = encrypt_symmetric(fname)) )
                        print_fname_stdin(fname),g10_errstr(rc) );
        break;
       case aSym: /* encrypt the given file only with the symmetric cipher */
        if( argc > 1 )
            wrong_args(_("--symmetric [filename]"));
        if( (rc = encrypt_symmetric(fname)) )
-            log_error (_("symmetric encryption of `%s' failed: %s\n"),
+            log_error (_("symmetric encryption of '%s' failed: %s\n"),
                         print_fname_stdin(fname),g10_errstr(rc) );
        break;
 
       case aEncr: /* encrypt the given file */
        if(multifile)
                         print_fname_stdin(fname),g10_errstr(rc) );
        break;
 
       case aEncr: /* encrypt the given file */
        if(multifile)
-         encrypt_crypt_files(argc, argv, remusr);
+         encrypt_crypt_files (ctrl, argc, argv, remusr);
        else
          {
            if( argc > 1 )
              wrong_args(_("--encrypt [filename]"));
        else
          {
            if( argc > 1 )
              wrong_args(_("--encrypt [filename]"));
-           if( (rc = encrypt_crypt (GNUPG_INVALID_FD, fname,
-                                     remusr, 0, NULL, GNUPG_INVALID_FD)) )
+           if( (rc = encrypt_crypt (ctrl, -1, fname, remusr, 0, NULL, -1)) )
              log_error("%s: encryption failed: %s\n",
                        print_fname_stdin(fname), g10_errstr(rc) );
          }
              log_error("%s: encryption failed: %s\n",
                        print_fname_stdin(fname), g10_errstr(rc) );
          }
@@ -3456,8 +3613,7 @@ main (int argc, char **argv)
                      " while in %s mode\n"),compliance_option_string());
        else
          {
                      " while in %s mode\n"),compliance_option_string());
        else
          {
-           if( (rc = encrypt_crypt (GNUPG_INVALID_FD, fname, 
-                                     remusr, 1, NULL, GNUPG_INVALID_FD)) )
+           if( (rc = encrypt_crypt (ctrl, -1, fname, remusr, 1, NULL, -1)) )
              log_error("%s: encryption failed: %s\n",
                        print_fname_stdin(fname), g10_errstr(rc) );
          }
              log_error("%s: encryption failed: %s\n",
                        print_fname_stdin(fname), g10_errstr(rc) );
          }
@@ -3477,7 +3633,7 @@ main (int argc, char **argv)
                strcpy(sl->d, fname);
            }
        }
                strcpy(sl->d, fname);
            }
        }
-       if( (rc = sign_file( sl, detached_sig, locusr, 0, NULL, NULL)) )
+       if( (rc = sign_file (ctrl, sl, detached_sig, locusr, 0, NULL, NULL)) )
            log_error("signing failed: %s\n", g10_errstr(rc) );
        free_strlist(sl);
        break;
            log_error("signing failed: %s\n", g10_errstr(rc) );
        free_strlist(sl);
        break;
@@ -3491,7 +3647,7 @@ main (int argc, char **argv)
        }
        else
            sl = NULL;
        }
        else
            sl = NULL;
-       if( (rc = sign_file(sl, detached_sig, locusr, 1, remusr, NULL)) )
+       if ((rc = sign_file (ctrl, sl, detached_sig, locusr, 1, remusr, NULL)))
            log_error("%s: sign+encrypt failed: %s\n",
                      print_fname_stdin(fname), g10_errstr(rc) );
        free_strlist(sl);
            log_error("%s: sign+encrypt failed: %s\n",
                      print_fname_stdin(fname), g10_errstr(rc) );
        free_strlist(sl);
@@ -3515,7 +3671,8 @@ main (int argc, char **argv)
              }
            else
              sl = NULL;
              }
            else
              sl = NULL;
-           if( (rc = sign_file(sl, detached_sig, locusr, 2, remusr, NULL)) )
+           if ((rc = sign_file (ctrl, sl, detached_sig, locusr,
+                                 2, remusr, NULL)))
              log_error("%s: symmetric+sign+encrypt failed: %s\n",
                        print_fname_stdin(fname), g10_errstr(rc) );
            free_strlist(sl);
              log_error("%s: symmetric+sign+encrypt failed: %s\n",
                        print_fname_stdin(fname), g10_errstr(rc) );
            free_strlist(sl);
@@ -3540,30 +3697,30 @@ main (int argc, char **argv)
        break;
 
       case aVerify:
        break;
 
       case aVerify:
-       if(multifile)
+       if (multifile)
          {
          {
-           if( (rc = verify_files( argc, argv ) ))
+           if ((rc = verify_files (ctrl, argc, argv)))
              log_error("verify files failed: %s\n", g10_errstr(rc) );
          }
        else
          {
              log_error("verify files failed: %s\n", g10_errstr(rc) );
          }
        else
          {
-           if( (rc = verify_signatures( argc, argv ) ))
+           if ((rc = verify_signatures (ctrl, argc, argv)))
              log_error("verify signatures failed: %s\n", g10_errstr(rc) );
          }
        break;
 
       case aDecrypt:
              log_error("verify signatures failed: %s\n", g10_errstr(rc) );
          }
        break;
 
       case aDecrypt:
-        if(multifile)
-         decrypt_messages(argc, argv);
+        if (multifile)
+         decrypt_messages (ctrl, argc, argv);
        else
          {
            if( argc > 1 )
              wrong_args(_("--decrypt [filename]"));
        else
          {
            if( argc > 1 )
              wrong_args(_("--decrypt [filename]"));
-           if( (rc = decrypt_message( fname ) ))
+           if( (rc = decrypt_message (ctrl, fname) ))
              log_error("decrypt_message failed: %s\n", g10_errstr(rc) );
          }
        break;
              log_error("decrypt_message failed: %s\n", g10_errstr(rc) );
          }
        break;
-            
+
       case aSignKey:
        if( argc != 1 )
          wrong_args(_("--sign-key user-id"));
       case aSignKey:
        if( argc != 1 )
          wrong_args(_("--sign-key user-id"));
@@ -3584,7 +3741,7 @@ main (int argc, char **argv)
 
        append_to_strlist( &sl, "save" );
        username = make_username( fname );
 
        append_to_strlist( &sl, "save" );
        username = make_username( fname );
-       keyedit_menu (username, locusr, sl, 0, 0 );
+       keyedit_menu (ctrl, username, locusr, sl, 0, 0 );
        xfree(username);
        free_strlist(sl);
        break;
        xfree(username);
        free_strlist(sl);
        break;
@@ -3597,14 +3754,25 @@ main (int argc, char **argv)
            sl = NULL;
            for( argc--, argv++ ; argc; argc--, argv++ )
                append_to_strlist( &sl, *argv );
            sl = NULL;
            for( argc--, argv++ ; argc; argc--, argv++ )
                append_to_strlist( &sl, *argv );
-           keyedit_menu( username, locusr, sl, 0, 1 );
+           keyedit_menu (ctrl, username, locusr, sl, 0, 1 );
            free_strlist(sl);
        }
        else
            free_strlist(sl);
        }
        else
-           keyedit_menu(username, locusr, NULL, 0, 1 );
+            keyedit_menu (ctrl, username, locusr, NULL, 0, 1 );
        xfree(username);
        break;
 
        xfree(username);
        break;
 
+      case aPasswd:
+        if (argc != 1)
+          wrong_args (_("--passwd <user-id>"));
+        else
+          {
+            username = make_username (fname);
+            keyedit_passwd (ctrl, username);
+            xfree (username);
+          }
+        break;
+
       case aDeleteKeys:
       case aDeleteSecretKeys:
       case aDeleteSecretAndPublicKeys:
       case aDeleteKeys:
       case aDeleteSecretKeys:
       case aDeleteSecretAndPublicKeys:
@@ -3626,21 +3794,21 @@ main (int argc, char **argv)
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
-       public_key_list( sl, 0 );
+       public_key_list (ctrl, sl, 0);
        free_strlist(sl);
        break;
       case aListSecretKeys:
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
        free_strlist(sl);
        break;
       case aListSecretKeys:
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
-       secret_key_list( sl );
+       secret_key_list (ctrl, sl);
        free_strlist(sl);
        break;
       case aLocateKeys:
        sl = NULL;
        for (; argc; argc--, argv++)
           add_to_strlist2( &sl, *argv, utf8_strings );
        free_strlist(sl);
        break;
       case aLocateKeys:
        sl = NULL;
        for (; argc; argc--, argv++)
           add_to_strlist2( &sl, *argv, utf8_strings );
-       public_key_list (sl, 1);
+       public_key_list (ctrl, sl, 1);
        free_strlist (sl);
        break;
 
        free_strlist (sl);
        break;
 
@@ -3648,19 +3816,19 @@ main (int argc, char **argv)
        if( opt.batch ) {
            if( argc > 1 )
                wrong_args("--gen-key [parameterfile]");
        if( opt.batch ) {
            if( argc > 1 )
                wrong_args("--gen-key [parameterfile]");
-           generate_keypair( argc? *argv : NULL, NULL, NULL );
+           generate_keypair (ctrl, argc? *argv : NULL, NULL, 0);
        }
        else {
            if( argc )
                wrong_args("--gen-key");
        }
        else {
            if( argc )
                wrong_args("--gen-key");
-           generate_keypair(NULL, NULL, NULL);
+           generate_keypair (ctrl, NULL, NULL, 0);
        }
        break;
 
       case aFastImport:
         opt.import_options |= IMPORT_FAST;
       case aImport:
        }
        break;
 
       case aFastImport:
         opt.import_options |= IMPORT_FAST;
       case aImport:
-       import_keys( argc? argv:NULL, argc, NULL, opt.import_options );
+       import_keys (ctrl, argc? argv:NULL, argc, NULL, opt.import_options);
        break;
 
        /* TODO: There are a number of command that use this same
        break;
 
        /* TODO: There are a number of command that use this same
@@ -3675,11 +3843,11 @@ main (int argc, char **argv)
        for( ; argc; argc--, argv++ )
            append_to_strlist2( &sl, *argv, utf8_strings );
        if( cmd == aSendKeys )
        for( ; argc; argc--, argv++ )
            append_to_strlist2( &sl, *argv, utf8_strings );
        if( cmd == aSendKeys )
-           rc=keyserver_export( sl );
+            rc = keyserver_export (ctrl, sl );
        else if( cmd == aRecvKeys )
        else if( cmd == aRecvKeys )
-           rc=keyserver_import( sl );
+            rc = keyserver_import (ctrl, sl );
        else
        else
-           rc=export_pubkeys( sl, opt.export_options );
+            rc = export_pubkeys (ctrl, sl, opt.export_options);
        if(rc)
          {
            if(cmd==aSendKeys)
        if(rc)
          {
            if(cmd==aSendKeys)
@@ -3694,19 +3862,19 @@ main (int argc, char **argv)
 
      case aSearchKeys:
        sl = NULL;
 
      case aSearchKeys:
        sl = NULL;
-       for( ; argc; argc--, argv++ )
-         append_to_strlist2( &sl, *argv, utf8_strings );
-       rc=keyserver_search( sl );
-       if(rc)
-         log_error(_("keyserver search failed: %s\n"),g10_errstr(rc));
-       free_strlist(sl);
+       for (; argc; argc--, argv++)
+         append_to_strlist2 (&sl, *argv, utf8_strings);
+       rc = keyserver_search (ctrl, sl);
+       if (rc)
+         log_error (_("keyserver search failed: %s\n"), gpg_strerror (rc));
+       free_strlist (sl);
        break;
 
       case aRefreshKeys:
        sl = NULL;
        for( ; argc; argc--, argv++ )
            append_to_strlist2( &sl, *argv, utf8_strings );
        break;
 
       case aRefreshKeys:
        sl = NULL;
        for( ; argc; argc--, argv++ )
            append_to_strlist2( &sl, *argv, utf8_strings );
-       rc=keyserver_refresh(sl);
+       rc = keyserver_refresh (ctrl, sl);
        if(rc)
          log_error(_("keyserver refresh failed: %s\n"),g10_errstr(rc));
        free_strlist(sl);
        if(rc)
          log_error(_("keyserver refresh failed: %s\n"),g10_errstr(rc));
        free_strlist(sl);
@@ -3716,7 +3884,7 @@ main (int argc, char **argv)
        sl = NULL;
        for( ; argc; argc--, argv++ )
            append_to_strlist2( &sl, *argv, utf8_strings );
        sl = NULL;
        for( ; argc; argc--, argv++ )
            append_to_strlist2( &sl, *argv, utf8_strings );
-       rc=keyserver_fetch(sl);
+       rc = keyserver_fetch (ctrl, sl);
        if(rc)
          log_error("key fetch failed: %s\n",g10_errstr(rc));
        free_strlist(sl);
        if(rc)
          log_error("key fetch failed: %s\n",g10_errstr(rc));
        free_strlist(sl);
@@ -3726,7 +3894,7 @@ main (int argc, char **argv)
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
-       export_seckeys( sl );
+       export_seckeys (ctrl, sl);
        free_strlist(sl);
        break;
 
        free_strlist(sl);
        break;
 
@@ -3734,7 +3902,7 @@ main (int argc, char **argv)
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
        sl = NULL;
        for( ; argc; argc--, argv++ )
            add_to_strlist2( &sl, *argv, utf8_strings );
-       export_secsubkeys( sl );
+       export_secsubkeys (ctrl, sl);
        free_strlist(sl);
        break;
 
        free_strlist(sl);
        break;
 
@@ -3776,29 +3944,30 @@ main (int argc, char **argv)
        {   int mode = argc < 2 ? 0 : atoi(*argv);
 
            if( mode == 1 && argc == 2 ) {
        {   int mode = argc < 2 ? 0 : atoi(*argv);
 
            if( mode == 1 && argc == 2 ) {
-               mpi_print( stdout, generate_public_prime( atoi(argv[1]) ), 1);
+               mpi_print (es_stdout,
+                           generate_public_prime( atoi(argv[1]) ), 1);
            }
            else if( mode == 2 && argc == 3 ) {
            }
            else if( mode == 2 && argc == 3 ) {
-               mpi_printstdout, generate_elg_prime(
+               mpi_print (es_stdout, generate_elg_prime(
                                             0, atoi(argv[1]),
                                             atoi(argv[2]), NULL,NULL ), 1);
            }
            else if( mode == 3 && argc == 3 ) {
                MPI *factors;
                                             0, atoi(argv[1]),
                                             atoi(argv[2]), NULL,NULL ), 1);
            }
            else if( mode == 3 && argc == 3 ) {
                MPI *factors;
-               mpi_printstdout, generate_elg_prime(
+               mpi_print (es_stdout, generate_elg_prime(
                                             1, atoi(argv[1]),
                                             atoi(argv[2]), NULL,&factors ), 1);
                putchar('\n');
                                             1, atoi(argv[1]),
                                             atoi(argv[2]), NULL,&factors ), 1);
                putchar('\n');
-               mpi_printstdout, factors[0], 1 ); /* print q */
+               mpi_print (es_stdout, factors[0], 1 ); /* print q */
            }
            else if( mode == 4 && argc == 3 ) {
                MPI g = mpi_alloc(1);
            }
            else if( mode == 4 && argc == 3 ) {
                MPI g = mpi_alloc(1);
-               mpi_printstdout, generate_elg_prime(
+               mpi_print (es_stdout, generate_elg_prime(
                                                 0, atoi(argv[1]),
                                                 atoi(argv[2]), g, NULL ), 1);
                putchar('\n');
                                                 0, atoi(argv[1]),
                                                 atoi(argv[2]), g, NULL ), 1);
                putchar('\n');
-               mpi_printstdout, g, 1 );
-               mpi_free(g);
+               mpi_print (es_stdout, g, 1 );
+               mpi_free (g);
            }
            else
                wrong_args("--gen-prime mode bits [qbits] ");
            }
            else
                wrong_args("--gen-prime mode bits [qbits] ");
@@ -3857,7 +4026,7 @@ main (int argc, char **argv)
            int algo = all_algos? 0 : gcry_md_map_name (*argv);
 
            if( !algo && !all_algos )
            int algo = all_algos? 0 : gcry_md_map_name (*argv);
 
            if( !algo && !all_algos )
-               log_error(_("invalid hash algorithm `%s'\n"), *argv );
+               log_error(_("invalid hash algorithm '%s'\n"), *argv );
            else {
                argc--; argv++;
                if( !argc )
            else {
                argc--; argv++;
                if( !argc )
@@ -3879,6 +4048,7 @@ main (int argc, char **argv)
        }
        break;
 
        }
        break;
 
+#ifndef NO_TRUST_MODELS
       case aListTrustDB:
        if( !argc )
            list_trustdb(NULL);
       case aListTrustDB:
        if( !argc )
            list_trustdb(NULL);
@@ -3924,7 +4094,8 @@ main (int argc, char **argv)
            wrong_args("--import-ownertrust [file]");
        import_ownertrust( argc? *argv:NULL );
        break;
            wrong_args("--import-ownertrust [file]");
        import_ownertrust( argc? *argv:NULL );
        break;
-      
+#endif /*!NO_TRUST_MODELS*/
+
       case aRebuildKeydbCaches:
         if (argc)
             wrong_args ("--rebuild-keydb-caches");
       case aRebuildKeydbCaches:
         if (argc)
             wrong_args ("--rebuild-keydb-caches");
@@ -3935,7 +4106,7 @@ main (int argc, char **argv)
       case aCardStatus:
         if (argc)
             wrong_args ("--card-status");
       case aCardStatus:
         if (argc)
             wrong_args ("--card-status");
-        card_status (stdout, NULL, 0);
+        card_status (es_stdout, NULL, 0);
         break;
 
       case aCardEdit:
         break;
 
       case aCardEdit:
@@ -3943,11 +4114,11 @@ main (int argc, char **argv)
             sl = NULL;
             for (argc--, argv++ ; argc; argc--, argv++)
                 append_to_strlist (&sl, *argv);
             sl = NULL;
             for (argc--, argv++ ; argc; argc--, argv++)
                 append_to_strlist (&sl, *argv);
-            card_edit (sl);
+            card_edit (ctrl, sl);
             free_strlist (sl);
        }
         else
             free_strlist (sl);
        }
         else
-            card_edit (NULL);
+          card_edit (ctrl, NULL);
         break;
 
       case aChangePIN:
         break;
 
       case aChangePIN:
@@ -3974,8 +4145,10 @@ main (int argc, char **argv)
        if( argc > 1 )
            wrong_args(_("[filename]"));
        /* Issue some output for the unix newbie */
        if( argc > 1 )
            wrong_args(_("[filename]"));
        /* Issue some output for the unix newbie */
-       if( !fname && !opt.outfile && isatty( fileno(stdin) )
-               && isatty( fileno(stdout) ) && isatty( fileno(stderr) ) )
+       if (!fname && !opt.outfile
+            && gnupg_isatty (fileno (stdin))
+            && gnupg_isatty (fileno (stdout))
+            && gnupg_isatty (fileno (stderr)))
            log_info(_("Go ahead and type your message ...\n"));
 
        a = iobuf_open(fname);
            log_info(_("Go ahead and type your message ...\n"));
 
        a = iobuf_open(fname);
@@ -3983,10 +4156,10 @@ main (int argc, char **argv)
           {
             iobuf_close (a);
             a = NULL;
           {
             iobuf_close (a);
             a = NULL;
-            errno = EPERM;
+            gpg_err_set_errno (EPERM);
           }
        if( !a )
           }
        if( !a )
-           log_error(_("can't open `%s'\n"), print_fname_stdin(fname));
+           log_error(_("can't open '%s'\n"), print_fname_stdin(fname));
        else {
 
            if( !opt.no_armor ) {
        else {
 
            if( !opt.no_armor ) {
@@ -3999,7 +4172,7 @@ main (int argc, char **argv)
                set_packet_list_mode(1);
                opt.list_packets=1;
            }
                set_packet_list_mode(1);
                opt.list_packets=1;
            }
-           rc = proc_packets(NULL, a );
+           rc = proc_packets (ctrl, NULL, a );
            if( rc )
                log_error("processing message failed: %s\n", g10_errstr(rc) );
            iobuf_close(a);
            if( rc )
                log_error("processing message failed: %s\n", g10_errstr(rc) );
            iobuf_close(a);
@@ -4008,6 +4181,8 @@ main (int argc, char **argv)
       }
 
     /* cleanup */
       }
 
     /* cleanup */
+    gpg_deinit_default_ctrl (ctrl);
+    xfree (ctrl);
     release_armor_context (afx);
     FREE_STRLIST(remusr);
     FREE_STRLIST(locusr);
     release_armor_context (afx);
     FREE_STRLIST(remusr);
     FREE_STRLIST(locusr);
@@ -4028,6 +4203,8 @@ void
 g10_exit( int rc )
 {
   gcry_control (GCRYCTL_UPDATE_RANDOM_SEED_FILE);
 g10_exit( int rc )
 {
   gcry_control (GCRYCTL_UPDATE_RANDOM_SEED_FILE);
+  if (DBG_CLOCK)
+    log_clock ("stop");
   if ( (opt.debug & DBG_MEMSTAT_VALUE) )
     {
       gcry_control (GCRYCTL_DUMP_MEMORY_STATS);
   if ( (opt.debug & DBG_MEMSTAT_VALUE) )
     {
       gcry_control (GCRYCTL_DUMP_MEMORY_STATS);
@@ -4037,7 +4214,7 @@ g10_exit( int rc )
     gcry_control (GCRYCTL_DUMP_SECMEM_STATS );
 
   emergency_cleanup ();
     gcry_control (GCRYCTL_DUMP_SECMEM_STATS );
 
   emergency_cleanup ();
-  
+
   rc = rc? rc : log_get_errorcount(0)? 2 : g10_errors_seen? 1 : 0;
   exit (rc);
 }
   rc = rc? rc : log_get_errorcount(0)? 2 : g10_errors_seen? 1 : 0;
   exit (rc);
 }
@@ -4047,33 +4224,33 @@ g10_exit( int rc )
    display, but there are a few other similar assumptions in the
    display code. */
 static void
    display, but there are a few other similar assumptions in the
    display code. */
 static void
-print_hex( gcry_md_hd_t md, int algo, const char *fname )
+print_hex (gcry_md_hd_t md, int algo, const char *fname)
 {
   int i,n,count,indent=0;
   const byte *p;
 
 {
   int i,n,count,indent=0;
   const byte *p;
 
-  if(fname)
-    indent=printf("%s: ",fname);
+  if (fname)
+    indent = es_printf("%s: ",fname);
 
 
-  if(indent>40)
+  if (indent>40)
     {
       printf("\n");
       indent=0;
     }
 
     {
       printf("\n");
       indent=0;
     }
 
-  if(algo==DIGEST_ALGO_RMD160)
-    indent+=printf("RMD160 = ");
-  else if(algo>0)
-    indent+=printf("%6s = ", gcry_md_algo_name (algo));
+  if (algo==DIGEST_ALGO_RMD160)
+    indent += es_printf("RMD160 = ");
+  else if (algo>0)
+    indent += es_printf("%6s = ", gcry_md_algo_name (algo));
   else
   else
-    algo=abs(algo);
+    algo = abs(algo);
 
 
-  count=indent;
+  count = indent;
 
   p = gcry_md_read (md, algo);
   n = gcry_md_get_algo_dlen (algo);
 
 
   p = gcry_md_read (md, algo);
   n = gcry_md_get_algo_dlen (algo);
 
-  count += printf ("%02X",*p++);
+  count += es_printf ("%02X",*p++);
 
   for(i=1;i<n;i++,p++)
     {
 
   for(i=1;i<n;i++,p++)
     {
@@ -4081,14 +4258,14 @@ print_hex( gcry_md_hd_t md, int algo, const char *fname )
        {
          if(count+2>79)
            {
        {
          if(count+2>79)
            {
-             printf("\n%*s",indent," ");
-             count=indent;
+             es_printf ("\n%*s",indent," ");
+             count = indent;
            }
          else
            }
          else
-           count+=printf(" ");
+           count += es_printf(" ");
 
 
-         if(!(i%8))
-           count+=printf(" ");
+         if (!(i%8))
+           count += es_printf(" ");
        }
       else if (n==20)
        {
        }
       else if (n==20)
        {
@@ -4096,58 +4273,59 @@ print_hex( gcry_md_hd_t md, int algo, const char *fname )
            {
              if(count+4>79)
                {
            {
              if(count+4>79)
                {
-                 printf("\n%*s",indent," ");
+                 es_printf ("\n%*s",indent," ");
                  count=indent;
                }
              else
                  count=indent;
                }
              else
-               count+=printf(" ");
+               count += es_printf(" ");
            }
 
            }
 
-         if(!(i%10))
-           count+=printf(" ");
+         if (!(i%10))
+           count += es_printf(" ");
        }
       else
        {
          if(!(i%4))
            {
        }
       else
        {
          if(!(i%4))
            {
-             if(count+8>79)
+             if (count+8>79)
                {
                {
-                 printf("\n%*s",indent," ");
+                 es_printf ("\n%*s",indent," ");
                  count=indent;
                }
              else
                  count=indent;
                }
              else
-               count+=printf(" ");
+               count += es_printf(" ");
            }
        }
 
            }
        }
 
-      count+=printf("%02X",*p);
+      count += es_printf("%02X",*p);
     }
 
     }
 
-  printf("\n");
+  es_printf ("\n");
 }
 
 static void
 print_hashline( gcry_md_hd_t md, int algo, const char *fname )
 {
 }
 
 static void
 print_hashline( gcry_md_hd_t md, int algo, const char *fname )
 {
-    int i, n;
-    const byte *p;
-    
-    if ( fname ) {
-        for (p = fname; *p; p++ ) {
-            if ( *p <= 32 || *p > 127 || *p == ':' || *p == '%' )
-                printf("%%%02X", *p );
-            else 
-                putchar( *p );
+  int i, n;
+  const byte *p;
+
+  if ( fname )
+    {
+      for (p = fname; *p; p++ )
+        {
+          if ( *p <= 32 || *p > 127 || *p == ':' || *p == '%' )
+            es_printf ("%%%02X", *p );
+          else
+            es_putc (*p, es_stdout);
         }
     }
         }
     }
-    putchar(':');
-    printf("%d:", algo );
-    p = gcry_md_read (md, algo);
-    n = gcry_md_get_algo_dlen (algo);
-    for(i=0; i < n ; i++, p++ ) 
-        printf("%02X", *p );
-    putchar(':');
-    putchar('\n');
+  es_putc (':', es_stdout);
+  es_printf ("%d:", algo);
+  p = gcry_md_read (md, algo);
+  n = gcry_md_get_algo_dlen (algo);
+  for(i=0; i < n ; i++, p++ )
+    es_printf ("%02X", *p);
+  es_fputs (":\n", es_stdout);
 }
 
 static void
 }
 
 static void
@@ -4170,7 +4348,7 @@ print_mds( const char *fname, int algo )
           {
             fclose (fp);
             fp = NULL;
           {
             fclose (fp);
             fp = NULL;
-            errno = EPERM;
+            gpg_err_set_errno (EPERM);
           }
     }
     if( !fp ) {
           }
     }
     if( !fp ) {
@@ -4182,9 +4360,11 @@ print_mds( const char *fname, int algo )
     if( algo )
         gcry_md_enable (md, algo);
     else {
     if( algo )
         gcry_md_enable (md, algo);
     else {
-       gcry_md_enable (md, GCRY_MD_MD5);
+        if (!openpgp_md_test_algo (GCRY_MD_MD5))
+          gcry_md_enable (md, GCRY_MD_MD5);
        gcry_md_enable (md, GCRY_MD_SHA1);
        gcry_md_enable (md, GCRY_MD_SHA1);
-       gcry_md_enable (md, GCRY_MD_RMD160);
+        if (!openpgp_md_test_algo (GCRY_MD_RMD160))
+          gcry_md_enable (md, GCRY_MD_RMD160);
         if (!openpgp_md_test_algo (GCRY_MD_SHA224))
           gcry_md_enable (md, GCRY_MD_SHA224);
         if (!openpgp_md_test_algo (GCRY_MD_SHA256))
         if (!openpgp_md_test_algo (GCRY_MD_SHA224))
           gcry_md_enable (md, GCRY_MD_SHA224);
         if (!openpgp_md_test_algo (GCRY_MD_SHA256))
@@ -4202,38 +4382,40 @@ print_mds( const char *fname, int algo )
     else {
        gcry_md_final (md);
         if ( opt.with_colons ) {
     else {
        gcry_md_final (md);
         if ( opt.with_colons ) {
-            if ( algo ) 
+            if ( algo )
                 print_hashline( md, algo, fname );
             else {
                 print_hashline( md, algo, fname );
             else {
-                print_hashline( md, GCRY_MD_MD5, fname );
+                if (!openpgp_md_test_algo (GCRY_MD_MD5))
+                    print_hashline( md, GCRY_MD_MD5, fname );
                 print_hashline( md, GCRY_MD_SHA1, fname );
                 print_hashline( md, GCRY_MD_SHA1, fname );
-                if (!gcry_md_test_algo (GCRY_MD_RMD160))
+                if (!openpgp_md_test_algo (GCRY_MD_RMD160))
                     print_hashline( md, GCRY_MD_RMD160, fname );
                     print_hashline( md, GCRY_MD_RMD160, fname );
-                if (!gcry_md_test_algo (GCRY_MD_SHA224))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA224))
                     print_hashline (md, GCRY_MD_SHA224, fname);
                     print_hashline (md, GCRY_MD_SHA224, fname);
-                if (!gcry_md_test_algo (GCRY_MD_SHA256))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA256))
                     print_hashline( md, GCRY_MD_SHA256, fname );
                     print_hashline( md, GCRY_MD_SHA256, fname );
-                if (!gcry_md_test_algo (GCRY_MD_SHA384))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA384))
                     print_hashline ( md, GCRY_MD_SHA384, fname );
                     print_hashline ( md, GCRY_MD_SHA384, fname );
-                if (!gcry_md_test_algo (GCRY_MD_SHA512))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA512))
                     print_hashline ( md, GCRY_MD_SHA512, fname );
             }
         }
         else {
             if( algo )
                     print_hashline ( md, GCRY_MD_SHA512, fname );
             }
         }
         else {
             if( algo )
-              print_hex(md,-algo,fname);
+               print_hex(md,-algo,fname);
             else {
             else {
-                print_hex( md, GCRY_MD_MD5, fname );
+                if (!openpgp_md_test_algo (GCRY_MD_MD5))
+                    print_hex( md, GCRY_MD_MD5, fname );
                 print_hex( md, GCRY_MD_SHA1, fname );
                 print_hex( md, GCRY_MD_SHA1, fname );
-                if (!gcry_md_test_algo (GCRY_MD_RMD160))
+                if (!openpgp_md_test_algo (GCRY_MD_RMD160))
                     print_hex( md, GCRY_MD_RMD160, fname );
                     print_hex( md, GCRY_MD_RMD160, fname );
-                if (!gcry_md_test_algo (GCRY_MD_SHA224))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA224))
                     print_hex (md, GCRY_MD_SHA224, fname);
                     print_hex (md, GCRY_MD_SHA224, fname);
-                if (!gcry_md_test_algo (GCRY_MD_SHA256))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA256))
                     print_hex( md, GCRY_MD_SHA256, fname );
                     print_hex( md, GCRY_MD_SHA256, fname );
-                if (!gcry_md_test_algo (GCRY_MD_SHA384))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA384))
                     print_hex( md, GCRY_MD_SHA384, fname );
                     print_hex( md, GCRY_MD_SHA384, fname );
-                if (!gcry_md_test_algo (GCRY_MD_SHA512))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA512))
                     print_hex( md, GCRY_MD_SHA512, fname );
             }
         }
                     print_hex( md, GCRY_MD_SHA512, fname );
             }
         }
@@ -4301,7 +4483,7 @@ add_policy_url( const char *string, int which )
     sl=add_to_strlist( &opt.sig_policy_url, string );
 
   if(critical)
     sl=add_to_strlist( &opt.sig_policy_url, string );
 
   if(critical)
-    sl->flags |= 1;    
+    sl->flags |= 1;
 }
 
 static void
 }
 
 static void
@@ -4334,5 +4516,5 @@ add_keyserver_url( const char *string, int which )
     sl=add_to_strlist( &opt.sig_keyserver_url, string );
 
   if(critical)
     sl=add_to_strlist( &opt.sig_keyserver_url, string );
 
   if(critical)
-    sl->flags |= 1;    
+    sl->flags |= 1;
 }
 }