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