Add accept4(), handle fallback from accept() to accept4()
authorH. Peter Anvin <hpa@linux.intel.com>
Wed, 6 Jan 2016 02:31:40 +0000 (18:31 -0800)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 6 Jan 2019 19:33:01 +0000 (19:33 +0000)
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@linux.intel.com>
Gbp-Pq: Name klibc-add-accept4-handle-fallback-from-accept-to-acc.patch

usr/include/sys/socket.h
usr/klibc/Kbuild
usr/klibc/SOCKETCALLS.def
usr/klibc/accept.c [new file with mode: 0644]
usr/klibc/socketcalls.pl

index 3334212a43ba068378553039b94db900134eccbe..d0ba9ebec630e65fa0c48dfcec0c424841d178e2 100644 (file)
@@ -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 *);
index d3e2b9fbc99b15d4426dc88c51d8367f7bad2d68..3837e95e8602be3b635d374718fd15719e279bab 100644 (file)
@@ -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 \
index 39f7db52c8b8f59cdca8eec7b8d4f4fd12254626..97413dec014d5675ead917f004596351a14b1fbd 100644 (file)
@@ -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 (file)
index 0000000..3ae7bcd
--- /dev/null
@@ -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
index 9df5949417a723a463d84c9cd113307fc27f697b..70ded0b0b126a7e015cf24b7072a810bcc5ea463 100644 (file)
@@ -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++ ) {