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