mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-12-15 08:56:34 -05: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
|
# 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
|
AC_FUNC_ALLOCA
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2889,3 +2889,82 @@ const char *pa_get_temp_dir(void) {
|
||||||
|
|
||||||
return "/tmp";
|
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 <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
#ifdef HAVE_SYS_RESOURCE_H
|
#ifdef HAVE_SYS_RESOURCE_H
|
||||||
#include <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);
|
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
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue