Skip to content

Commit

Permalink
net/SocketDescriptor: add GetPeerPidfd()
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxKellermann committed Jan 1, 2025
1 parent 14e1337 commit 22dd4a2
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/net/SocketDescriptor.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
#include "IPv6Address.hxx"
#include "UniqueSocketDescriptor.hxx"

#ifdef __linux__
#include "io/UniqueFileDescriptor.hxx"
#endif

#ifdef _WIN32
#include <ws2tcpip.h>
#else
Expand Down Expand Up @@ -235,6 +239,24 @@ SocketDescriptor::GetPeerCredentials() const noexcept

#endif

#ifdef __linux__

#ifndef SO_PEERPIDFD
#define SO_PEERPIDFD 77
#endif

UniqueFileDescriptor
SocketDescriptor::GetPeerPidfd() const noexcept
{
int pidfd;
if (GetOption(SOL_SOCKET, SO_PEERPIDFD, &pidfd, sizeof(pidfd)) < sizeof(pidfd))
return {};

return UniqueFileDescriptor{pidfd};
}

#endif // __linux__

#ifdef _WIN32

bool
Expand Down
11 changes: 11 additions & 0 deletions src/net/SocketDescriptor.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class StaticSocketAddress;
class IPv4Address;
class IPv6Address;
class UniqueSocketDescriptor;
class UniqueFileDescriptor;

/**
* An OO wrapper for a Berkeley or WinSock socket descriptor.
Expand Down Expand Up @@ -229,6 +230,16 @@ public:
struct ucred GetPeerCredentials() const noexcept;
#endif

#ifdef __linux__
/**
* Get a pidfd for the peer process. Returns an undefined
* instance on error (with errno set).
*
* Requires Linux 6.5.
*/
UniqueFileDescriptor GetPeerPidfd() const noexcept;
#endif // __linux__

bool SetOption(int level, int name,
const void *value, std::size_t size) const noexcept;

Expand Down

0 comments on commit 22dd4a2

Please sign in to comment.