From a0d40ac588701010ea6a9366f6a874e83844858e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 6 Apr 2010 23:35:59 +0200 Subject: [PATCH] util: move close_all_fds() to util.c --- execute.c | 53 +++-------------------------------------------------- util.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ util.h | 2 ++ 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/execute.c b/execute.c index 02f53dc48..31e1bdc25 100644 --- a/execute.c +++ b/execute.c @@ -44,61 +44,14 @@ #include "securebits.h" #include "cgroup.h" -static int close_fds(int except[], unsigned n_except) { - DIR *d; - struct dirent *de; - int r = 0; - - /* Modifies the fds array! (sorts it) */ - - if (!(d = opendir("/proc/self/fd"))) - return -errno; - - while ((de = readdir(d))) { - int fd; - - if (de->d_name[0] == '.') - continue; - - if ((r = safe_atoi(de->d_name, &fd)) < 0) - goto finish; - - if (fd < 3) - continue; - - if (fd == dirfd(d)) - continue; - - if (except) { - bool found; - unsigned i; - - found = false; - for (i = 0; i < n_except; i++) - if (except[i] == fd) { - found = true; - break; - } - - if (found) - continue; - } - - if ((r = close_nointr(fd)) < 0) - goto finish; - } - -finish: - closedir(d); - return r; -} - static int shift_fds(int fds[], unsigned n_fds) { int start, restart_from; if (n_fds <= 0) return 0; + /* Modifies the fds array! (sorts it) */ + assert(fds); start = 0; @@ -653,7 +606,7 @@ int exec_spawn(const ExecCommand *command, free(d); } - if (close_fds(fds, n_fds) < 0 || + if (close_all_fds(fds, n_fds) < 0 || shift_fds(fds, n_fds) < 0 || flags_fds(fds, n_fds, context->non_blocking) < 0) { r = EXIT_FDS; diff --git a/util.c b/util.c index 4ae57bbd6..f3af9567c 100644 --- a/util.c +++ b/util.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "macro.h" #include "util.h" @@ -1123,6 +1124,53 @@ int fd_cloexec(int fd, bool cloexec) { return 0; } +int close_all_fds(const int except[], unsigned n_except) { + DIR *d; + struct dirent *de; + int r = 0; + + if (!(d = opendir("/proc/self/fd"))) + return -errno; + + while ((de = readdir(d))) { + int fd; + + if (de->d_name[0] == '.') + continue; + + if ((r = safe_atoi(de->d_name, &fd)) < 0) + goto finish; + + if (fd < 3) + continue; + + if (fd == dirfd(d)) + continue; + + if (except) { + bool found; + unsigned i; + + found = false; + for (i = 0; i < n_except; i++) + if (except[i] == fd) { + found = true; + break; + } + + if (found) + continue; + } + + if ((r = close_nointr(fd)) < 0) + goto finish; + } + +finish: + closedir(d); + return r; +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime", diff --git a/util.h b/util.h index 772d7ae9f..a1e79d47b 100644 --- a/util.h +++ b/util.h @@ -175,6 +175,8 @@ bool ignore_file(const char *filename); int fd_nonblock(int fd, bool nonblock); int fd_cloexec(int fd, bool cloexec); +int close_all_fds(const int except[], unsigned n_except); + const char *ioprio_class_to_string(int i); int ioprio_class_from_string(const char *s); -- 2.30.2