os: define SOCK_CLOEXEC on Linux
authorPekka Paalanen <ppaalanen@gmail.com>
Mon, 23 Apr 2012 09:10:45 +0000 (12:10 +0300)
committerPekka Paalanen <ppaalanen@gmail.com>
Wed, 25 Apr 2012 06:32:57 +0000 (09:32 +0300)
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>
src/wayland-os.c
src/wayland-os.h
tests/os-wrappers-test.c

index 8f75976..4db8050 100644 (file)
@@ -55,13 +55,11 @@ wl_os_socket_cloexec(int domain, int type, int protocol)
 {
        int fd;
 
-#ifdef SOCK_CLOEXEC
        fd = socket(domain, type | SOCK_CLOEXEC, protocol);
        if (fd >= 0)
                return fd;
        if (errno != EINVAL)
                return -1;
-#endif
 
        fd = socket(domain, type, protocol);
        return set_cloexec_or_close(fd);
index 49adc2b..a57b3aa 100644 (file)
 int
 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
index aa2631b..c6bf26e 100644 (file)
@@ -50,12 +50,10 @@ socket(int domain, int type, int protocol)
 {
        wrapped_calls++;
 
-#ifdef SOCK_CLOEXEC
        if (fall_back && (type & SOCK_CLOEXEC)) {
                errno = EINVAL;
                return -1;
        }
-#endif
 
        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 */
        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
         * falling back without a forced fallback.
         */
        assert(wrapped_calls > n);
-#else
-       assert(wrapped_calls == 1);
-#endif
-       assert(fd >= 0);
 
        exec_fd_leak_check(nr_fds);
 }