summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-01-07 22:49:02 +0000
committerLennart Poettering <lennart@poettering.net>2005-01-07 22:49:02 +0000
commit1117b84689ee5337369b95c7b093be9acbed26ae (patch)
treed22f1129bf29db7c346aed983250642ceb8404fa
parent1ce32c515fa0456fa7f112b3c03c628205bf35ee (diff)
add FD_CLOEXEC support
git-svn-id: file:///home/lennart/svn/public/libasyncns/trunk@13 cc0fb855-19ed-0310-866e-8c1d96e4abae
-rw-r--r--libasyncns/asyncns.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/libasyncns/asyncns.c b/libasyncns/asyncns.c
index 6976256..d1ce584 100644
--- a/libasyncns/asyncns.c
+++ b/libasyncns/asyncns.c
@@ -155,6 +155,20 @@ static int fd_nonblock(int fd) {
return fcntl(fd, F_SETFL, i | O_NONBLOCK);
}
+static int fd_cloexec(int fd) {
+ int v;
+ assert(fd >= 0);
+
+ if ((v = fcntl(fd, F_GETFD, 0)) < 0)
+ return -1;
+
+ if (v & FD_CLOEXEC)
+ return 0;
+
+ return fcntl(fd, F_SETFD, v | FD_CLOEXEC);
+}
+
+
static void *serialize_addrinfo(void *p, const struct addrinfo *ai, size_t *length, size_t maxlength) {
addrinfo_serialization_t *s = p;
size_t cnl, l;
@@ -402,6 +416,11 @@ asyncns_t* asyncns_new(int n_proc) {
if (socketpair(PF_UNIX, SOCK_DGRAM, 0, fd2) < 0)
goto fail;
+ fd_cloexec(fd1[0]);
+ fd_cloexec(fd1[1]);
+ fd_cloexec(fd2[0]);
+ fd_cloexec(fd2[1]);
+
if (n_proc > MAX_WORKERS)
n_proc = MAX_WORKERS;