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