Android does not have SOCK_CLOEXEC, so implement a wrapper that falls back. Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>dev
parent
7a1b32a198
commit
51aaf646db
@ -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; |
||||||
|
} |
||||||
|
|
@ -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 */ |
Loading…
Reference in new issue