Prechádzať zdrojové kódy

LibCore: Implement LocalSocket::peer_pid

Mostly a copy of Core::LocalSocket::peer_pid.
sin-ack 3 rokov pred
rodič
commit
4cad0dd74c

+ 36 - 0
Userland/Libraries/LibCore/Stream.cpp

@@ -568,6 +568,42 @@ ErrorOr<void> LocalSocket::send_fd(int fd)
 #endif
 #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)
 ErrorOr<size_t> LocalSocket::read_without_waiting(Bytes buffer)
 {
 {
     return m_helper.read(buffer, MSG_DONTWAIT);
     return m_helper.read(buffer, MSG_DONTWAIT);

+ 1 - 0
Userland/Libraries/LibCore/Stream.h

@@ -413,6 +413,7 @@ public:
 
 
     ErrorOr<int> receive_fd(int flags);
     ErrorOr<int> receive_fd(int flags);
     ErrorOr<void> send_fd(int fd);
     ErrorOr<void> send_fd(int fd);
+    ErrorOr<pid_t> peer_pid() const;
     ErrorOr<size_t> read_without_waiting(Bytes buffer);
     ErrorOr<size_t> read_without_waiting(Bytes buffer);
 
 
     virtual ~LocalSocket() { close(); }
     virtual ~LocalSocket() { close(); }