diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile index c4c0df732..444b6bbb6 100644 --- a/test/zdtm/live/static/Makefile +++ b/test/zdtm/live/static/Makefile @@ -225,6 +225,7 @@ TST_DIR = \ mnt_ext_master \ mntns_deleted \ binfmt_misc \ + unlink_regular00 \ TST_DIR_FILE = \ chroot \ diff --git a/test/zdtm/live/static/unlink_regular00.c b/test/zdtm/live/static/unlink_regular00.c new file mode 100644 index 000000000..6e97df2d1 --- /dev/null +++ b/test/zdtm/live/static/unlink_regular00.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zdtmtst.h" + +const char *test_doc = "Checkpointing/restore of unlinked file inside unlinked directory"; +const char *test_author = "Kirill Tkhai "; + +char *dirname; +TEST_OPTION(dirname, string, "directory name", 1); + +#define SUBDIR "subdir" +#define FNAME "testfile" +#define MSG "Hello!!!111" + +int main(int argc, char ** argv) +{ + char subdir[PATH_MAX], fname[PATH_MAX], lname[PATH_MAX]; + char buf[sizeof(MSG) + 1]; + int fd, ret = -1; + + test_init(argc, argv); + + memset(buf, 0, sizeof(buf)); + + if (mkdir(dirname, 0777)) { + fail("can't create %s", dirname); + exit(1); + } + + if (mount("none", dirname, "tmpfs", 0, "") < 0) { + fail("can't mount tmpfs to %s", dirname); + goto rm_topdir; + } + + sprintf(subdir, "%s/" SUBDIR, dirname); + + if (mkdir(subdir, 0777)) { + fail("can't create %s", subdir); + goto umount; + } + + sprintf(fname, "%s/" SUBDIR "/" FNAME, dirname); + sprintf(lname, "%s/" FNAME, dirname); + + fd = open(fname, O_RDWR | O_CREAT, 0644); + if (fd < 0) { + fail("can't open %s", fname); + rmdir(subdir); + goto umount; + } + + if (link(fname, lname) < 0) { + fail("can't link %s to %s", fname, lname); + unlink(fname); + rmdir(subdir); + goto umount; + } + + if (unlink(fname) || rmdir(subdir)) { + fail("can't unlink %s or %s", fname, subdir); + goto close_file; + } + + if (write(fd, MSG, sizeof(MSG)) != sizeof(MSG)) { + fail("can't write %s", fname); + goto close_file; + } + + test_daemon(); + test_waitsig(); + + if (lseek(fd, 0, SEEK_SET) != 0) { + fail("can't lseek %s", fname); + goto close_file; + } + + if (read(fd, buf, sizeof(MSG)) != sizeof(MSG)) { + fail("can't read %s", fname); + goto close_file; + } + + if (strcmp(buf, MSG)) { + fail("content differs: %s, %s, sizeof=%d", buf, MSG, sizeof(MSG)); + goto close_file; + } + + ret = 0; + pass(); + +close_file: + close(fd); + unlink(lname); +umount: + if (umount(dirname) < 0) + pr_err("Can't umount\n"); +rm_topdir: + if (rmdir(dirname) < 0) + pr_err("Can't rmdir()\n"); + + return ret; +} diff --git a/test/zdtm/live/static/unlink_regular00.desc b/test/zdtm/live/static/unlink_regular00.desc new file mode 100644 index 000000000..dfe829b84 --- /dev/null +++ b/test/zdtm/live/static/unlink_regular00.desc @@ -0,0 +1 @@ +{'flavor': 'ns', 'flags': 'suid'}