From: Lennart Poettering Date: Thu, 23 Nov 2023 16:58:01 +0000 (+0100) Subject: socket-util: add helper for getting peer pidfd X-Git-Tag: v256-rc1~1307^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=da5e0c442bc1f0e1e47ab92b0196e99e7c4ffafd;p=thirdparty%2Fsystemd.git socket-util: add helper for getting peer pidfd --- 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,