[Devel] [PATCH 05/10] cr_tests: Factor out close_all_fds()
Matt Helsley
matthltc at us.ibm.com
Mon Mar 15 16:01:01 PDT 2010
Signed-off-by: Matt Helsley <matthltc at us.ibm.com>
---
fileio/fileio1.c | 11 ++++-------
fileio/filelease1.c | 6 +-----
fileio/filelease2.c | 8 +-------
fileio/filelock1.c | 8 ++------
fileio/filelock2.c | 8 ++------
fileio/fsetown1.c | 8 ++------
libcrtest/common.c | 27 ++++++++++++++++++++++++++-
libcrtest/libcrtest.h | 1 +
8 files changed, 39 insertions(+), 38 deletions(-)
diff --git a/fileio/fileio1.c b/fileio/fileio1.c
index 9a25176..fbce118 100644
--- a/fileio/fileio1.c
+++ b/fileio/fileio1.c
@@ -9,6 +9,8 @@
#include <errno.h>
#include <string.h>
+extern void close_all_fds(void);
+
/*
* Create a 'test-input' input file.
*
@@ -244,9 +246,7 @@ enum test_mode {
int main(int argc, char *argv[])
{
- int c;
- int fd;
- int i;
+ int fd, c;
char *srcfile;
char *destfile;
enum test_mode mode;
@@ -273,10 +273,7 @@ int main(int argc, char *argv[])
* Cannot checkpoint process with open device files yet;
*/
printf("Closing stdio fds and writing messages to %s\n", log_fnam);
- for (i=0; i<100; i++) {
- if (i != fileno(logfp))
- close(i);
- }
+ close_all_fds();
/*
* Announce that we are now prepared for a checkpoint
diff --git a/fileio/filelease1.c b/fileio/filelease1.c
index a6731b8..4d5ce5c 100644
--- a/fileio/filelease1.c
+++ b/fileio/filelease1.c
@@ -218,11 +218,7 @@ int main(int argc, char *argv[])
printf("%s: Closing stdio fds and writing messages to %s\n",
argv[0], LOG_FILE);
-
- for (i=0; i<100; i++) {
- if (fileno(logfp) != i)
- close(i);
- }
+ close_all_fds();
setup_test_data();
event_fd1 = setup_notification();
diff --git a/fileio/filelease2.c b/fileio/filelease2.c
index bf18ad9..0e3ffe9 100644
--- a/fileio/filelease2.c
+++ b/fileio/filelease2.c
@@ -348,8 +348,6 @@ failed:
int main(int argc, char *argv[])
{
- int i;
-
if (test_done()) {
printf("Remove %s before running test\n", TEST_DONE);
do_exit(1);
@@ -363,11 +361,7 @@ int main(int argc, char *argv[])
printf("%s: Closing stdio fds and writing messages to %s\n",
argv[0], LOG_FILE);
-
- for (i=0; i<100; i++) {
- if (fileno(logfp) != i)
- close(i);
- }
+ close_all_fds();
setup_test_data();
event_fd1 = setup_notification();
diff --git a/fileio/filelock1.c b/fileio/filelock1.c
index 77060e9..248eb40 100644
--- a/fileio/filelock1.c
+++ b/fileio/filelock1.c
@@ -293,7 +293,7 @@ void usage(char *argv[])
int main(int argc, char *argv[])
{
- int i, c;
+ int c;
logfp = fopen(LOG_FILE, "w");
if (!logfp) {
@@ -316,11 +316,7 @@ int main(int argc, char *argv[])
printf("%s: Closing stdio fds and writing messages to %s\n",
argv[0], LOG_FILE);
-
- for (i=0; i<100; i++) {
- if (fileno(logfp) != i)
- close(i);
- }
+ close_all_fds();
setup_test_file();
event_fd1 = setup_notification();
diff --git a/fileio/filelock2.c b/fileio/filelock2.c
index 992aaee..e2e69ef 100644
--- a/fileio/filelock2.c
+++ b/fileio/filelock2.c
@@ -319,7 +319,7 @@ int create_child(int idx, void (*child_func)(int))
int main(int argc, char *argv[])
{
- int i, c;
+ int c;
logfp = fopen(LOG_FILE, "w");
if (!logfp) {
@@ -345,11 +345,7 @@ int main(int argc, char *argv[])
printf("%s: Closing stdio fds and writing messages to %s\n",
argv[0], LOG_FILE);
-
- for (i=0; i<100; i++) {
- if (fileno(logfp) != i)
- close(i);
- }
+ close_all_fds();
setup_test_file();
event_fd1 = setup_notification();
diff --git a/fileio/fsetown1.c b/fileio/fsetown1.c
index 57f9bb6..05ddcee 100644
--- a/fileio/fsetown1.c
+++ b/fileio/fsetown1.c
@@ -190,7 +190,7 @@ void usr1_handler(int sig)
int main(int argc, char *argv[])
{
- int i, rc;
+ int rc;
int pid;
if (test_done()) {
@@ -206,11 +206,7 @@ int main(int argc, char *argv[])
printf("%s: Closing stdio fds and writing messages to %s\n",
argv[0], LOG_FILE);
-
- for (i=0; i<100; i++) {
- if (fileno(logfp) != i)
- close(i);
- }
+ close_all_fds();
setup_test_data();
event_fd1 = setup_notification();
diff --git a/libcrtest/common.c b/libcrtest/common.c
index c496889..7672189 100644
--- a/libcrtest/common.c
+++ b/libcrtest/common.c
@@ -5,6 +5,7 @@
#include <errno.h>
#include <string.h>
#include <malloc.h>
+#include <dirent.h>
#include "libcrtest.h"
#include <sys/eventfd.h>
#include <sys/stat.h>
@@ -138,7 +139,7 @@ int do_wait(int num_children)
return 0;
}
-static void do_sync(FILE *fp)
+void do_sync(FILE *fp)
{
int rc;
@@ -148,6 +149,30 @@ static void do_sync(FILE *fp)
fprintf(logfp, "ERROR: fsync %s\n", strerror(errno));
}
+void close_all_fds(void)
+{
+ /* Close everything but stdin, stdout, and stderr */
+ DIR *proc_self_fd;
+ struct dirent *dent;
+
+ proc_self_fd = opendir("/proc/self/fd");
+ if (!proc_self_fd) {
+ perror("opendir");
+ do_exit(1);
+ }
+
+ while ((dent = readdir(proc_self_fd)) != NULL) {
+ int fd;
+
+ if (sscanf(dent->d_name, "%12d", &fd) != 1)
+ continue;
+ if ((logfp && fileno(logfp) == fd) || \
+ (dirfd(proc_self_fd) == fd))
+ continue;
+ close(fd);
+ }
+ closedir(proc_self_fd);
+}
/*
* Return 0 if data in srcfp matches data in destfp);
diff --git a/libcrtest/libcrtest.h b/libcrtest/libcrtest.h
index 9723c74..8e68261 100644
--- a/libcrtest/libcrtest.h
+++ b/libcrtest/libcrtest.h
@@ -15,6 +15,7 @@ struct record {
typedef unsigned long long u64;
+extern void close_all_fds(void);
extern void do_exit(int status);
extern int test_done(void);
extern int test_checkpoint_done();
--
1.6.3.3
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list