1 // Modified version of library functions in FUSE
10 #include <sys/socket.h>
13 int send_fd(int sock_fd, int fd)
17 struct cmsghdr *p_cmsg;
19 size_t cmsgbuf[CMSG_SPACE(sizeof(fd)) / sizeof(size_t)];
23 msg.msg_control = cmsgbuf;
24 msg.msg_controllen = sizeof(cmsgbuf);
25 p_cmsg = CMSG_FIRSTHDR(&msg);
26 p_cmsg->cmsg_level = SOL_SOCKET;
27 p_cmsg->cmsg_type = SCM_RIGHTS;
28 p_cmsg->cmsg_len = CMSG_LEN(sizeof(fd));
29 p_fds = (int *) CMSG_DATA(p_cmsg);
31 msg.msg_controllen = p_cmsg->cmsg_len;
37 /* "To pass file descriptors or credentials you need to send/read at
38 * least one byte" (man 7 unix) */
39 vec.iov_base = &sendchar;
40 vec.iov_len = sizeof(sendchar);
41 while ((retval = sendmsg(sock_fd, &msg, 0)) == -1 && errno == EINTR);
43 perror("sending file descriptor");
44 fprintf(stderr,"File descriptor: %d", sock_fd);
55 int receive_fd(int fd)
61 size_t ccmsg[CMSG_SPACE(sizeof(int)) / sizeof(size_t)];
71 /* old BSD implementations should use msg_accrights instead of
72 * msg_control; the interface is different. */
73 msg.msg_control = ccmsg;
74 msg.msg_controllen = sizeof(ccmsg);
76 while(((rv = recvmsg(fd, &msg, 0)) == -1) && errno == EINTR);
86 cmsg = CMSG_FIRSTHDR(&msg);
87 if (!cmsg->cmsg_type == SCM_RIGHTS) {
88 fprintf(stderr, "got control message of unknown type %d\n",
92 return *(int*)CMSG_DATA(cmsg);