186d7f5d3SJohn Marino #include <sys/socket.h>
286d7f5d3SJohn Marino #include <sys/uio.h>
386d7f5d3SJohn Marino #include <unistd.h>
486d7f5d3SJohn Marino #include <errno.h>
586d7f5d3SJohn Marino
main(argc,argv)686d7f5d3SJohn Marino main(argc, argv)
786d7f5d3SJohn Marino int argc;
886d7f5d3SJohn Marino char **argv;
986d7f5d3SJohn Marino {
1086d7f5d3SJohn Marino int i;
1186d7f5d3SJohn Marino int j[2];
1286d7f5d3SJohn Marino
1386d7f5d3SJohn Marino socketpair(AF_UNIX, SOCK_STREAM, 0, j);
1486d7f5d3SJohn Marino
1586d7f5d3SJohn Marino i = fork();
1686d7f5d3SJohn Marino if (i == 0) {
1786d7f5d3SJohn Marino close(0);
1886d7f5d3SJohn Marino close(1);
1986d7f5d3SJohn Marino close(2);
2086d7f5d3SJohn Marino
2186d7f5d3SJohn Marino int mysecretfd = recvfd(j[0]);
2286d7f5d3SJohn Marino write(mysecretfd, "hello\n", 7);
2386d7f5d3SJohn Marino } else {
2486d7f5d3SJohn Marino sendfd(j[1], 1);
2586d7f5d3SJohn Marino
2686d7f5d3SJohn Marino pause();
2786d7f5d3SJohn Marino }
2886d7f5d3SJohn Marino
2986d7f5d3SJohn Marino }
3086d7f5d3SJohn Marino
3186d7f5d3SJohn Marino int
sendfd(int s,int fd)3286d7f5d3SJohn Marino sendfd(int s, int fd)
3386d7f5d3SJohn Marino {
3486d7f5d3SJohn Marino char buf[1];
3586d7f5d3SJohn Marino struct iovec iov;
3686d7f5d3SJohn Marino struct msghdr msg;
3786d7f5d3SJohn Marino struct cmsghdr *cmsg;
3886d7f5d3SJohn Marino int n;
3986d7f5d3SJohn Marino char cms[CMSG_SPACE(sizeof(int))];
4086d7f5d3SJohn Marino
4186d7f5d3SJohn Marino buf[0] = 0;
4286d7f5d3SJohn Marino iov.iov_base = buf;
4386d7f5d3SJohn Marino iov.iov_len = 1;
4486d7f5d3SJohn Marino
4586d7f5d3SJohn Marino memset(&msg, 0, sizeof msg);
4686d7f5d3SJohn Marino msg.msg_iov = &iov;
4786d7f5d3SJohn Marino msg.msg_iovlen = 1;
4886d7f5d3SJohn Marino msg.msg_control = (caddr_t)cms;
4986d7f5d3SJohn Marino msg.msg_controllen = CMSG_LEN(sizeof(int));
5086d7f5d3SJohn Marino
5186d7f5d3SJohn Marino cmsg = CMSG_FIRSTHDR(&msg);
5286d7f5d3SJohn Marino cmsg->cmsg_len = CMSG_LEN(sizeof(int));
5386d7f5d3SJohn Marino cmsg->cmsg_level = SOL_SOCKET;
5486d7f5d3SJohn Marino cmsg->cmsg_type = SCM_RIGHTS;
5586d7f5d3SJohn Marino memmove(CMSG_DATA(cmsg), &fd, sizeof(int));
5686d7f5d3SJohn Marino
5786d7f5d3SJohn Marino if((n=sendmsg(s, &msg, 0)) != iov.iov_len)
5886d7f5d3SJohn Marino return -1;
5986d7f5d3SJohn Marino return 0;
6086d7f5d3SJohn Marino }
6186d7f5d3SJohn Marino
6286d7f5d3SJohn Marino int
recvfd(int s)6386d7f5d3SJohn Marino recvfd(int s)
6486d7f5d3SJohn Marino {
6586d7f5d3SJohn Marino int n;
6686d7f5d3SJohn Marino int fd;
6786d7f5d3SJohn Marino char buf[1];
6886d7f5d3SJohn Marino struct iovec iov;
6986d7f5d3SJohn Marino struct msghdr msg;
7086d7f5d3SJohn Marino struct cmsghdr *cmsg;
7186d7f5d3SJohn Marino char cms[CMSG_SPACE(sizeof(int))];
7286d7f5d3SJohn Marino
7386d7f5d3SJohn Marino iov.iov_base = buf;
7486d7f5d3SJohn Marino iov.iov_len = 1;
7586d7f5d3SJohn Marino
7686d7f5d3SJohn Marino memset(&msg, 0, sizeof msg);
7786d7f5d3SJohn Marino msg.msg_name = 0;
7886d7f5d3SJohn Marino msg.msg_namelen = 0;
7986d7f5d3SJohn Marino msg.msg_iov = &iov;
8086d7f5d3SJohn Marino msg.msg_iovlen = 1;
8186d7f5d3SJohn Marino
8286d7f5d3SJohn Marino msg.msg_control = (caddr_t)cms;
8386d7f5d3SJohn Marino msg.msg_controllen = sizeof cms;
8486d7f5d3SJohn Marino
8586d7f5d3SJohn Marino if((n=recvmsg(s, &msg, 0)) < 0)
8686d7f5d3SJohn Marino return -1;
8786d7f5d3SJohn Marino if(n == 0){
8886d7f5d3SJohn Marino return -1;
8986d7f5d3SJohn Marino }
9086d7f5d3SJohn Marino cmsg = CMSG_FIRSTHDR(&msg);
9186d7f5d3SJohn Marino memmove(&fd, CMSG_DATA(cmsg), sizeof(int));
9286d7f5d3SJohn Marino return fd;
9386d7f5d3SJohn Marino }
94