[tschwinge/sendmmsg] Add recvmmsg and sendmmsg to the generic glibc API
Thomas Schwinge
thomas@codesourcery.com
Thu Nov 1 22:58:00 GMT 2012
Hi!
Finally getting back to this issue.
On Sat, 23 Jun 2012 11:07:26 +0200, I wrote:
> On Fri, 22 Jun 2012 15:06:53 +0200, I wrote:
> > On 30 Mar 2012 11:43:09 -0000, drepper@sourceware.org wrote:
> > > http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=c030f70c8796c7743c3aa97d6beff3bd5b8dcd5d
> > >
> > > commit c030f70c8796c7743c3aa97d6beff3bd5b8dcd5d
> > > Author: Ulrich Drepper <drepper@gmail.com>
> > > Date: Fri Mar 30 07:42:29 2012 -0400
> > >
> > > Speed up DNS by avoiding a system call if possible
> >
> > This patch adds a call to the (currently) Linux-specific sendmmsg to
> > generic code:
> >
> > res_send.c: In function 'send_dg':
> > res_send.c:1113:22: error: array type has incomplete element type
> > struct mmsghdr reqs[2];
> > ^
> > res_send.c:1132:7: warning: implicit declaration of function 'sendmmsg' [-Wimplicit-function-declaration]
> > int ndg = sendmmsg (pfd[0].fd, reqs, 2, MSG_NOSIGNAL);
> > ^
> >
> > > + * resolv/res_send.c (send_dg): Use sendmmsg if we have to write two
> > > + requests to save a system call.
> >
> > > +++ b/resolv/res_send.c
> > > [...]
> > > + int ndg = sendmmsg (pfd[0].fd, reqs, 2, MSG_NOSIGNAL);
> >
> > How do people want me to solve this? a) Make the code use sendmmsg only
> > if it is is available, or b) add a generic ENOSYS sendmmsg stub
> > (appropriately versioned for 2.16/2.17) and move struct sendmmsg etc. to
> > a generic place? (The existing code already does and has to do the
> > correct thing if sendmmsg "returns" ENOSYS (and probes only once), as
> > this will also happen with older Linux kernels.) I'd tend towards b)
> > because we might add a sendmmsg implementation for GNU/Hurd later on.
>
> This got a little bit more involved, I'm afraid. If you feel more
> comfortable that way, I'm fine with holding the patch back until after
> the release, but would appreciate a quick review if the general approach
> is fine.
>
> Cross-build-tested for i686-gnu, »make check«-tested for
> x86_64-linux-gnu, where I also compared all *.o *.os to those without the
> patch using GCC's contrib/compare-debug (no notable differences), and
> also the resulting symbol version information looks as expected.
On Mon, 25 Jun 2012 16:32:06 -0700 (PDT), Roland McGrath <roland@hack.frob.com> wrote:
> I think this is the right way to go: adding sendmmsg/recvmmsg to the
> generic libc API. They are generally useful interfaces and there is
> nothing intrinsically Linuxoid about them.
OK, thanks.
> At least when not given a
> timeout, they could be implemented in terms of sendmsg/recvmsg. So
> perhaps we ought to have a sysdeps/posix implementation that the Hurd
> would use instead of stubs (and folks can consider adding new RPCs).
> Then perhaps the Linux fallback case should be that instead of stubs, too.
Sounds reasonable, but that's for later: let's first solve this issue
here.
> This certainly has to wait for 2.17. Please file a bugzilla report
> for it, update your change to use GLIBC_2.17 for the symbol version
> additions, and publish the change on a private branch for others to
> look at.
I have now updated the patch (symbol versions, also added for all ports),
rebased it on current sources, and published it as the tschwinge/sendmmsg
branch.
Did I generally get the versioning stuff right? That aside, especially
the changes to the four sysdeps/unix/sysv/linux/*mmsg.* files are
sufficiently hairy that they need to be scrutinized closely for that they
do the right thing for all the possible cases.
commit 2d5d0c27cdc6c975ba020e880e94ad3841f11ca3
Author: Thomas Schwinge <thomas@schwinge.name>
Date: Thu Nov 1 23:40:02 2012 +0100
Add recvmmsg and sendmmsg to the generic glibc API.
diff --git ChangeLog ChangeLog
index bea7626..8409f1b 100644
--- ChangeLog
+++ ChangeLog
@@ -1,3 +1,49 @@
+2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/bits/socket.h (struct mmsghdr, recvmmsg)
+ (sendmmsg): Move declarations...
+ * socket/sys/socket.h: ... here.
+ * socket/recvmmsg.c: New file.
+ * socket/sendmmsg.c: New file.
+ * sysdeps/unix/sysv/linux/internal_recvmmsg.S [__ASSUME_RECVMMSG]
+ (recvmmsg): Rename to __recvmmsg, create weak alias and make
+ definition of __recvmmsg hidden.
+ * sysdeps/unix/sysv/linux/recvmmsg.c (recvmmsg): Likewise.
+ Include <socket/recvmmsg.c> for ENOSYS stub.
+ * sysdeps/unix/sysv/linux/internal_sendmmsg.S [__ASSUME_SENDMMSG]
+ (sendmmsg): Rename to __sendmmsg, create weak alias and make
+ definition of __sendmmsg hidden.
+ * sysdeps/unix/sysv/linux/sendmmsg.c (sendmmsg): Likewise.
+ Include <socket/sendmmsg.c> for ENOSYS stub.
+ * sysdeps/unix/sysv/linux/Makefile [subdir=socket]
+ (sysdep_routines): Move recvmmsg and sendmmsg...
+ * socket/Makefile (routines): ... here.
+ * socket/Versions (GLIBC_2.17): Add __sendmmsg, recvmmsg, and
+ sendmmsg.
+ * include/sys/socket.h (__recvmmsg, __sendmmsg): Add declarations.
+ * resolv/res_send.c (send_dg): Invoke __sendmmsg instead of
+ sendmmsg.
+ * sysdeps/unix/sysv/linux/i386/nptl/libc.abilist (GLIBC_2.17): Add
+ __sendmmsg.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/sh/nptl/libc.abilist (GLIBC_2.17):
+ Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/64/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/x32/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+
2012-11-01 Andreas Schwab <schwab@linux-m68k.org>
* scripts/check-local-headers.sh: Ignore c++ headers.
diff --git include/sys/socket.h include/sys/socket.h
index ec08857..821a9c0 100644
--- include/sys/socket.h
+++ include/sys/socket.h
@@ -91,6 +91,10 @@ extern ssize_t __libc_sendmsg (int __fd, const struct msghdr *__message,
extern ssize_t __sendmsg (int __fd, const struct msghdr *__message,
int __flags) attribute_hidden;
+extern int __sendmmsg (int __fd, struct mmsghdr *__vmessages,
+ unsigned int __vlen, int __flags);
+libc_hidden_proto (__sendmmsg)
+
/* Receive a message as described by MESSAGE from socket FD.
Returns the number of bytes read or -1 for errors. */
extern ssize_t __libc_recvmsg (int __fd, struct msghdr *__message,
@@ -98,6 +102,11 @@ extern ssize_t __libc_recvmsg (int __fd, struct msghdr *__message,
extern ssize_t __recvmsg (int __fd, struct msghdr *__message,
int __flags) attribute_hidden;
+extern int __recvmmsg (int __fd, struct mmsghdr *__vmessages,
+ unsigned int __vlen, int __flags,
+ const struct timespec *__tmo);
+libc_hidden_proto (__recvmmsg)
+
/* Set socket FD's option OPTNAME at protocol level LEVEL
to *OPTVAL (which is OPTLEN bytes long).
Returns 0 on success, -1 for errors. */
diff --git ports/ChangeLog.alpha ports/ChangeLog.alpha
index 7bfdda3..c237a30 100644
--- ports/ChangeLog.alpha
+++ ports/ChangeLog.alpha
@@ -1,3 +1,8 @@
+2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/alpha/nptl/libc.abilist (GLIBC_2.17):
+ Add __sendmmsg.
+
2012-11-01 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/alpha/bits/fcntl.h: Remove all
diff --git ports/ChangeLog.arm ports/ChangeLog.arm
index 0b76f5e..5d78122 100644
--- ports/ChangeLog.arm
+++ ports/ChangeLog.arm
@@ -1,3 +1,8 @@
+2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/arm/nptl/libc.abilist (GLIBC_2.17):
+ Add __sendmmsg.
+
2012-10-22 Roland McGrath <roland@hack.frob.com>
* sysdeps/unix/sysv/linux/arm/nptl/libc.abilist
diff --git ports/ChangeLog.ia64 ports/ChangeLog.ia64
index 1531304..3eec77c 100644
--- ports/ChangeLog.ia64
+++ ports/ChangeLog.ia64
@@ -1,3 +1,8 @@
+2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/ia64/nptl/libc.abilist (GLIBC_2.17):
+ Add __sendmmsg.
+
2012-10-30 Joseph Myers <joseph@codesourcery.com>
[BZ #14047]
diff --git ports/ChangeLog.m68k ports/ChangeLog.m68k
index ac879c1..7e9a3f6 100644
--- ports/ChangeLog.m68k
+++ ports/ChangeLog.m68k
@@ -1,3 +1,10 @@
+2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libc.abilist
+ (GLIBC_2.17): Add __sendmmsg.
+ * sysdeps/unix/sysv/linux/m68k/m680x0/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+
2012-10-25 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/m68k/bits/fcntl.h: Remove all
diff --git ports/ChangeLog.mips ports/ChangeLog.mips
index 3652ff9..0450431 100644
--- ports/ChangeLog.mips
+++ ports/ChangeLog.mips
@@ -1,5 +1,14 @@
2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+ * sysdeps/unix/sysv/linux/mips/mips32/nptl/libc.abilist
+ (GLIBC_2.17): Add __sendmmsg.
+ * sysdeps/unix/sysv/linux/mips/mips64/n32/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/mips/mips64/n64/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+
+2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+
* sysdeps/unix/sysv/linux/mips/configure: Regenerate.
* sysdeps/unix/sysv/linux/mips/mips64/n32/nptl/libc.abilist
diff --git ports/ChangeLog.powerpc ports/ChangeLog.powerpc
index 758853e..8a0b1b7 100644
--- ports/ChangeLog.powerpc
+++ ports/ChangeLog.powerpc
@@ -1,3 +1,8 @@
+2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/nptl/libc.abilist
+ (GLIBC_2.17): Add __sendmmsg.
+
2012-10-31 Andreas Schwab <schwab@linux-m68k.org>
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/nptl/libc.abilist:
diff --git ports/ChangeLog.tile ports/ChangeLog.tile
index 1f04349..110204c 100644
--- ports/ChangeLog.tile
+++ ports/ChangeLog.tile
@@ -1,3 +1,12 @@
+2012-11-01 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libc.abilist
+ (GLIBC_2.17): Add __sendmmsg.
+ * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+ * sysdeps/unix/sysv/linux/tile/tilepro/nptl/libc.abilist
+ (GLIBC_2.17): Likewise.
+
2012-10-30 Chris Metcalf <cmetcalf@tilera.com>
* sysdeps/tile/dl-machine.h: Use new DL_AFTER_LOAD macro
diff --git ports/sysdeps/unix/sysv/linux/alpha/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/alpha/nptl/libc.abilist
index 1d0cc7e..0ce8e1f 100644
--- ports/sysdeps/unix/sysv/linux/alpha/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/alpha/nptl/libc.abilist
@@ -1813,6 +1813,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/arm/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/arm/nptl/libc.abilist
index ceab6b2..e4c0674 100644
--- ports/sysdeps/unix/sysv/linux/arm/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/arm/nptl/libc.abilist
@@ -80,6 +80,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/ia64/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/ia64/nptl/libc.abilist
index b3510fe..d5cf29c 100644
--- ports/sysdeps/unix/sysv/linux/ia64/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/ia64/nptl/libc.abilist
@@ -80,6 +80,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libc.abilist
index 3c40379..e17e324 100644
--- ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libc.abilist
@@ -81,6 +81,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/m68k/m680x0/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/m68k/m680x0/nptl/libc.abilist
index f998b1b..db61e00 100644
--- ports/sysdeps/unix/sysv/linux/m68k/m680x0/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/m68k/m680x0/nptl/libc.abilist
@@ -1769,6 +1769,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/mips/mips32/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/mips/mips32/nptl/libc.abilist
index 7378869..91defd2 100644
--- ports/sysdeps/unix/sysv/linux/mips/mips32/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/mips/mips32/nptl/libc.abilist
@@ -2244,6 +2244,7 @@ _gp_disp
_gp_disp A
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/mips/mips64/n32/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/mips/mips64/n32/nptl/libc.abilist
index df2e637..42c5904 100644
--- ports/sysdeps/unix/sysv/linux/mips/mips64/n32/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/mips/mips64/n32/nptl/libc.abilist
@@ -1392,6 +1392,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/mips/mips64/n64/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/mips/mips64/n64/nptl/libc.abilist
index 22b3068..d88c2f2 100644
--- ports/sysdeps/unix/sysv/linux/mips/mips64/n64/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/mips/mips64/n64/nptl/libc.abilist
@@ -1390,6 +1390,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/nptl/libc.abilist
index 0efc6b5..157fbfc 100644
--- ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/nptl/libc.abilist
@@ -1775,6 +1775,7 @@ GLIBC_2.16
GLIBC_2.17
GLIBC_2.17 A
__ppc_get_timebase_freq F
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libc.abilist
index d79b2df..d730e6c 100644
--- ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libc.abilist
@@ -2082,6 +2082,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libc.abilist
index f617405..71e192b 100644
--- ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libc.abilist
@@ -2082,6 +2082,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libc.abilist ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libc.abilist
index d79b2df..d730e6c 100644
--- ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libc.abilist
+++ ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libc.abilist
@@ -2082,6 +2082,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git resolv/res_send.c resolv/res_send.c
index 0a28cd7..c790031 100644
--- resolv/res_send.c
+++ resolv/res_send.c
@@ -1129,7 +1129,7 @@ send_dg(res_state statp,
reqs[1].msg_hdr.msg_control = NULL;
reqs[1].msg_hdr.msg_controllen = 0;
- int ndg = sendmmsg (pfd[0].fd, reqs, 2, MSG_NOSIGNAL);
+ int ndg = __sendmmsg (pfd[0].fd, reqs, 2, MSG_NOSIGNAL);
if (__builtin_expect (ndg == 2, 1))
{
if (reqs[0].msg_len != buflen
diff --git socket/Makefile socket/Makefile
index e3a90b8..6037f3f 100644
--- socket/Makefile
+++ socket/Makefile
@@ -26,7 +26,7 @@ headers := sys/socket.h sys/un.h bits/sockaddr.h bits/socket.h \
routines := accept bind connect getpeername getsockname getsockopt \
listen recv recvfrom recvmsg send sendmsg sendto \
setsockopt shutdown socket socketpair isfdtype opensock \
- sockatmark accept4
+ sockatmark accept4 recvmmsg sendmmsg
aux := have_sock_cloexec
diff --git socket/Versions socket/Versions
index 7a96b1e..347433f 100644
--- socket/Versions
+++ socket/Versions
@@ -34,4 +34,10 @@ libc {
GLIBC_2.10 {
accept4;
}
+ GLIBC_2.17 {
+ # functions used in other libraries
+ __sendmmsg;
+
+ recvmmsg; sendmmsg;
+ }
}
diff --git socket/recvmmsg.c socket/recvmmsg.c
new file mode 100644
index 0000000..0bc6450
--- /dev/null
+++ socket/recvmmsg.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <sys/socket.h>
+
+/* Receive up to VLEN messages as described by VMESSAGES from socket FD.
+ Returns the number of bytes read or -1 for errors. */
+int
+__recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
+ const struct timespec *tmo)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
+libc_hidden_def (__recvmmsg)
+
+weak_alias (__recvmmsg, recvmmsg)
+
+stub_warning (recvmmsg)
diff --git socket/sendmmsg.c socket/sendmmsg.c
new file mode 100644
index 0000000..f717037
--- /dev/null
+++ socket/sendmmsg.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <sys/socket.h>
+
+/* Send a VLEN messages as described by VMESSAGES to socket FD.
+ Returns the number of datagrams successfully written or -1 for errors. */
+int
+__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
+libc_hidden_def (__sendmmsg)
+
+weak_alias (__sendmmsg, sendmmsg)
+
+stub_warning (sendmmsg)
diff --git socket/sys/socket.h socket/sys/socket.h
index 787c2b9..3810a37 100644
--- socket/sys/socket.h
+++ socket/sys/socket.h
@@ -97,6 +97,16 @@ typedef union { __SOCKADDR_ALLTYPES
# undef __SOCKADDR_ONETYPE
#endif
+#ifdef __USE_GNU
+/* For `recvmmsg' and `sendmmsg'. */
+struct mmsghdr
+ {
+ struct msghdr msg_hdr; /* Actual message header. */
+ unsigned int msg_len; /* Number of received or sent bytes for the
+ entry. */
+ };
+#endif
+
/* Create a new socket of type TYPE in domain DOMAIN, using
protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically.
@@ -175,6 +185,16 @@ extern ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n,
extern ssize_t sendmsg (int __fd, const struct msghdr *__message,
int __flags);
+#ifdef __USE_GNU
+/* Send a VLEN messages as described by VMESSAGES to socket FD.
+ Returns the number of datagrams successfully written or -1 for errors.
+
+ This function is a cancellation point and therefore not marked with
+ __THROW. */
+extern int sendmmsg (int __fd, struct mmsghdr *__vmessages,
+ unsigned int __vlen, int __flags);
+#endif
+
/* Receive a message as described by MESSAGE from socket FD.
Returns the number of bytes read or -1 for errors.
@@ -182,6 +202,17 @@ extern ssize_t sendmsg (int __fd, const struct msghdr *__message,
__THROW. */
extern ssize_t recvmsg (int __fd, struct msghdr *__message, int __flags);
+#ifdef __USE_GNU
+/* Receive up to VLEN messages as described by VMESSAGES from socket FD.
+ Returns the number of bytes read or -1 for errors.
+
+ This function is a cancellation point and therefore not marked with
+ __THROW. */
+extern int recvmmsg (int __fd, struct mmsghdr *__vmessages,
+ unsigned int __vlen, int __flags,
+ const struct timespec *__tmo);
+#endif
+
/* Put the current value for socket FD's option OPTNAME at protocol level LEVEL
into OPTVAL (which is *OPTLEN bytes long), and set *OPTLEN to the value's
diff --git sysdeps/unix/sysv/linux/Makefile sysdeps/unix/sysv/linux/Makefile
index 8e5361c..ecd9c2c 100644
--- sysdeps/unix/sysv/linux/Makefile
+++ sysdeps/unix/sysv/linux/Makefile
@@ -12,8 +12,7 @@ CFLAGS-malloc.c += -DMORECORE_CLEARS=2
endif
ifeq ($(subdir),socket)
-sysdep_routines += internal_accept4 recvmmsg internal_recvmmsg sendmmsg \
- internal_sendmmsg
+sysdep_routines += internal_accept4 internal_recvmmsg internal_sendmmsg
endif
ifeq ($(subdir),misc)
diff --git sysdeps/unix/sysv/linux/bits/socket.h sysdeps/unix/sysv/linux/bits/socket.h
index 309cba7..df8f167 100644
--- sysdeps/unix/sysv/linux/bits/socket.h
+++ sysdeps/unix/sysv/linux/bits/socket.h
@@ -235,16 +235,6 @@ struct msghdr
int msg_flags; /* Flags on received message. */
};
-#ifdef __USE_GNU
-/* For `recvmmsg' and 'sendmmsg'. */
-struct mmsghdr
- {
- struct msghdr msg_hdr; /* Actual message header. */
- unsigned int msg_len; /* Number of received or sent bytes
- for the entry. */
- };
-#endif
-
/* Structure used for storage of ancillary data object information. */
struct cmsghdr
{
@@ -389,27 +379,4 @@ struct linger
int l_linger; /* Time to linger. */
};
-
-__BEGIN_DECLS
-
-#ifdef __USE_GNU
-/* Receive up to VLEN messages as described by VMESSAGES from socket FD.
- Returns the number of bytes read or -1 for errors.
-
- This function is a cancellation point and therefore not marked with
- __THROW. */
-extern int recvmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags,
- const struct timespec *__tmo);
-
-/* Send a VLEN messages as described by VMESSAGES to socket FD.
- Return the number of datagrams successfully written or -1 for errors.
-This function is a cancellation point and therefore not marked with
- __THROW. */
-extern int sendmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags);
-#endif
-
-__END_DECLS
-
#endif /* bits/socket.h */
diff --git sysdeps/unix/sysv/linux/i386/nptl/libc.abilist sysdeps/unix/sysv/linux/i386/nptl/libc.abilist
index 67d5929..c057117 100644
--- sysdeps/unix/sysv/linux/i386/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/i386/nptl/libc.abilist
@@ -1813,6 +1813,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/internal_recvmmsg.S sysdeps/unix/sysv/linux/internal_recvmmsg.S
index 66c1357..18e6da8 100644
--- sysdeps/unix/sysv/linux/internal_recvmmsg.S
+++ sysdeps/unix/sysv/linux/internal_recvmmsg.S
@@ -2,13 +2,14 @@
#include <sys/syscall.h>
#if !defined __NR_recvmmsg && defined __NR_socketcall
# define socket recvmmsg
-# ifdef __ASSUME_RECVMMSG
-# define __socket recvmmsg
-# else
+# ifndef __ASSUME_RECVMMSG
# define __socket __internal_recvmmsg
+# define NO_WEAK_ALIAS
# endif
# define NARGS 5
# define NEED_CANCELLATION
-# define NO_WEAK_ALIAS
# include <socket.S>
+# ifdef __ASSUME_RECVMMSG
+libc_hidden_def (__recvmmsg)
+# endif
#endif
diff --git sysdeps/unix/sysv/linux/internal_sendmmsg.S sysdeps/unix/sysv/linux/internal_sendmmsg.S
index f5152c9..e6681f0 100644
--- sysdeps/unix/sysv/linux/internal_sendmmsg.S
+++ sysdeps/unix/sysv/linux/internal_sendmmsg.S
@@ -2,13 +2,14 @@
#include <sys/syscall.h>
#if !defined __NR_sendmmsg && defined __NR_socketcall
# define socket sendmmsg
-# ifdef __ASSUME_SENDMMSG
-# define __socket sendmmsg
-# else
+# ifndef __ASSUME_SENDMMSG
# define __socket __internal_sendmmsg
+# define NO_WEAK_ALIAS
# endif
# define NARGS 4
# define NEED_CANCELLATION
-# define NO_WEAK_ALIAS
# include <socket.S>
+# ifdef __ASSUME_SENDMMSG
+libc_hidden_def (__sendmmsg)
+# endif
#endif
diff --git sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist
index 8e45958..4f4ee1e 100644
--- sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist
@@ -1775,6 +1775,7 @@ GLIBC_2.16
GLIBC_2.17
GLIBC_2.17 A
__ppc_get_timebase_freq F
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist
index 8eaaccd..3e7c8d6 100644
--- sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist
@@ -81,6 +81,7 @@ GLIBC_2.16
GLIBC_2.17
GLIBC_2.17 A
__ppc_get_timebase_freq F
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/recvmmsg.c sysdeps/unix/sysv/linux/recvmmsg.c
index 32fc8df..782b933 100644
--- sysdeps/unix/sysv/linux/recvmmsg.c
+++ sysdeps/unix/sysv/linux/recvmmsg.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010 Free Software Foundation, Inc.
+/* Copyright (C) 2010-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@redhat.com>, 2010.
@@ -26,8 +26,8 @@
#ifdef __NR_recvmmsg
int
-recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
- const struct timespec *tmo)
+__recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
+ const struct timespec *tmo)
{
if (SINGLE_THREAD_P)
return INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
@@ -40,6 +40,9 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
return result;
}
+libc_hidden_def (__recvmmsg)
+
+weak_alias (__recvmmsg, recvmmsg)
#elif defined __NR_socketcall
# ifndef __ASSUME_RECVMMSG
extern int __internal_recvmmsg (int fd, struct mmsghdr *vmessages,
@@ -50,8 +53,8 @@ extern int __internal_recvmmsg (int fd, struct mmsghdr *vmessages,
static int have_recvmmsg;
int
-recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
- const struct timespec *tmo)
+__recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
+ const struct timespec *tmo)
{
if (__builtin_expect (have_recvmmsg >= 0, 1))
{
@@ -84,16 +87,13 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
__set_errno (ENOSYS);
return -1;
}
+libc_hidden_def (__recvmmsg)
+
+weak_alias (__recvmmsg, recvmmsg)
# else
-/* When __ASSUME_RECVMMSG recvmmsg is defined in internal_recvmmsg.S. */
+/* When __ASSUME_RECVMMSG, __recvmmsg and recvmmsg are defined in
+ internal_recvmmsg.S. */
# endif
#else
-int
-recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
- const struct timespec *tmo)
-{
- __set_errno (ENOSYS);
- return -1;
-}
-stub_warning (recvmmsg)
+# include <socket/recvmmsg.c>
#endif
diff --git sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist
index d9914ff..7c9f7ed 100644
--- sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist
@@ -1765,6 +1765,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist
index ef1ead3..f267284 100644
--- sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist
@@ -86,6 +86,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/sendmmsg.c sysdeps/unix/sysv/linux/sendmmsg.c
index 0674419..606291a 100644
--- sysdeps/unix/sysv/linux/sendmmsg.c
+++ sysdeps/unix/sysv/linux/sendmmsg.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011 Free Software Foundation, Inc.
+/* Copyright (C) 2011-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gmail.com>, 2011.
@@ -26,7 +26,7 @@
#ifdef __NR_sendmmsg
int
-sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
+__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
{
if (SINGLE_THREAD_P)
return INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
@@ -39,6 +39,9 @@ sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
return result;
}
+libc_hidden_def (__sendmmsg)
+
+weak_alias (__sendmmsg, sendmmsg)
#elif defined __NR_socketcall
# ifndef __ASSUME_SENDMMSG
extern int __internal_sendmmsg (int fd, struct mmsghdr *vmessages,
@@ -48,7 +51,7 @@ extern int __internal_sendmmsg (int fd, struct mmsghdr *vmessages,
static int have_sendmmsg;
int
-sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
+__sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
{
if (__builtin_expect (have_sendmmsg >= 0, 1))
{
@@ -81,15 +84,12 @@ sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
__set_errno (ENOSYS);
return -1;
}
+libc_hidden_def (__sendmmsg)
+
+weak_alias (__sendmmsg, sendmmsg)
# else
/* When __ASSUME_SENDMMSG sendmmsg is defined in internal_sendmmsg.S. */
# endif
#else
-int
-sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
-{
- __set_errno (ENOSYS);
- return -1;
-}
-stub_warning (sendmmsg)
+# include <socket/sendmmsg.c>
#endif
diff --git sysdeps/unix/sysv/linux/sh/nptl/libc.abilist sysdeps/unix/sysv/linux/sh/nptl/libc.abilist
index 733b550..fb57092 100644
--- sysdeps/unix/sysv/linux/sh/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/sh/nptl/libc.abilist
@@ -86,6 +86,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/sparc/sparc32/nptl/libc.abilist sysdeps/unix/sysv/linux/sparc/sparc32/nptl/libc.abilist
index 3a96ea8..b52edb8 100644
--- sysdeps/unix/sysv/linux/sparc/sparc32/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/sparc/sparc32/nptl/libc.abilist
@@ -1770,6 +1770,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/sparc/sparc64/nptl/libc.abilist sysdeps/unix/sysv/linux/sparc/sparc64/nptl/libc.abilist
index aa892b8..0d1082e 100644
--- sysdeps/unix/sysv/linux/sparc/sparc64/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/sparc/sparc64/nptl/libc.abilist
@@ -91,6 +91,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/x86_64/64/nptl/libc.abilist sysdeps/unix/sysv/linux/x86_64/64/nptl/libc.abilist
index a42d424..df0c33e 100644
--- sysdeps/unix/sysv/linux/x86_64/64/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/x86_64/64/nptl/libc.abilist
@@ -82,6 +82,7 @@ GLIBC_2.16
timespec_get F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
diff --git sysdeps/unix/sysv/linux/x86_64/x32/nptl/libc.abilist sysdeps/unix/sysv/linux/x86_64/x32/nptl/libc.abilist
index 108b80f..e48ca2a 100644
--- sysdeps/unix/sysv/linux/x86_64/x32/nptl/libc.abilist
+++ sysdeps/unix/sysv/linux/x86_64/x32/nptl/libc.abilist
@@ -2080,6 +2080,7 @@ GLIBC_2.16
xprt_unregister F
GLIBC_2.17
GLIBC_2.17 A
+ __sendmmsg F
clock_getcpuclockid F
clock_getres F
clock_gettime F
Grüße,
Thomas
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 489 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20121101/68955e26/attachment.sig>
More information about the Libc-alpha
mailing list