summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--execute.c53
-rw-r--r--util.c48
-rw-r--r--util.h2
3 files changed, 53 insertions, 50 deletions
diff --git a/execute.c b/execute.c
index 02f53dc485..31e1bdc252 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 4ae57bbd65..f3af9567cf 100644
--- a/util.c
+++ b/util.c
@@ -33,6 +33,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <dirent.h>
#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 772d7ae9ff..a1e79d47b1 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);