]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: add virGetUNIXSocketPath helper
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 19 Jan 2018 13:48:10 +0000 (13:48 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Wed, 31 Jan 2018 15:12:53 +0000 (15:12 +0000)
When receiving multiple socket FDs from systemd, it is critical to know
what socket address each corresponds to so we can setup the right
protocols on each.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/libvirt_private.syms
src/util/virutil.c
src/util/virutil.h

index 9339c2c3259da6912f11caf958ddc6cfa86edbce..7404759f7fa51e1e2bcb66f749c025e13ee14d10 100644 (file)
@@ -2980,6 +2980,7 @@ virGetListenFDs;
 virGetSelfLastChanged;
 virGetSystemPageSize;
 virGetSystemPageSizeKB;
+virGetUNIXSocketPath;
 virGetUnprivSGIOSysfsPath;
 virGetUserCacheDirectory;
 virGetUserConfigDirectory;
index e9dbaf3d7ade938cd13c6aa16e3fd087d438d54e..8352e0f1f1ce71b59b2fb66e6653d76d4be02a58 100644 (file)
 # include <shlobj.h>
 #endif
 
+#ifdef HAVE_SYS_UN_H
+# include <sys/un.h>
+#endif
+
 #include "c-ctype.h"
 #include "mgetgroups.h"
 #include "virerror.h"
@@ -1978,6 +1982,47 @@ virGetListenFDs(void)
 
 #endif /* WIN32 */
 
+#ifdef HAVE_SYS_UN_H
+char *virGetUNIXSocketPath(int fd)
+{
+    struct sockaddr_storage ss = { 0 };
+    struct sockaddr_un *un = (struct sockaddr_un *)&ss;
+    socklen_t len = sizeof(ss);
+    char *path;
+
+    if (getsockname(fd, (struct sockaddr *)&ss, &len) < 0) {
+        virReportSystemError(errno, _("Unable to get address of FD %d"), fd);
+        return NULL;
+    }
+
+    if (ss.ss_family != AF_UNIX) {
+        virReportSystemError(EINVAL, _("FD %d is not a UNIX socket, has af=%d"),
+                             fd, ss.ss_family);
+        return NULL;
+    }
+
+    if (un->sun_path[0] == '\0')
+        un->sun_path[0] = '@';
+
+    if (VIR_ALLOC_N(path, sizeof(un->sun_path) + 1) < 0)
+        return NULL;
+
+    memcpy(path, un->sun_path, sizeof(un->sun_path));
+    path[sizeof(un->sun_path)] = '\0';
+    return path;
+}
+
+#else /* HAVE_SYS_UN_H */
+
+char *virGetUNIXSocketPath(int fd)
+{
+    virReportSystemError(ENOSYS, "%s",
+                         _("UNIX sockets not supported on this platform");
+    return NULL;
+}
+
+#endif /* HAVE_SYS_UN_H */
+
 #ifndef WIN32
 long virGetSystemPageSize(void)
 {
index 9381ad568200772c23975069bdaaf826bfd12127..be0f6b0ea855c75b792f452a7813186087c2c0be 100644 (file)
@@ -207,6 +207,7 @@ verify((int)VIR_TRISTATE_BOOL_NO == (int)VIR_TRISTATE_SWITCH_OFF);
 verify((int)VIR_TRISTATE_BOOL_ABSENT == (int)VIR_TRISTATE_SWITCH_ABSENT);
 
 unsigned int virGetListenFDs(void);
+char *virGetUNIXSocketPath(int fd);
 
 long virGetSystemPageSize(void) ATTRIBUTE_NOINLINE;
 long virGetSystemPageSizeKB(void) ATTRIBUTE_NOINLINE;