diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-04-06 23:35:59 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-04-06 23:35:59 +0200 |
commit | a0d40ac588701010ea6a9366f6a874e83844858e (patch) | |
tree | c50229adee7a3dec87b966cb36c6f6a164a05c34 /util.c | |
parent | 2882c7eda072e218516df584d2489f996d01dcf6 (diff) |
util: move close_all_fds() to util.c
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -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", |