1 #include <sys/socket.h>
2 #include <sys/uio.h>
3 #include <unistd.h>
4 #include <errno.h>
5 
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
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
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