klibc-bot for H. Peter Anvin
2016-Jan-06 02:39 UTC
[klibc] [klibc:master] Add accept4(), handle fallback from accept () to accept4()
Commit-ID: cf8147c43a60d9eb6a6713d16f30364a698a6936 Gitweb: http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=cf8147c43a60d9eb6a6713d16f30364a698a6936 Author: H. Peter Anvin <hpa at linux.intel.com> AuthorDate: Tue, 5 Jan 2016 18:31:40 -0800 Committer: H. Peter Anvin <hpa at linux.intel.com> CommitDate: Tue, 5 Jan 2016 18:35:16 -0800 [klibc] Add accept4(), handle fallback from accept() to accept4() Add support for the accept4() system call. Some architectures now have accept4() but not accept(), so introduce a standard fallback. However, since accept() is a socketcall, we have to do some special hacks. While we are at it, handle conditional socketcall stubs based on their existence <linux/net.h>, analogous to <asm/unistd.h>. Signed-off-by: H. Peter Anvin <hpa at linux.intel.com> --- usr/include/sys/socket.h | 1 + usr/klibc/Kbuild | 2 +- usr/klibc/SOCKETCALLS.def | 1 + usr/klibc/accept.c | 16 ++++++++++++++++ usr/klibc/socketcalls.pl | 15 +++++++++++++-- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/usr/include/sys/socket.h b/usr/include/sys/socket.h index 3334212..d0ba9eb 100644 --- a/usr/include/sys/socket.h +++ b/usr/include/sys/socket.h @@ -251,6 +251,7 @@ __extern int bind(int, const struct sockaddr *, int); __extern int connect(int, const struct sockaddr *, socklen_t); __extern int listen(int, int); __extern int accept(int, struct sockaddr *, socklen_t *); +__extern int accept4(int, struct sockaddr *, socklen_t *, int); __extern int getsockname(int, struct sockaddr *, socklen_t *); __extern int getpeername(int, struct sockaddr *, socklen_t *); __extern int socketpair(int, int, int, int *); diff --git a/usr/klibc/Kbuild b/usr/klibc/Kbuild index 5521038..f797166 100644 --- a/usr/klibc/Kbuild +++ b/usr/klibc/Kbuild @@ -58,7 +58,7 @@ klib-y += vsnprintf.o snprintf.o vsprintf.o sprintf.o \ lrand48.o jrand48.o mrand48.o nrand48.o srand48.o seed48.o \ inet/inet_ntoa.o inet/inet_aton.o inet/inet_addr.o \ inet/inet_ntop.o inet/inet_pton.o inet/bindresvport.o \ - send.o recv.o \ + accept.o send.o recv.o \ access.o chmod.o chown.o dup2.o mknod.o poll.o rename.o stat.o \ lchown.o link.o rmdir.o unlink.o utimes.o lstat.o mkdir.o \ readlink.o realpath.o select.o symlink.o pipe.o \ diff --git a/usr/klibc/SOCKETCALLS.def b/usr/klibc/SOCKETCALLS.def index 39f7db5..97413de 100644 --- a/usr/klibc/SOCKETCALLS.def +++ b/usr/klibc/SOCKETCALLS.def @@ -9,6 +9,7 @@ <?> int connect(int, const struct sockaddr *, socklen_t); <?> int listen(int, int); <?> int accept(int, struct sockaddr *, socklen_t *); +<?> int accept4(int, struct sockaddr *, socklen_t *, int); <?> int getsockname(int, struct sockaddr *, socklen_t *); <?> int getpeername(int, struct sockaddr *, socklen_t *); <?> int socketpair(int, int, int, int *); diff --git a/usr/klibc/accept.c b/usr/klibc/accept.c new file mode 100644 index 0000000..3ae7bcd --- /dev/null +++ b/usr/klibc/accept.c @@ -0,0 +1,16 @@ +/* + * pread.c + * + * Some architectures need to wrap the system call + */ + +#include <sys/socket.h> + +#if !_KLIBC_SYS_SOCKETCALL && defined(__NR_accept4) && !defined(__NR_accept) + +int accept(int socket, struct sockaddr *address, socklen_t *addr_len) +{ + return accept4(socket, address, addr_len, 0); +} + +#endif diff --git a/usr/klibc/socketcalls.pl b/usr/klibc/socketcalls.pl index 9df5949..70ded0b 100644 --- a/usr/klibc/socketcalls.pl +++ b/usr/klibc/socketcalls.pl @@ -47,11 +47,22 @@ while ( defined($line = <FILE>) ) { print OUT "#include \"socketcommon.h\"\n"; print OUT "\n"; - print OUT "#if _KLIBC_SYS_SOCKETCALL || !defined(__NR_${name})\n\n"; + print OUT "#if _KLIBC_SYS_SOCKETCALL\n"; + print OUT "# define DO_THIS_SOCKETCALL\n"; + print OUT "#else\n"; + print OUT "# if !defined(__NR_${name})"; + if ($name eq 'accept') { + print OUT " && !defined(__NR_accept4)"; + } + print OUT "\n# define DO_THIS_SOCKETCALL\n"; + print OUT "# endif\n"; + print OUT "#endif\n\n"; + + print OUT "#if defined(DO_THIS_SOCKETCALL) && defined(SYS_\U${name}\E)\n\n"; print OUT "extern long __socketcall(int, const unsigned long *);\n\n"; - print OUT "$type $name (", join(', ', @cargs), ")\n"; + print OUT "$type ${name}(", join(', ', @cargs), ")\n"; print OUT "{\n"; print OUT " unsigned long args[$nargs];\n"; for ( $i = 0 ; $i < $nargs ; $i++ ) {