aboutsummaryrefslogtreecommitdiff
path: root/src/lib9/sendfd.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-12-11 17:50:28 +0000
committerrsc <devnull@localhost>2003-12-11 17:50:28 +0000
commitb3994ec5c78e6c18885079b58abb7fb997899c3f (patch)
treed4ead391f5ebd1554cc5ecfba69130e750de67bb /src/lib9/sendfd.c
parent32f69c36e0eec1227934bbd34854bfebd88686f2 (diff)
downloadplan9port-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.c79
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;
+}