Commit a0d40ac5 authored by Lennart Poettering's avatar Lennart Poettering
Browse files

util: move close_all_fds() to util.c

parent 2882c7ed
......@@ -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;
......
......@@ -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",
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment