3 * cc -Wall fdpassing.c -o /tmp/fdp
6 #include <sys/socket.h>
17 void sendfd(int s, int fd);
21 main(int ac, char **av)
29 if (socketpair(PF_LOCAL, SOCK_STREAM, 0, fds) < 0) {
33 fcntl(fds[0], F_SETFL, 0);
34 fcntl(fds[1], F_SETFL, 0);
37 while ((fd = recvfd(fds[0])) >= 0) {
40 if (fstat(fd, &st) < 0)
42 else if (read(fd, &dummy, sizeof(dummy)) != sizeof(dummy))
55 for (i = 1; i < ac; ++i) {
56 if ((fd = open(av[i], O_RDONLY, 0666)) < 0) {
57 fprintf(stderr, "unable to open %s\n", av[i]);
65 usleep(1000000 / 5 - 10000);
69 while (wait(NULL) < 0)
84 bzero(&msg, sizeof(msg));
85 bzero(&cmsg, sizeof(cmsg));
92 msg.msg_control = (caddr_t)&cmsg;
93 msg.msg_controllen = sizeof(cmsg);
95 cmsg.cmsg.cmsg_level = SOL_SOCKET;
96 cmsg.cmsg.cmsg_type = SCM_RIGHTS;
97 cmsg.cmsg.cmsg_len = sizeof(cmsg);
100 if (sendmsg(s, &msg, 0) < 0) {
101 printf("sendfd: failed %s\n", strerror(errno));
118 bzero(&msg, sizeof(msg));
119 bzero(&cmsg, sizeof(cmsg));
121 iov.iov_base = &dummy;
122 iov.iov_len = sizeof(dummy);
126 msg.msg_control = (caddr_t)&cmsg;
127 msg.msg_controllen = sizeof(cmsg);
130 cmsg.cmsg.cmsg_level = SOL_SOCKET;
131 cmsg.cmsg.cmsg_type = SCM_RIGHTS;
133 cmsg.cmsg.cmsg_len = sizeof(cmsg);
136 if ((r = recvmsg(s, &msg, MSG_EOR)) < 0) {
137 printf("recvmsg: failed %s\n", strerror(errno));