Blame


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>
8 b3994ec5 2003-12-11 devnull
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
12 2ec48bbc 2005-07-13 devnull # else
13 2ec48bbc 2005-07-13 devnull # define CMSG_ALIGN(len) (((len)+sizeof(long)-1) & ~(sizeof(long)-1))
14 2ec48bbc 2005-07-13 devnull # endif
15 2ec48bbc 2005-07-13 devnull #endif
16 2ec48bbc 2005-07-13 devnull
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))
19 2ec48bbc 2005-07-13 devnull #endif
20 2ec48bbc 2005-07-13 devnull
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))
23 2ec48bbc 2005-07-13 devnull #endif
24 2ec48bbc 2005-07-13 devnull
25 b3994ec5 2003-12-11 devnull int
26 b3994ec5 2003-12-11 devnull sendfd(int s, int fd)
27 b3994ec5 2003-12-11 devnull {
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;
32 b3994ec5 2003-12-11 devnull int n;
33 52e61644 2005-05-01 devnull char cms[CMSG_SPACE(sizeof(int))];
34 fa325e9b 2020-01-10 cross
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;
38 b3994ec5 2003-12-11 devnull
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));
44 b3994ec5 2003-12-11 devnull
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 0c9c620f 2010-03-10 rsc memmove(CMSG_DATA(cmsg), &fd, sizeof(int));
50 b3994ec5 2003-12-11 devnull
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;
54 b3994ec5 2003-12-11 devnull }
55 b3994ec5 2003-12-11 devnull
56 b3994ec5 2003-12-11 devnull int
57 b3994ec5 2003-12-11 devnull recvfd(int s)
58 b3994ec5 2003-12-11 devnull {
59 b3994ec5 2003-12-11 devnull int n;
60 52e61644 2005-05-01 devnull int fd;
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))];
66 b3994ec5 2003-12-11 devnull
67 b3994ec5 2003-12-11 devnull iov.iov_base = buf;
68 b3994ec5 2003-12-11 devnull iov.iov_len = 1;
69 b3994ec5 2003-12-11 devnull
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;
75 b3994ec5 2003-12-11 devnull
76 52e61644 2005-05-01 devnull msg.msg_control = (caddr_t)cms;
77 52e61644 2005-05-01 devnull msg.msg_controllen = sizeof cms;
78 b3994ec5 2003-12-11 devnull
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;
84 c8a93fb7 2006-07-23 devnull }
85 52e61644 2005-05-01 devnull cmsg = CMSG_FIRSTHDR(&msg);
86 96898a81 2010-03-10 rsc memmove(&fd, CMSG_DATA(cmsg), sizeof(int));
87 52e61644 2005-05-01 devnull return fd;
88 b3994ec5 2003-12-11 devnull }