On Fri, Apr 28, 2017 at 05:46:21PM +0200, Lukas Jirkovsky wrote: > Add support for sockets in /run used by recent gpg-agent
Thanks for the patch! Aside from a few comments on the code, I wonder if it would be better to use "gpgconf --list-dir agent-socket" instead of reimplementing the various bits of logic ourselves? That's only usable with the gnupg 2.x series, though. > Index: subversion/libsvn_subr/gpg_agent.c > =================================================================== > *** subversion/libsvn_subr/gpg_agent.c (revision 1792920) > --- subversion/libsvn_subr/gpg_agent.c (working copy) > *************** 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) { apr_uid_current is only available when APR_HAS_USER is defined. > + 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); Should probably use svn_io_stat here instead, with wanted set to APR_FINFO_TYPE. > ! if(S_ISSOCK(statbuf.st_mode)) { > ! socket_name = socketpaths[isock]; > ! break; > ! } > ! } > } > > if (socket_name != NULL) Cheers, -- James GPG Key: 4096R/91BF BF4D 6956 BD5D F7B7 2D23 DFE6 91AE 331B A3DB