diff options
Diffstat (limited to 'src/utils/lib/fileutils.c')
-rw-r--r-- | src/utils/lib/fileutils.c | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/src/utils/lib/fileutils.c b/src/utils/lib/fileutils.c index 9da906a..7a8fce2 100644 --- a/src/utils/lib/fileutils.c +++ b/src/utils/lib/fileutils.c @@ -110,7 +110,7 @@ unwind: /* * portable getdtablesize() */ -int get_fd_tabsize(void) +unsigned int get_fd_tabsize(void) { int m; @@ -129,18 +129,7 @@ int get_fd_tabsize(void) return m; } -static inline int in_set(int x, const int set[], size_t setsz) -{ - size_t i; - - for (i = 0; i < setsz; i++) { - if (set[i] == x) - return 1; - } - return 0; -} - -void close_all_fds(const int exclude[], size_t exsz) +void ul_close_all_fds(unsigned int first, unsigned int last) { struct dirent *d; DIR *dir; @@ -149,25 +138,29 @@ void close_all_fds(const int exclude[], size_t exsz) if (dir) { while ((d = xreaddir(dir))) { char *end; - int fd; + unsigned int fd; + int dfd; errno = 0; - fd = strtol(d->d_name, &end, 10); + fd = strtoul(d->d_name, &end, 10); if (errno || end == d->d_name || !end || *end) continue; - if (dirfd(dir) == fd) + dfd = dirfd(dir); + if (dfd < 0) + continue; + if ((unsigned int)dfd == fd) continue; - if (in_set(fd, exclude, exsz)) + if (fd < first || last < fd) continue; close(fd); } closedir(dir); } else { - int fd, tbsz = get_fd_tabsize(); + unsigned fd, tbsz = get_fd_tabsize(); for (fd = 0; fd < tbsz; fd++) { - if (!in_set(fd, exclude, exsz)) + if (first <= fd && fd <= last) close(fd); } } @@ -181,22 +174,23 @@ int main(int argc, char *argv[]) if (strcmp(argv[1], "--mkstemp") == 0) { FILE *f; - char *tmpname; + char *tmpname = NULL; + f = xfmkstemp(&tmpname, NULL, "test"); unlink(tmpname); free(tmpname); fclose(f); } else if (strcmp(argv[1], "--close-fds") == 0) { - static const int wanted_fds[] = { - STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO - }; - ignore_result( dup(STDIN_FILENO) ); ignore_result( dup(STDIN_FILENO) ); ignore_result( dup(STDIN_FILENO) ); - close_all_fds(wanted_fds, ARRAY_SIZE(wanted_fds)); +# ifdef HAVE_CLOSE_RANGE + if (close_range(STDERR_FILENO + 1, ~0U, 0) < 0) +# endif + ul_close_all_fds(STDERR_FILENO + 1, ~0U); + } else if (strcmp(argv[1], "--copy-file") == 0) { int ret = ul_copy_file(STDIN_FILENO, STDOUT_FILENO); if (ret == UL_COPY_READ_ERROR) @@ -209,7 +203,7 @@ int main(int argc, char *argv[]) #endif -int mkdir_p(const char *path, mode_t mode) +int ul_mkdir_p(const char *path, mode_t mode) { char *p, *dir; int rc = 0; |