diff --git a/compat/Makefile.am b/compat/Makefile.am index ec251bb..790816f 100644 --- a/compat/Makefile.am +++ b/compat/Makefile.am @@ -29,6 +29,8 @@ endif libcompat_la_SOURCES = libcompat_la_LIBADD = $(PLATFORM_LDADD) +libcompat_la_SOURCES += socket.c + if !HAVE_ADJFREQ if HOST_FREEBSD libcompat_la_SOURCES += adjfreq_freebsd.c diff --git a/compat/socket.c b/compat/socket.c new file mode 100644 index 0000000..fd699f9 --- /dev/null +++ b/compat/socket.c @@ -0,0 +1,29 @@ +#define SOCKET_FLAGS_PRIV + +#include + +#ifdef NEED_SOCKET_FLAGS + +#include + +int +_socket(int domain, int type, int protocol) +{ + int s = socket(domain, type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK), protocol); + int flags; + if (s == -1) + return s; + + if (type & SOCK_CLOEXEC) { + flags = fcntl(s, F_GETFD); + fcntl(s, F_SETFD, flags | FD_CLOEXEC); + } + + if (type & SOCK_NONBLOCK) { + flags = fcntl(s, F_GETFL); + fcntl(s, F_SETFL, flags | O_NONBLOCK); + } + return s; +} + +#endif diff --git a/include/sys/socket.h b/include/sys/socket.h index b572009..4cbc55d 100644 --- a/include/sys/socket.h +++ b/include/sys/socket.h @@ -11,6 +11,15 @@ ((struct sockaddr*)(X))->sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : \ ((struct sockaddr*)(X))->sa_family == AF_UNSPEC ? sizeof(struct sockaddr) : \ sizeof(struct sockaddr)) +#endif + +#if !defined(SOCK_NONBLOCK) || !defined(SOCK_CLOEXEC) +#define NEED_SOCKET_FLAGS +int _socket(int domain, int type, int protocol); +#ifndef SOCKET_FLAGS_PRIV +#define socket(d, t, p) _socket(d, t, p) +#endif +#endif /* * Prevent Solaris 10 system header leakage @@ -19,4 +28,10 @@ #undef MODEMASK #endif +#ifndef SOCK_NONBLOCK +#define SOCK_NONBLOCK 0x4000 /* set O_NONBLOCK */ +#endif + +#ifndef SOCK_CLOEXEC +#define SOCK_CLOEXEC 0x8000 /* set FD_CLOEXEC */ #endif