mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
core-util: introduce FD_CLOEXEC wrappers for open/socket/pipe/accept
This commit is contained in:
parent
754644fa6e
commit
9c1a98953f
3 changed files with 86 additions and 1 deletions
|
|
@ -445,7 +445,7 @@ AC_CHECK_FUNCS_ONCE([lstat])
|
|||
|
||||
# Non-standard
|
||||
|
||||
AC_CHECK_FUNCS_ONCE([setresuid setresgid setreuid setregid seteuid setegid ppoll strsignal sig2str strtof_l])
|
||||
AC_CHECK_FUNCS_ONCE([setresuid setresgid setreuid setregid seteuid setegid ppoll strsignal sig2str strtof_l pipe2 accept4])
|
||||
|
||||
AC_FUNC_ALLOCA
|
||||
|
||||
|
|
|
|||
|
|
@ -2889,3 +2889,82 @@ const char *pa_get_temp_dir(void) {
|
|||
|
||||
return "/tmp";
|
||||
}
|
||||
|
||||
int pa_open_cloexec(const char *fn, int flags, mode_t mode) {
|
||||
int fd;
|
||||
|
||||
#ifdef O_NOCTTY
|
||||
flags |= O_NOCTTY;
|
||||
#endif
|
||||
|
||||
#ifdef O_CLOEXEC
|
||||
if ((fd = open(fn, flags|O_CLOEXEC, mode)) >= 0)
|
||||
return fd;
|
||||
|
||||
if (errno != EINVAL)
|
||||
return fd;
|
||||
#endif
|
||||
|
||||
if ((fd = open(fn, flags, mode)) < 0)
|
||||
return fd;
|
||||
|
||||
pa_make_fd_cloexec(fd);
|
||||
return fd;
|
||||
}
|
||||
|
||||
int pa_socket_cloexec(int domain, int type, int protocol) {
|
||||
int fd;
|
||||
|
||||
#ifdef SOCK_CLOEXEC
|
||||
if ((fd = socket(domain, type | SOCK_CLOEXEC, protocol)) >= 0)
|
||||
return fd;
|
||||
|
||||
if (errno != EINVAL)
|
||||
return fd;
|
||||
#endif
|
||||
|
||||
if ((fd = socket(domain, type, protocol)) < 0)
|
||||
return fd;
|
||||
|
||||
pa_make_fd_cloexec(fd);
|
||||
return fd;
|
||||
}
|
||||
|
||||
int pa_pipe_cloexec(int pipefd[2]) {
|
||||
int r;
|
||||
|
||||
#ifdef HAVE_PIPE2
|
||||
if ((r = pipe2(pipefd, O_CLOEXEC)) >= 0)
|
||||
return r;
|
||||
|
||||
if (errno != EINVAL && errno != ENOSYS)
|
||||
return r;
|
||||
#endif
|
||||
|
||||
if ((r = pipe(pipefd)) < 0)
|
||||
return r;
|
||||
|
||||
pa_make_fd_cloexec(pipefd[0]);
|
||||
pa_make_fd_cloexec(pipefd[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
|
||||
int fd;
|
||||
|
||||
#ifdef HAVE_ACCEPT4
|
||||
if ((fd = accept4(sockfd, addr, addrlen, SOCK_CLOEXEC)) >= 0)
|
||||
return fd;
|
||||
|
||||
if (errno != EINVAL && errno != ENOSYS)
|
||||
return fd;
|
||||
#endif
|
||||
|
||||
if ((fd = accept(sockfd, addr, addrlen)) < 0)
|
||||
return fd;
|
||||
|
||||
pa_make_fd_cloexec(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#ifdef HAVE_SYS_RESOURCE_H
|
||||
#include <sys/resource.h>
|
||||
|
|
@ -258,4 +259,9 @@ pa_bool_t pa_run_from_build_tree(void);
|
|||
|
||||
const char *pa_get_temp_dir(void);
|
||||
|
||||
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);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue