aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac26
-rw-r--r--src/assuan-socket-server.c21
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;