aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2014-10-14 14:16:34 -0500
committerRob Landley <rob@landley.net>2014-10-14 14:16:34 -0500
commit784eb9c2d2cbd8ec49ff40dbaba17f4407f3b85a (patch)
tree56c9c74095322626deecff444d10f2d706a32306
parent1796626d9e7a4df3705ef83dbf278d248756692b (diff)
downloadtoybox-784eb9c2d2cbd8ec49ff40dbaba17f4407f3b85a.tar.gz
Use O_CLOEXEC instead of O_RDONLY to signal loopfiles_rw() to close filehandles.
-rw-r--r--lib/lib.c10
-rw-r--r--toys/other/truncate.c2
-rw-r--r--toys/posix/cmp.c2
3 files changed, 7 insertions, 7 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 7911315e..19d28d2b 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -421,8 +421,8 @@ void poke(void *ptr, uint64_t val, int size)
// flags is O_RDONLY, stdout otherwise. An empty argument list calls
// function() on just stdin/stdout.
//
-// Note: read only filehandles are automatically closed when function()
-// returns, but writeable filehandles must be close by function()
+// Note: pass O_CLOEXEC to automatically close filehandles when function()
+// returns, otherwise filehandles must be closed by function()
void loopfiles_rw(char **argv, int flags, int permissions, int failok,
void (*function)(int fd, char *name))
{
@@ -441,14 +441,14 @@ void loopfiles_rw(char **argv, int flags, int permissions, int failok,
continue;
}
function(fd, *argv);
- if (flags == O_RDONLY) close(fd);
+ if (flags & O_CLOEXEC) close(fd);
} while (*++argv);
}
-// Call loopfiles_rw with O_RDONLY and !failok (common case).
+// Call loopfiles_rw with O_RDONLY|O_CLOEXEC and !failok (common case).
void loopfiles(char **argv, void (*function)(int fd, char *name))
{
- loopfiles_rw(argv, O_RDONLY, 0, 0, function);
+ loopfiles_rw(argv, O_RDONLY|O_CLOEXEC, 0, 0, function);
}
// Slow, but small.
diff --git a/toys/other/truncate.c b/toys/other/truncate.c
index 123ae553..d09818f3 100644
--- a/toys/other/truncate.c
+++ b/toys/other/truncate.c
@@ -35,6 +35,6 @@ void truncate_main(void)
// Create files with mask rwrwrw.
// Nonexistent files are only an error if we're supposed to create them.
- loopfiles_rw(toys.optargs, O_WRONLY|(cr ? O_CREAT : 0), 0666, cr,
+ loopfiles_rw(toys.optargs, O_WRONLY|O_CLOEXEC|(cr ? O_CREAT : 0), 0666, cr,
do_truncate);
}
diff --git a/toys/posix/cmp.c b/toys/posix/cmp.c
index 13990d45..2dae1138 100644
--- a/toys/posix/cmp.c
+++ b/toys/posix/cmp.c
@@ -79,6 +79,6 @@ out:
void cmp_main(void)
{
- loopfiles_rw(toys.optargs, O_RDONLY, 0, toys.optflags&FLAG_s, do_cmp);
+ loopfiles_rw(toys.optargs, O_CLOEXEC, 0, toys.optflags&FLAG_s, do_cmp);
}