OSX does not have accept4 :(

master
leitner 3 years ago
parent ca968b8cec
commit 7fd8e31f7d

@ -204,7 +204,7 @@ clean:
rm -f *.o *.obj *.a *.lib *.da *.bbg *.bb core t haveip6.h haven2i.h \ 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 \ havesl.h haveinline.h iopause.h select.h havekqueue.h haveepoll.h \
libepoll havesigio.h havebsdsf.h havesendfile.h havescope.h havedevpoll.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 *.gcda *.gcno
INCLUDES=buffer.h byte.h fmt.h ip4.h ip6.h mmap.h scan.h socket.h str.h stralloc.h \ 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 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 -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 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 >/dev/null 2>&1; then echo ""; else \
if $(DIET) $(CCC) $(CFLAGS) -o trysocket trysocket.c -lsocket >/dev/null 2>&1; then echo "-lsocket"; 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_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_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_accept6.o socket_connect6.o socket_local6.o socket_recv6.o \
socket_remote6.o socket_send6.o socket_accept6_flags.o: havescope.h socket_remote6.o socket_send6.o socket_accept6_flags.o: havescope.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); 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. /* 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_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); int socket_accept6_flags(int s,char* ip,uint16* port,uint32* scope_id, int flags);

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

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

@ -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