Browse Source

OSX does not have accept4 :(

master
Felix von Leitner 2 months ago
parent
commit
e23d5bbc5b
  1. 9
      GNUmakefile
  2. 6
      socket.h
  3. 15
      socket/socket_accept4_flags.c
  4. 11
      socket/socket_accept6_flags.c
  5. 10
      tryaccept4.c

9
GNUmakefile

@ -204,7 +204,7 @@ clean:
rm -f *.o *.obj *.a *.lib *.da *.bbg *.bb core t haveip6.h haven2i.h \
havesl.h haveinline.h iopause.h select.h havekqueue.h haveepoll.h \
libepoll havesigio.h havebsdsf.h havesendfile.h havescope.h havedevpoll.h \
dep libsocket havealloca.h haveuint128.h entities.h ent havepread.h \
dep libsocket havealloca.h haveuint128.h entities.h ent havepread.h haveaccept4.h \
*.gcda *.gcno
INCLUDES=buffer.h byte.h fmt.h ip4.h ip6.h mmap.h scan.h socket.h str.h stralloc.h \
@ -337,6 +337,11 @@ select.h: select.h1 select.h2 trysysel.c
if $(DIET) $(CCC) $(CFLAGS) -c trysysel.c >/dev/null 2>&1; then cp select.h2 select.h; else cp select.h1 select.h; fi
-rm -f trysysel.o
haveaccept4.h: tryaccept4.c
-rm -f $@
if $(DIET) $(CCC) $(CFLAGS) -c tryaccept4.c >/dev/null 2>&1; then echo "#define HAVE_ACCEPT4"; fi > $@
-rm -f tryaccept4.o
libsocket: trysocket.c
if $(DIET) $(CCC) $(CFLAGS) -o trysocket trysocket.c >/dev/null 2>&1; then echo ""; else \
if $(DIET) $(CCC) $(CFLAGS) -o trysocket trysocket.c -lsocket >/dev/null 2>&1; then echo "-lsocket"; else \
@ -352,6 +357,8 @@ socket_mchopcount6.o socket_mcjoin6.o socket_mcleave6.o socket_mcloop6.o \
socket_recv6.o socket_remote6.o socket_sctp6b.o socket_send6.o \
socket_tcp6b.o socket_tcp6.o socket_udp6.o socket_accept6_flags.o: haveip6.h
socket_accept4_flags.o socket_accept6_flags.o: haveaccept4.h
socket_accept6.o socket_connect6.o socket_local6.o socket_recv6.o \
socket_remote6.o socket_send6.o socket_accept6_flags.o: havescope.h

6
socket.h

@ -47,7 +47,11 @@ int socket_accept4_makenonblocking_setcloseonexec(int s,char* ip,uint16* port);
int socket_accept6_makenonblocking_setcloseonexec(int s,char* ip,uint16* port,uint32* scope_id);
/* These are internal wrappers around accept4, not meant for external use.
* flags can be SOCK_NONBLOCK or SOCK_CLOEXEC or both (defined in sys/socket.h) */
* flags can be SOCKET_NONBLOCK or SOCKET_CLOEXEC or both */
enum {
SOCKET_NONBLOCK=1,
SOCKET_CLOEXEC=2,
};
int socket_accept4_flags(int s,char* ip,uint16* port, int flags);
int socket_accept6_flags(int s,char* ip,uint16* port,uint32* scope_id, int flags);

15
socket/socket_accept4_flags.c

@ -20,6 +20,8 @@
#include "io_internal.h"
#endif
#include "haveaccept4.h"
int socket_accept4_flags(int s, char *ip, uint16 *port, int flags) {
struct sockaddr_in si;
socklen_t len = sizeof si;
@ -75,11 +77,15 @@ incoming:
} else {
#endif
#ifdef HAVE_ACCEPT4
static int noaccept4; // auto initialized to 0
if (noaccept4)
fd=-1;
else {
if ((fd=accept4(s,(void*) &si, &len, flags))==-1) {
int flg=0;
if (flags & SOCKET_NONBLOCK) flg += SOCK_NONBLOCK;
if (flags & SOCKET_CLOEXEC) flg += SOCK_CLOEXEC;
if ((fd=accept4(s,(void*) &si, &len, flg))==-1) {
if (errno != ENOSYS)
return -1;
// if we get here, fd==-1 && errno==ENOSYS
@ -87,12 +93,13 @@ incoming:
}
}
if (fd==-1) {
#endif
int fl = 0;
/* if we get here, the kernel did not support accept4. */
if ((fd=accept(s,(void*) &si,&len))==-1)
return -1;
if (flags & SOCK_NONBLOCK) fl |= O_NDELAY;
if (flags & SOCK_CLOEXEC) fl |= O_CLOEXEC;
if (flags & SOCKET_NONBLOCK) fl |= O_NDELAY;
if (flags & SOCKET_CLOEXEC) fl |= O_CLOEXEC;
/* On BSD the accepted socket inherits O_NDELAY and O_CLOEXEC, on
* Linux it doesn't. accept4 makes this explicit. So for the
* fallback, make it explicit as well */
@ -107,7 +114,9 @@ incoming:
#ifdef __linux__
}
#endif
#ifdef HAVE_ACCEPT4
}
#endif
#ifdef __MINGW32__
}

11
socket/socket_accept6_flags.c

@ -25,6 +25,8 @@
#include "io_internal.h"
#endif
#include "haveaccept4.h"
int socket_accept6_flags(int s, char* ip, uint16* port, uint32* scope_id, int flags)
{
#ifdef LIBC_HAS_IP6
@ -86,17 +88,22 @@ incoming:
} else {
#endif
#ifdef HAVE_ACCEPT4
static int noaccept4; // auto initialized to 0
if (noaccept4)
fd=-1;
else {
if ((fd=accept4(s,(void*) &sa, &dummy, flags))==-1) {
int flg=0;
if (flags & SOCKET_NONBLOCK) flg += SOCK_NONBLOCK;
if (flags & SOCKET_CLOEXEC) flg += SOCK_CLOEXEC;
if ((fd=accept4(s,(void*) &sa, &dummy, flg))==-1) {
if (errno != ENOSYS)
return -1;
noaccept4=1;
}
}
if (fd==-1) {
#endif
int fl = 0;
fd = accept(s, (struct sockaddr *) &sa, &dummy);
if (fd == -1)
@ -117,7 +124,9 @@ incoming:
#ifdef __linux__
}
#endif
#ifdef HAVE_ACCEPT4
}
#endif
#ifdef __MINGW32__
}
#endif

10
tryaccept4.c

@ -0,0 +1,10 @@
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
int main() {
accept4(0, NULL, NULL, 0); // we just want to know if the symbol exists
return 0;
}
Loading…
Cancel
Save