X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=execute.c;h=31e1bdc252b4bc8479a12f1037fc0eeef683f0e2;hb=0bc824be78848cdf12f19aff4144666dc4114858;hp=dd36038c4a98a743c084851084ad3def50d2bc39;hpb=8e27452380193a5f81bfd08a59aab8b07008ba0b;p=elogind.git diff --git a/execute.c b/execute.c index dd36038c4..31e1bdc25 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; @@ -137,6 +90,7 @@ static int shift_fds(int fds[], unsigned n_fds) { static int flags_fds(int fds[], unsigned n_fds, bool nonblock) { unsigned i; + int r; if (n_fds <= 0) return 0; @@ -146,27 +100,16 @@ static int flags_fds(int fds[], unsigned n_fds, bool nonblock) { /* Drops/Sets O_NONBLOCK and FD_CLOEXEC from the file flags */ for (i = 0; i < n_fds; i++) { - int flags; - - if ((flags = fcntl(fds[i], F_GETFL, 0)) < 0) - return -errno; - - if (nonblock) - flags |= O_NONBLOCK; - else - flags &= ~O_NONBLOCK; - if (fcntl(fds[i], F_SETFL, flags) < 0) - return -errno; + if ((r = fd_nonblock(fds[i], nonblock)) < 0) + return r; /* We unconditionally drop FD_CLOEXEC from the fds, * since after all we want to pass these fds to our * children */ - if ((flags = fcntl(fds[i], F_GETFD, 0)) < 0) - return -errno; - if (fcntl(fds[i], F_SETFD, flags &~FD_CLOEXEC) < 0) - return -errno; + if ((r = fd_cloexec(fds[i], false)) < 0) + return r; } return 0; @@ -663,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;