]> code.delx.au - pulseaudio/commitdiff
core-util: introduce pa_fopen_cloexec()
authorLennart Poettering <lennart@poettering.net>
Fri, 30 Oct 2009 03:20:24 +0000 (04:20 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 30 Oct 2009 03:20:24 +0000 (04:20 +0100)
src/pulsecore/core-util.c
src/pulsecore/core-util.h

index a199daa38cdcbf0c9722f438786dad5d77c2b077..40da8f4206f7ac0a508c6aba11c7943bce4d00ea 100644 (file)
@@ -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;
 }
index 323fdcb466d3697efe64beb2f63fab7ed3aae29a..d50f79a2cdcc6941227d6dd8a304a8214f75f493 100644 (file)
@@ -263,5 +263,6 @@ int pa_open_cloexec(const char *fn, int flags, mode_t mode);
 int pa_socket_cloexec(int domain, int type, int protocol);
 int pa_pipe_cloexec(int pipefd[2]);
 int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
+FILE* pa_fopen_cloexec(const char *path, const char *mode);
 
 #endif