t_fifos.c revision 1.2 1 /* $NetBSD: t_fifos.c,v 1.2 2010/05/01 10:46:29 pooka 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 /* for debugging */
21 #define USE_ATF
22
23 #ifdef USE_ATF
24 #include "../../h_macros.h"
25
26 ATF_TC_WITH_CLEANUP(fifos);
27 ATF_TC_HEAD(fifos, tc)
28 {
29 atf_tc_set_md_var(tc, "descr", "test fifo support in ffs");
30 atf_tc_set_md_var(tc, "timeout", "5");
31 }
32 #else
33 #include <err.h>
34 #define atf_tc_fail_errno(a) err(1, a)
35 #define atf_tc_fail(...) err(1, __VA_ARGS__)
36 #endif
37
38 #define teststr1 "raving & drooling"
39 #define teststr2 "haha, charade"
40
41 static void *
42 w1(void *arg)
43 {
44 int fd;
45
46 fd = rump_sys_open("sheep", O_WRONLY);
47 if (fd == -1)
48 atf_tc_fail_errno("w1 open");
49 if (rump_sys_write(fd, teststr1, sizeof(teststr1)) != sizeof(teststr1))
50 atf_tc_fail_errno("w1 write");
51 rump_sys_close(fd);
52
53 return NULL;
54 }
55
56 static void *
57 w2(void *arg)
58 {
59 int fd;
60
61 fd = rump_sys_open("pigs", O_WRONLY);
62 if (fd == -1)
63 atf_tc_fail_errno("w2 open");
64 if (rump_sys_write(fd, teststr2, sizeof(teststr2)) != sizeof(teststr2))
65 atf_tc_fail_errno("w2 write");
66 rump_sys_close(fd);
67
68 return NULL;
69 }
70
71 static void *
72 r1(void *arg)
73 {
74 char buf[32];
75 int fd;
76
77 fd = rump_sys_open("sheep", O_RDONLY);
78 if (fd == -1)
79 atf_tc_fail_errno("r1 open");
80 if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr1))
81 atf_tc_fail_errno("r1 read");
82 rump_sys_close(fd);
83
84 if (strcmp(teststr1, buf) != 0)
85 atf_tc_fail("got invalid str, %s vs. %s", buf, teststr1);
86
87 return NULL;
88 }
89
90 static void *
91 r2(void *arg)
92 {
93 char buf[32];
94 int fd;
95
96 fd = rump_sys_open("pigs", O_RDONLY);
97 if (fd == -1)
98 atf_tc_fail_errno("r2 open");
99 if (rump_sys_read(fd, buf, sizeof(buf)) != sizeof(teststr2))
100 atf_tc_fail_errno("r2 read");
101 rump_sys_close(fd);
102
103 if (strcmp(teststr2, buf) != 0)
104 atf_tc_fail("got invalid str, %s vs. %s", buf, teststr2);
105
106 return NULL;
107 }
108
109 #define IMGNAME "atf.img"
110
111 const char *newfs = "newfs -F -s 10000 " IMGNAME;
112 #define FAKEBLK "/dev/sp00ka"
113
114 #ifdef USE_ATF
115 ATF_TC_BODY(fifos, tc)
116 #else
117 int main(int argc, char *argv[])
118 #endif
119 {
120 struct ufs_args args;
121 pthread_t ptw1, ptw2, ptr1, ptr2;
122
123 if (system(newfs) == -1)
124 atf_tc_fail_errno("newfs failed");
125
126 memset(&args, 0, sizeof(args));
127 args.fspec = __UNCONST(FAKEBLK);
128
129 rump_init();
130 if (rump_sys_mkdir("/animals", 0777) == -1)
131 atf_tc_fail_errno("cannot create mountpoint");
132 rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK);
133 if (rump_sys_mount(MOUNT_FFS, "/animals", 0, &args, sizeof(args))==-1)
134 atf_tc_fail_errno("rump_sys_mount failed");
135
136 /* create fifos */
137 if (rump_sys_chdir("/animals") == 1)
138 atf_tc_fail_errno("chdir");
139 if (rump_sys_mkfifo("pigs", S_IFIFO | 0777) == -1)
140 atf_tc_fail_errno("mknod1");
141 if (rump_sys_mkfifo("sheep", S_IFIFO | 0777) == -1)
142 atf_tc_fail_errno("mknod2");
143
144 pthread_create(&ptw1, NULL, w1, NULL);
145 pthread_create(&ptw2, NULL, w2, NULL);
146 pthread_create(&ptr1, NULL, r1, NULL);
147 pthread_create(&ptr2, NULL, r2, NULL);
148
149 pthread_join(ptw1, NULL);
150 pthread_join(ptw2, NULL);
151 pthread_join(ptr1, NULL);
152 pthread_join(ptr2, NULL);
153
154 if (rump_sys_chdir("/") == 1)
155 atf_tc_fail_errno("chdir");
156
157 if (rump_sys_unmount("/animals", 0) == -1)
158 atf_tc_fail_errno("unmount failed");
159 }
160
161 #ifdef USE_ATF
162 ATF_TC_CLEANUP(fifos, tc)
163 {
164
165 unlink(IMGNAME);
166 }
167
168 ATF_TP_ADD_TCS(tp)
169 {
170 ATF_TP_ADD_TC(tp, fifos);
171 return 0;
172 }
173 #endif
174