From: H. Peter Anvin Date: Wed, 6 Jan 2016 02:31:40 +0000 (-0800) Subject: Add accept4(), handle fallback from accept() to accept4() X-Git-Tag: archive/raspbian/2.0.4-11+rpi1^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=94b2a5088a42275d911c2c47241cfe1fef95a198;p=klibc.git 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 , analogous to . Signed-off-by: H. Peter Anvin Gbp-Pq: Name klibc-add-accept4-handle-fallback-from-accept-to-acc.patch --- 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 d3e2b9f..3837e95 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 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 + +#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 = ) ) { 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++ ) {