]> xenbits.xensource.com Git - libvirt.git/commitdiff
rpc: Retrieve peer PID via new getsockopt() for Mac
authorDoug Goldstein <cardoe@cardoe.com>
Sat, 12 Oct 2013 17:06:27 +0000 (12:06 -0500)
committerDoug Goldstein <cardoe@cardoe.com>
Tue, 22 Oct 2013 15:51:31 +0000 (10:51 -0500)
While LOCAL_PEERCRED on the BSDs does not return the pid information of
the peer, Mac OS X 10.8 added LOCAL_PEERPID to retrieve the pid so we
should use that when its available to get that information.

src/rpc/virnetsocket.c

index b2ebefec3b7d294fe0148c56976bb8188b621e08..3eb5708fcc0283030a672b409a956b46fb2789a3 100644 (file)
@@ -1197,12 +1197,36 @@ int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
         goto cleanup;
     }
 
-    /* PID and process creation time are not supported on BSDs */
+    /* PID and process creation time are not supported on BSDs by
+     * LOCAL_PEERCRED.
+     */
     *pid = -1;
     *timestamp = -1;
     *uid = cr.cr_uid;
     *gid = cr.cr_gid;
 
+# ifdef LOCAL_PEERPID
+    /* Exists on Mac OS X 10.8 for retrieving the peer's PID */
+    cr_len = sizeof(*pid);
+
+    if (getsockopt(sock->fd, VIR_SOL_PEERCRED, LOCAL_PEERPID, pid, &cr_len) < 0) {
+        /* Ensure this is set to something sane as there are no guarantees
+         * as to what its set to now.
+         */
+        *pid = -1;
+
+        /* If this was built on a system with LOCAL_PEERPID defined but
+         * the kernel doesn't support it we'll get back EOPNOTSUPP so
+         * treat all errors but EOPNOTSUPP as fatal
+         */
+        if (errno != EOPNOTSUPP) {
+            virReportSystemError(errno, "%s",
+                    _("Failed to get client socket PID"));
+            goto cleanup;
+        }
+    }
+# endif
+
     ret = 0;
 
 cleanup: