mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-20 16:51:37 +00:00
Move static and transition into zdtm top. We can't move all the micro tests themselves, as we need to distinguish static from non static (zdtm.py makes additional checks on static ones). Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
117 lines
2 KiB
C
117 lines
2 KiB
C
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/wait.h>
|
|
#include <fcntl.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
|
|
#include "zdtmtst.h"
|
|
#define OFFSET 1000
|
|
#define OFFSET2 500
|
|
|
|
const char *test_doc = "Check shared struct file-s";
|
|
const char *test_author = "Andrey Vagin <avagin@openvz.org>";
|
|
|
|
char *filename;
|
|
TEST_OPTION(filename, string, "file name", 1);
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
pid_t pid;
|
|
int fd, fd2, fd3, ret, status;
|
|
off_t off;
|
|
|
|
test_init(argc, argv);
|
|
|
|
fd = open(filename, O_RDWR | O_CREAT, 0644);
|
|
if (fd == -1)
|
|
return 1;
|
|
|
|
fd2 = dup(fd);
|
|
if (fd < 0)
|
|
return 1;
|
|
|
|
fd3 = open(filename, O_RDWR | O_CREAT, 0644);
|
|
if (fd3 == -1)
|
|
return 1;
|
|
|
|
pid = test_fork();
|
|
|
|
if (pid == -1)
|
|
return 1;
|
|
else if (pid) {
|
|
fcntl(fd2, F_SETFD, 1);
|
|
|
|
test_daemon();
|
|
test_waitsig();
|
|
off = lseek(fd, OFFSET, SEEK_SET);
|
|
if (off == (off_t) -1)
|
|
return 1;
|
|
|
|
off = lseek(fd3, OFFSET2, SEEK_SET);
|
|
if (off == (off_t) -1)
|
|
return 1;
|
|
|
|
ret = kill(pid, SIGTERM);
|
|
if (ret == -1) {
|
|
pr_perror("kill() failed");
|
|
}
|
|
|
|
ret = wait(&status);
|
|
if (ret == -1) {
|
|
pr_perror("wait() failed");
|
|
return 1;
|
|
}
|
|
|
|
if (!WIFEXITED(status) || WEXITSTATUS(status)) {
|
|
fail("Child exited with non-zero status");
|
|
return 1;
|
|
}
|
|
off = lseek(fd2, 0, SEEK_CUR);
|
|
if (off != OFFSET) {
|
|
fail("offset1 fail\n");
|
|
return 1;
|
|
}
|
|
off = lseek(fd3, 0, SEEK_CUR);
|
|
if (off != OFFSET2) {
|
|
fail("offset2 fail\n");
|
|
return 1;
|
|
}
|
|
|
|
ret = fcntl(fd, F_GETFD, 0);
|
|
if (ret != 0) {
|
|
fail("fd cloexec broken\n");
|
|
return 1;
|
|
}
|
|
|
|
ret = fcntl(fd2, F_GETFD, 0);
|
|
if (ret != 1) {
|
|
fail("fd2 cloexec broken\n");
|
|
return 1;
|
|
}
|
|
|
|
} else {
|
|
test_waitsig();
|
|
off = lseek(fd, 0, SEEK_CUR);
|
|
if (off != OFFSET) {
|
|
fail("offset3 fail\n");
|
|
return 1;
|
|
}
|
|
off = lseek(fd2, 0, SEEK_CUR);
|
|
if (off != OFFSET) {
|
|
fail("offset4 fail\n");
|
|
return 1;
|
|
}
|
|
off = lseek(fd3, 0, SEEK_CUR);
|
|
if (off != OFFSET2) {
|
|
fail("offset5 fail\n");
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
pass();
|
|
|
|
return 0;
|
|
}
|