Implement recvmsg() (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 26 Oct 2015 19:12:07 +0000 (15:12 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Oct 2015 16:05:14 +0000 (12:05 -0400)
It's about as standards compliant as recvfrom().

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/recvmsg.c [new file with mode: 0644]

diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/recvmsg.c b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/recvmsg.c
new file mode 100644 (file)
index 0000000..82de78e
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright (c) 2015 Google Inc.
+ * Barret Rhoden <brho@cs.berkeley.edu>
+ * See LICENSE for details.
+ *
+ * recvmsg(), on top of recvfrom(). */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <errno.h>
+
+/* Receive a message as described by MSG from socket FD.  Returns the number of
+ * bytes read or -1 for errors.  */
+ssize_t __recvmsg(int fd, struct msghdr *msg, int flags)
+{
+       ssize_t ret;
+
+       if (msg->msg_iovlen < 1) {
+               errno = EINVAL;
+               return -1;
+       }
+       ret = recvfrom(fd, msg->msg_iov[0].iov_base, msg->msg_iov[0].iov_len,
+                      flags, msg->msg_name, &msg->msg_namelen);
+       if (ret == -1)
+               return ret;
+       /* On successful calls, there's extra info we can return via *msg */
+       msg->msg_controllen = 0;
+       msg->msg_flags = 0;
+       return ret;
+}
+weak_alias(__recvmsg, recvmsg)