t_fifos.c revision 1.4
1/*	$NetBSD: t_fifos.c,v 1.4 2010/06/04 08:39:40 jmmv Exp $	*/
2
3#include <sys/types.h>
4#include <sys/mount.h>
5
6#include <atf-c.h>
7#include <errno.h>
8#include <fcntl.h>
9#include <pthread.h>
10#include <stdio.h>
11#include <stdlib.h>
12#include <unistd.h>
13#include <string.h>
14
15#include <rump/rump.h>
16#include <rump/rump_syscalls.h>
17
18#include <ufs/ufs/ufsmount.h>
19
20#include "../../h_macros.h"
21
22ATF_TC_WITH_CLEANUP(fifos);
23ATF_TC_HEAD(fifos, tc)
24{
25	atf_tc_set_md_var(tc, "descr", "test fifo support in ffs");
26	atf_tc_set_md_var(tc, "timeout", "5");
27	atf_tc_set_md_var(tc, "use.fs", "true");
28}
29
30#define teststr1 "raving & drooling"
31#define teststr2 "haha, charade"
32
33static void *
34w1(void *arg)
35{
36	int fd;
37
38	fd = rump_sys_open("sheep", O_WRONLY);
39	if (fd == -1)
40		atf_tc_fail_errno("w1 open");
41	if (rump_sys_write(fd, teststr1, sizeof(teststr1)) != sizeof(teststr1))
42		atf_tc_fail_errno("w1 write");
43	rump_sys_close(fd);
44
45	return NULL;
46}
47
48static void *
49w2(void *arg)
50{
51	int fd;
52
53	fd = rump_sys_open("pigs", O_WRONLY);
54	if (fd == -1)
55		atf_tc_fail_errno("w2 open");
56	if (rump_sys_write(fd, teststr2, sizeof(teststr2)) != sizeof(teststr2))
57		atf_tc_fail_errno("w2 write");
58	rump_sys_close(fd);
59
60	return NULL;
61}
62
63static void *
64r1(void *arg)
65{
66	char buf[32];
67	int fd;
68
69	fd = rump_sys_open("sheep", O_RDONLY);
70	if (fd == -1)
71		atf_tc_fail_errno("r1 open");
72	if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr1))
73		atf_tc_fail_errno("r1 read");
74	rump_sys_close(fd);
75
76	if (strcmp(teststr1, buf) != 0)
77		atf_tc_fail("got invalid str, %s vs. %s", buf, teststr1);
78
79	return NULL;
80}
81
82static void *
83r2(void *arg)
84{
85	char buf[32];
86	int fd;
87
88	fd = rump_sys_open("pigs", O_RDONLY);
89	if (fd == -1)
90		atf_tc_fail_errno("r2 open");
91	if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr2))
92		atf_tc_fail_errno("r2 read");
93	rump_sys_close(fd);
94
95	if (strcmp(teststr2, buf) != 0)
96		atf_tc_fail("got invalid str, %s vs. %s", buf, teststr2);
97
98	return NULL;
99}
100
101#define IMGNAME "atf.img"
102
103const char *newfs = "newfs -F -s 10000 " IMGNAME;
104#define FAKEBLK "/dev/sp00ka"
105
106ATF_TC_BODY(fifos, tc)
107{
108	struct ufs_args args;
109	pthread_t ptw1, ptw2, ptr1, ptr2;
110
111	if (system(newfs) == -1)
112		atf_tc_fail_errno("newfs failed");
113
114	memset(&args, 0, sizeof(args));
115	args.fspec = __UNCONST(FAKEBLK);
116
117	rump_init();
118	if (rump_sys_mkdir("/animals", 0777) == -1)
119		atf_tc_fail_errno("cannot create mountpoint");
120	rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK);
121	if (rump_sys_mount(MOUNT_FFS, "/animals", 0, &args, sizeof(args))==-1)
122		atf_tc_fail_errno("rump_sys_mount failed");
123
124	/* create fifos */
125	if (rump_sys_chdir("/animals") == 1)
126		atf_tc_fail_errno("chdir");
127	if (rump_sys_mkfifo("pigs", S_IFIFO | 0777) == -1)
128		atf_tc_fail_errno("mknod1");
129	if (rump_sys_mkfifo("sheep", S_IFIFO | 0777) == -1)
130		atf_tc_fail_errno("mknod2");
131
132	pthread_create(&ptw1, NULL, w1, NULL);
133	pthread_create(&ptw2, NULL, w2, NULL);
134	pthread_create(&ptr1, NULL, r1, NULL);
135	pthread_create(&ptr2, NULL, r2, NULL);
136
137	pthread_join(ptw1, NULL);
138	pthread_join(ptw2, NULL);
139	pthread_join(ptr1, NULL);
140	pthread_join(ptr2, NULL);
141
142	if (rump_sys_chdir("/") == 1)
143		atf_tc_fail_errno("chdir");
144
145	if (rump_sys_unmount("/animals", 0) == -1)
146		atf_tc_fail_errno("unmount failed");
147}
148
149ATF_TC_CLEANUP(fifos, tc)
150{
151
152	unlink(IMGNAME);
153}
154
155ATF_TP_ADD_TCS(tp)
156{
157	ATF_TP_ADD_TC(tp, fifos);
158	return 0;
159}
160