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; }