diff options
author | OBATA Akio <obache@users.noreply.github.com> | 2015-10-10 18:14:56 +0900 |
---|---|---|
committer | OBATA Akio <obache@users.noreply.github.com> | 2015-10-10 18:14:56 +0900 |
commit | 81c610714d19b74494bbeaa434b10d2909aa4a07 (patch) | |
tree | c17f86941d2d729febbac45a73c674b687ac5e7c /src | |
parent | 0772a99444a5aa897ac58a830820a937b5931591 (diff) | |
download | ConsoleKit2-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.c | 20 |
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; |