1314818Sngie/*	$NetBSD: t_fifos.c,v 1.6 2017/01/13 21:30:39 christos Exp $	*/
2272343Sngie
3272343Sngie#include <sys/types.h>
4272343Sngie#include <sys/mount.h>
5272343Sngie
6272343Sngie#include <atf-c.h>
7272343Sngie#include <errno.h>
8272343Sngie#include <fcntl.h>
9272343Sngie#include <pthread.h>
10272343Sngie#include <stdio.h>
11272343Sngie#include <stdlib.h>
12272343Sngie#include <unistd.h>
13272343Sngie#include <string.h>
14272343Sngie
15272343Sngie#include <rump/rump.h>
16272343Sngie#include <rump/rump_syscalls.h>
17272343Sngie
18272343Sngie#include <ufs/ufs/ufsmount.h>
19272343Sngie
20314818Sngie#include "h_macros.h"
21272343Sngie
22272343SngieATF_TC_WITH_CLEANUP(fifos);
23272343SngieATF_TC_HEAD(fifos, tc)
24272343Sngie{
25272343Sngie	atf_tc_set_md_var(tc, "descr", "test fifo support in ffs");
26272343Sngie	atf_tc_set_md_var(tc, "timeout", "5");
27272343Sngie}
28272343Sngie
29272343Sngie#define teststr1 "raving & drooling"
30272343Sngie#define teststr2 "haha, charade"
31272343Sngie
32272343Sngiestatic void *
33272343Sngiew1(void *arg)
34272343Sngie{
35272343Sngie	int fd;
36272343Sngie
37272343Sngie	fd = rump_sys_open("sheep", O_WRONLY);
38272343Sngie	if (fd == -1)
39272343Sngie		atf_tc_fail_errno("w1 open");
40272343Sngie	if (rump_sys_write(fd, teststr1, sizeof(teststr1)) != sizeof(teststr1))
41272343Sngie		atf_tc_fail_errno("w1 write");
42272343Sngie	rump_sys_close(fd);
43272343Sngie
44272343Sngie	return NULL;
45272343Sngie}
46272343Sngie
47272343Sngiestatic void *
48272343Sngiew2(void *arg)
49272343Sngie{
50272343Sngie	int fd;
51272343Sngie
52272343Sngie	fd = rump_sys_open("pigs", O_WRONLY);
53272343Sngie	if (fd == -1)
54272343Sngie		atf_tc_fail_errno("w2 open");
55272343Sngie	if (rump_sys_write(fd, teststr2, sizeof(teststr2)) != sizeof(teststr2))
56272343Sngie		atf_tc_fail_errno("w2 write");
57272343Sngie	rump_sys_close(fd);
58272343Sngie
59272343Sngie	return NULL;
60272343Sngie}
61272343Sngie
62272343Sngiestatic void *
63272343Sngier1(void *arg)
64272343Sngie{
65272343Sngie	char buf[32];
66272343Sngie	int fd;
67272343Sngie
68272343Sngie	fd = rump_sys_open("sheep", O_RDONLY);
69272343Sngie	if (fd == -1)
70272343Sngie		atf_tc_fail_errno("r1 open");
71272343Sngie	if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr1))
72272343Sngie		atf_tc_fail_errno("r1 read");
73272343Sngie	rump_sys_close(fd);
74272343Sngie
75272343Sngie	if (strcmp(teststr1, buf) != 0)
76272343Sngie		atf_tc_fail("got invalid str, %s vs. %s", buf, teststr1);
77272343Sngie
78272343Sngie	return NULL;
79272343Sngie}
80272343Sngie
81272343Sngiestatic void *
82272343Sngier2(void *arg)
83272343Sngie{
84272343Sngie	char buf[32];
85272343Sngie	int fd;
86272343Sngie
87272343Sngie	fd = rump_sys_open("pigs", O_RDONLY);
88272343Sngie	if (fd == -1)
89272343Sngie		atf_tc_fail_errno("r2 open");
90272343Sngie	if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr2))
91272343Sngie		atf_tc_fail_errno("r2 read");
92272343Sngie	rump_sys_close(fd);
93272343Sngie
94272343Sngie	if (strcmp(teststr2, buf) != 0)
95272343Sngie		atf_tc_fail("got invalid str, %s vs. %s", buf, teststr2);
96272343Sngie
97272343Sngie	return NULL;
98272343Sngie}
99272343Sngie
100272343Sngie#define IMGNAME "atf.img"
101272343Sngie
102272343Sngieconst char *newfs = "newfs -F -s 10000 " IMGNAME;
103272343Sngie#define FAKEBLK "/dev/sp00ka"
104272343Sngie
105272343SngieATF_TC_BODY(fifos, tc)
106272343Sngie{
107272343Sngie	struct ufs_args args;
108272343Sngie	pthread_t ptw1, ptw2, ptr1, ptr2;
109272343Sngie
110272343Sngie	if (system(newfs) == -1)
111272343Sngie		atf_tc_fail_errno("newfs failed");
112272343Sngie
113272343Sngie	memset(&args, 0, sizeof(args));
114272343Sngie	args.fspec = __UNCONST(FAKEBLK);
115272343Sngie
116272343Sngie	rump_init();
117272343Sngie	if (rump_sys_mkdir("/animals", 0777) == -1)
118272343Sngie		atf_tc_fail_errno("cannot create mountpoint");
119272343Sngie	rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK);
120272343Sngie	if (rump_sys_mount(MOUNT_FFS, "/animals", 0, &args, sizeof(args))==-1)
121272343Sngie		atf_tc_fail_errno("rump_sys_mount failed");
122272343Sngie
123272343Sngie	/* create fifos */
124272343Sngie	if (rump_sys_chdir("/animals") == 1)
125272343Sngie		atf_tc_fail_errno("chdir");
126272343Sngie	if (rump_sys_mkfifo("pigs", S_IFIFO | 0777) == -1)
127272343Sngie		atf_tc_fail_errno("mknod1");
128272343Sngie	if (rump_sys_mkfifo("sheep", S_IFIFO | 0777) == -1)
129272343Sngie		atf_tc_fail_errno("mknod2");
130272343Sngie
131272343Sngie	pthread_create(&ptw1, NULL, w1, NULL);
132272343Sngie	pthread_create(&ptw2, NULL, w2, NULL);
133272343Sngie	pthread_create(&ptr1, NULL, r1, NULL);
134272343Sngie	pthread_create(&ptr2, NULL, r2, NULL);
135272343Sngie
136272343Sngie	pthread_join(ptw1, NULL);
137272343Sngie	pthread_join(ptw2, NULL);
138272343Sngie	pthread_join(ptr1, NULL);
139272343Sngie	pthread_join(ptr2, NULL);
140272343Sngie
141272343Sngie	if (rump_sys_chdir("/") == 1)
142272343Sngie		atf_tc_fail_errno("chdir");
143272343Sngie
144272343Sngie	if (rump_sys_unmount("/animals", 0) == -1)
145272343Sngie		atf_tc_fail_errno("unmount failed");
146272343Sngie}
147272343Sngie
148272343SngieATF_TC_CLEANUP(fifos, tc)
149272343Sngie{
150272343Sngie
151272343Sngie	unlink(IMGNAME);
152272343Sngie}
153272343Sngie
154272343SngieATF_TP_ADD_TCS(tp)
155272343Sngie{
156272343Sngie	ATF_TP_ADD_TC(tp, fifos);
157272343Sngie	return 0;
158272343Sngie}
159