diff options
| author | Lennart Poettering <lennart@poettering.net> | 2009-10-30 04:20:24 +0100 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2009-10-30 04:20:24 +0100 | 
| commit | 752727a13d2d55439aefe618677f7e932acc9862 (patch) | |
| tree | c1597e266c1dbc8d39493313b7e0b7084c906778 | |
| parent | a698ee3f52e9d61b378cb0dad2cfb1bcc31c708a (diff) | |
core-util: introduce pa_fopen_cloexec()
| -rw-r--r-- | src/pulsecore/core-util.c | 29 | ||||
| -rw-r--r-- | src/pulsecore/core-util.h | 1 | 
2 files changed, 28 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;  } diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h index 323fdcb4..d50f79a2 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  | 
