Blob
1 #include <u.h>2 #define NOPLAN9DEFINES3 #include <libc.h>4 #include <sys/socket.h>5 #include <sys/uio.h>6 #include <unistd.h>7 #include <errno.h>9 typedef struct Sendfd Sendfd;10 struct Sendfd {11 struct cmsghdr cmsg;12 int fd;13 };15 int16 sendfd(int s, int fd)17 {18 char buf[1];19 struct iovec iov;20 struct msghdr msg;21 int n;22 Sendfd sfd;24 buf[0] = 0;25 iov.iov_base = buf;26 iov.iov_len = 1;28 memset(&msg, 0, sizeof msg);29 msg.msg_iov = &iov;30 msg.msg_iovlen = 1;32 sfd.cmsg.cmsg_len = sizeof sfd;33 sfd.cmsg.cmsg_level = SOL_SOCKET;34 sfd.cmsg.cmsg_type = SCM_RIGHTS;35 sfd.fd = fd;37 msg.msg_control = (caddr_t)&sfd;38 msg.msg_controllen = sizeof sfd;40 if((n=sendmsg(s, &msg, 0)) != iov.iov_len)41 return -1;42 return 0;43 }45 int46 recvfd(int s)47 {48 int n;49 char buf[1];50 struct iovec iov;51 struct msghdr msg;52 Sendfd sfd;54 iov.iov_base = buf;55 iov.iov_len = 1;57 memset(&msg, 0, sizeof msg);58 msg.msg_name = 0;59 msg.msg_namelen = 0;60 msg.msg_iov = &iov;61 msg.msg_iovlen = 1;63 memset(&sfd, 0, sizeof sfd);64 sfd.fd = -1;65 sfd.cmsg.cmsg_len = sizeof sfd;66 sfd.cmsg.cmsg_level = SOL_SOCKET;67 sfd.cmsg.cmsg_type = SCM_RIGHTS;69 msg.msg_control = (caddr_t)&sfd;70 msg.msg_controllen = sizeof sfd;72 if((n=recvmsg(s, &msg, 0)) < 0)73 return -1;74 if(n==0 && sfd.fd==-1){75 werrstr("eof in recvfd");76 return -1;77 }78 return sfd.fd;79 }