api: Add FreeBSD specific mechanisms for unix sockets 37/40637/4
authorTom Jones <thj@freebsd.org>
Mon, 29 Jan 2024 15:08:01 +0000 (15:08 +0000)
committerDamjan Marion <dmarion@0xa5.net>
Wed, 24 Apr 2024 12:23:25 +0000 (12:23 +0000)
FreeBSD doesn't support SCM_CREDENTIALS, but has an equivalent mechanism
called SCM_CRED. This is documented in unix(4), use SCM_CREDS on
FreeBSD.

Type: improvement
Change-Id: Iaf4ec0d68445239c06fa0eef6c25db7e3328e989
Signed-off-by: Tom Jones <thj@freebsd.org>
src/vlibmemory/socket_client.c

index 5fa19c6..ad28136 100644 (file)
 #define _GNU_SOURCE
 #include <sys/socket.h>
 
+#ifdef __FreeBSD__
+#define _WANT_UCRED
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/un.h>
+#endif /* __FreeBSD__ */
+
 #include <svm/ssvm.h>
 #include <vlibmemory/socket_client.h>
 #include <vlibmemory/memory_client.h>
@@ -278,7 +286,11 @@ vl_sock_api_recv_fd_msg_internal (socket_client_main_t * scm, int fds[],
   struct msghdr mh = { 0 };
   struct iovec iov[1];
   ssize_t size = 0;
+#ifdef __linux__
   struct ucred *cr = 0;
+#elif __FreeBSD__
+  struct cmsgcred *cr = 0;
+#endif /* __linux__ */
   struct cmsghdr *cmsg;
   pid_t pid __attribute__ ((unused));
   uid_t uid __attribute__ ((unused));
@@ -318,6 +330,7 @@ vl_sock_api_recv_fd_msg_internal (socket_client_main_t * scm, int fds[],
     {
       if (cmsg->cmsg_level == SOL_SOCKET)
        {
+#ifdef __linux__
          if (cmsg->cmsg_type == SCM_CREDENTIALS)
            {
              cr = (struct ucred *) CMSG_DATA (cmsg);
@@ -325,6 +338,15 @@ vl_sock_api_recv_fd_msg_internal (socket_client_main_t * scm, int fds[],
              gid = cr->gid;
              pid = cr->pid;
            }
+#elif __FreeBSD__
+         if (cmsg->cmsg_type == SCM_CREDS)
+           {
+             cr = (struct cmsgcred *) CMSG_DATA (cmsg);
+             uid = cr->cmcred_uid;
+             gid = cr->cmcred_gid;
+             pid = cr->cmcred_pid;
+           }
+#endif /* __linux__ */
          else if (cmsg->cmsg_type == SCM_RIGHTS)
            {
              clib_memcpy_fast (fds, CMSG_DATA (cmsg), sizeof (int) * n_fds);