summaryrefslogtreecommitdiffstats
path: root/src/utils/lib/fileutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/lib/fileutils.c')
-rw-r--r--src/utils/lib/fileutils.c46
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;