From d27c42b8fcc92f3fc776fd1b821d2572bce01c04 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 23 Feb 2012 09:57:52 -0500 Subject: [PATCH] Implement FreeBSD credential support Signed-off-by: Mathieu Desnoyers --- src/bin/lttng-sessiond/main.c | 1 + src/common/compat/socket.h | 22 ++++++----------- src/common/sessiond-comm/sessiond-comm.c | 31 +++++++++++++++++++++--- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 7dca8ad05..aefda5123 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -39,6 +39,7 @@ #include #include +#include #include #include #include diff --git a/src/common/compat/socket.h b/src/common/compat/socket.h index ec8d3ea67..7356324f7 100644 --- a/src/common/compat/socket.h +++ b/src/common/compat/socket.h @@ -26,7 +26,6 @@ #ifdef __linux__ #define LTTNG_SOCK_CREDS SCM_CREDENTIALS -#define LTTNG_SOCK_FDS SCM_RIGHTS typedef struct ucred lttng_sock_cred; @@ -40,21 +39,16 @@ typedef struct ucred lttng_sock_cred; #elif defined(__FreeBSD__) -#undef SO_PASSCRED -#define SO_PASSCRED 0 +struct lttng_sock_cred { + uid_t uid; + gid_t gid; +}; -#define LTTNG_SOCK_CREDS SCM_CREDS -#define LTTNG_SOCK_FDS SCM_RIGHTS +typedef struct lttng_sock_cred lttng_sock_cred; -typedef struct cmsgcred lttng_sock_cred; - -#define LTTNG_SOCK_SET_UID_CRED(c, uid) LTTNG_REF(c)->cmcred_uid = uid -#define LTTNG_SOCK_SET_GID_CRED(c, gid) LTTNG_REF(c)->cmcred_gid = gid -#define LTTNG_SOCK_SET_PID_CRED(c, pid) LTTNG_REF(c)->cmcred_pid = pid - -#define LTTNG_SOCK_GET_UID_CRED(c) LTTNG_REF(c)->cmcred_uid -#define LTTNG_SOCK_GET_GID_CRED(c) LTTNG_REF(c)->cmcred_gid -#define LTTNG_SOCK_GET_PID_CRED(c) LTTNG_REF(c)->cmcred_pid +#define LTTNG_SOCK_GET_UID_CRED(c) LTTNG_REF(c)->uid +#define LTTNG_SOCK_GET_GID_CRED(c) LTTNG_REF(c)->gid +#define LTTNG_SOCK_GET_PID_CRED(c) -1 #else #error "Please add support for your OS." diff --git a/src/common/sessiond-comm/sessiond-comm.c b/src/common/sessiond-comm/sessiond-comm.c index f133d5bfb..20baaaf7b 100644 --- a/src/common/sessiond-comm/sessiond-comm.c +++ b/src/common/sessiond-comm/sessiond-comm.c @@ -429,12 +429,14 @@ end: ssize_t lttcomm_send_creds_unix_sock(int sock, void *buf, size_t len) { struct msghdr msg; - struct cmsghdr *cmptr; struct iovec iov[1]; ssize_t ret = -1; +#ifdef __linux__ + struct cmsghdr *cmptr; size_t sizeof_cred = sizeof(lttng_sock_cred); char anc_buf[CMSG_SPACE(sizeof_cred)]; lttng_sock_cred *creds; +#endif /* __linux__ */ memset(&msg, 0, sizeof(msg)); @@ -443,6 +445,7 @@ ssize_t lttcomm_send_creds_unix_sock(int sock, void *buf, size_t len) msg.msg_iov = iov; msg.msg_iovlen = 1; +#ifdef __linux__ msg.msg_control = (caddr_t) anc_buf; msg.msg_controllen = CMSG_LEN(sizeof_cred); @@ -456,6 +459,7 @@ ssize_t lttcomm_send_creds_unix_sock(int sock, void *buf, size_t len) LTTNG_SOCK_SET_UID_CRED(creds, geteuid()); LTTNG_SOCK_SET_GID_CRED(creds, getegid()); LTTNG_SOCK_SET_PID_CRED(creds, getpid()); +#endif /* __linux__ */ ret = sendmsg(sock, &msg, 0); if (ret < 0) { @@ -474,11 +478,13 @@ ssize_t lttcomm_recv_creds_unix_sock(int sock, void *buf, size_t len, lttng_sock_cred *creds) { struct msghdr msg; - struct cmsghdr *cmptr; struct iovec iov[1]; ssize_t ret; +#ifdef __linux__ + struct cmsghdr *cmptr; size_t sizeof_cred = sizeof(lttng_sock_cred); char anc_buf[CMSG_SPACE(sizeof_cred)]; +#endif /* __linux__ */ memset(&msg, 0, sizeof(msg)); @@ -494,8 +500,10 @@ ssize_t lttcomm_recv_creds_unix_sock(int sock, void *buf, size_t len, msg.msg_iov = iov; msg.msg_iovlen = 1; +#ifdef __linux__ msg.msg_control = anc_buf; msg.msg_controllen = sizeof(anc_buf); +#endif /* __linux__ */ ret = recvmsg(sock, &msg, 0); if (ret < 0) { @@ -503,6 +511,7 @@ ssize_t lttcomm_recv_creds_unix_sock(int sock, void *buf, size_t len, goto end; } +#ifdef __linux__ if (msg.msg_flags & MSG_CTRUNC) { fprintf(stderr, "Error: Control message truncated.\n"); ret = -1; @@ -531,6 +540,14 @@ ssize_t lttcomm_recv_creds_unix_sock(int sock, void *buf, size_t len, } memcpy(creds, CMSG_DATA(cmptr), sizeof_cred); +#elif defined(__FreeBSD__) + ret = getpeereid(sock, &creds->uid, &creds->gid); + if (ret != 0) { + return ret; + } +#else +#error "Please implement credential support for your OS." +#endif /* __linux__ */ end: return ret; @@ -539,6 +556,7 @@ end: /* * Set socket option to use credentials passing. */ +#ifdef __linux__ int lttcomm_setsockopt_creds_unix_sock(int sock) { int ret, on = 1; @@ -548,6 +566,13 @@ int lttcomm_setsockopt_creds_unix_sock(int sock) if (ret < 0) { perror("setsockopt creds unix sock"); } - return ret; } +#elif defined(__FreeBSD__) +int lttcomm_setsockopt_creds_unix_sock(int sock) +{ + return 0; +} +#else +#error "Please implement credential support for your OS." +#endif /* __linux__ */ -- 2.34.1