From 4cad0dd74c249ac997b1a06b969eceaea6c9c35b Mon Sep 17 00:00:00 2001 From: sin-ack Date: Fri, 14 Jan 2022 13:25:37 +0000 Subject: [PATCH] LibCore: Implement LocalSocket::peer_pid Mostly a copy of Core::LocalSocket::peer_pid. --- Userland/Libraries/LibCore/Stream.cpp | 36 +++++++++++++++++++++++++++ Userland/Libraries/LibCore/Stream.h | 1 + 2 files changed, 37 insertions(+) diff --git a/Userland/Libraries/LibCore/Stream.cpp b/Userland/Libraries/LibCore/Stream.cpp index f0dbe57938..fcc5800614 100644 --- a/Userland/Libraries/LibCore/Stream.cpp +++ b/Userland/Libraries/LibCore/Stream.cpp @@ -568,6 +568,42 @@ ErrorOr LocalSocket::send_fd(int fd) #endif } +ErrorOr LocalSocket::peer_pid() const +{ +#ifdef AK_OS_MACOS + pid_t pid; + socklen_t pid_size = sizeof(pid); +#elif defined(__FreeBSD__) + struct xucred creds = {}; + socklen_t creds_size = sizeof(creds); +#elif defined(__OpenBSD__) + struct sockpeercred creds = {}; + socklen_t creds_size = sizeof(creds); +#else + struct ucred creds = {}; + socklen_t creds_size = sizeof(creds); +#endif + +#ifdef AK_OS_MACOS + if (getsockopt(m_helper.fd(), SOL_LOCAL, LOCAL_PEERPID, &pid, &pid_size) < 0) +#elif defined(__FreeBSD__) + if (getsockopt(m_helper.fd(), SOL_LOCAL, LOCAL_PEERCRED, &creds, &creds_size) < 0) +#else + if (getsockopt(m_helper.fd(), SOL_SOCKET, SO_PEERCRED, &creds, &creds_size) < 0) +#endif + { + return Error::from_syscall("getsockopt", -errno); + } + +#ifdef AK_OS_MACOS + return pid; +#elif defined(__FreeBSD__) + return creds.cr_pid; +#else + return creds.pid; +#endif +} + ErrorOr LocalSocket::read_without_waiting(Bytes buffer) { return m_helper.read(buffer, MSG_DONTWAIT); diff --git a/Userland/Libraries/LibCore/Stream.h b/Userland/Libraries/LibCore/Stream.h index 17d59ee408..15b4f07cb2 100644 --- a/Userland/Libraries/LibCore/Stream.h +++ b/Userland/Libraries/LibCore/Stream.h @@ -413,6 +413,7 @@ public: ErrorOr receive_fd(int flags); ErrorOr send_fd(int fd); + ErrorOr peer_pid() const; ErrorOr read_without_waiting(Bytes buffer); virtual ~LocalSocket() { close(); }