--- a/source3/lib/msghdr.c 2015-03-10 08:28:31.000000000 -0400 +++ b/source3/lib/msghdr.c 2015-09-18 13:59:52.040243000 -0400 @@ -21,9 +21,14 @@ #include "lib/util/iov_buf.h" #include + #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 @@ 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->msg_accrights = buf; + msg->msg_accrightslen = num_fds; + + return num_fds; +#endif } struct msghdr_buf { @@ -139,6 +165,7 @@ if (bufsize < ret) { return ret; } +#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL if (msg != NULL) { if (num_fds != 0) { msg->msg_control = buf; @@ -148,6 +175,17 @@ msg->msg_controllen = 0; } } +#else /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ + if (msg != NULL) { + if (num_fds != 0) { + msg->msg_accrights= buf; + msg->msg_accrightslen = ret; + } else { + msg->msg_accrights = NULL; + msg->msg_accrightslen = 0; + } + } +#endif return ret; }