1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| | Make GnuPG automatically find a pinentry installed by Guix. Try using
$HOME or, if that variable is not set, use the system password database,
or fall back to looking in "/".
More information:
https://bugs.gnu.org/24076
diff --git a/common/homedir.c b/common/homedir.c
index 4b6e46e88..f7ae68ba5 100644
--- a/common/homedir.c
+++ b/common/homedir.c
@@ -33,6 +33,7 @@
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
+#include <pwd.h>
#ifdef HAVE_W32_SYSTEM
#include <winsock2.h> /* Due to the stupid mingw64 requirement to
@@ -67,6 +68,10 @@
* gnupg_homedir and gnupg_set_homedir. Malloced. */
static char *the_gnupg_homedir;
+/* The user's home directory. Used in Guix to help GnuPG find the
+ * pinentry. */
+static char *the_user_homedir;
+
/* Flag indicating that home directory is not the default one. */
static byte non_default_homedir;
@@ -509,6 +514,25 @@ gnupg_homedir (void)
return the_gnupg_homedir;
}
+/* Return the user's home directory */
+const char *
+user_homedir (void)
+{
+ const char *dir;
+ dir = getenv("HOME");
+ if (dir == NULL)
+ {
+ struct passwd *pw = NULL;
+ pw = getpwuid (getuid ());
+ if (pw != NULL)
+ dir = pw->pw_dir;
+ else
+ dir = "/";
+ }
+ if (!the_user_homedir)
+ the_user_homedir = make_absfilename (dir, NULL);
+ return the_user_homedir;
+}
/* Return whether the home dir is the default one. */
int
@@ -971,6 +995,7 @@ get_default_pinentry_name (int reset)
} names[] = {
/* The first entry is what we return in case we found no
other pinentry. */
+ { user_homedir, "/.guix-profile/bin/pinentry" },
{ gnupg_bindir, DIRSEP_S "pinentry" EXEEXT_S },
#ifdef HAVE_W32_SYSTEM
/* Try Gpg4win directory (with bin and without.) */
|