From b3994ec5c78e6c18885079b58abb7fb997899c3f Mon Sep 17 00:00:00 2001 From: rsc Date: Thu, 11 Dec 2003 17:50:28 +0000 Subject: More files related to user-level file servers. Also add acme! --- src/lib9/sendfd.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/lib9/sendfd.c (limited to 'src/lib9/sendfd.c') diff --git a/src/lib9/sendfd.c b/src/lib9/sendfd.c new file mode 100644 index 00000000..b3a2448f --- /dev/null +++ b/src/lib9/sendfd.c @@ -0,0 +1,79 @@ +#include +#define NOPLAN9DEFINES +#include +#include +#include +#include +#include + +typedef struct Sendfd Sendfd; +struct Sendfd { + struct cmsghdr cmsg; + int fd; +}; + +int +sendfd(int s, int fd) +{ + char buf[1]; + struct iovec iov; + struct msghdr msg; + int n; + Sendfd sfd; + + buf[0] = 0; + iov.iov_base = buf; + iov.iov_len = 1; + + memset(&msg, 0, sizeof msg); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + sfd.cmsg.cmsg_len = sizeof sfd; + sfd.cmsg.cmsg_level = SOL_SOCKET; + sfd.cmsg.cmsg_type = SCM_RIGHTS; + sfd.fd = fd; + + msg.msg_control = &sfd; + msg.msg_controllen = sizeof sfd; + + if((n=sendmsg(s, &msg, 0)) != iov.iov_len) + return -1; + return 0; +} + +int +recvfd(int s) +{ + int n; + char buf[1]; + struct iovec iov; + struct msghdr msg; + Sendfd sfd; + + iov.iov_base = buf; + iov.iov_len = 1; + + memset(&msg, 0, sizeof msg); + msg.msg_name = 0; + msg.msg_namelen = 0; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + memset(&sfd, 0, sizeof sfd); + sfd.fd = -1; + sfd.cmsg.cmsg_len = sizeof sfd; + sfd.cmsg.cmsg_level = SOL_SOCKET; + sfd.cmsg.cmsg_type = SCM_RIGHTS; + + msg.msg_control = &sfd; + msg.msg_controllen = sizeof sfd; + + if((n=recvmsg(s, &msg, 0)) < 0) + return -1; + if(n==0 && sfd.fd==-1){ + werrstr("eof in recvfd"); + return -1; + } + return sfd.fd; +} -- cgit v1.2.3