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>]])
# 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"
}
-#ifdef SO_PEERCRED
+#if defined(SO_PEERCRED)
int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
uid_t *uid,
gid_t *gid,
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,