|
@@ -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);
|