Android does not have SOCK_CLOEXEC, so implement a wrapper that falls back. Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
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