From 4f11112be0c0a89e8f078c0b4bcc103dbc6ac875 Mon Sep 17 00:00:00 2001 From: Jan Beich Date: Tue, 26 Aug 2025 05:41:22 +0200 Subject: [PATCH] eis: implement getting client PID for BSDs after 70cfc6eed2e3 src/libeis-socket.c:192:15: error: variable has incomplete type 'struct ucred' 192 | struct ucred ucred; | ^ src/libeis-socket.c:192:9: note: forward declaration of 'struct ucred' 192 | struct ucred ucred; | ^ src/libeis-socket.c:194:65: error: use of undeclared identifier 'SO_PEERCRED' 194 | int rc = getsockopt(source_get_fd(client->source), SOL_SOCKET, SO_PEERCRED, &ucred, &len); | ^ Part-of: --- src/libeis-socket.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/libeis-socket.c b/src/libeis-socket.c index 915360d..5009600 100644 --- a/src/libeis-socket.c +++ b/src/libeis-socket.c @@ -41,6 +41,28 @@ #include "libeis.h" #include "libeis-private.h" +#if defined(__DragonFly__) || defined(__FreeBSD__) +#include +#define CRED_T xucred +#define CRED_LVL SOL_LOCAL +#define CRED_OPT LOCAL_PEERCRED +#define CRED_PID cr_pid +#elif defined(__NetBSD__) +#define CRED_T unpcbid +#define CRED_LVL SOL_LOCAL +#define CRED_OPT LOCAL_PEEREID +#define CRED_PID unp_pid +#else +#if defined(__OpenBSD__) +#define CRED_T sockpeercred +#else +#define CRED_T ucred +#endif +#define CRED_LVL SOL_SOCKET +#define CRED_OPT SO_PEERCRED +#define CRED_PID pid +#endif + struct eis_socket { struct object object; struct source *listener; @@ -189,11 +211,11 @@ eis_backend_socket_get_client_pid(struct eis_client* client) log_bug_client(eis, "Not a socket backend"); return -EINVAL; } - struct ucred ucred; + struct CRED_T ucred; socklen_t len = sizeof(ucred); - int rc = getsockopt(source_get_fd(client->source), SOL_SOCKET, SO_PEERCRED, &ucred, &len); + int rc = getsockopt(source_get_fd(client->source), CRED_LVL, CRED_OPT, &ucred, &len); if (rc < 0) { return -errno; } - return ucred.pid; + return ucred.CRED_PID; }