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