[CRIU] [PATCH] zdtm: check that process w/o file descriptors can be dumped and restored
Andrey Vagin
avagin at openvz.org
Mon Oct 27 02:19:21 PDT 2014
In addition it checks that criu closes all its descriptors
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
test/zdtm/live/static/Makefile | 1 +
test/zdtm/live/static/fd.c | 109 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 110 insertions(+)
create mode 100644 test/zdtm/live/static/fd.c
diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile
index e9cac39..0670ef1 100644
--- a/test/zdtm/live/static/Makefile
+++ b/test/zdtm/live/static/Makefile
@@ -115,6 +115,7 @@ TST_NOFILE = \
dumpable01 \
dumpable02 \
remap_dead_pid \
+ fd \
# jobctl00 \
TST_FILE = \
diff --git a/test/zdtm/live/static/fd.c b/test/zdtm/live/static/fd.c
new file mode 100644
index 0000000..12bda5f
--- /dev/null
+++ b/test/zdtm/live/static/fd.c
@@ -0,0 +1,109 @@
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <string.h>
+#include <sys/wait.h>
+
+#include "zdtmtst.h"
+#include "lock.h"
+
+const char *test_doc = "Check that criu closes up all its descriptors";
+const char *test_author = "Andrew Vagin <avagin at parallels.com>";
+
+int main(int argc, char **argv)
+{
+ struct dirent *de;
+ char pfd[PATH_MAX];
+ mutex_t *lock;
+ int status;
+ pid_t pid;
+ DIR *d;
+
+ test_init(argc, argv);
+
+ lock = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+ if (lock == MAP_FAILED)
+ return 1;
+
+ mutex_init(lock);
+ mutex_lock(lock);
+
+ pid = fork();
+ if (pid < 0) {
+ err("fork()");
+ return 1;
+ }
+
+ if (pid == 0) {
+
+ d = opendir("/proc/self/fd");
+ if (d == NULL)
+ return 1;
+
+ while ((de = readdir(d))) {
+ int fd;
+
+ if (de->d_name[0] == '.')
+ continue;
+
+ fd = atoi(de->d_name);
+ if (dirfd(d) == fd)
+ continue;
+ close(fd);
+ }
+
+ closedir(d);
+ mutex_unlock(lock);
+
+ test_waitsig();
+
+ return 0;
+ }
+
+ mutex_lock(lock);
+
+ test_daemon();
+ test_waitsig();
+
+ snprintf(pfd, sizeof(pfd), "/proc/%d/fd", pid);
+ d = opendir(pfd);
+ if (d == NULL)
+ return 2;
+
+ while ((de = readdir(d))) {
+ int ret;
+
+ if (de->d_name[0] == '.')
+ continue;
+
+ ret = readlinkat(dirfd(d), de->d_name, pfd, sizeof(pfd) - 1);
+ if (ret < 0) {
+ err("readlink");
+ ret = 0;
+ }
+ pfd[ret] = '\0';
+ fail("Unexpected fd: %s -> %s\n", de->d_name, pfd);
+ return 1;
+ }
+
+ closedir(d);
+ kill(pid, SIGTERM);
+
+ if (waitpid(pid, &status, 0) != pid) {
+ err("waitpid()");
+ return 1;
+ }
+
+ if (status != 0) {
+ fail("%d:%d:%d:%d", WIFEXITED(status), WEXITSTATUS(status),
+ WIFSIGNALED(status), WTERMSIG(status));
+ return 1;
+ }
+
+ pass();
+
+ return 0;
+}
--
1.9.3
More information about the CRIU
mailing list