diff options
Diffstat (limited to 'libc')
-rw-r--r-- | libc/inet/Makefile.in | 3 | ||||
-rw-r--r-- | libc/inet/recvmmsg.c | 8 | ||||
-rw-r--r-- | libc/inet/sendmmsg.c | 8 | ||||
-rw-r--r-- | libc/inet/socketcalls.c | 48 |
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) |