diff options
author | rsc <devnull@localhost> | 2003-12-11 17:50:28 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-12-11 17:50:28 +0000 |
commit | b3994ec5c78e6c18885079b58abb7fb997899c3f (patch) | |
tree | d4ead391f5ebd1554cc5ecfba69130e750de67bb /src/lib9/sendfd.c | |
parent | 32f69c36e0eec1227934bbd34854bfebd88686f2 (diff) | |
download | plan9port-b3994ec5c78e6c18885079b58abb7fb997899c3f.tar.gz plan9port-b3994ec5c78e6c18885079b58abb7fb997899c3f.tar.bz2 plan9port-b3994ec5c78e6c18885079b58abb7fb997899c3f.zip |
More files related to user-level file servers.
Also add acme!
Diffstat (limited to 'src/lib9/sendfd.c')
-rw-r--r-- | src/lib9/sendfd.c | 79 |
1 files changed, 79 insertions, 0 deletions
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 <u.h> +#define NOPLAN9DEFINES +#include <libc.h> +#include <sys/socket.h> +#include <sys/uio.h> +#include <unistd.h> +#include <errno.h> + +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; +} |