summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-04-06 23:35:59 +0200
committerLennart Poettering <lennart@poettering.net>2010-04-06 23:35:59 +0200
commita0d40ac588701010ea6a9366f6a874e83844858e (patch)
treec50229adee7a3dec87b966cb36c6f6a164a05c34 /util.c
parent2882c7eda072e218516df584d2489f996d01dcf6 (diff)
util: move close_all_fds() to util.c
Diffstat (limited to 'util.c')
-rw-r--r--util.c48
1 files changed, 48 insertions, 0 deletions
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",