diff options
author | Pekka Paalanen <ppaalanen@gmail.com> | 2012-05-30 15:53:41 +0300 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-31 13:52:20 -0400 |
commit | 51aaf646db84b35a317a576459cd9a06c767b800 (patch) | |
tree | c94b5c1cdd5e9460fc241e77228a205c1f241bd8 | |
parent | 7a1b32a19888bb4f4a47dc951cf5d72db0899c11 (diff) |
compositor: work around missing SOCK_CLOEXEC
Android does not have SOCK_CLOEXEC, so implement a wrapper that falls
back.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
-rw-r--r-- | shared/Makefile.am | 2 | ||||
-rw-r--r-- | shared/os-compatibility.c | 78 | ||||
-rw-r--r-- | shared/os-compatibility.h | 29 | ||||
-rw-r--r-- | src/compositor.c | 5 |
4 files changed, 111 insertions, 3 deletions
diff --git a/shared/Makefile.am b/shared/Makefile.am index f712ae7..1f62941 100644 --- a/shared/Makefile.am +++ b/shared/Makefile.am @@ -9,5 +9,7 @@ libshared_la_SOURCES = \ option-parser.c \ image-loader.c \ config-parser.h \ + os-compatibility.c \ + os-compatibility.h \ cairo-util.c \ cairo-util.h diff --git a/shared/os-compatibility.c b/shared/os-compatibility.c new file mode 100644 index 0000000..b79aa1f --- /dev/null +++ b/shared/os-compatibility.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2012 Collabora, Ltd. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> + +#include "os-compatibility.h" + +static int +set_cloexec_or_close(int fd) +{ + long flags; + + if (fd == -1) + return -1; + + flags = fcntl(fd, F_GETFD); + if (flags == -1) + goto err; + + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) + goto err; + + return fd; + +err: + close(fd); + return -1; +} + +int +os_socketpair_cloexec(int domain, int type, int protocol, int *sv) +{ + int ret; + +#ifdef SOCK_CLOEXEC + ret = socketpair(domain, type | SOCK_CLOEXEC, protocol, sv); + if (ret == 0 || errno != EINVAL) + return ret; +#endif + + ret = socketpair(domain, type, protocol, sv); + if (ret < 0) + return ret; + + sv[0] = set_cloexec_or_close(sv[0]); + sv[1] = set_cloexec_or_close(sv[1]); + + if (sv[0] != -1 && sv[1] != -1) + return 0; + + close(sv[0]); + close(sv[1]); + return -1; +} + diff --git a/shared/os-compatibility.h b/shared/os-compatibility.h new file mode 100644 index 0000000..77e8672 --- /dev/null +++ b/shared/os-compatibility.h @@ -0,0 +1,29 @@ +/* + * Copyright © 2012 Collabora, Ltd. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef OS_COMPATIBILITY_H +#define OS_COMPATIBILITY_H + +int +os_socketpair_cloexec(int domain, int type, int protocol, int *sv); + +#endif /* OS_COMPATIBILITY_H */ diff --git a/src/compositor.c b/src/compositor.c index a36ccd5..e99f051 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -35,9 +35,7 @@ #include <assert.h> #include <sys/ioctl.h> #include <sys/wait.h> -#include <sys/types.h> #include <sys/socket.h> -#include <fcntl.h> #include <unistd.h> #include <math.h> #include <linux/input.h> @@ -48,6 +46,7 @@ #include <wayland-server.h> #include "compositor.h" +#include "../shared/os-compatibility.h" static struct wl_list child_process_list; static jmp_buf segv_jmp_buf; @@ -134,7 +133,7 @@ weston_client_launch(struct weston_compositor *compositor, pid_t pid; struct wl_client *client; - if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sv) < 0) { + if (os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, sv) < 0) { fprintf(stderr, "weston_client_launch: " "socketpair failed while launching '%s': %m\n", path); |