aboutsummaryrefslogtreecommitdiffstats
path: root/common/homedir.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/homedir.c')
-rw-r--r--common/homedir.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/common/homedir.c b/common/homedir.c
index 27141eb75..e3efcee7b 100644
--- a/common/homedir.c
+++ b/common/homedir.c
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
+#include <unistd.h>
#ifdef HAVE_W32_SYSTEM
#include <winsock2.h> /* Due to the stupid mingw64 requirement to
@@ -607,6 +608,41 @@ dirmngr_user_socket_name (void)
}
+/* Return the default pinentry name. If RESET is true the internal
+ cache is first flushed. */
+static const char *
+get_default_pinentry_name (int reset)
+{
+ static char *name;
+
+ if (reset)
+ {
+ xfree (name);
+ name = NULL;
+ }
+
+ if (!name)
+ {
+ name = xstrconcat (gnupg_bindir (),
+ DIRSEP_S "pinentry" EXEEXT_S, NULL);
+ if (access (name, F_OK) && errno == ENOENT)
+ {
+ char *name2;
+ name2 = xstrconcat (gnupg_bindir (),
+ DIRSEP_S "pinentry-basic" EXEEXT_S, NULL);
+ if (access (name2, F_OK))
+ xfree (name2); /* Does not exist. */
+ else /* Switch to pinentry-basic. */
+ {
+ xfree (name);
+ name = name2;
+ }
+ }
+ }
+ return name;
+}
+
+
/* Return the file name of a helper tool. WHICH is one of the
GNUPG_MODULE_NAME_foo constants. */
const char *
@@ -630,9 +666,9 @@ gnupg_module_name (int which)
case GNUPG_MODULE_NAME_PINENTRY:
#ifdef GNUPG_DEFAULT_PINENTRY
- return GNUPG_DEFAULT_PINENTRY;
+ return GNUPG_DEFAULT_PINENTRY; /* (Set by a configure option) */
#else
- X(bindir, "pinentry");
+ return get_default_pinentry_name (0);
#endif
case GNUPG_MODULE_NAME_SCDAEMON:
@@ -683,3 +719,12 @@ gnupg_module_name (int which)
}
#undef X
}
+
+
+/* Flush some of the cached module names. This is for example used by
+ gpg-agent to allow configuring a different pinentry. */
+void
+gnupg_module_name_flush_some (void)
+{
+ (void)get_default_pinentry_name (1);
+}