Fixes <https://bugs.gnu.org/24076>. * gnu/packages/patches/gnupg-default-pinentry.patch: New file. Use $HOME to find the user's Guix profile and installed pinentry. * gnu/local.mk (dist_patch_DATA): Add the patch. * gnu/packages/gnupg.scm (gnupg)[source]: Use it.
		
			
				
	
	
		
			65 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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.) */
 |