1 #include <sys/socket.h>
2 #include <sys/uio.h>
3 #include <unistd.h>
4 #include <errno.h>
5
main(argc,argv)6 main(argc, argv)
7 int argc;
8 char **argv;
9 {
10 int i;
11 int j[2];
12
13 socketpair(AF_UNIX, SOCK_STREAM, 0, j);
14
15 i = fork();
16 if (i == 0) {
17 close(0);
18 close(1);
19 close(2);
20
21 int mysecretfd = recvfd(j[0]);
22 write(mysecretfd, "hello\n", 7);
23 } else {
24 sendfd(j[1], 1);
25
26 pause();
27 }
28
29 }
30
31 int
sendfd(int s,int fd)32 sendfd(int s, int fd)
33 {
34 char buf[1];
35 struct iovec iov;
36 struct msghdr msg;
37 struct cmsghdr *cmsg;
38 int n;
39 char cms[CMSG_SPACE(sizeof(int))];
40
41 buf[0] = 0;
42 iov.iov_base = buf;
43 iov.iov_len = 1;
44
45 memset(&msg, 0, sizeof msg);
46 msg.msg_iov = &iov;
47 msg.msg_iovlen = 1;
48 msg.msg_control = (caddr_t)cms;
49 msg.msg_controllen = CMSG_LEN(sizeof(int));
50
51 cmsg = CMSG_FIRSTHDR(&msg);
52 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
53 cmsg->cmsg_level = SOL_SOCKET;
54 cmsg->cmsg_type = SCM_RIGHTS;
55 memmove(CMSG_DATA(cmsg), &fd, sizeof(int));
56
57 if((n=sendmsg(s, &msg, 0)) != iov.iov_len)
58 return -1;
59 return 0;
60 }
61
62 int
recvfd(int s)63 recvfd(int s)
64 {
65 int n;
66 int fd;
67 char buf[1];
68 struct iovec iov;
69 struct msghdr msg;
70 struct cmsghdr *cmsg;
71 char cms[CMSG_SPACE(sizeof(int))];
72
73 iov.iov_base = buf;
74 iov.iov_len = 1;
75
76 memset(&msg, 0, sizeof msg);
77 msg.msg_name = 0;
78 msg.msg_namelen = 0;
79 msg.msg_iov = &iov;
80 msg.msg_iovlen = 1;
81
82 msg.msg_control = (caddr_t)cms;
83 msg.msg_controllen = sizeof cms;
84
85 if((n=recvmsg(s, &msg, 0)) < 0)
86 return -1;
87 if(n == 0){
88 return -1;
89 }
90 cmsg = CMSG_FIRSTHDR(&msg);
91 memmove(&fd, CMSG_DATA(cmsg), sizeof(int));
92 return fd;
93 }
94