mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-02-04 17:47:03 +03:00
util: move close_all_fds() to util.c
This commit is contained in:
parent
2882c7eda0
commit
a0d40ac588
53
execute.c
53
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;
|
||||
|
48
util.c
48
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",
|
||||
|
2
util.h
2
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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user