+int pass_afd(int fd, char *buf, size_t size)
+{
+ struct msghdr msg = {.msg_iov = NULL};
+ struct cmsghdr *cmsg;
+ char control[255];
+ int ret;
+ struct iovec iov;
+
+ iov.iov_base = buf;
+ iov.iov_len = size;
+
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+
+ msg.msg_control = control;
+ msg.msg_controllen = sizeof(control);
+
+ cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+ *(int *)CMSG_DATA(cmsg) = fd;
+
+ /* Sum of the length of all control messages in the buffer */
+ msg.msg_controllen = cmsg->cmsg_len;
+ PARA_NOTICE_LOG("passing %zu bytes and fd %d\n", size, fd);
+ ret = sendmsg(server_socket, &msg, 0);
+ if (ret < 0) {
+ ret = -ERRNO_TO_PARA_ERROR(errno);
+ return ret;
+ }
+ return 1;
+}
+