Commit ad41b1e9 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

zdtm:fifo: check that read only fifo descriptor is restored

* Create fifo and two descriptors rw and ro
* Write data and close rw descriptor
* Suspend/resume
* Read data from ro descriptor
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 542abe80
...@@ -64,6 +64,7 @@ TST_FILE = \ ...@@ -64,6 +64,7 @@ TST_FILE = \
unlink_largefile \ unlink_largefile \
mtime_mmap \ mtime_mmap \
fifo \ fifo \
fifo_ro \
fifo_wronly \ fifo_wronly \
unlink_fifo \ unlink_fifo \
unlink_fifo_wronly \ unlink_fifo_wronly \
......
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "zdtmtst.h"
const char *test_doc = "Check that a fifo read-only descriptor is restored with data";
const char *test_author = "Andrew Vagin <avagin@openvz.org>";
char *filename;
TEST_OPTION(filename, string, "file name", 1);
#define BUF_SIZE (16 * 4096) /* A fifo buffer has 16 slots by default */
int main(int argc, char **argv)
{
int fd;
int fd_ro;
struct stat st;
mode_t mode = S_IFIFO | 0700;
uint8_t buf[BUF_SIZE];
uint32_t crc;
int ret;;
test_init(argc, argv);
if (mknod(filename, mode, 0)) {
err("can't make fifo \"%s\": %m\n", filename);
exit(1);
}
fd = open(filename, O_RDWR);
if (fd < 0) {
err("can't open %s: %m\n", filename);
return 1;
}
fd_ro = open(filename, O_RDONLY);
if (fd_ro < 0) {
err("can't open %s: %m\n", filename);
return 1;
}
crc = ~0;
datagen(buf, BUF_SIZE, &crc);
ret = write(fd, buf, BUF_SIZE);
if (ret != BUF_SIZE) {
err("write() failed\n");
return 1;
}
close(fd);
test_daemon();
test_waitsig();
ret = read(fd_ro, buf, BUF_SIZE);
if (ret != BUF_SIZE) {
err("read() failed\n");
return 1;
}
crc = ~0;
if (datachk(buf, BUF_SIZE, &crc)) {
fail("data corrupted\n");
return 1;
}
if (close(fd_ro) < 0) {
fail("can't close %s: %m", filename);
return 1;
}
if (stat(filename, &st) < 0) {
fail("can't stat %s: %m", filename);
return 1;
}
if (st.st_mode != mode) {
fail("%s is no longer the fifo we had", filename);
return 1;
}
if (unlink(filename) < 0) {
fail("can't unlink %s: %m", filename);
return 1;
}
pass();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment