summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
Diffstat (limited to 'libc')
-rw-r--r--libc/inet/Makefile.in3
-rw-r--r--libc/inet/recvmmsg.c8
-rw-r--r--libc/inet/sendmmsg.c8
-rw-r--r--libc/inet/socketcalls.c48
4 files changed, 66 insertions, 1 deletions
diff --git a/libc/inet/Makefile.in b/libc/inet/Makefile.in
index 332e70e53..bed76c30c 100644
--- a/libc/inet/Makefile.in
+++ b/libc/inet/Makefile.in
@@ -47,7 +47,8 @@ CSRC-$(UCLIBC_HAS_RESOLVER_SUPPORT) += \
socketcalls_CSRC-y += \
accept.c bind.c connect.c getpeername.c getsockname.c \
getsockopt.c listen.c recv.c recvfrom.c recvmsg.c send.c sendmsg.c \
- sendto.c setsockopt.c shutdown.c socket.c socketpair.c
+ sendto.c setsockopt.c shutdown.c socket.c socketpair.c \
+ recvmmsg.c sendmmsg.c
socketcalls_CSRC-$(UCLIBC_LINUX_SPECIFIC) += accept4.c
CSRC-$(UCLIBC_HAS_SOCKET) += $(socketcalls_CSRC-y) opensock.c
diff --git a/libc/inet/recvmmsg.c b/libc/inet/recvmmsg.c
new file mode 100644
index 000000000..003b5a65f
--- /dev/null
+++ b/libc/inet/recvmmsg.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_recvmmsg
+#include "socketcalls.c"
diff --git a/libc/inet/sendmmsg.c b/libc/inet/sendmmsg.c
new file mode 100644
index 000000000..f1557fe2f
--- /dev/null
+++ b/libc/inet/sendmmsg.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_sendmmsg
+#include "socketcalls.c"
diff --git a/libc/inet/socketcalls.c b/libc/inet/socketcalls.c
index 1fef8100b..cb281407e 100644
--- a/libc/inet/socketcalls.c
+++ b/libc/inet/socketcalls.c
@@ -29,6 +29,8 @@
#define SYS_SENDMSG 16
#define SYS_RECVMSG 17
#define SYS_ACCEPT4 18
+#define SYS_RECVMMSG 19
+#define SYS_SENDMMSG 20
#endif
/* exposed on x86 since Linux commit 9dea5dc921b5f4045a18c63eb92e84dc274d17eb */
@@ -283,6 +285,30 @@ CANCELLABLE_SYSCALL(ssize_t, recvmsg, (int sockfd, struct msghdr *msg, int flags
lt_libc_hidden(recvmsg)
#endif
+#ifdef L_recvmmsg
+static ssize_t __NC(recvmmsg)(int sockfd, struct mmsghdr *msg, size_t vlen,
+ int flags, struct timespec *tmo)
+{
+# ifdef __NR_recvmmsg
+ return (ssize_t)INLINE_SYSCALL(recvmmsg, 5, sockfd, msg, vlen, flags, tmo);
+# else
+ unsigned long args[5];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) msg;
+ args[2] = vlen;
+ args[3] = flags;
+ args[4] = (unsigned long) tmo;
+ return (ssize_t)__socketcall(SYS_RECVMMSG, args);
+# endif
+}
+CANCELLABLE_SYSCALL(ssize_t, recvmmsg,
+ (int sockfd, struct mmsghdr *msg, size_t vlen, int flags,
+ struct timespec *tmo),
+ (sockfd, msg, vlen, flags, tmo))
+lt_libc_hidden(recvmmsg)
+#endif
+
#ifdef L_send
static ssize_t __NC(send)(int sockfd, const void *buffer, size_t len, int flags)
{
@@ -324,6 +350,28 @@ CANCELLABLE_SYSCALL(ssize_t, sendmsg, (int sockfd, const struct msghdr *msg, int
lt_libc_hidden(sendmsg)
#endif
+#ifdef L_sendmmsg
+static ssize_t __NC(sendmmsg)(int sockfd, struct mmsghdr *msg, size_t vlen,
+ int flags)
+{
+# ifdef __NR_sendmmsg
+ return (ssize_t)INLINE_SYSCALL(sendmmsg, 4, sockfd, msg, vlen, flags);
+# else
+ unsigned long args[4];
+
+ args[0] = sockfd;
+ args[1] = (unsigned long) msg;
+ args[2] = vlen;
+ args[3] = flags;
+ return (ssize_t)__socketcall(SYS_SENDMMSG, args);
+# endif
+}
+CANCELLABLE_SYSCALL(ssize_t, sendmmsg,
+ (int sockfd, struct mmsghdr *msg, size_t vlen, int flags),
+ (sockfd, msg, vlen, flags))
+lt_libc_hidden(sendmmsg)
+#endif
+
#ifdef L_sendto
ssize_t __NC(sendto)(int sockfd, const void *buffer, size_t len, int flags,
const struct sockaddr *to, socklen_t tolen)