From da5e0c442bc1f0e1e47ab92b0196e99e7c4ffafd Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 23 Nov 2023 17:58:01 +0100 Subject: [PATCH] socket-util: add helper for getting peer pidfd --- src/basic/missing_socket.h | 4 ++++ src/basic/socket-util.c | 15 +++++++++++++++ src/basic/socket-util.h | 1 + 3 files changed, 20 insertions(+) diff --git a/src/basic/missing_socket.h b/src/basic/missing_socket.h index 30ac297e171..3333cf18e7a 100644 --- a/src/basic/missing_socket.h +++ b/src/basic/missing_socket.h @@ -32,6 +32,10 @@ struct sockaddr_vm { #define SO_PEERGROUPS 59 #endif +#ifndef SO_PEERPIDFD +#define SO_PEERPIDFD 77 +#endif + #ifndef SO_BINDTOIFINDEX #define SO_BINDTOIFINDEX 62 #endif diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 86472c88474..98133a2ecda 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -956,6 +956,21 @@ int getpeergroups(int fd, gid_t **ret) { return (int) n; } +int getpeerpidfd(int fd) { + socklen_t n = sizeof(int); + int pidfd = -EBADF; + + assert(fd >= 0); + + if (getsockopt(fd, SOL_SOCKET, SO_PEERPIDFD, &pidfd, &n) < 0) + return -errno; + + if (n != sizeof(int)) + return -EIO; + + return pidfd; +} + ssize_t send_many_fds_iov_sa( int transport_fd, int *fds_array, size_t n_fds_array, diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index 9a11df834d1..032d73857ed 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -152,6 +152,7 @@ bool address_label_valid(const char *p); int getpeercred(int fd, struct ucred *ucred); int getpeersec(int fd, char **ret); int getpeergroups(int fd, gid_t **ret); +int getpeerpidfd(int fd); ssize_t send_many_fds_iov_sa( int transport_fd,