summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOBATA Akio <obache@users.noreply.github.com>2015-10-10 18:14:56 +0900
committerOBATA Akio <obache@users.noreply.github.com>2015-10-10 18:14:56 +0900
commit81c610714d19b74494bbeaa434b10d2909aa4a07 (patch)
treec17f86941d2d729febbac45a73c674b687ac5e7c /src
parent0772a99444a5aa897ac58a830820a937b5931591 (diff)
downloadConsoleKit2-81c610714d19b74494bbeaa434b10d2909aa4a07.tar.gz
Fix pid detection with ck_get_socket_perr_credentials on NetBSD
NetBSD 5 and later have getpeereid(3), but it only for euid. Use getsockopt(2) with LOCAL_PEEREID if available in priority to it.
Diffstat (limited to 'src')
-rw-r--r--src/ck-sysdeps-unix.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/ck-sysdeps-unix.c b/src/ck-sysdeps-unix.c
index cf79525..c24a0e1 100644
--- a/src/ck-sysdeps-unix.c
+++ b/src/ck-sysdeps-unix.c
@@ -40,6 +40,10 @@
#include <dev/wscons/wsdisplay_usl_io.h>
#endif
+#if defined(__NetBSD__)
+#include <sys/un.h>
+#endif
+
#ifdef HAVE_SYS_VT_H
#include <sys/vt.h>
#endif
@@ -108,6 +112,22 @@ ck_get_socket_peer_credentials (int socket_fd,
if (ucred != NULL) {
ucred_free (ucred);
}
+#elif defined(LOCAL_PEEREID)
+ struct unpcbid cr;
+ socklen_t cr_len;
+
+ cr_len = sizeof (cr);
+
+ if (getsockopt (socket_fd, 0, LOCAL_PEEREID, &cr, &cr_len) == 0 && cr_len == sizeof (cr)) {
+ pid_read = cr.unp_pid;
+ uid_read = cr.unp_euid;
+ ret = TRUE;
+ } else {
+ g_warning ("Failed to getsockopt() credentials, returned len %d/%d: %s\n",
+ cr_len,
+ (int) sizeof (cr),
+ g_strerror (errno));
+ }
#elif defined(HAVE_GETPEEREID)
gid_t dummy;