#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);
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 {
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 {