From a77aa44f0e30cb899d1f3f652ee940b43c4bf6d7 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Sequoia Date: Fri, 27 Jan 2023 16:42:29 -0800 Subject: [PATCH] os: Add an implementation of wl_os_socket_peercred() for darwin This adds an alternative implementation of wl_os_socket_peercred() using getpeereid(3) and LOCAL_PEERPID, similar to changes I recently made to xorg-server. Signed-off-by: Jeremy Huddleston Sequoia --- meson.build | 1 + src/wayland-os.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/meson.build b/meson.build index cb6c2385..78948674 100644 --- a/meson.build +++ b/meson.build @@ -44,6 +44,7 @@ endforeach have_funcs = [ 'accept4', + 'getpeereid', 'mkostemp', 'posix_fallocate', 'prctl', diff --git a/src/wayland-os.c b/src/wayland-os.c index f00ead4b..0754d89b 100644 --- a/src/wayland-os.c +++ b/src/wayland-os.c @@ -125,6 +125,20 @@ wl_os_socket_peercred(int sockfd, uid_t *uid, gid_t *gid, pid_t *pid) *pid = ucred.pid; return 0; } +#elif defined(HAVE_GETPEEREID) && defined(LOCAL_PEERPID) +int +wl_os_socket_peercred(int sockfd, uid_t *uid, gid_t *gid, pid_t *pid) +{ + socklen_t len; + + if (getpeereid(sockfd, uid, gid) != 0) + return -1; + + len = sizeof(pid_t); + if (getsockopt(sockfd, SOL_LOCAL, LOCAL_PEERPID, pid, &len) != 0) + return -1; + return 0; +} #else #error "Don't know how to read ucred on this platform" #endif