TODO msg: start re-adding fd=passing with accrights
[obnox/samba/samba-obnox.git] / source3 / lib / msghdr.c
index 82f7ca7cdee18e2be7cfac0f13dd9ea989476f2a..72e4b0945e799b4e023456d626815a506cf4b873 100644 (file)
 
 #include "replace.h"
 #include "lib/msghdr.h"
-#include "lib/iov_buf.h"
+#include "lib/util/iov_buf.h"
 #include <sys/socket.h>
 
+ #if !defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) && !defined(HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS)
+ # error Can not pass file descriptors
+ #endif
+
 ssize_t msghdr_prep_fds(struct msghdr *msg, uint8_t *buf, size_t bufsize,
                        const int *fds, size_t num_fds)
 {
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
        size_t fds_size = sizeof(int) * MIN(num_fds, INT8_MAX);
        size_t cmsg_len = CMSG_LEN(fds_size);
        size_t cmsg_space = CMSG_SPACE(fds_size);
@@ -56,6 +61,27 @@ ssize_t msghdr_prep_fds(struct msghdr *msg, uint8_t *buf, size_t bufsize,
        msg->msg_controllen = cmsg->cmsg_len;
 
        return cmsg_space;
+#else /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
+
+       if (num_fds == 0) {
+               if (msg != NULL) {
+                       msg->msg_accrights = NULL;
+                       msg->msg_accrightslen = 0;
+               }
+               return 0;
+       }
+       if (num_fds > INT8_MAX) {
+               return -1;
+       }
+       if ((msg == NULL) || (num_fds > bufsize)) {
+               return num_fds;
+       }
+
+       msg->accrights = buf;
+       msg->accrights_len = num_fds;
+
+       return num_fds;
+#endif
 }
 
 struct msghdr_buf {
@@ -70,13 +96,18 @@ ssize_t msghdr_copy(struct msghdr_buf *msg, size_t msgsize,
                    const struct iovec *iov, int iovcnt,
                    const int *fds, size_t num_fds)
 {
-       size_t fd_len, iov_len, needed, bufsize;
+       ssize_t fd_len;
+       size_t iov_len, needed, bufsize;
 
        bufsize = (msgsize > offsetof(struct msghdr_buf, buf)) ?
                msgsize - offsetof(struct msghdr_buf, buf) : 0;
 
        fd_len = msghdr_prep_fds(&msg->msg, msg->buf, bufsize, fds, num_fds);
 
+       if (fd_len == -1) {
+               return -1;
+       }
+
        if (bufsize >= fd_len) {
                bufsize -= fd_len;
        } else {