Add support for sockets in /run used by recent gpg-agent

* subversion/libsvn_subr/gpg_agent.c
        (find_running_gpg_agent): Check for socket presence in
        /run/user/UID/gnupg and /var/run/user/UID/gnupg in
        addition to ~/.gnupg
Index: subversion/libsvn_subr/gpg_agent.c
===================================================================
*** subversion/libsvn_subr/gpg_agent.c  (revision 1792920)
--- subversion/libsvn_subr/gpg_agent.c  (working copy)
***************
*** 62,70 ****
--- 62,73 ----
  #include <unistd.h>
  
  #include <sys/socket.h>
+ #include <sys/stat.h>
  #include <sys/un.h>
  
  #include <apr_pools.h>
+ #include <apr_user.h>
+ #include <apr_strings.h>
  #include "svn_auth.h"
  #include "svn_config.h"
  #include "svn_error.h"
*************** find_running_gpg_agent(int *new_sd, apr_
*** 266,278 ****
      }
    else
      {
        const char *homedir = svn_user_get_homedir(pool);
! 
!       if (!homedir)
!         return SVN_NO_ERROR;
! 
!       socket_name = svn_dirent_join_many(pool, homedir, ".gnupg",
!                                          "S.gpg-agent", SVN_VA_NULL);
      }
  
    if (socket_name != NULL)
--- 269,309 ----
      }
    else
      {
+       int isockmax = 0;
+       const char* socketpaths[3] = {0,0,0};
+       /* GnuPG since 2.1.13 uses /run/user/UID/gnupg based sockets */
+       apr_uid_t uid;
+       apr_gid_t gid;
+       if(apr_uid_current(&uid, &gid, pool) == APR_SUCCESS) {
+         char* uidbuf = apr_psprintf(pool, "%lu", (unsigned long)uid);
+         socketpaths[isockmax++] = svn_dirent_join_many(pool, "/run/user",
+                                                        uidbuf, "gnupg",
+                                                        "S.gpg-agent",
+                                                        SVN_VA_NULL);
+         socketpaths[isockmax++] = svn_dirent_join_many(pool, "/var/run/user",
+                                                        uidbuf, "gnupg",
+                                                        "S.gpg-agent",
+                                                        SVN_VA_NULL);
+       }
+       /* older GnuPG versions use /home/USER/.gnupg based sockets */
        const char *homedir = svn_user_get_homedir(pool);
!       if(homedir) {
!         socketpaths[isockmax++] =  svn_dirent_join_many(pool, homedir,
!                                                         ".gnupg",
!                                                         "S.gpg-agent",
!                                                         SVN_VA_NULL);
!       }
! 
!       /* find which of the available socket paths actually exists */
!       int isock = 0;
!       for (isock = 0; isock < isockmax; isock++) {
!         struct stat statbuf;
!         stat(socketpaths[isock], &statbuf);
!         if(S_ISSOCK(statbuf.st_mode)) {
!           socket_name = socketpaths[isock];
!           break;
!         }
!       }
      }
  
    if (socket_name != NULL)

Reply via email to