gpg: Do not require a trustdb with --always-trust.
[gnupg.git] / g10 / gpg.c
index c31a558..65a9cab 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
 #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 "cipher.h"
 #include "filter.h"
 #include "ttyio.h"
 #include "i18n.h"
@@ -55,6 +55,8 @@
 #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
@@ -216,6 +218,7 @@ enum cmd_and_opt_values
     oPassphraseFD,
     oPassphraseFile,
     oPassphraseRepeat,
+    oPinentryMode,
     oCommandFD,
     oCommandFile,
     oQuickRandom,
@@ -328,6 +331,7 @@ enum cmd_and_opt_values
     oTrustedKey,
     oNoExpensiveTrustChecks,
     oFixedListMode,
+    oLegacyListMode,
     oNoSigCache,
     oNoSigCreateCheck,
     oAutoCheckTrustDB,
@@ -427,12 +431,16 @@ static ARGPARSE_OPTS opts[] = {
   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", "@"),
+#endif
+
   ARGPARSE_c (aDeArmor, "dearmor", "@"),
   ARGPARSE_c (aDeArmor, "dearmour", "@"),
   ARGPARSE_c (aEnArmor, "enarmor", "@"),
@@ -599,7 +607,10 @@ static ARGPARSE_OPTS opts[] = {
 
   /* More hidden commands and options. */
   ARGPARSE_c (aPrintMDs, "print-mds", "@"), /* old */
+#ifndef NO_TRUST_MODELS
   ARGPARSE_c (aListTrustDB, "list-trustdb", "@"),
+#endif
+
   /* Not yet used:
      ARGPARSE_c (aListTrustPath, "list-trust-path", "@"), */
   ARGPARSE_c (aDeleteSecretAndPublicKeys,
@@ -610,11 +621,19 @@ static ARGPARSE_OPTS opts[] = {
   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", "@"),
+
+#ifndef NO_TRUST_MODELS
   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", "@"),
@@ -642,7 +661,6 @@ static ARGPARSE_OPTS opts[] = {
   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", "@"),
@@ -686,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 (oLegacyListMode, "legacy-list-mode", "@"),
   ARGPARSE_s_n (oListOnly, "list-only", "@"),
   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
   ARGPARSE_s_n (oIgnoreValidFrom,    "ignore-valid-from", "@"),
@@ -698,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 (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", "@"),
@@ -807,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 )
 {
@@ -814,7 +868,7 @@ my_strusage( int 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;
@@ -840,12 +894,12 @@ my_strusage( int level )
 
       case 1:
       case 40: p =
-           _("Usage: gpg [options] [files] (-h for help)");
+           _("Usage: @GPG@ [options] [files] (-h for help)");
        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;
@@ -857,23 +911,23 @@ my_strusage( int level )
       case 33: p = _("\nSupported algorithms:\n"); break;
       case 34:
        if (!pubkeys)
-            pubkeys = build_list (_("Pubkey: "), 0,
-                                  openpgp_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 )
            ciphers = build_list(_("Cipher: "), 'S',
-                                 openpgp_cipher_algo_name,
-                                 openpgp_cipher_test_algo );
+                                 build_list_cipher_algo_name,
+                                 build_list_cipher_test_algo );
        p = ciphers;
        break;
       case 36:
        if( !digests )
            digests = build_list(_("Hash: "), 'H',
-                                 gcry_md_algo_name,
-                                 openpgp_md_test_algo );
+                                 build_list_md_algo_name,
+                                 build_list_md_test_algo );
        p = digests;
        break;
       case 37:
@@ -891,57 +945,56 @@ my_strusage( int level )
 
 
 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);
 }
 
 
@@ -1011,7 +1064,7 @@ set_debug (const char *level)
     }
   else
     {
-      log_error (_("invalid debug-level `%s' given\n"), level);
+      log_error (_("invalid debug-level '%s' given\n"), level);
       g10_exit (2);
     }
 
@@ -1028,7 +1081,7 @@ set_debug (const char *level)
   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\n",
+    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":"",
@@ -1041,7 +1094,8 @@ set_debug (const char *level)
               (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_ASSUAN_VALUE )? " assuan":"",
+              (opt.debug & DBG_CLOCK_VALUE  )? " clock":"");
 }
 
 
@@ -1126,8 +1180,8 @@ open_info_file (const char *fname, int for_write, int binary)
       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
@@ -1180,7 +1234,7 @@ add_group(char *string)
   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;
     }
 
@@ -1378,49 +1432,49 @@ check_permissions (const char *path, int item)
        {
          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"
-                      " configuration file `%s'\n"),tmppath);
+                      " configuration file '%s'\n"),tmppath);
          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"
-                      " homedir `%s'\n"),tmppath);
+                      " homedir '%s'\n"),tmppath);
          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"
-                      " extension `%s'\n"),tmppath);
+                      " extension '%s'\n"),tmppath);
        }
       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"
-                      " configuration file `%s'\n"),tmppath);
+                      " configuration file '%s'\n"),tmppath);
          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"
-                      " homedir `%s'\n"),tmppath);
+                      " homedir '%s'\n"),tmppath);
          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"
-                      " extension `%s'\n"),tmppath);
+                      " extension '%s'\n"),tmppath);
        }
     }
 
@@ -1532,7 +1586,16 @@ list_config(char *items)
       if(show_all || ascii_strcasecmp(name,"pubkey")==0)
        {
          es_printf ("cfg:pubkey:");
-         print_algo_numbers (openpgp_pk_test_algo);
+         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;
        }
@@ -1540,7 +1603,7 @@ list_config(char *items)
       if(show_all || ascii_strcasecmp(name,"cipher")==0)
        {
          es_printf ("cfg:cipher:");
-         print_algo_numbers(openpgp_cipher_test_algo);
+         print_algo_numbers (build_list_cipher_test_algo);
          es_printf ("\n");
          any=1;
        }
@@ -1548,7 +1611,8 @@ list_config(char *items)
       if (show_all || !ascii_strcasecmp (name,"ciphername"))
        {
          es_printf ("cfg:ciphername:");
-         print_algo_names (openpgp_cipher_test_algo,openpgp_cipher_algo_name);
+         print_algo_names (build_list_cipher_test_algo,
+                            build_list_cipher_algo_name);
          es_printf ("\n");
          any = 1;
        }
@@ -1558,7 +1622,7 @@ list_config(char *items)
         || ascii_strcasecmp(name,"hash")==0)
        {
          es_printf ("cfg:digest:");
-         print_algo_numbers(openpgp_md_test_algo);
+         print_algo_numbers (build_list_md_test_algo);
          es_printf ("\n");
          any=1;
        }
@@ -1568,7 +1632,8 @@ list_config(char *items)
           || !ascii_strcasecmp(name,"hashname"))
        {
          es_printf ("cfg:digestname:");
-         print_algo_names (openpgp_md_test_algo, gcry_md_algo_name);
+         print_algo_names (build_list_md_test_algo,
+                            build_list_md_algo_name);
          es_printf ("\n");
          any=1;
        }
@@ -1602,7 +1667,7 @@ list_config(char *items)
        break;
 
       if(!any)
-       log_error(_("unknown configuration item `%s'\n"),name);
+       log_error(_("unknown configuration item '%s'\n"),name);
     }
 }
 
@@ -1790,6 +1855,8 @@ collapse_args(int argc,char *argv[])
   return str;
 }
 
+
+#ifndef NO_TRUST_MODELS
 static void
 parse_trust_model(const char *model)
 {
@@ -1804,8 +1871,9 @@ parse_trust_model(const char *model)
   else if(ascii_strcasecmp(model,"auto")==0)
     opt.trust_model=TM_AUTO;
   else
-    log_error("unknown trust model `%s'\n",model);
+    log_error("unknown trust model '%s'\n",model);
 }
+#endif /*NO_TRUST_MODELS*/
 
 
 /* This fucntion called to initialized a new control object.  It is
@@ -1831,8 +1899,8 @@ char *
 get_default_configname (void)
 {
   char *configname = NULL;
-  char *name = xstrdup ("gpg" EXTSEP_S "conf-" SAFE_VERSION);
-  char *ver = &name[strlen ("gpg" EXTSEP_S "conf-")];
+  char *name = xstrdup (GPG_NAME EXTSEP_S "conf-" SAFE_VERSION);
+  char *ver = &name[strlen (GPG_NAME EXTSEP_S "conf-")];
 
   do
     {
@@ -1858,13 +1926,13 @@ get_default_configname (void)
   xfree(name);
 
   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))
-       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
@@ -1913,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;
+#ifndef NO_TRUST_MODELS
     const char *trustdb_name = NULL;
+#endif /*!NO_TRUST_MODELS*/
     char *def_cipher_string = NULL;
     char *def_digest_string = NULL;
     char *compress_algo_string = NULL;
@@ -1940,12 +2010,12 @@ 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. */
-    gnupg_reopen_std ("gpg");
+    gnupg_reopen_std (GPG_NAME);
     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();
@@ -2002,7 +2072,11 @@ main (int argc, char **argv)
     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 ();
@@ -2011,13 +2085,14 @@ main (int argc, char **argv)
     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;
-    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++;
@@ -2093,7 +2168,7 @@ main (int argc, char **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);
@@ -2122,18 +2197,18 @@ main (int argc, char **argv)
        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 {
-               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 )
-           log_info(_("reading options from `%s'\n"), configname );
+           log_info(_("reading options from '%s'\n"), configname );
        default_config = 0;
     }
 
@@ -2248,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:
-           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",
@@ -2316,12 +2391,16 @@ main (int argc, char **argv)
           case oQuickRandom:
             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;
+
+#ifndef NO_TRUST_MODELS
          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 )
@@ -2352,6 +2431,8 @@ main (int argc, char **argv)
 
          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. */
@@ -2359,13 +2440,15 @@ main (int argc, char **argv)
          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)
              {
-               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;
@@ -2549,7 +2632,7 @@ main (int argc, char **argv)
            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;
@@ -2561,7 +2644,7 @@ main (int argc, char **argv)
            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;
@@ -2592,7 +2675,16 @@ main (int argc, char **argv)
          case oPassphraseFile:
             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
             break;
-         case oPassphraseRepeat: opt.passphrase_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;
@@ -2643,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 ) )
-               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;
@@ -2814,6 +2906,7 @@ main (int argc, char **argv)
                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;
@@ -2926,7 +3019,7 @@ main (int argc, char **argv)
            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:
@@ -3052,7 +3145,7 @@ main (int argc, char **argv)
       }
 
     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"));
@@ -3092,6 +3185,16 @@ main (int argc, char **argv)
         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);
 
@@ -3103,6 +3206,8 @@ main (int argc, char **argv)
       }
 
     set_debug (debug_level);
+    if (DBG_CLOCK)
+      log_clock ("start");
 
     /* Do these after the switch(), so they can override settings. */
     if(PGP2)
@@ -3138,7 +3243,6 @@ main (int argc, char **argv)
              {
                log_info(_("encrypting a message in --pgp2 mode requires "
                           "the IDEA cipher\n"));
-               idea_cipher_warn(1);
                unusable=1;
              }
            else if(cmd==aSym)
@@ -3197,10 +3301,6 @@ main (int argc, char **argv)
 
     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"));
@@ -3350,17 +3450,17 @@ main (int argc, char **argv)
            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:
-               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:
-               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;
@@ -3392,11 +3492,7 @@ main (int argc, char **argv)
     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. */
@@ -3404,7 +3500,8 @@ main (int argc, char **argv)
         || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest) )
       {
        if (!nrings || default_keyring)  /* Add default ring. */
-           keydb_add_resource ("pubring" EXTSEP_S "gpg", 4);
+           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);
       }
@@ -3425,7 +3522,9 @@ main (int argc, char **argv)
     ctrl = xcalloc (1, sizeof *ctrl);
     gpg_init_default_ctrl (ctrl);
 
-    switch( cmd ) {
+#ifndef NO_TRUST_MODELS
+    switch (cmd)
+      {
       case aPrimegen:
       case aPrintMD:
       case aPrintMDs:
@@ -3434,13 +3533,21 @@ main (int argc, char **argv)
       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)
       {
@@ -3467,14 +3574,14 @@ main (int argc, char **argv)
        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)) )
-            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;
 
@@ -3709,12 +3816,12 @@ main (int argc, char **argv)
        if( opt.batch ) {
            if( argc > 1 )
                wrong_args("--gen-key [parameterfile]");
-           generate_keypair (argc? *argv : NULL, NULL, 0);
+           generate_keypair (ctrl, argc? *argv : NULL, NULL, 0);
        }
        else {
            if( argc )
                wrong_args("--gen-key");
-           generate_keypair (NULL, NULL, 0);
+           generate_keypair (ctrl, NULL, NULL, 0);
        }
        break;
 
@@ -3919,7 +4026,7 @@ main (int argc, char **argv)
            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 )
@@ -3941,6 +4048,7 @@ main (int argc, char **argv)
        }
        break;
 
+#ifndef NO_TRUST_MODELS
       case aListTrustDB:
        if( !argc )
            list_trustdb(NULL);
@@ -3986,6 +4094,7 @@ main (int argc, char **argv)
            wrong_args("--import-ownertrust [file]");
        import_ownertrust( argc? *argv:NULL );
        break;
+#endif /*!NO_TRUST_MODELS*/
 
       case aRebuildKeydbCaches:
         if (argc)
@@ -4050,7 +4159,7 @@ main (int argc, char **argv)
             gpg_err_set_errno (EPERM);
           }
        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 ) {
@@ -4094,6 +4203,8 @@ void
 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);
@@ -4249,9 +4360,11 @@ print_mds( const char *fname, int algo )
     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_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))
@@ -4272,35 +4385,37 @@ print_mds( const char *fname, int algo )
             if ( algo )
                 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 );
-                if (!gcry_md_test_algo (GCRY_MD_RMD160))
+                if (!openpgp_md_test_algo (GCRY_MD_RMD160))
                     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);
-                if (!gcry_md_test_algo (GCRY_MD_SHA256))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA256))
                     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 );
-                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_hex(md,-algo,fname);
+               print_hex(md,-algo,fname);
             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 );
-                if (!gcry_md_test_algo (GCRY_MD_RMD160))
+                if (!openpgp_md_test_algo (GCRY_MD_RMD160))
                     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);
-                if (!gcry_md_test_algo (GCRY_MD_SHA256))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA256))
                     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 );
-                if (!gcry_md_test_algo (GCRY_MD_SHA512))
+                if (!openpgp_md_test_algo (GCRY_MD_SHA512))
                     print_hex( md, GCRY_MD_SHA512, fname );
             }
         }