summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibCore/Stream.cpp36
-rw-r--r--Userland/Libraries/LibCore/Stream.h1
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(); }