os: define SOCK_CLOEXEC on Linux

If it's not already defined, and we are on Linux, #define it. This gets
rid of a load of #ifdefs. This should also allow to use it when the
kernel supports it, but the libc does not define it.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
This commit is contained in:
Pekka Paalanen 2012-04-23 12:10:45 +03:00
parent 1f827a4776
commit 3b29783dc8
3 changed files with 14 additions and 9 deletions

View file

@ -55,13 +55,11 @@ wl_os_socket_cloexec(int domain, int type, int protocol)
{ {
int fd; int fd;
#ifdef SOCK_CLOEXEC
fd = socket(domain, type | SOCK_CLOEXEC, protocol); fd = socket(domain, type | SOCK_CLOEXEC, protocol);
if (fd >= 0) if (fd >= 0)
return fd; return fd;
if (errno != EINVAL) if (errno != EINVAL)
return -1; return -1;
#endif
fd = socket(domain, type, protocol); fd = socket(domain, type, protocol);
return set_cloexec_or_close(fd); return set_cloexec_or_close(fd);

View file

@ -26,4 +26,17 @@
int int
wl_os_socket_cloexec(int domain, int type, int protocol); wl_os_socket_cloexec(int domain, int type, int protocol);
/*
* The following are for wayland-os.c and the unit tests.
* Do not use them elsewhere.
*/
#ifdef __linux__
#ifndef SOCK_CLOEXEC
#define SOCK_CLOEXEC 02000000
#endif
#endif /* __linux__ */
#endif #endif

View file

@ -50,12 +50,10 @@ socket(int domain, int type, int protocol)
{ {
wrapped_calls++; wrapped_calls++;
#ifdef SOCK_CLOEXEC
if (fall_back && (type & SOCK_CLOEXEC)) { if (fall_back && (type & SOCK_CLOEXEC)) {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
#endif
return real_socket(domain, type, protocol); return real_socket(domain, type, protocol);
} }
@ -70,17 +68,13 @@ do_os_wrappers_socket_cloexec(int n)
/* simply create a socket that closes on exec */ /* simply create a socket that closes on exec */
fd = wl_os_socket_cloexec(PF_LOCAL, SOCK_STREAM, 0); fd = wl_os_socket_cloexec(PF_LOCAL, SOCK_STREAM, 0);
assert(fd >= 0);
#ifdef SOCK_CLOEXEC
/* /*
* Must have 2 calls if falling back, but must also allow * Must have 2 calls if falling back, but must also allow
* falling back without a forced fallback. * falling back without a forced fallback.
*/ */
assert(wrapped_calls > n); assert(wrapped_calls > n);
#else
assert(wrapped_calls == 1);
#endif
assert(fd >= 0);
exec_fd_leak_check(nr_fds); exec_fd_leak_check(nr_fds);
} }