diff options
-rw-r--r-- | Userland/Libraries/LibCore/Stream.cpp | 36 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/Stream.h | 1 |
2 files changed, 37 insertions, 0 deletions
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<void> LocalSocket::send_fd(int fd) #endif } +ErrorOr<pid_t> 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<size_t> 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<int> receive_fd(int flags); ErrorOr<void> send_fd(int fd); + ErrorOr<pid_t> peer_pid() const; ErrorOr<size_t> read_without_waiting(Bytes buffer); virtual ~LocalSocket() { close(); } |