This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hi!
On Fri, 2 Nov 2012 12:38:00 -0700 (PDT), Roland McGrath <roland@hack.frob.com> wrote:
> [...]
Thanks for the explanation of name spaces and related symbol internals.
I now have a better understanding of this.
Here is the latest version of the patch. I have also recreated the
tschwinge/sendmmsg branch (90a40232b8bd4973002718aacfcfd793139a7ff5).
Primarily I have addressed Roland's comments: move __sendmmsg to
GLIBC_PRIVATE, and restore recvmmsg to not have an internal __recvmmsg
symbol.
For testing, I have also done additional builds on x86 and x86-64
GNU/Linux with the following patch applied:
diff --git sysdeps/unix/sysv/linux/internal_sendmmsg.S sysdeps/unix/sysv/linux/internal_sendmmsg.S
index e6681f0..bb71cc6 100644
--- sysdeps/unix/sysv/linux/internal_sendmmsg.S
+++ sysdeps/unix/sysv/linux/internal_sendmmsg.S
@@ -1,5 +1,8 @@
#include <kernel-features.h>
#include <sys/syscall.h>
+
+#undef __NR_sendmmsg
+
#if !defined __NR_sendmmsg && defined __NR_socketcall
# define socket sendmmsg
# ifndef __ASSUME_SENDMMSG
diff --git sysdeps/unix/sysv/linux/sendmmsg.c sysdeps/unix/sysv/linux/sendmmsg.c
index a6daff1..3310d78 100644
--- sysdeps/unix/sysv/linux/sendmmsg.c
+++ sysdeps/unix/sysv/linux/sendmmsg.c
@@ -23,6 +23,7 @@
#include <sys/syscall.h>
#include <kernel-features.h>
+#undef __NR_sendmmsg
#ifdef __NR_sendmmsg
int
This exercises the case that there is no sendmmsg syscall. On x86, the
socketcall interface will instead be used. On x86-64, there is no
socketcall interface, so the ENOSYS stub will be used. All
socket/{internal_,}sendmmsg.o{,s} files look as I'd expecte them to look.
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.
* sysdeps/unix/sysv/linux/recvmmsg.c [!defined __NR_recvmmsg &&
!defined __NR_socketcall] (recvmmsg): Move ENOSYS stub into and
include it from...
* socket/recvmmsg.c: ... this new file.
* 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.
[!defined __NR_sendmmsg && !defined __NR_socketcall] (sendmmsg):
Move ENOSYS stub into and include it from...
* socket/sendmmsg.c: ... this new file.
* sysdeps/unix/sysv/linux/Makefile [subdir=socket]
(sysdep_routines): Move recvmmsg and sendmmsg...
* socket/Makefile (routines): ... here.
* socket/Versions (GLIBC_2.17): Add recvmmsg and sendmmsg.
(GLIBC_PRIVATE): Add __sendmmsg.
* include/sys/socket.h (__sendmmsg): Add declarations.
* resolv/res_send.c (send_dg): Invoke __sendmmsg instead of
sendmmsg.
diff --git include/sys/socket.h include/sys/socket.h
index ec08857..9caf1bb 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,
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..dcad329 100644
--- socket/Versions
+++ socket/Versions
@@ -34,4 +34,10 @@ libc {
GLIBC_2.10 {
accept4;
}
+ GLIBC_2.17 {
+ recvmmsg; sendmmsg;
+ }
+ GLIBC_PRIVATE {
+ __sendmmsg;
+ }
}
diff --git socket/recvmmsg.c socket/recvmmsg.c
new file mode 100644
index 0000000..2d6d474
--- /dev/null
+++ socket/recvmmsg.c
@@ -0,0 +1,31 @@
+/* Receive multiple messages on a socket. Stub version.
+ Copyright (C) 2010-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;
+}
+stub_warning (recvmmsg)
diff --git socket/sendmmsg.c socket/sendmmsg.c
new file mode 100644
index 0000000..ed93f49
--- /dev/null
+++ socket/sendmmsg.c
@@ -0,0 +1,32 @@
+/* Send multiple messages on a socket. Stub version.
+ Copyright (C) 2011-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/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/recvmmsg.c sysdeps/unix/sysv/linux/recvmmsg.c
index 32fc8df..009d868 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.
@@ -88,12 +88,5 @@ recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
/* When __ASSUME_RECVMMSG recvmmsg is 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/sendmmsg.c sysdeps/unix/sysv/linux/sendmmsg.c
index 0674419..a6daff1 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,8 @@ 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 +50,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 +83,11 @@ 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
GrÃÃe,
Thomas
Attachment:
pgp00000.pgp
Description: PGP signature
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |