From: Lennart Poettering Date: Fri, 30 Oct 2009 03:20:24 +0000 (+0100) Subject: core-util: introduce pa_fopen_cloexec() X-Git-Tag: 1.0_branch~1151 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=752727a13d2d55439aefe618677f7e932acc9862;p=profile%2Fivi%2Fpulseaudio.git core-util: introduce pa_fopen_cloexec() --- diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index a199daa..40da8f4 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; } diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h index 323fdcb..d50f79a 100644 --- a/src/pulsecore/core-util.h +++ b/src/pulsecore/core-util.h @@ -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