summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/core-util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2009-10-30 04:20:24 +0100
committerLennart Poettering <lennart@poettering.net>2009-10-30 04:20:24 +0100
commit752727a13d2d55439aefe618677f7e932acc9862 (patch)
treec1597e266c1dbc8d39493313b7e0b7084c906778 /src/pulsecore/core-util.c
parenta698ee3f52e9d61b378cb0dad2cfb1bcc31c708a (diff)
core-util: introduce pa_fopen_cloexec()
Diffstat (limited to 'src/pulsecore/core-util.c')
-rw-r--r--src/pulsecore/core-util.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index a199daa3..40da8f42 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2961,7 +2961,7 @@ int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
#ifdef HAVE_ACCEPT4
if ((fd = accept4(sockfd, addr, addrlen, SOCK_CLOEXEC)) >= 0)
- return fd;
+ goto finish;
if (errno != EINVAL && errno != ENOSYS)
return fd;
@@ -2970,7 +2970,32 @@ int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
if ((fd = accept(sockfd, addr, addrlen)) < 0)
return fd;
+finish:
pa_make_fd_cloexec(fd);
+ return fd;
+}
- return 0;
+FILE* pa_fopen_cloexec(const char *path, const char *mode) {
+ FILE *f;
+ char *m;
+
+ m = pa_sprintf_malloc("%se", mode);
+
+ errno = 0;
+ if ((f = fopen(path, m))) {
+ pa_xfree(m);
+ goto finish;
+ }
+
+ pa_xfree(m);
+
+ if (errno != EINVAL)
+ return NULL;
+
+ if (!(f = fopen(path, mode)))
+ return NULL;
+
+finish:
+ pa_make_fd_cloexec(fileno(f));
+ return f;
}