From 0c94357f9d1dbf36145ab50dc01db0876ee218c8 Mon Sep 17 00:00:00 2001 From: Roman Bogorodskiy Date: Fri, 14 Dec 2012 22:06:33 +0400 Subject: [PATCH] Socket identity support for FreeBSD. This adds an implementation of virNetSocketGetUNIXIdentity() using LOCAL_PEERCRED socket option and xucred struct, defined in on systems that have it. --- configure.ac | 3 ++- src/rpc/virnetsocket.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 19369828c6..6c35afc651 100644 --- a/configure.ac +++ b/configure.ac @@ -187,7 +187,8 @@ LIBS=$old_libs dnl Availability of various common headers (non-fatal if missing). AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/un.h \ sys/poll.h syslog.h mntent.h net/ethernet.h linux/magic.h \ - sys/un.h sys/syscall.h netinet/tcp.h ifaddrs.h libtasn1.h]) + sys/un.h sys/syscall.h netinet/tcp.h ifaddrs.h libtasn1.h \ + sys/ucred.h]) dnl Check whether endian provides handy macros. AC_CHECK_DECLS([htole64], [], [], [[#include ]]) diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c index a1b64d7309..70c621f636 100644 --- a/src/rpc/virnetsocket.c +++ b/src/rpc/virnetsocket.c @@ -35,6 +35,10 @@ # include #endif +#ifdef HAVE_SYS_UCRED_H +# include +#endif + #include "c-ctype.h" #include "virnetsocket.h" #include "util.h" @@ -1091,7 +1095,7 @@ int virNetSocketGetPort(virNetSocketPtr sock) } -#ifdef SO_PEERCRED +#if defined(SO_PEERCRED) int virNetSocketGetUNIXIdentity(virNetSocketPtr sock, uid_t *uid, gid_t *gid, @@ -1115,6 +1119,30 @@ int virNetSocketGetUNIXIdentity(virNetSocketPtr sock, virMutexUnlock(&sock->lock); return 0; } +#elif defined(LOCAL_PEERCRED) +int virNetSocketGetUNIXIdentity(virNetSocketPtr sock, + uid_t *uid, + gid_t *gid, + pid_t *pid) +{ + struct xucred cr; + socklen_t cr_len = sizeof(cr); + virMutexLock(&sock->lock); + + if (getsockopt(sock->fd, SOL_SOCKET, LOCAL_PEERCRED, &cr, &cr_len) < 0) { + virReportSystemError(errno, "%s", + _("Failed to get client socket identity")); + virMutexUnlock(&sock->lock); + return -1; + } + + *pid = -1; + *uid = cr.cr_uid; + *gid = cr.cr_gid; + + virMutexUnlock(&sock->lock); + return 0; +} #else int virNetSocketGetUNIXIdentity(virNetSocketPtr sock ATTRIBUTE_UNUSED, uid_t *uid ATTRIBUTE_UNUSED,