]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Socket identity support for FreeBSD.
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Fri, 14 Dec 2012 18:06:33 +0000 (22:06 +0400)
committerEric Blake <eblake@redhat.com>
Fri, 14 Dec 2012 18:49:31 +0000 (11:49 -0700)
This adds an implementation of virNetSocketGetUNIXIdentity()
using LOCAL_PEERCRED socket option and xucred struct, defined
in <sys/ucred.h> on systems that have it.

configure.ac
src/rpc/virnetsocket.c

index 19369828c69abeee9460aebe87f0969cb5fcf203..6c35afc65156fd87ee471cbfe168103c66c7deb3 100644 (file)
@@ -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 <endian.h>]])
 
index a1b64d73090041e0a619cc07b6c992898e12d602..70c621f636b9d194df164154356e5b2e8df6ed5c 100644 (file)
 # include <netinet/tcp.h>
 #endif
 
+#ifdef HAVE_SYS_UCRED_H
+# include <sys/ucred.h>
+#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,