1 b3994ec5 2003-12-11 devnull #include <u.h>
2 b3994ec5 2003-12-11 devnull #define NOPLAN9DEFINES
3 b3994ec5 2003-12-11 devnull #include <libc.h>
4 b3994ec5 2003-12-11 devnull #include <sys/socket.h>
5 b3994ec5 2003-12-11 devnull #include <sys/uio.h>
6 b3994ec5 2003-12-11 devnull #include <unistd.h>
7 b3994ec5 2003-12-11 devnull #include <errno.h>
9 2ec48bbc 2005-07-13 devnull #ifndef CMSG_ALIGN
10 2ec48bbc 2005-07-13 devnull # ifdef __sun__
11 2ec48bbc 2005-07-13 devnull # define CMSG_ALIGN _CMSG_DATA_ALIGN
13 2ec48bbc 2005-07-13 devnull # define CMSG_ALIGN(len) (((len)+sizeof(long)-1) & ~(sizeof(long)-1))
17 2ec48bbc 2005-07-13 devnull #ifndef CMSG_SPACE
18 2ec48bbc 2005-07-13 devnull # define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr))+CMSG_ALIGN(len))
21 2ec48bbc 2005-07-13 devnull #ifndef CMSG_LEN
22 2ec48bbc 2005-07-13 devnull # define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr))+(len))
26 b3994ec5 2003-12-11 devnull sendfd(int s, int fd)
28 b3994ec5 2003-12-11 devnull char buf[1];
29 b3994ec5 2003-12-11 devnull struct iovec iov;
30 b3994ec5 2003-12-11 devnull struct msghdr msg;
31 52e61644 2005-05-01 devnull struct cmsghdr *cmsg;
33 52e61644 2005-05-01 devnull char cms[CMSG_SPACE(sizeof(int))];
35 b3994ec5 2003-12-11 devnull buf[0] = 0;
36 b3994ec5 2003-12-11 devnull iov.iov_base = buf;
37 b3994ec5 2003-12-11 devnull iov.iov_len = 1;
39 b3994ec5 2003-12-11 devnull memset(&msg, 0, sizeof msg);
40 b3994ec5 2003-12-11 devnull msg.msg_iov = &iov;
41 b3994ec5 2003-12-11 devnull msg.msg_iovlen = 1;
42 52e61644 2005-05-01 devnull msg.msg_control = (caddr_t)cms;
43 52e61644 2005-05-01 devnull msg.msg_controllen = CMSG_LEN(sizeof(int));
45 52e61644 2005-05-01 devnull cmsg = CMSG_FIRSTHDR(&msg);
46 52e61644 2005-05-01 devnull cmsg->cmsg_len = CMSG_LEN(sizeof(int));
47 52e61644 2005-05-01 devnull cmsg->cmsg_level = SOL_SOCKET;
48 52e61644 2005-05-01 devnull cmsg->cmsg_type = SCM_RIGHTS;
49 52e61644 2005-05-01 devnull *(int*)CMSG_DATA(cmsg) = fd;
51 b3994ec5 2003-12-11 devnull if((n=sendmsg(s, &msg, 0)) != iov.iov_len)
52 b3994ec5 2003-12-11 devnull return -1;
53 b3994ec5 2003-12-11 devnull return 0;
57 b3994ec5 2003-12-11 devnull recvfd(int s)
61 b3994ec5 2003-12-11 devnull char buf[1];
62 b3994ec5 2003-12-11 devnull struct iovec iov;
63 b3994ec5 2003-12-11 devnull struct msghdr msg;
64 52e61644 2005-05-01 devnull struct cmsghdr *cmsg;
65 52e61644 2005-05-01 devnull char cms[CMSG_SPACE(sizeof(int))];
67 b3994ec5 2003-12-11 devnull iov.iov_base = buf;
68 b3994ec5 2003-12-11 devnull iov.iov_len = 1;
70 b3994ec5 2003-12-11 devnull memset(&msg, 0, sizeof msg);
71 b3994ec5 2003-12-11 devnull msg.msg_name = 0;
72 b3994ec5 2003-12-11 devnull msg.msg_namelen = 0;
73 b3994ec5 2003-12-11 devnull msg.msg_iov = &iov;
74 b3994ec5 2003-12-11 devnull msg.msg_iovlen = 1;
76 52e61644 2005-05-01 devnull msg.msg_control = (caddr_t)cms;
77 52e61644 2005-05-01 devnull msg.msg_controllen = sizeof cms;
79 b3994ec5 2003-12-11 devnull if((n=recvmsg(s, &msg, 0)) < 0)
80 b3994ec5 2003-12-11 devnull return -1;
81 c8a93fb7 2006-07-23 devnull if(n == 0){
82 c8a93fb7 2006-07-23 devnull werrstr("unexpected EOF");
83 c8a93fb7 2006-07-23 devnull return -1;
85 52e61644 2005-05-01 devnull cmsg = CMSG_FIRSTHDR(&msg);
86 52e61644 2005-05-01 devnull fd = *(int*)CMSG_DATA(cmsg);
87 52e61644 2005-05-01 devnull return fd;