]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/netbsd-tests/fs/union/t_pr.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / netbsd-tests / fs / union / t_pr.c
1 /*      $NetBSD: t_pr.c,v 1.8 2011/08/10 06:27:02 hannken Exp $ */
2
3 #include <sys/types.h>
4 #include <sys/mount.h>
5
6 #include <atf-c.h>
7 #include <err.h>
8 #include <errno.h>
9 #include <fcntl.h>
10 #include <stdio.h>
11 #include <unistd.h>
12 #include <string.h>
13 #include <stdlib.h>
14
15 #include <rump/rump.h>
16 #include <rump/rump_syscalls.h>
17
18 #include <miscfs/union/union.h>
19
20 #include "../../h_macros.h"
21
22 ATF_TC(multilayer);
23 ATF_TC_HEAD(multilayer, tc)
24 {
25         atf_tc_set_md_var(tc, "descr", "mount_union -b twice");
26 }
27
28 ATF_TC_BODY(multilayer, tc)
29 {
30         struct union_args unionargs;
31
32         rump_init();
33
34         if (rump_sys_mkdir("/Tunion", 0777) == -1)
35                 atf_tc_fail_errno("mkdir mp1");
36         if (rump_sys_mkdir("/Tunion2", 0777) == -1)
37                 atf_tc_fail_errno("mkdir mp2");
38         if (rump_sys_mkdir("/Tunion2/A", 0777) == -1)
39                 atf_tc_fail_errno("mkdir A");
40         if (rump_sys_mkdir("/Tunion2/B", 0777) == -1)
41                 atf_tc_fail_errno("mkdir B");
42
43         unionargs.target = __UNCONST("/Tunion2/A");
44         unionargs.mntflags = UNMNT_BELOW;
45
46         if (rump_sys_mount(MOUNT_UNION, "/Tunion", 0,
47             &unionargs, sizeof(unionargs)) == -1)
48                 atf_tc_fail_errno("union mount");
49
50         unionargs.target = __UNCONST("/Tunion2/B");
51         unionargs.mntflags = UNMNT_BELOW;
52
53         rump_sys_mount(MOUNT_UNION, "/Tunion", 0,&unionargs,sizeof(unionargs));
54 }
55
56 ATF_TC(devnull1);
57 ATF_TC_HEAD(devnull1, tc)
58 {
59         atf_tc_set_md_var(tc, "descr", "mount_union -b and "
60             "'echo x > /un/null'");
61 }
62
63 ATF_TC_BODY(devnull1, tc)
64 {
65         struct union_args unionargs;
66         int fd, res;
67
68         rump_init();
69
70         if (rump_sys_mkdir("/mp", 0777) == -1)
71                 atf_tc_fail_errno("mkdir mp");
72
73         unionargs.target = __UNCONST("/dev");
74         unionargs.mntflags = UNMNT_BELOW;
75
76         if (rump_sys_mount(MOUNT_UNION, "/mp", 0,
77             &unionargs, sizeof(unionargs)) == -1)
78                 atf_tc_fail_errno("union mount");
79
80         fd = rump_sys_open("/mp/null", O_WRONLY | O_CREAT | O_TRUNC);
81
82         if (fd == -1)
83                 atf_tc_fail_errno("open");
84
85         res = rump_sys_write(fd, &fd, sizeof(fd));
86         if (res != sizeof(fd))
87                 atf_tc_fail("write");
88 }
89
90 ATF_TC(devnull2);
91 ATF_TC_HEAD(devnull2, tc)
92 {
93         atf_tc_set_md_var(tc, "descr", "mount_union -b and "
94             "'echo x >> /un/null'");
95 }
96
97 ATF_TC_BODY(devnull2, tc)
98 {
99         struct union_args unionargs;
100         int fd, res;
101
102         rump_init();
103
104         if (rump_sys_mkdir("/mp", 0777) == -1)
105                 atf_tc_fail_errno("mkdir mp");
106
107         unionargs.target = __UNCONST("/dev");
108         unionargs.mntflags = UNMNT_BELOW;
109
110         if (rump_sys_mount(MOUNT_UNION, "/mp", 0,
111             &unionargs, sizeof(unionargs)) == -1)
112                 atf_tc_fail_errno("union mount");
113
114         fd = rump_sys_open("/mp/null", O_WRONLY | O_CREAT | O_APPEND);
115         if (fd == -1)
116                 atf_tc_fail_errno("open");
117
118         res = rump_sys_write(fd, &fd, sizeof(fd));
119         if (res != sizeof(fd))
120                 atf_tc_fail("write");
121 }
122
123 ATF_TP_ADD_TCS(tp)
124 {
125         ATF_TP_ADD_TC(tp, multilayer);
126         ATF_TP_ADD_TC(tp, devnull1);
127         ATF_TP_ADD_TC(tp, devnull2);
128
129         return atf_no_error();
130 }