From 36c3c4172db847f51cdfd13238894b2549de6538 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Nov 24 2022 16:38:34 +0000 Subject: fd-util: add new fd_cloexec_many() helper (cherry picked from commit ed18c22c989495aab36512f03449222cfcf79aa7) --- diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index 6ed0444..66bb756 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -174,6 +174,25 @@ int fd_cloexec(int fd, bool cloexec) { return RET_NERRNO(fcntl(fd, F_SETFD, nflags)); } +int fd_cloexec_many(const int fds[], size_t n_fds, bool cloexec) { + int ret = 0, r; + + assert(n_fds == 0 || fds); + + for (size_t i = 0; i < n_fds; i++) { + if (fds[i] < 0) /* Skip gracefully over already invalidated fds */ + continue; + + r = fd_cloexec(fds[i], cloexec); + if (r < 0 && ret >= 0) /* Continue going, but return first error */ + ret = r; + else + ret = 1; /* report if we did anything */ + } + + return ret; +} + _pure_ static bool fd_in_set(int fd, const int fdset[], size_t n_fdset) { assert(n_fdset == 0 || fdset); diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h index d9896e2..29c7d86 100644 --- a/src/basic/fd-util.h +++ b/src/basic/fd-util.h @@ -56,6 +56,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(DIR*, closedir, NULL); int fd_nonblock(int fd, bool nonblock); int fd_cloexec(int fd, bool cloexec); +int fd_cloexec_many(const int fds[], size_t n_fds, bool cloexec); int get_max_fd(void);