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
__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 *);
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 \
<?> 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 *);
--- /dev/null
+/*
+ * 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
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++ ) {