7 #include <sys/socket.h>
9 #include "stolen_from_fuse.h"
11 // Most of this code is stolen from FUSE 2.7.4
13 int rrm_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");
54 int rrm_receive_fd(int fd)
60 size_t ccmsg[CMSG_SPACE(sizeof(int)) / sizeof(size_t)];
70 /* old BSD implementations should use msg_accrights instead of
71 * msg_control; the interface is different. */
72 msg.msg_control = ccmsg;
73 msg.msg_controllen = sizeof(ccmsg);
75 while(((rv = recvmsg(fd, &msg, 0)) == -1) && errno == EINTR);
85 cmsg = CMSG_FIRSTHDR(&msg);
86 if (!cmsg->cmsg_type == SCM_RIGHTS) {
87 fprintf(stderr, "got control message of unknown type %d\n",
91 return *(int*)CMSG_DATA(cmsg);
94 int rrm_fuse_mnt_umount(const char *progname, const char *mnt, int lazy)
99 res = umount2(mnt, lazy ? 2 : 0);
101 fprintf(stderr, "%s: failed to unmount %s: %s\n",
102 progname, mnt, strerror(errno));
107 static int rrm_try_open(const char *dev, char **devp, int silent)
109 int fd = open(dev, O_RDWR);
113 fprintf(stderr, "failed to allocate memory\n" );
118 } else if (errno == ENODEV ||
119 errno == ENOENT)/* check for ENOENT too, for the udev case */
122 fprintf(stderr, "failed to open %s: %s\n", dev,
128 static int rrm_try_open_fuse_device(char **devp)
134 fd = rrm_try_open(FUSE_DEV_NEW, devp, 0);
140 fd = rrm_try_open(FUSE_DEV_OLD, devp, 1);
147 int rrm_open_fuse_device(char **devp)
149 int fd = rrm_try_open_fuse_device(devp);
154 "fuse device not found, try 'modprobe fuse' first\n");