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 b3994ec5 2003-12-11 devnull typedef struct Sendfd Sendfd;
10 b3994ec5 2003-12-11 devnull struct Sendfd {
11 b3994ec5 2003-12-11 devnull struct cmsghdr cmsg;
12 b3994ec5 2003-12-11 devnull int fd;
13 b3994ec5 2003-12-11 devnull };
14 b3994ec5 2003-12-11 devnull
15 b3994ec5 2003-12-11 devnull int
16 b3994ec5 2003-12-11 devnull sendfd(int s, int fd)
17 b3994ec5 2003-12-11 devnull {
18 b3994ec5 2003-12-11 devnull char buf[1];
19 b3994ec5 2003-12-11 devnull struct iovec iov;
20 b3994ec5 2003-12-11 devnull struct msghdr msg;
21 b3994ec5 2003-12-11 devnull int n;
22 b3994ec5 2003-12-11 devnull Sendfd sfd;
23 b3994ec5 2003-12-11 devnull
24 b3994ec5 2003-12-11 devnull buf[0] = 0;
25 b3994ec5 2003-12-11 devnull iov.iov_base = buf;
26 b3994ec5 2003-12-11 devnull iov.iov_len = 1;
27 b3994ec5 2003-12-11 devnull
28 b3994ec5 2003-12-11 devnull memset(&msg, 0, sizeof msg);
29 b3994ec5 2003-12-11 devnull msg.msg_iov = &iov;
30 b3994ec5 2003-12-11 devnull msg.msg_iovlen = 1;
31 b3994ec5 2003-12-11 devnull
32 b3994ec5 2003-12-11 devnull sfd.cmsg.cmsg_len = sizeof sfd;
33 b3994ec5 2003-12-11 devnull sfd.cmsg.cmsg_level = SOL_SOCKET;
34 b3994ec5 2003-12-11 devnull sfd.cmsg.cmsg_type = SCM_RIGHTS;
35 b3994ec5 2003-12-11 devnull sfd.fd = fd;
36 b3994ec5 2003-12-11 devnull
37 8f314994 2004-03-02 devnull msg.msg_control = (caddr_t)&sfd;
38 b3994ec5 2003-12-11 devnull msg.msg_controllen = sizeof sfd;
39 b3994ec5 2003-12-11 devnull
40 b3994ec5 2003-12-11 devnull if((n=sendmsg(s, &msg, 0)) != iov.iov_len)
41 b3994ec5 2003-12-11 devnull return -1;
42 b3994ec5 2003-12-11 devnull return 0;
43 b3994ec5 2003-12-11 devnull }
44 b3994ec5 2003-12-11 devnull
45 b3994ec5 2003-12-11 devnull int
46 b3994ec5 2003-12-11 devnull recvfd(int s)
47 b3994ec5 2003-12-11 devnull {
48 b3994ec5 2003-12-11 devnull int n;
49 b3994ec5 2003-12-11 devnull char buf[1];
50 b3994ec5 2003-12-11 devnull struct iovec iov;
51 b3994ec5 2003-12-11 devnull struct msghdr msg;
52 b3994ec5 2003-12-11 devnull Sendfd sfd;
53 b3994ec5 2003-12-11 devnull
54 b3994ec5 2003-12-11 devnull iov.iov_base = buf;
55 b3994ec5 2003-12-11 devnull iov.iov_len = 1;
56 b3994ec5 2003-12-11 devnull
57 b3994ec5 2003-12-11 devnull memset(&msg, 0, sizeof msg);
58 b3994ec5 2003-12-11 devnull msg.msg_name = 0;
59 b3994ec5 2003-12-11 devnull msg.msg_namelen = 0;
60 b3994ec5 2003-12-11 devnull msg.msg_iov = &iov;
61 b3994ec5 2003-12-11 devnull msg.msg_iovlen = 1;
62 b3994ec5 2003-12-11 devnull
63 b3994ec5 2003-12-11 devnull memset(&sfd, 0, sizeof sfd);
64 b3994ec5 2003-12-11 devnull sfd.fd = -1;
65 b3994ec5 2003-12-11 devnull sfd.cmsg.cmsg_len = sizeof sfd;
66 b3994ec5 2003-12-11 devnull sfd.cmsg.cmsg_level = SOL_SOCKET;
67 b3994ec5 2003-12-11 devnull sfd.cmsg.cmsg_type = SCM_RIGHTS;
68 b3994ec5 2003-12-11 devnull
69 8f314994 2004-03-02 devnull msg.msg_control = (caddr_t)&sfd;
70 b3994ec5 2003-12-11 devnull msg.msg_controllen = sizeof sfd;
71 b3994ec5 2003-12-11 devnull
72 b3994ec5 2003-12-11 devnull if((n=recvmsg(s, &msg, 0)) < 0)
73 b3994ec5 2003-12-11 devnull return -1;
74 b3994ec5 2003-12-11 devnull if(n==0 && sfd.fd==-1){
75 b3994ec5 2003-12-11 devnull werrstr("eof in recvfd");
76 b3994ec5 2003-12-11 devnull return -1;
77 b3994ec5 2003-12-11 devnull }
78 b3994ec5 2003-12-11 devnull return sfd.fd;
79 b3994ec5 2003-12-11 devnull }