diff options
-rw-r--r-- | configure.ac | 26 | ||||
-rw-r--r-- | src/assuan-socket-server.c | 21 |
2 files changed, 47 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index b420f48..5a2a8d6 100644 --- a/configure.ac +++ b/configure.ac @@ -367,9 +367,35 @@ AC_CACHE_VAL(assuan_cv_sys_so_peercred, assuan_cv_sys_so_peercred=no) ]) AC_MSG_RESULT($assuan_cv_sys_so_peercred) + if test $assuan_cv_sys_so_peercred = yes; then AC_DEFINE(HAVE_SO_PEERCRED, 1, [Defined if SO_PEERCRED is supported (Linux specific)]) +else + # + # Check for the getsockopt LOCAL_PEEREID (NetBSD) + # + AC_MSG_CHECKING(for LOCAL_PEEREID) + AC_CACHE_VAL(assuan_cv_sys_so_local_peereid, + [AC_TRY_COMPILE([#include <sys/socket.> + #include <sys/un.h>], + [struct unpcbid unp; + int unpl = sizeof unp; + getsockopt (1, SOL_SOCKET, LOCAL_PEEREID, &unp, &unpl);], + assuan_cv_sys_so_local_peereid=yes, + assuan_cv_sys_so_local_peereid=no) + ]) + AC_MSG_RESULT($assuan_cv_sys_so_local_peereid) + + if test $assuan_cv_sys_so_local_peereid = yes; then + AC_DEFINE(HAVE_LOCAL_PEEREID, 1, + [Defined if LOCAL_PEEREID is supported (NetBSD specific)]) + else + # + # FreeBSD + # + AC_CHECK_FUNCS([getpeereid]) + fi fi diff --git a/src/assuan-socket-server.c b/src/assuan-socket-server.c index 27994a2..1e8e541 100644 --- a/src/assuan-socket-server.c +++ b/src/assuan-socket-server.c @@ -74,6 +74,27 @@ accept_connection_bottom (assuan_context_t ctx) ctx->pid = cr.pid; } } +#elif defined(HAVE_LOCAL_PEEREID) + { + struct unpcbid unp; + socklen_t unpl = sizeof unp; + + if (getsockopt(fd, 0, LOCAL_PEEREID, &unp, &unpl) != -1) + { + ctx->peercred.pid = unp.unp_pid; + ctx->peercred.uid = unp.unp_euid; + ctx->peercred.gid = unp.unp_egid; + ctx->peercred_valid = 1; + } + } +#elif defined(HAVE_GETPEEREID) + { + if (getpeereid(fd, &ctx->peercred.uid, &ctx->peercred.gid) != -1) + { + ctx->peercred.pid = ASSUAN_INVALID_PID; + ctx->peercred_valid = 1; + } + } #endif ctx->inbound.fd = fd; |