util: add virGetUNIXSocketPath helper

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>
This commit is contained in:
Daniel P. Berrange 2018-01-19 13:48:10 +00:00 committed by Daniel P. Berrangé
parent b42c591fec
commit 9fe6619d4a
3 changed files with 47 additions and 0 deletions

View File

@ -2980,6 +2980,7 @@ virGetListenFDs;
virGetSelfLastChanged;
virGetSystemPageSize;
virGetSystemPageSizeKB;
virGetUNIXSocketPath;
virGetUnprivSGIOSysfsPath;
virGetUserCacheDirectory;
virGetUserConfigDirectory;

View File

@ -68,6 +68,10 @@
# 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)
{

View 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;