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 <jeremyhu@apple.com>
This commit is contained in:
Jeremy Huddleston Sequoia 2023-01-27 16:42:29 -08:00
parent 25da99a7e5
commit a77aa44f0e
2 changed files with 15 additions and 0 deletions

View file

@ -44,6 +44,7 @@ endforeach
have_funcs = [ have_funcs = [
'accept4', 'accept4',
'getpeereid',
'mkostemp', 'mkostemp',
'posix_fallocate', 'posix_fallocate',
'prctl', 'prctl',

View file

@ -125,6 +125,20 @@ wl_os_socket_peercred(int sockfd, uid_t *uid, gid_t *gid, pid_t *pid)
*pid = ucred.pid; *pid = ucred.pid;
return 0; 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 #else
#error "Don't know how to read ucred on this platform" #error "Don't know how to read ucred on this platform"
#endif #endif