netstat(1): Remove some unused prototypes.
[dragonfly.git] / test / dfregress / testcases / io / sendfd_1 / sendfd_1.c
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 }