[git] GnuPG - branch, master, updated. gnupg-2.1.12-56-g22a7ef0

by Werner Koch cvs at cvs.gnupg.org
Tue Jun 7 11:01:43 CEST 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "The GNU Privacy Guard".

The branch, master has been updated
       via  22a7ef01aa2c0eb77bcc40174d09104acc35cab1 (commit)
      from  650abbab716750d6087a457a25fa2efaaa3567cd (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 22a7ef01aa2c0eb77bcc40174d09104acc35cab1
Author: Werner Koch <wk at gnupg.org>
Date:   Tue Jun 7 10:59:46 2016 +0200

    Replace use of opt.homedir by accessor functions.
    
    * common/homedir.c (the_gnupg_homedir): New var.
    (gnupg_set_homedir): New.
    (gnupg_homedir): New.
    * g10/options.h (struct opt): Remove 'homedir' and replace all users
    by the new accessor functions.
    * g13/g13-common.h (struct opt): Ditto.
    * scd/scdaemon.h (struct opt): Ditto.
    * sm/gpgsm.h (struct opt): Ditto.
    * dirmngr/dirmngr.h (struct opt): Ditto.
    * agent/preset-passphrase.c (opt_homedir): Ditto.
    * agent/protect-tool.c (opt_homedir): Ditto.
    --
    
    This will make detection of a non-default homedir easier.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/agent/agent.h b/agent/agent.h
index 0dcb201..42a580c 100644
--- a/agent/agent.h
+++ b/agent/agent.h
@@ -62,7 +62,6 @@ struct
   int quiet;           /* Be as quiet as possible */
   int dry_run;         /* Don't change any persistent data */
   int batch;           /* Batch mode */
-  const char *homedir; /* Configuration directory name */
 
   /* True if we handle sigusr2.  */
   int sigusr2_enabled;
diff --git a/agent/command-ssh.c b/agent/command-ssh.c
index 0e1d9fc..e3cd4b9 100644
--- a/agent/command-ssh.c
+++ b/agent/command-ssh.c
@@ -897,7 +897,7 @@ open_control_file (ssh_control_file_t *r_cf, int append)
   /* Note: As soon as we start to use non blocking functions here
      (i.e. where Pth might switch threads) we need to employ a
      mutex.  */
-  cf->fname = make_filename_try (opt.homedir, SSH_CONTROL_FILE_NAME, NULL);
+  cf->fname = make_filename_try (gnupg_homedir (), SSH_CONTROL_FILE_NAME, NULL);
   if (!cf->fname)
     {
       err = gpg_error_from_syserror ();
@@ -2734,7 +2734,7 @@ ssh_handler_request_identities (ctrl_t ctrl,
   {
     char *dname;
 
-    dname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, NULL);
+    dname = make_filename (gnupg_homedir (), GNUPG_PRIVATE_KEYS_DIR, NULL);
     if (!dname)
       {
         err = gpg_err_code_from_syserror ();
diff --git a/agent/command.c b/agent/command.c
index d55e7da..1898d6c 100644
--- a/agent/command.c
+++ b/agent/command.c
@@ -1258,7 +1258,8 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
       char *dirname;
       struct dirent *dir_entry;
 
-      dirname = make_filename_try (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, NULL);
+      dirname = make_filename_try (gnupg_homedir (),
+                                   GNUPG_PRIVATE_KEYS_DIR, NULL);
       if (!dirname)
         {
           err = gpg_error_from_syserror ();
diff --git a/agent/findkey.c b/agent/findkey.c
index a78709c..d3780b9 100644
--- a/agent/findkey.c
+++ b/agent/findkey.c
@@ -135,7 +135,8 @@ agent_write_private_key (const unsigned char *grip,
   bin2hex (grip, 20, hexgrip);
   strcpy (hexgrip+40, ".key");
 
-  fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL);
+  fname = make_filename (gnupg_homedir (), GNUPG_PRIVATE_KEYS_DIR,
+                         hexgrip, NULL);
 
   /* FIXME: Write to a temp file first so that write failures during
      key updates won't lead to a key loss.  */
@@ -652,7 +653,8 @@ read_key_file (const unsigned char *grip, gcry_sexp_t *result)
   bin2hex (grip, 20, hexgrip);
   strcpy (hexgrip+40, ".key");
 
-  fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL);
+  fname = make_filename (gnupg_homedir (), GNUPG_PRIVATE_KEYS_DIR,
+                         hexgrip, NULL);
   fp = es_fopen (fname, "rb");
   if (!fp)
     {
@@ -767,7 +769,8 @@ remove_key_file (const unsigned char *grip)
 
   bin2hex (grip, 20, hexgrip);
   strcpy (hexgrip+40, ".key");
-  fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL);
+  fname = make_filename (gnupg_homedir (), GNUPG_PRIVATE_KEYS_DIR,
+                         hexgrip, NULL);
   if (gnupg_remove (fname))
     err = gpg_error_from_syserror ();
   xfree (fname);
@@ -1289,7 +1292,8 @@ agent_key_available (const unsigned char *grip)
   bin2hex (grip, 20, hexgrip);
   strcpy (hexgrip+40, ".key");
 
-  fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL);
+  fname = make_filename (gnupg_homedir (), GNUPG_PRIVATE_KEYS_DIR,
+                         hexgrip, NULL);
   result = !access (fname, R_OK)? 0 : -1;
   xfree (fname);
   return result;
diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
index a950530..1832296 100644
--- a/agent/gpg-agent.c
+++ b/agent/gpg-agent.c
@@ -804,8 +804,6 @@ main (int argc, char **argv )
   if (shell && strlen (shell) >= 3 && !strcmp (shell+strlen (shell)-3, "csh") )
     csh_style = 1;
 
-  opt.homedir = default_homedir ();
-
   /* Record some of the original environment strings. */
   {
     const char *s;
@@ -861,7 +859,7 @@ main (int argc, char **argv )
 	else if (pargs.r_opt == oNoOptions)
           default_config = 0; /* --no-options */
 	else if (pargs.r_opt == oHomedir)
-          opt.homedir = pargs.r.ret_str;
+          gnupg_set_homedir (pargs.r.ret_str);
 	else if (pargs.r_opt == oDebugQuickRandom)
           {
             gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
@@ -878,8 +876,8 @@ main (int argc, char **argv )
   */
 
   if (default_config)
-    configname = make_filename (opt.homedir, GPG_AGENT_NAME EXTSEP_S "conf",
-                                NULL );
+    configname = make_filename (gnupg_homedir (),
+                                GPG_AGENT_NAME EXTSEP_S "conf", NULL);
 
   argc = orig_argc;
   argv = orig_argv;
@@ -944,7 +942,7 @@ main (int argc, char **argv )
         case oNoGreeting: /* Dummy option.  */ break;
         case oNoVerbose: opt.verbose = 0; break;
         case oNoOptions: break; /* no-options */
-        case oHomedir: opt.homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
         case oNoDetach: nodetach = 1; break;
         case oLogFile: logfile = pargs.r.ret_str; break;
         case oCsh: csh_style = 1; break;
@@ -1030,7 +1028,7 @@ main (int argc, char **argv )
   finalize_rereadable_options ();
 
   /* Turn the homedir into an absolute one. */
-  opt.homedir = make_absfilename (opt.homedir, NULL);
+  gnupg_set_homedir (make_absfilename (gnupg_homedir (), NULL));
 
   /* Print a warning if an argument looks like an option.  */
   if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
@@ -1104,8 +1102,8 @@ main (int argc, char **argv )
       char *filename_esc;
 
       /* List options and default values in the GPG Conf format.  */
-      filename = make_filename (opt.homedir, GPG_AGENT_NAME EXTSEP_S "conf",
-                                NULL );
+      filename = make_filename (gnupg_homedir (),
+                                GPG_AGENT_NAME EXTSEP_S "conf", NULL);
       filename_esc = percent_escape (filename, NULL);
 
       es_printf ("%s-%s.conf:%lu:\"%s\n",
@@ -1764,7 +1762,7 @@ create_socket_name (char *standard_name, int with_homedir)
   char *name;
 
   if (with_homedir)
-    name = make_filename (opt.homedir, standard_name, NULL);
+    name = make_filename (gnupg_homedir (), standard_name, NULL);
   else
     name = make_filename (standard_name, NULL);
   if (strchr (name, PATHSEP_C))
@@ -1932,7 +1930,7 @@ create_directories (void)
   const char *defhome = standard_homedir ();
   char *home;
 
-  home = make_filename (opt.homedir, NULL);
+  home = make_filename (gnupg_homedir (), NULL);
   if ( stat (home, &statbuf) )
     {
       if (errno == ENOENT)
@@ -2731,7 +2729,7 @@ check_own_socket (void)
   if (check_own_socket_running || shutdown_pending)
     return;  /* Still running or already shutting down.  */
 
-  sockname = make_filename (opt.homedir, GPG_AGENT_SOCK_NAME, NULL);
+  sockname = make_filename_try (gnupg_homedir (), GPG_AGENT_SOCK_NAME, NULL);
   if (!sockname)
     return; /* Out of memory.  */
 
@@ -2757,7 +2755,9 @@ check_for_running_agent (int silent)
   char *sockname;
   assuan_context_t ctx = NULL;
 
-  sockname = make_filename (opt.homedir, GPG_AGENT_SOCK_NAME, NULL);
+  sockname = make_filename_try (gnupg_homedir (), GPG_AGENT_SOCK_NAME, NULL);
+  if (!sockname)
+    return gpg_error_from_syserror ();
 
   err = assuan_new (&ctx);
   if (!err)
diff --git a/agent/preset-passphrase.c b/agent/preset-passphrase.c
index 1ebf181..29fdfe8 100644
--- a/agent/preset-passphrase.c
+++ b/agent/preset-passphrase.c
@@ -66,7 +66,6 @@ enum cmd_and_opt_values
 aTest };
 
 
-static const char *opt_homedir;
 static const char *opt_passphrase;
 
 static ARGPARSE_OPTS opts[] = {
@@ -219,8 +218,6 @@ main (int argc, char **argv)
   i18n_init ();
   init_common_subsystems (&argc, &argv);
 
-  opt_homedir = default_homedir ();
-
   pargs.argc = &argc;
   pargs.argv = &argv;
   pargs.flags=  1;  /* (do not remove the args) */
@@ -229,7 +226,7 @@ main (int argc, char **argv)
       switch (pargs.r_opt)
         {
         case oVerbose: opt.verbose++; break;
-        case oHomedir: opt_homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
 
         case oPreset: cmd = oPreset; break;
         case oForget: cmd = oForget; break;
@@ -248,7 +245,7 @@ main (int argc, char **argv)
 
   /* Tell simple-pwquery about the the standard socket name.  */
   {
-    char *tmp = make_filename (opt_homedir, GPG_AGENT_SOCK_NAME, NULL);
+    char *tmp = make_filename (gnupg_homedir (), GPG_AGENT_SOCK_NAME, NULL);
     simple_pw_set_socket (tmp);
     xfree (tmp);
   }
diff --git a/agent/protect-tool.c b/agent/protect-tool.c
index ad036ee..fdb7913 100644
--- a/agent/protect-tool.c
+++ b/agent/protect-tool.c
@@ -86,7 +86,6 @@ struct rsa_secret_key_s
 };
 
 
-static const char *opt_homedir;
 static int opt_armor;
 static int opt_canonical;
 static int opt_store;
@@ -577,9 +576,6 @@ main (int argc, char **argv )
   gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);
 
 
-  opt_homedir = default_homedir ();
-
-
   pargs.argc = &argc;
   pargs.argv = &argv;
   pargs.flags=  1;  /* (do not remove the args) */
@@ -590,7 +586,7 @@ main (int argc, char **argv )
         case oVerbose: opt.verbose++; break;
         case oArmor:   opt_armor=1; break;
         case oCanonical: opt_canonical=1; break;
-        case oHomedir: opt_homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
 
         case oAgentProgram: opt_agent_program = pargs.r.ret_str; break;
 
@@ -634,7 +630,7 @@ main (int argc, char **argv )
   /* Set the information which can't be taken from envvars.  */
   gnupg_prepare_get_passphrase (GPG_ERR_SOURCE_DEFAULT,
                                 opt.verbose,
-                                opt_homedir,
+                                gnupg_homedir (),
                                 opt_agent_program,
                                 NULL, NULL, NULL);
 
diff --git a/agent/trustlist.c b/agent/trustlist.c
index af5f645..b8df3fd 100644
--- a/agent/trustlist.c
+++ b/agent/trustlist.c
@@ -344,7 +344,14 @@ read_trustfiles (void)
     return gpg_error_from_syserror ();
   tableidx = 0;
 
-  fname = make_filename (opt.homedir, "trustlist.txt", NULL);
+  fname = make_filename_try (gnupg_homedir (), "trustlist.txt", NULL);
+  if (!fname)
+    {
+      err = gpg_error_from_syserror ();
+      xfree (table);
+      return err;
+    }
+
   if ( access (fname, F_OK) )
     {
       if ( errno == ENOENT )
@@ -608,7 +615,10 @@ agent_marktrusted (ctrl_t ctrl, const char *name, const char *fpr, int flag)
      trustlist with only admin priviliges to modify it.  Of course
      this is not a secure way of denying access, but it avoids the
      usual clicking on an Okay button most users are used to. */
-  fname = make_filename (opt.homedir, "trustlist.txt", NULL);
+  fname = make_filename_try (gnupg_homedir (), "trustlist.txt", NULL);
+  if (!fname)
+    return gpg_error_from_syserror ();
+
   if ( access (fname, W_OK) && errno != ENOENT)
     {
       xfree (fname);
@@ -733,7 +743,15 @@ agent_marktrusted (ctrl_t ctrl, const char *name, const char *fpr, int flag)
       return is_disabled? gpg_error (GPG_ERR_NOT_TRUSTED) : 0;
     }
 
-  fname = make_filename (opt.homedir, "trustlist.txt", NULL);
+  fname = make_filename_try (gnupg_homedir (), "trustlist.txt", NULL);
+  if (!fname)
+    {
+      err = gpg_error_from_syserror ();
+      unlock_trusttable ();
+      xfree (fprformatted);
+      xfree (nameformatted);
+      return err;
+    }
   if ( access (fname, F_OK) && errno == ENOENT)
     {
       fp = es_fopen (fname, "wx,mode=-rw-r");
diff --git a/common/homedir.c b/common/homedir.c
index 5bf5173..eccffec 100644
--- a/common/homedir.c
+++ b/common/homedir.c
@@ -1,6 +1,6 @@
 /* homedir.c - Setup the home directory.
  * Copyright (C) 2004, 2006, 2007, 2010 Free Software Foundation, Inc.
- * Copyright (C) 2013 Werner Koch
+ * Copyright (C) 2013, 2016 Werner Koch
  *
  * This file is part of GnuPG.
  *
@@ -58,6 +58,12 @@
 #include "util.h"
 #include "sysutils.h"
 
+
+/* The GnuPG homedir.  This is only accessed by the functions
+ * gnupg_homedir and gnupg_set_homedir.  Malloced.  */
+static char *the_gnupg_homedir;
+
+
 #ifdef HAVE_W32_SYSTEM
 /* A flag used to indicate that a control file for gpgconf has been
    detected.  Under Windows the presence of this file indicates a
@@ -368,6 +374,30 @@ w32_commondir (void)
 #endif /*HAVE_W32_SYSTEM*/
 
 
+/* Change the homedir.  Some care must be taken to set this early
+ * enough becuase previous calls to gnupg_homedir may else return a
+ * different string.  */
+void
+gnupg_set_homedir (const char *newdir)
+{
+  if (!newdir || !*newdir)
+    newdir = default_homedir ();
+  xfree (the_gnupg_homedir);
+  the_gnupg_homedir = xstrdup (newdir);
+}
+
+
+/* Return the homedir.  The returned string is valid until another
+ * gnupg-set-homedir call.  Note that this may be a relative string.
+ * This function replaced the former global opt.homedir.  */
+const char *
+gnupg_homedir (void)
+{
+  /* If a homedir has not been set, set it to the default.  */
+  if (!the_gnupg_homedir)
+    the_gnupg_homedir = xstrdup (default_homedir ());
+  return the_gnupg_homedir;
+}
 
 
 /* Return the name of the sysconfdir.  This is a static string.  This
diff --git a/common/util.h b/common/util.h
index 7634885..634ae06 100644
--- a/common/util.h
+++ b/common/util.h
@@ -220,6 +220,8 @@ const char *openpgp_is_curve_supported (const char *name, int *r_algo);
 /*-- homedir.c --*/
 const char *standard_homedir (void);
 const char *default_homedir (void);
+void gnupg_set_homedir (const char *newdir);
+const char *gnupg_homedir (void);
 const char *gnupg_sysconfdir (void);
 const char *gnupg_bindir (void);
 const char *gnupg_libexecdir (void);
diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c
index f249d68..bc71a40 100644
--- a/dirmngr/dirmngr.c
+++ b/dirmngr/dirmngr.c
@@ -795,9 +795,7 @@ main (int argc, char **argv)
   if (shell && strlen (shell) >= 3 && !strcmp (shell+strlen (shell)-3, "csh") )
     csh_style = 1;
 
-  opt.homedir = default_homedir ();
-
-  /* Now with NPth running we can set the logging callback.  Our
+    /* Now with NPth running we can set the logging callback.  Our
      windows implementation does not yet feature the NPth TLS
      functions.  */
 #ifndef HAVE_W32_SYSTEM
@@ -835,7 +833,7 @@ main (int argc, char **argv)
         default_config = 0; /* --no-options */
       else if (pargs.r_opt == oHomedir)
         {
-          opt.homedir = pargs.r.ret_str;
+          gnupg_set_homedir (pargs.r.ret_str);
           homedir_seen = 1;
         }
       else if (pargs.r_opt == aDaemon)
@@ -862,9 +860,9 @@ main (int argc, char **argv)
   if (opt.system_daemon && !homedir_seen)
     {
 #ifdef HAVE_W32CE_SYSTEM
-      opt.homedir = DIRSEP_S "gnupg";
+      gnupg_set_homedir (DIRSEP_S "gnupg");
 #else
-      opt.homedir = gnupg_sysconfdir ();
+      gnupg_set_homedir (gnupg_sysconfdir ());
 #endif
       opt.homedir_cache = gnupg_cachedir ();
       socket_name = dirmngr_sys_socket_name ();
@@ -875,7 +873,7 @@ main (int argc, char **argv)
     socket_name = dirmngr_sys_socket_name ();
 
   if (default_config)
-    configname = make_filename (opt.homedir, DIRMNGR_NAME".conf", NULL );
+    configname = make_filename (gnupg_homedir (), DIRMNGR_NAME".conf", NULL );
 
   argc = orig_argc;
   argv = orig_argv;
@@ -989,7 +987,7 @@ main (int argc, char **argv)
     greeting = 0;
 
   if (!opt.homedir_cache)
-    opt.homedir_cache = opt.homedir;
+    opt.homedir_cache = xstrdup (gnupg_homedir ());
 
   if (greeting)
     {
@@ -1019,7 +1017,8 @@ main (int argc, char **argv)
           log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
     }
 
-  if (!access ("/etc/"DIRMNGR_NAME, F_OK) && !strncmp (opt.homedir, "/etc/", 5))
+  if (!access ("/etc/"DIRMNGR_NAME, F_OK)
+      && !strncmp (gnupg_homedir (), "/etc/", 5))
     log_info
       ("NOTE: DirMngr is now a proper part of %s.  The configuration and"
        " other directory names changed.  Please check that no other version"
@@ -1043,7 +1042,7 @@ main (int argc, char **argv)
 #if USE_LDAP
   if (!ldapfile)
     {
-      ldapfile = make_filename (opt.homedir,
+      ldapfile = make_filename (gnupg_homedir (),
                                 opt.system_daemon?
                                 "ldapservers.conf":"dirmngr_ldapservers.conf",
                                 NULL);
@@ -1396,7 +1395,7 @@ main (int argc, char **argv)
       /* First the configuration file.  This is not an option, but it
 	 is vital information for GPG Conf.  */
       if (!opt.config_filename)
-        opt.config_filename = make_filename (opt.homedir,
+        opt.config_filename = make_filename (gnupg_homedir (),
                                              "dirmngr.conf", NULL );
 
       filename = percent_escape (opt.config_filename, NULL);
@@ -1416,7 +1415,7 @@ main (int argc, char **argv)
          and having both of them is thus problematic.  --no-detach is
          also only usable on the command line.  --batch is unused.  */
 
-      filename = make_filename (opt.homedir,
+      filename = make_filename (gnupg_homedir (),
                                 opt.system_daemon?
                                 "ldapservers.conf":"dirmngr_ldapservers.conf",
                                 NULL);
@@ -1658,7 +1657,7 @@ parse_ocsp_signer (const char *string)
     {
       if (string[0] == '.' && string[1] == '/' )
         string += 2;
-      fname = make_filename (opt.homedir, string, NULL);
+      fname = make_filename (gnupg_homedir (), string, NULL);
     }
 
   fp = es_fopen (fname, "r");
diff --git a/dirmngr/dirmngr.h b/dirmngr/dirmngr.h
index 6078884..8d90ae4 100644
--- a/dirmngr/dirmngr.h
+++ b/dirmngr/dirmngr.h
@@ -79,8 +79,7 @@ struct
   int quiet;          /* be as quiet as possible */
   int dry_run;        /* don't change any persistent data */
   int batch;          /* batch mode */
-  const char *homedir;      /* Configuration directory name */
-  const char *homedir_cache; /* Ditto for cache files (/var/cache/dirmngr).  */
+  const char *homedir_cache; /* Dir for cache files (/var/cache/dirmngr).  */
 
   char *config_filename;     /* Name of a config file, which will be
                                 reread on a HUP if it is not NULL. */
diff --git a/dirmngr/server.c b/dirmngr/server.c
index bca0d8e..6eb6f1b 100644
--- a/dirmngr/server.c
+++ b/dirmngr/server.c
@@ -2440,22 +2440,13 @@ start_command_handler (assuan_fd_t fd)
 
   if (!hello_line)
     {
-      size_t n;
-      const char *cfgname;
-
-      cfgname = opt.config_filename? opt.config_filename : "[none]";
-
-      n = (30 + strlen (opt.homedir) + strlen (cfgname)
-           + strlen (hello) + 1);
-      hello_line = xmalloc (n+1);
-      snprintf (hello_line, n,
-                "Home: %s\n"
-                "Config: %s\n"
-                "%s",
-                opt.homedir,
-                cfgname,
-                hello);
-      hello_line[n] = 0;
+      hello_line = xtryasprintf
+        ("Home: %s\n"
+         "Config: %s\n"
+         "%s",
+         gnupg_homedir (),
+         opt.config_filename? opt.config_filename : "[none]",
+         hello);
     }
 
   ctrl->server_local->assuan_ctx = ctx;
diff --git a/g10/call-agent.c b/g10/call-agent.c
index 818f3de..ad4e67c 100644
--- a/g10/call-agent.c
+++ b/g10/call-agent.c
@@ -303,7 +303,7 @@ start_agent (ctrl_t ctrl, int for_card)
     {
       rc = start_new_gpg_agent (&agent_ctx,
                                 GPG_ERR_SOURCE_DEFAULT,
-                                opt.homedir,
+                                gnupg_homedir (),
                                 opt.agent_program,
                                 opt.lc_ctype, opt.lc_messages,
                                 opt.session_env,
diff --git a/g10/call-dirmngr.c b/g10/call-dirmngr.c
index d35a5cf..f9a0e19 100644
--- a/g10/call-dirmngr.c
+++ b/g10/call-dirmngr.c
@@ -177,7 +177,7 @@ create_context (ctrl_t ctrl, assuan_context_t *r_ctx)
   *r_ctx = NULL;
   err = start_new_dirmngr (&ctx,
                            GPG_ERR_SOURCE_DEFAULT,
-                           opt.homedir,
+                           gnupg_homedir (),
                            opt.dirmngr_program,
                            opt.autostart, opt.verbose, DBG_IPC,
                            NULL /*gpg_status2*/, ctrl);
diff --git a/g10/gpg.c b/g10/gpg.c
index 9adf169..0a5af70 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -1000,9 +1000,9 @@ my_strusage( int level )
 
       case 31: p = "\nHome: "; break;
 #ifndef __riscos__
-      case 32: p = opt.homedir; break;
+      case 32: p = gnupg_homedir (); break;
 #else /* __riscos__ */
-      case 32: p = make_filename(opt.homedir, NULL); break;
+      case 32: p = make_filename(gnupg_homedir (), NULL); break;
 #endif /* __riscos__ */
       case 33: p = _("\nSupported algorithms:\n"); break;
       case 34:
@@ -1180,18 +1180,6 @@ set_debug (const char *level)
 }
 
 
-
-/* We need the home directory also in some other directories, so make
-   sure that both variables are always in sync. */
-static void
-set_homedir (const char *dir)
-{
-  if (!dir)
-    dir = "";
-  opt.homedir = dir;
-}
-
-
 /* We set the screen dimensions for UI purposes.  Do not allow screens
    smaller than 80x24 for the sake of simplicity. */
 static void
@@ -1412,7 +1400,8 @@ check_permissions (const char *path, int item)
      could be rectified if the homedir itself had proper
      permissions. */
   if(item!=0 && homedir_cache>-1
-     && ascii_strncasecmp(opt.homedir,tmppath,strlen(opt.homedir))==0)
+     && !ascii_strncasecmp (gnupg_homedir (), tmppath,
+                            strlen (gnupg_homedir ())))
     {
       ret=homedir_cache;
       goto end;
@@ -2082,18 +2071,19 @@ get_default_configname (void)
 	    break;
 	}
 
-      configname = make_filename (opt.homedir, name, NULL);
+      configname = make_filename (gnupg_homedir (), name, NULL);
     }
   while (access (configname, R_OK));
 
   xfree(name);
 
   if (! configname)
-    configname = make_filename (opt.homedir, GPG_NAME EXTSEP_S "conf", NULL);
+    configname = make_filename (gnupg_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);
+      char *p = make_filename (gnupg_homedir (), "options", NULL);
       if (! access (p, R_OK))
 	log_info (_("Note: old default options file '%s' ignored\n"), p);
       xfree (p);
@@ -2101,7 +2091,7 @@ get_default_configname (void)
   else
     {
       /* Use the old default only if it exists.  */
-      char *p = make_filename (opt.homedir, "options", NULL);
+      char *p = make_filename (gnupg_homedir (), "options", NULL);
       if (!access (p, R_OK))
 	{
 	  xfree (configname);
@@ -2252,7 +2242,7 @@ main (int argc, char **argv)
     opt.keyid_format = KF_NONE;
     opt.def_sig_expire = "0";
     opt.def_cert_expire = "0";
-    set_homedir (default_homedir ());
+    gnupg_set_homedir (NULL);
     opt.passphrase_repeat = 1;
     opt.emit_version = 1; /* Limit to the major number.  */
     opt.weak_digests = NULL;
@@ -2281,7 +2271,7 @@ main (int argc, char **argv)
             opt.no_homedir_creation = 1;
           }
         else if( pargs.r_opt == oHomedir )
-	    set_homedir ( pargs.r.ret_str );
+	    gnupg_set_homedir (pargs.r.ret_str);
 	else if( pargs.r_opt == oNoPermissionWarn )
 	    opt.no_perm_warn=1;
 	else if (pargs.r_opt == oStrict )
@@ -2295,10 +2285,10 @@ main (int argc, char **argv)
     }
 
 #ifdef HAVE_DOSISH_SYSTEM
-    if ( strchr (opt.homedir,'\\') ) {
-        char *d, *buf = xmalloc (strlen (opt.homedir)+1);
-        const char *s = opt.homedir;
-        for (d=buf,s=opt.homedir; *s; s++)
+    if ( strchr (gnupg_homedir, '\\') ) {
+      char *d, *buf = xmalloc (strlen (gnupg_homedir ())+1);
+      const char *s;
+      for (d=buf, s = gnupg_homedir (); *s; s++)
           {
             *d++ = *s == '\\'? '/': *s;
 #ifdef HAVE_W32_SYSTEM
@@ -2307,7 +2297,7 @@ main (int argc, char **argv)
 #endif
           }
         *d = 0;
-        set_homedir (buf);
+        gnupg_set_homedir (buf);
     }
 #endif
 
@@ -2344,7 +2334,7 @@ main (int argc, char **argv)
     pargs.flags= ARGPARSE_FLAG_KEEP;
 
     /* By this point we have a homedir, and cannot change it. */
-    check_permissions(opt.homedir,0);
+    check_permissions (gnupg_homedir (), 0);
 
   next_pass:
     if( configname ) {
@@ -3668,7 +3658,7 @@ main (int argc, char **argv)
 
     /* Set the random seed file. */
     if( use_random_seed ) {
-	char *p = make_filename(opt.homedir, "random_seed", NULL );
+      char *p = make_filename (gnupg_homedir (), "random_seed", NULL );
 	gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
         if (!access (p, F_OK))
           register_secured_file (p);
diff --git a/g10/gpgcompose.c b/g10/gpgcompose.c
index d6f0307..7d8b1b7 100644
--- a/g10/gpgcompose.c
+++ b/g10/gpgcompose.c
@@ -2956,10 +2956,6 @@ main (int argc, char *argv[])
   int processed;
   ctrl_t ctrl;
 
-  opt.homedir = default_homedir ();
-  if (! opt.homedir)
-    opt.homedir = "";
-
   opt.ignore_time_conflict = 1;
   /* Allow notations in the IETF space, for instance.  */
   opt.expert = 1;
diff --git a/g10/gpgv.c b/g10/gpgv.c
index f1e994b..30b4422 100644
--- a/g10/gpgv.c
+++ b/g10/gpgv.c
@@ -169,7 +169,6 @@ main( int argc, char **argv )
   opt.trust_model = TM_ALWAYS;
   opt.batch = 1;
 
-  opt.homedir = default_homedir ();
   opt.weak_digests = NULL;
 
   tty_no_terminal(1);
@@ -196,7 +195,7 @@ main( int argc, char **argv )
         case oLoggerFD:
           log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
           break;
-        case oHomedir: opt.homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
         case oWeakDigest:
           additional_weak_digest(pargs.r.ret_str);
           break;
diff --git a/g10/keydb.c b/g10/keydb.c
index 0164348..17ddd5d 100644
--- a/g10/keydb.c
+++ b/g10/keydb.c
@@ -666,7 +666,7 @@ keydb_add_resource (const char *url, unsigned int flags)
           )
         filename = make_filename (resname, NULL);
       else
-        filename = make_filename (opt.homedir, resname, NULL);
+        filename = make_filename (gnupg_homedir (), resname, NULL);
     }
   else
     filename = xstrdup (resname);
diff --git a/g10/keyedit.c b/g10/keyedit.c
index e9ec7e2..aa62cc1 100644
--- a/g10/keyedit.c
+++ b/g10/keyedit.c
@@ -2428,7 +2428,7 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
             else if (*arg_string == '~')
               fname = make_filename (arg_string, NULL);
             else
-              fname = make_filename (opt.homedir, arg_string, NULL);
+              fname = make_filename (gnupg_homedir (), arg_string, NULL);
 
 	    /* Open that file.  */
 	    a = iobuf_open (fname);
diff --git a/g10/keygen.c b/g10/keygen.c
index a4a3110..ad5dfa4 100644
--- a/g10/keygen.c
+++ b/g10/keygen.c
@@ -4261,7 +4261,8 @@ do_generate_keypair (ctrl_t ctrl, struct para_data_s *para,
               log_assert (sub_psk);
 
               if (s)
-                err = card_store_key_with_backup (ctrl, sub_psk, opt.homedir);
+                err = card_store_key_with_backup (ctrl,
+                                                  sub_psk, gnupg_homedir ());
             }
         }
       else
diff --git a/g10/migrate.c b/g10/migrate.c
index f4881b4..a9da5a0 100644
--- a/g10/migrate.c
+++ b/g10/migrate.c
@@ -49,10 +49,10 @@ migrate_secring (ctrl_t ctrl)
   char *flagfile = NULL;
   char *agent_version = NULL;
 
-  secring = make_filename (opt.homedir, "secring" EXTSEP_S "gpg", NULL);
+  secring = make_filename (gnupg_homedir (), "secring" EXTSEP_S "gpg", NULL);
   if (access (secring, F_OK))
     goto leave; /* Does not exist or is not readable.  */
-  flagfile = make_filename (opt.homedir, V21_MIGRATION_FNAME, NULL);
+  flagfile = make_filename (gnupg_homedir (), V21_MIGRATION_FNAME, NULL);
   if (!access (flagfile, F_OK))
     goto leave; /* Does exist - fine.  */
 
diff --git a/g10/options.h b/g10/options.h
index 2ae1724..bf5831d 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -106,7 +106,6 @@ struct
   int marginals_needed;
   int completes_needed;
   int max_cert_depth;
-  const char *homedir;
   const char *agent_program;
   const char *dirmngr_program;
 
diff --git a/g10/revoke.c b/g10/revoke.c
index 33dac5b..218ca59 100644
--- a/g10/revoke.c
+++ b/g10/revoke.c
@@ -533,7 +533,7 @@ gen_standard_revoke (PKT_public_key *psk, const char *cache_nonce)
   int kl;
   char *orig_codeset;
 
-  dir = get_openpgp_revocdir (opt.homedir);
+  dir = get_openpgp_revocdir (gnupg_homedir ());
   tmpstr = hexfingerprint (psk, NULL, 0);
   fname = xstrconcat (dir, DIRSEP_S, tmpstr, NULL);
   xfree (tmpstr);
diff --git a/g10/server.c b/g10/server.c
index 9ec263f..771a8a7 100644
--- a/g10/server.c
+++ b/g10/server.c
@@ -695,12 +695,12 @@ gpg_server (ctrl_t ctrl)
   assuan_set_pointer (ctx, ctrl);
   if (opt.verbose || opt.debug)
     {
-      char *tmp = NULL;
+      char *tmp;
 
       tmp = xtryasprintf ("Home: %s\n"
                           "Config: %s\n"
                           "%s",
-                          opt.homedir,
+                          gnupg_homedir (),
                           "fixme: need config filename",
                           hello);
       if (tmp)
diff --git a/g10/tdbio.c b/g10/tdbio.c
index 5fdd946..a414709 100644
--- a/g10/tdbio.c
+++ b/g10/tdbio.c
@@ -617,14 +617,15 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
 
   if (!new_dbname)
     {
-      fname = make_filename (opt.homedir, "trustdb" EXTSEP_S GPGEXT_GPG, NULL);
+      fname = make_filename (gnupg_homedir (),
+                             "trustdb" EXTSEP_S GPGEXT_GPG, NULL);
     }
   else if (*new_dbname != DIRSEP_C )
     {
       if (strchr (new_dbname, DIRSEP_C))
         fname = make_filename (new_dbname, NULL);
       else
-        fname = make_filename (opt.homedir, new_dbname, NULL);
+        fname = make_filename (gnupg_homedir (), new_dbname, NULL);
     }
   else
     {
diff --git a/g10/tofu.c b/g10/tofu.c
index 043ecb1..d11a8de 100644
--- a/g10/tofu.c
+++ b/g10/tofu.c
@@ -747,7 +747,7 @@ opendb (char *filename, enum db_type type)
       log_assert (! filename);
       log_assert (type == DB_COMBINED);
 
-      filename = make_filename (opt.homedir, "tofu.db", NULL);
+      filename = make_filename (gnupg_homedir (), "tofu.db", NULL);
       filename_free = 1;
     }
   else
@@ -895,10 +895,10 @@ getdb (tofu_dbs_t dbs, const char *name, enum db_type type)
         char *name_db;
 
         /* Make the directory.  */
-        rc = gnupg_mkdir_p (opt.homedir, "tofu.d", type_str, prefix, NULL);
+        rc = gnupg_mkdir_p (gnupg_homedir (), "tofu.d", type_str, prefix, NULL);
         if (rc)
           {
-            name_db = xstrconcat (opt.homedir, "tofu.d",
+            name_db = xstrconcat (gnupg_homedir (), "tofu.d",
                                   type_str, prefix, NULL);
             log_error (_("can't create directory '%s': %s\n"),
                        name_db, gpg_strerror (rc));
@@ -908,7 +908,7 @@ getdb (tofu_dbs_t dbs, const char *name, enum db_type type)
 
         name_db = xstrconcat (name_sanitized, ".db", NULL);
         filename = make_filename
-          (opt.homedir, "tofu.d", type_str, prefix, name_db, NULL);
+          (gnupg_homedir (), "tofu.d", type_str, prefix, name_db, NULL);
         xfree (name_db);
       }
     }
@@ -989,7 +989,7 @@ opendbs (ctrl_t ctrl)
 
   if (opt.tofu_db_format == TOFU_DB_AUTO)
     {
-      char *filename = make_filename (opt.homedir, "tofu.db", NULL);
+      char *filename = make_filename (gnupg_homedir (), "tofu.db", NULL);
       struct stat s;
       int have_tofu_db = 0;
       int have_tofu_d = 0;
diff --git a/g13/g13-common.h b/g13/g13-common.h
index 316b94a..a205081 100644
--- a/g13/g13-common.h
+++ b/g13/g13-common.h
@@ -55,7 +55,6 @@ struct
   int quiet;          /* Be as quiet as possible.  */
   int dry_run;        /* Don't change any persistent data.  */
 
-  const char *homedir;         /* Configuration directory name.  */
   const char *config_filename; /* Name of the used config file.  */
 
   /* Filename of the AGENT program.  */
diff --git a/g13/g13-syshelp.c b/g13/g13-syshelp.c
index 645730f..f3c20f5 100644
--- a/g13/g13-syshelp.c
+++ b/g13/g13-syshelp.c
@@ -159,7 +159,7 @@ my_strusage( int level )
       break;
 
     case 31: p = "\nHome: "; break;
-    case 32: p = opt.homedir; break;
+    case 32: p = gnupg_homedir (); break;
 
     default: p = NULL; break;
     }
@@ -269,7 +269,6 @@ main ( int argc, char **argv)
     log_fatal ("error allocating session environment block: %s\n",
                strerror (errno));
 
-  opt.homedir = default_homedir ();
   /* Fixme: We enable verbose mode here because there is currently no
      way to do this when starting g13-syshelp.  To fix that we should
      add a g13-syshelp.conf file in /etc/gnupg.  */
@@ -393,7 +392,7 @@ main ( int argc, char **argv)
         case oStatusFD: ctrl.status_fd = pargs.r.ret_int; break;
         case oLoggerFD: log_set_fd (pargs.r.ret_int ); break;
 
-        case oHomedir: opt.homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
 
         case oFakedSystemTime:
           {
@@ -427,7 +426,8 @@ main ( int argc, char **argv)
   configname = NULL;
 
   if (!opt.config_filename)
-    opt.config_filename = make_filename (opt.homedir, G13_NAME".conf", NULL);
+    opt.config_filename = make_filename (gnupg_homedir (),
+                                         G13_NAME".conf", NULL);
 
   if (log_get_errorcount(0))
     g13_exit(2);
@@ -472,7 +472,7 @@ main ( int argc, char **argv)
   /* Set the standard GnuPG random seed file.  */
   if (use_random_seed)
     {
-      char *p = make_filename (opt.homedir, "random_seed", NULL);
+      char *p = make_filename (gnupg_homedir (), "random_seed", NULL);
       gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
       xfree(p);
     }
diff --git a/g13/g13.c b/g13/g13.c
index 4489b2f..0499a18 100644
--- a/g13/g13.c
+++ b/g13/g13.c
@@ -247,7 +247,7 @@ my_strusage( int level )
       break;
 
     case 31: p = "\nHome: "; break;
-    case 32: p = opt.homedir; break;
+    case 32: p = gnupg_homedir (); break;
 
     default: p = NULL; break;
     }
@@ -391,8 +391,6 @@ main ( int argc, char **argv)
     log_fatal ("error allocating session environment block: %s\n",
                strerror (errno));
 
-  opt.homedir = default_homedir ();
-
   /* First check whether we have a config file on the commandline.  */
   orig_argc = argc;
   orig_argv = argv;
@@ -412,7 +410,7 @@ main ( int argc, char **argv)
       else if (pargs.r_opt == oNoOptions)
         default_config = 0; /* --no-options */
       else if (pargs.r_opt == oHomedir)
-        opt.homedir = pargs.r.ret_str;
+        gnupg_set_homedir (pargs.r.ret_str);
     }
 
   /* Initialize the secure memory. */
@@ -446,7 +444,7 @@ main ( int argc, char **argv)
 
   /* Set the default option file */
   if (default_config )
-    configname = make_filename (opt.homedir, G13_NAME".conf", NULL);
+    configname = make_filename (gnupg_homedir (), G13_NAME".conf", NULL);
 
   argc        = orig_argc;
   argv        = orig_argv;
@@ -552,7 +550,7 @@ main ( int argc, char **argv)
 	    }
           break;
 
-        case oHomedir: opt.homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
 
         case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
         case oGpgProgram: opt.gpg_program = pargs.r.ret_str;  break;
@@ -623,7 +621,8 @@ main ( int argc, char **argv)
   configname = NULL;
 
   if (!opt.config_filename)
-    opt.config_filename = make_filename (opt.homedir, G13_NAME".conf", NULL);
+    opt.config_filename = make_filename (gnupg_homedir (),
+                                         G13_NAME".conf", NULL);
 
   if (log_get_errorcount(0))
     g13_exit(2);
@@ -690,7 +689,7 @@ main ( int argc, char **argv)
   /* Set the standard GnuPG random seed file.  */
   if (use_random_seed)
     {
-      char *p = make_filename (opt.homedir, "random_seed", NULL);
+      char *p = make_filename (gnupg_homedir (), "random_seed", NULL);
       gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
       xfree(p);
     }
diff --git a/g13/server.c b/g13/server.c
index 33885d6..a96ec6e 100644
--- a/g13/server.c
+++ b/g13/server.c
@@ -631,12 +631,12 @@ g13_server (ctrl_t ctrl)
 
   if (opt.verbose || opt.debug)
     {
-      char *tmp = NULL;
+      char *tmp;
 
       tmp = xtryasprintf ("Home: %s\n"
                           "Config: %s\n"
                           "%s",
-                          opt.homedir,
+                          gnupg_homedir (),
                           opt.config_filename,
                           hello);
       if (tmp)
diff --git a/kbx/keybox-defs.h b/kbx/keybox-defs.h
index 6af5448..d74a7ef 100644
--- a/kbx/keybox-defs.h
+++ b/kbx/keybox-defs.h
@@ -140,7 +140,6 @@ typedef struct _keybox_openpgp_info *keybox_openpgp_info_t;
 
 /* Don't know whether this is needed: */
 /*  static struct { */
-/*    const char *homedir; */
 /*    int dry_run; */
 /*    int quiet; */
 /*    int verbose; */
diff --git a/scd/command.c b/scd/command.c
index 72ff132..a4a2ba0 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -2281,7 +2281,7 @@ update_reader_status_file (int set_card_removed_flag)
 	     depends on how client sessions will associate the reader
 	     status with their session.  */
           snprintf (templ, sizeof templ, "reader_%d.status", vr->slot);
-          fname = make_filename (opt.homedir, templ, NULL );
+          fname = make_filename (gnupg_homedir (), templ, NULL );
           fp = fopen (fname, "w");
           if (fp)
             {
@@ -2300,7 +2300,7 @@ update_reader_status_file (int set_card_removed_flag)
             char *homestr, *envstr;
             gpg_error_t err;
 
-            homestr = make_filename (opt.homedir, NULL);
+            homestr = make_filename (gnupg_homedir (), NULL);
             if (gpgrt_asprintf (&envstr, "GNUPGHOME=%s", homestr) < 0)
               log_error ("out of core while building environment\n");
             else
@@ -2323,7 +2323,7 @@ update_reader_status_file (int set_card_removed_flag)
                            (status & 2)? "PRESENT": "NOCARD");
                 args[8] = NULL;
 
-                fname = make_filename (opt.homedir, "scd-event", NULL);
+                fname = make_filename (gnupg_homedir (), "scd-event", NULL);
                 err = gnupg_spawn_process_detached (fname, args, envs);
                 if (err && gpg_err_code (err) != GPG_ERR_ENOENT)
                   log_error ("failed to run event handler '%s': %s\n",
diff --git a/scd/scdaemon.c b/scd/scdaemon.c
index e8218ca..576dbf9 100644
--- a/scd/scdaemon.c
+++ b/scd/scdaemon.c
@@ -463,8 +463,6 @@ main (int argc, char **argv )
   if (shell && strlen (shell) >= 3 && !strcmp (shell+strlen (shell)-3, "csh") )
     csh_style = 1;
 
-  opt.homedir = default_homedir ();
-
   /* Check whether we have a config file on the commandline */
   orig_argc = argc;
   orig_argv = argv;
@@ -484,7 +482,7 @@ main (int argc, char **argv )
 	else if (pargs.r_opt == oNoOptions)
           default_config = 0; /* --no-options */
 	else if (pargs.r_opt == oHomedir)
-          opt.homedir = pargs.r.ret_str;
+          gnupg_set_homedir (pargs.r.ret_str);
     }
 
   /* initialize the secure memory. */
@@ -497,7 +495,7 @@ main (int argc, char **argv )
 
 
   if (default_config)
-    configname = make_filename (opt.homedir, SCDAEMON_NAME EXTSEP_S "conf",
+    configname = make_filename (gnupg_homedir (), SCDAEMON_NAME EXTSEP_S "conf",
                                 NULL );
 
 
@@ -582,7 +580,7 @@ main (int argc, char **argv )
         case oNoGreeting: nogreeting = 1; break;
         case oNoVerbose: opt.verbose = 0; break;
         case oNoOptions: break; /* no-options */
-        case oHomedir: opt.homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
         case oNoDetach: nodetach = 1; break;
         case oLogFile: logfile = pargs.r.ret_str; break;
         case oCsh: csh_style = 1; break;
@@ -674,8 +672,8 @@ main (int argc, char **argv )
       if (config_filename)
 	filename = xstrdup (config_filename);
       else
-        filename = make_filename (opt.homedir, SCDAEMON_NAME EXTSEP_S "conf",
-                                  NULL);
+        filename = make_filename (gnupg_homedir (),
+                                  SCDAEMON_NAME EXTSEP_S "conf", NULL);
       filename_esc = percent_escape (filename, NULL);
 
       es_printf ("%s-%s.conf:%lu:\"%s\n",
@@ -1044,7 +1042,7 @@ create_socket_name (char *standard_name)
 {
   char *name;
 
-  name = make_filename (opt.homedir, standard_name, NULL);
+  name = make_filename (gnupg_homedir (), standard_name, NULL);
   if (strchr (name, PATHSEP_C))
     {
       log_error (("'%s' are not allowed in the socket name\n"), PATHSEP_S);
diff --git a/scd/scdaemon.h b/scd/scdaemon.h
index 1a95ba7..448cb84 100644
--- a/scd/scdaemon.h
+++ b/scd/scdaemon.h
@@ -51,7 +51,6 @@ struct
   int quiet;          /* Be as quiet as possible. */
   int dry_run;        /* Don't change any persistent data. */
   int batch;          /* Batch mode. */
-  const char *homedir;      /* Configuration directory name. */
   const char *ctapi_driver; /* Library to access the ctAPI. */
   const char *pcsc_driver;  /* Library to access the PC/SC system. */
   const char *reader_port;  /* NULL or reder port to use. */
diff --git a/sm/call-agent.c b/sm/call-agent.c
index 8c1c727..09ae359 100644
--- a/sm/call-agent.c
+++ b/sm/call-agent.c
@@ -133,7 +133,7 @@ start_agent (ctrl_t ctrl)
     {
       rc = start_new_gpg_agent (&agent_ctx,
                                 GPG_ERR_SOURCE_DEFAULT,
-                                opt.homedir,
+                                gnupg_homedir (),
                                 opt.agent_program,
                                 opt.lc_ctype, opt.lc_messages,
                                 opt.session_env,
diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c
index 881c484..a3b9ca8 100644
--- a/sm/call-dirmngr.c
+++ b/sm/call-dirmngr.c
@@ -248,7 +248,7 @@ start_dirmngr_ext (ctrl_t ctrl, assuan_context_t *ctx_r)
      to take care of the implicit option sending caching. */
 
   err = start_new_dirmngr (&ctx, GPG_ERR_SOURCE_DEFAULT,
-                           opt.homedir, opt.dirmngr_program,
+                           gnupg_homedir (), opt.dirmngr_program,
                            opt.autostart, opt.verbose, DBG_IPC,
                            gpgsm_status2, ctrl);
   if (!opt.autostart && gpg_err_code (err) == GPG_ERR_NO_DIRMNGR)
diff --git a/sm/gpgsm.c b/sm/gpgsm.c
index fc6d1c7..e6fd703 100644
--- a/sm/gpgsm.c
+++ b/sm/gpgsm.c
@@ -581,7 +581,7 @@ my_strusage( int level )
       break;
 
     case 31: p = "\nHome: "; break;
-    case 32: p = opt.homedir; break;
+    case 32: p = gnupg_homedir (); break;
     case 33: p = _("\nSupported algorithms:\n"); break;
     case 34:
       if (!ciphers)
@@ -964,8 +964,6 @@ main ( int argc, char **argv)
      remember to update the Gpgconflist entry as well.  */
   opt.def_cipher_algoid = DEFAULT_CIPHER_ALGO;
 
-  opt.homedir = default_homedir ();
-
 
   /* First check whether we have a config file on the commandline */
   orig_argc = argc;
@@ -989,7 +987,7 @@ main ( int argc, char **argv)
           opt.no_homedir_creation = 1;
         }
       else if (pargs.r_opt == oHomedir)
-        opt.homedir = pargs.r.ret_str;
+        gnupg_set_homedir (pargs.r.ret_str);
       else if (pargs.r_opt == aCallProtectTool)
         break; /* This break makes sure that --version and --help are
                   passed to the protect-tool. */
@@ -1024,9 +1022,10 @@ main ( int argc, char **argv)
 
   /* Set the default option file */
   if (default_config )
-    configname = make_filename (opt.homedir, GPGSM_NAME EXTSEP_S "conf", NULL);
+    configname = make_filename (gnupg_homedir (),
+                                GPGSM_NAME EXTSEP_S "conf", NULL);
   /* Set the default policy file */
-  opt.policy_file = make_filename (opt.homedir, "policies.txt", NULL);
+  opt.policy_file = make_filename (gnupg_homedir (), "policies.txt", NULL);
 
   argc        = orig_argc;
   argv        = orig_argv;
@@ -1304,7 +1303,7 @@ main ( int argc, char **argv)
 	    }
           break;
         case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
-        case oHomedir: opt.homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
         case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
 
         case oDisplay:
@@ -1468,7 +1467,7 @@ main ( int argc, char **argv)
   configname = NULL;
 
   if (!opt.config_filename)
-    opt.config_filename = make_filename (opt.homedir,
+    opt.config_filename = make_filename (gnupg_homedir (),
                                          GPGSM_NAME EXTSEP_S "conf",
                                          NULL);
 
@@ -1605,7 +1604,7 @@ main ( int argc, char **argv)
   /* Set the random seed file. */
   if (use_random_seed)
     {
-      char *p = make_filename (opt.homedir, "random_seed", NULL);
+      char *p = make_filename (gnupg_homedir (), "random_seed", NULL);
       gcry_control (GCRYCTL_SET_RANDOM_SEED_FILE, p);
       xfree(p);
     }
diff --git a/sm/gpgsm.h b/sm/gpgsm.h
index 5aad4b1..9751df4 100644
--- a/sm/gpgsm.h
+++ b/sm/gpgsm.h
@@ -61,7 +61,6 @@ struct
   int dry_run;      /* don't change any persistent data */
   int no_homedir_creation;
 
-  const char *homedir;         /* Configuration directory name */
   const char *config_filename; /* Name of the used config file. */
   const char *agent_program;
 
diff --git a/sm/keydb.c b/sm/keydb.c
index 495eb49..8a1efd4 100644
--- a/sm/keydb.c
+++ b/sm/keydb.c
@@ -287,7 +287,7 @@ keydb_add_resource (const char *url, int force, int secret, int *auto_created)
       if (strchr(resname, DIRSEP_C) )
         filename = make_filename (resname, NULL);
       else
-        filename = make_filename (opt.homedir, resname, NULL);
+        filename = make_filename (gnupg_homedir (), resname, NULL);
     }
   else
     filename = xstrdup (resname);
diff --git a/sm/server.c b/sm/server.c
index a43ff34..8b4a29c 100644
--- a/sm/server.c
+++ b/sm/server.c
@@ -1308,7 +1308,7 @@ gpgsm_server (certlist_t default_recplist)
     }
   if (opt.verbose || opt.debug)
     {
-      char *tmp = NULL;
+      char *tmp;
 
       /* Fixme: Use the really used socket name.  */
       if (asprintf (&tmp,
@@ -1316,7 +1316,7 @@ gpgsm_server (certlist_t default_recplist)
                     "Config: %s\n"
                     "DirmngrInfo: %s\n"
                     "%s",
-                    opt.homedir,
+                    gnupg_homedir (),
                     opt.config_filename,
                     (dirmngr_user_socket_name ()
                      ? dirmngr_user_socket_name ()
diff --git a/tools/gpg-check-pattern.c b/tools/gpg-check-pattern.c
index fbf30a2..37283a1 100644
--- a/tools/gpg-check-pattern.c
+++ b/tools/gpg-check-pattern.c
@@ -181,8 +181,6 @@ main (int argc, char **argv )
   setup_libgcrypt_logging ();
   gcry_control (GCRYCTL_INIT_SECMEM, 4096, 0);
 
-  opt.homedir = default_homedir ();
-
   pargs.argc = &argc;
   pargs.argv = &argv;
   pargs.flags=  1;  /* (do not remove the args) */
@@ -191,7 +189,7 @@ main (int argc, char **argv )
       switch (pargs.r_opt)
         {
         case oVerbose: opt.verbose++; break;
-        case oHomedir: opt.homedir = pargs.r.ret_str; break;
+        case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
         case oCheck: opt.checkonly = 1; break;
         case oNull: opt.null = 1; break;
 
diff --git a/tools/gpg-connect-agent.c b/tools/gpg-connect-agent.c
index 2e00b8f..eb8b51f 100644
--- a/tools/gpg-connect-agent.c
+++ b/tools/gpg-connect-agent.c
@@ -209,7 +209,7 @@ my_strusage( int level )
             "Connect to a running agent and send commands\n");
       break;
     case 31: p = "\nHome: "; break;
-    case 32: p = opt.homedir; break;
+    case 32: p = gnupg_homedir (); break;
     case 33: p = "\n"; break;
 
     default: p = NULL; break;
@@ -555,7 +555,7 @@ get_var_ext (const char *name)
             log_error ("getcwd failed: %s\n", strerror (errno));
         }
       else if (!strcmp (s, "homedir"))
-        result = make_filename (opt.homedir, NULL);
+        result = make_filename (gnupg_homedir (), NULL);
       else if (!strcmp (s, "sysconfdir"))
         result = xstrdup (gnupg_sysconfdir ());
       else if (!strcmp (s, "bindir"))
@@ -1181,7 +1181,6 @@ main (int argc, char **argv)
   assuan_set_gpg_err_source (0);
 
 
-  opt.homedir = default_homedir ();
   opt.autostart = 1;
   opt.connect_flags = 1;
 
@@ -1196,7 +1195,7 @@ main (int argc, char **argv)
 	case oQuiet:     opt.quiet = 1; break;
         case oVerbose:   opt.verbose++; break;
         case oNoVerbose: opt.verbose = 0; break;
-        case oHomedir:   opt.homedir = pargs.r.ret_str; break;
+        case oHomedir:   gnupg_set_homedir (pargs.r.ret_str); break;
         case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
         case oDirmngrProgram: opt.dirmngr_program = pargs.r.ret_str;  break;
         case oNoAutostart:    opt.autostart = 0; break;
@@ -1225,7 +1224,7 @@ main (int argc, char **argv)
        in particular handy on Windows. */
   if (opt.use_uiserver)
     {
-      opt.raw_socket = make_absfilename (opt.homedir, "S.uiserver", NULL);
+      opt.raw_socket = make_absfilename (gnupg_homedir (), "S.uiserver", NULL);
     }
 
   /* Print a warning if an argument looks like an option.  */
@@ -2209,7 +2208,7 @@ start_agent (void)
   if (opt.use_dirmngr)
     err = start_new_dirmngr (&ctx,
                              GPG_ERR_SOURCE_DEFAULT,
-                             opt.homedir,
+                             gnupg_homedir (),
                              opt.dirmngr_program,
                              opt.autostart,
                              !opt.quiet, 0,
@@ -2217,7 +2216,7 @@ start_agent (void)
   else
     err = start_new_gpg_agent (&ctx,
                                GPG_ERR_SOURCE_DEFAULT,
-                               opt.homedir,
+                               gnupg_homedir (),
                                opt.agent_program,
                                NULL, NULL,
                                session_env,
diff --git a/tools/symcryptrun.c b/tools/symcryptrun.c
index 4b90cd2..49c17c5 100644
--- a/tools/symcryptrun.c
+++ b/tools/symcryptrun.c
@@ -214,7 +214,7 @@ my_strusage (int level)
             "Call a simple symmetric encryption tool\n");
       break;
     case 31: p = "\nHome: "; break;
-    case 32: p = opt.homedir; break;
+    case 32: p = gnupg_homedir (); break;
     case 33: p = "\n"; break;
 
     default: p = NULL; break;
@@ -896,8 +896,6 @@ main (int argc, char **argv)
   i18n_init();
   init_common_subsystems (&argc, &argv);
 
-  opt.homedir = default_homedir ();
-
   /* Check whether we have a config file given on the commandline */
   orig_argc = argc;
   orig_argv = argv;
@@ -915,11 +913,11 @@ main (int argc, char **argv)
       else if (pargs.r_opt == oNoOptions)
         default_config = 0; /* --no-options */
       else if (pargs.r_opt == oHomedir)
-	opt.homedir = pargs.r.ret_str;
+	gnupg_set_homedir (pargs.r.ret_str);
     }
 
   if (default_config)
-    configname = make_filename (opt.homedir, "symcryptrun.conf", NULL );
+    configname = make_filename (gnupg_homedir (), "symcryptrun.conf", NULL );
 
   argc = orig_argc;
   argv = orig_argv;
@@ -1010,7 +1008,7 @@ main (int argc, char **argv)
 
   /* Tell simple-pwquery about the the standard socket name.  */
   {
-    char *tmp = make_filename (opt.homedir, GPG_AGENT_SOCK_NAME, NULL);
+    char *tmp = make_filename (gnupg_homedir (), GPG_AGENT_SOCK_NAME, NULL);
     simple_pw_set_socket (tmp);
     xfree (tmp);
   }

-----------------------------------------------------------------------

Summary of changes:
 agent/agent.h             |  1 -
 agent/command-ssh.c       |  4 ++--
 agent/command.c           |  3 ++-
 agent/findkey.c           | 12 ++++++++----
 agent/gpg-agent.c         | 26 +++++++++++++-------------
 agent/preset-passphrase.c |  7 ++-----
 agent/protect-tool.c      |  8 ++------
 agent/trustlist.c         | 24 +++++++++++++++++++++---
 common/homedir.c          | 32 +++++++++++++++++++++++++++++++-
 common/util.h             |  2 ++
 dirmngr/dirmngr.c         | 25 ++++++++++++-------------
 dirmngr/dirmngr.h         |  3 +--
 dirmngr/server.c          | 23 +++++++----------------
 g10/call-agent.c          |  2 +-
 g10/call-dirmngr.c        |  2 +-
 g10/gpg.c                 | 46 ++++++++++++++++++----------------------------
 g10/gpgcompose.c          |  4 ----
 g10/gpgv.c                |  3 +--
 g10/keydb.c               |  2 +-
 g10/keyedit.c             |  2 +-
 g10/keygen.c              |  3 ++-
 g10/migrate.c             |  4 ++--
 g10/options.h             |  1 -
 g10/revoke.c              |  2 +-
 g10/server.c              |  4 ++--
 g10/tdbio.c               |  5 +++--
 g10/tofu.c                | 10 +++++-----
 g13/g13-common.h          |  1 -
 g13/g13-syshelp.c         | 10 +++++-----
 g13/g13.c                 | 15 +++++++--------
 g13/server.c              |  4 ++--
 kbx/keybox-defs.h         |  1 -
 scd/command.c             |  6 +++---
 scd/scdaemon.c            | 14 ++++++--------
 scd/scdaemon.h            |  1 -
 sm/call-agent.c           |  2 +-
 sm/call-dirmngr.c         |  2 +-
 sm/gpgsm.c                | 17 ++++++++---------
 sm/gpgsm.h                |  1 -
 sm/keydb.c                |  2 +-
 sm/server.c               |  4 ++--
 tools/gpg-check-pattern.c |  4 +---
 tools/gpg-connect-agent.c | 13 ++++++-------
 tools/symcryptrun.c       | 10 ++++------
 44 files changed, 188 insertions(+), 179 deletions(-)


hooks/post-receive
-- 
The GNU Privacy Guard
http://git.gnupg.org




More information about the Gnupg-commits mailing list