1*57718be8SEnji Cooper /* $NetBSD: t_basic.c,v 1.4 2010/07/19 15:35:39 pooka Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper #include <sys/types.h> 4*57718be8SEnji Cooper #include <sys/param.h> 5*57718be8SEnji Cooper #include <sys/mount.h> 6*57718be8SEnji Cooper 7*57718be8SEnji Cooper #include <atf-c.h> 8*57718be8SEnji Cooper #include <err.h> 9*57718be8SEnji Cooper #include <errno.h> 10*57718be8SEnji Cooper #include <fcntl.h> 11*57718be8SEnji Cooper #include <stdio.h> 12*57718be8SEnji Cooper #include <unistd.h> 13*57718be8SEnji Cooper #include <string.h> 14*57718be8SEnji Cooper #include <stdlib.h> 15*57718be8SEnji Cooper 16*57718be8SEnji Cooper #include <rump/rump.h> 17*57718be8SEnji Cooper #include <rump/rump_syscalls.h> 18*57718be8SEnji Cooper #include <rump/rumpvfs_if_pub.h> 19*57718be8SEnji Cooper 20*57718be8SEnji Cooper #include <fs/tmpfs/tmpfs_args.h> 21*57718be8SEnji Cooper #include <miscfs/umapfs/umap.h> 22*57718be8SEnji Cooper 23*57718be8SEnji Cooper #include "../../h_macros.h" 24*57718be8SEnji Cooper 25*57718be8SEnji Cooper ATF_TC(basic); 26*57718be8SEnji Cooper ATF_TC_HEAD(basic, tc) 27*57718be8SEnji Cooper { 28*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "basic umapfs mapping"); 29*57718be8SEnji Cooper } 30*57718be8SEnji Cooper 31*57718be8SEnji Cooper static void 32*57718be8SEnji Cooper xtouch(const char *path) 33*57718be8SEnji Cooper { 34*57718be8SEnji Cooper int fd; 35*57718be8SEnji Cooper 36*57718be8SEnji Cooper fd = rump_sys_open(path, O_CREAT | O_RDWR, 0777); 37*57718be8SEnji Cooper if (fd == -1) 38*57718be8SEnji Cooper atf_tc_fail_errno("create %s", path); 39*57718be8SEnji Cooper rump_sys_close(fd); 40*57718be8SEnji Cooper } 41*57718be8SEnji Cooper 42*57718be8SEnji Cooper static void 43*57718be8SEnji Cooper xchown(const char *path, uid_t uid, gid_t gid) 44*57718be8SEnji Cooper { 45*57718be8SEnji Cooper 46*57718be8SEnji Cooper if (rump_sys_chown(path, uid, gid) == -1) 47*57718be8SEnji Cooper atf_tc_fail_errno("chown %s failed", path); 48*57718be8SEnji Cooper } 49*57718be8SEnji Cooper 50*57718be8SEnji Cooper static void 51*57718be8SEnji Cooper testuidgid(const char *path, uid_t uid, gid_t gid) 52*57718be8SEnji Cooper { 53*57718be8SEnji Cooper struct stat sb; 54*57718be8SEnji Cooper 55*57718be8SEnji Cooper if (rump_sys_stat(path, &sb) == -1) 56*57718be8SEnji Cooper atf_tc_fail_errno("stat %s", path); 57*57718be8SEnji Cooper if (uid != (uid_t)-1) { 58*57718be8SEnji Cooper if (sb.st_uid != uid) 59*57718be8SEnji Cooper atf_tc_fail("%s: expected uid %d, got %d", 60*57718be8SEnji Cooper path, uid, sb.st_uid); 61*57718be8SEnji Cooper } 62*57718be8SEnji Cooper if (gid != (gid_t)-1) { 63*57718be8SEnji Cooper if (sb.st_gid != gid) 64*57718be8SEnji Cooper atf_tc_fail("%s: expected gid %d, got %d", 65*57718be8SEnji Cooper path, gid, sb.st_gid); 66*57718be8SEnji Cooper } 67*57718be8SEnji Cooper } 68*57718be8SEnji Cooper 69*57718be8SEnji Cooper ATF_TC_BODY(basic, tc) 70*57718be8SEnji Cooper { 71*57718be8SEnji Cooper struct umap_args umargs; 72*57718be8SEnji Cooper struct tmpfs_args targs; 73*57718be8SEnji Cooper u_long umaps[2][2]; 74*57718be8SEnji Cooper u_long gmaps[2][2]; 75*57718be8SEnji Cooper 76*57718be8SEnji Cooper rump_init(); 77*57718be8SEnji Cooper if (rump_sys_mkdir("/td1", 0777) == -1) 78*57718be8SEnji Cooper atf_tc_fail_errno("mp1"); 79*57718be8SEnji Cooper if (rump_sys_mkdir("/td2", 0777) == -1) 80*57718be8SEnji Cooper atf_tc_fail_errno("mp1"); 81*57718be8SEnji Cooper 82*57718be8SEnji Cooper /* use tmpfs because rumpfs doesn't support ownership */ 83*57718be8SEnji Cooper memset(&targs, 0, sizeof(targs)); 84*57718be8SEnji Cooper targs.ta_version = TMPFS_ARGS_VERSION; 85*57718be8SEnji Cooper targs.ta_root_mode = 0777; 86*57718be8SEnji Cooper if (rump_sys_mount(MOUNT_TMPFS, "/td1", 0, &targs, sizeof(targs)) == -1) 87*57718be8SEnji Cooper atf_tc_fail_errno("could not mount tmpfs td1"); 88*57718be8SEnji Cooper 89*57718be8SEnji Cooper memset(&umargs, 0, sizeof(umargs)); 90*57718be8SEnji Cooper 91*57718be8SEnji Cooper /* 92*57718be8SEnji Cooper * Map td1 uid 555 to td2 uid 777 (yes, IMHO the umapfs 93*57718be8SEnji Cooper * mapping format is counter-intuitive). 94*57718be8SEnji Cooper */ 95*57718be8SEnji Cooper umaps[0][0] = 777; 96*57718be8SEnji Cooper umaps[0][1] = 555; 97*57718be8SEnji Cooper umaps[1][0] = 0; 98*57718be8SEnji Cooper umaps[1][1] = 0; 99*57718be8SEnji Cooper gmaps[0][0] = 4321; 100*57718be8SEnji Cooper gmaps[0][1] = 1234; 101*57718be8SEnji Cooper gmaps[1][0] = 0; 102*57718be8SEnji Cooper gmaps[1][1] = 0; 103*57718be8SEnji Cooper 104*57718be8SEnji Cooper umargs.umap_target = __UNCONST("/td1"); 105*57718be8SEnji Cooper umargs.nentries = 2; 106*57718be8SEnji Cooper umargs.gnentries = 2; 107*57718be8SEnji Cooper umargs.mapdata = umaps; 108*57718be8SEnji Cooper umargs.gmapdata = gmaps; 109*57718be8SEnji Cooper 110*57718be8SEnji Cooper if (rump_sys_mount(MOUNT_UMAP, "/td2", 0, &umargs,sizeof(umargs)) == -1) 111*57718be8SEnji Cooper atf_tc_fail_errno("could not mount umapfs"); 112*57718be8SEnji Cooper 113*57718be8SEnji Cooper xtouch("/td1/noch"); 114*57718be8SEnji Cooper testuidgid("/td1/noch", 0, 0); 115*57718be8SEnji Cooper testuidgid("/td2/noch", 0, 0); 116*57718be8SEnji Cooper 117*57718be8SEnji Cooper xtouch("/td1/nomap"); 118*57718be8SEnji Cooper xchown("/td1/nomap", 1, 2); 119*57718be8SEnji Cooper testuidgid("/td1/nomap", 1, 2); 120*57718be8SEnji Cooper testuidgid("/td2/nomap", -1, -1); 121*57718be8SEnji Cooper 122*57718be8SEnji Cooper xtouch("/td1/forwmap"); 123*57718be8SEnji Cooper xchown("/td1/forwmap", 555, 1234); 124*57718be8SEnji Cooper testuidgid("/td1/forwmap", 555, 1234); 125*57718be8SEnji Cooper testuidgid("/td2/forwmap", 777, 4321); 126*57718be8SEnji Cooper 127*57718be8SEnji Cooper /* 128*57718be8SEnji Cooper * this *CANNOT* be correct??? 129*57718be8SEnji Cooper */ 130*57718be8SEnji Cooper xtouch("/td1/revmap"); 131*57718be8SEnji Cooper /* 132*57718be8SEnji Cooper * should be 777 / 4321 (?), but makes first test fail since 133*57718be8SEnji Cooper * it gets 777 / 4321, i.e. unmapped results. 134*57718be8SEnji Cooper */ 135*57718be8SEnji Cooper xchown("/td2/revmap", 555, 1234); 136*57718be8SEnji Cooper testuidgid("/td1/revmap", 555, 1234); 137*57718be8SEnji Cooper testuidgid("/td2/revmap", 777, 4321); 138*57718be8SEnji Cooper 139*57718be8SEnji Cooper } 140*57718be8SEnji Cooper 141*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 142*57718be8SEnji Cooper { 143*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, basic); 144*57718be8SEnji Cooper return 0; /*XXX?*/ 145*57718be8SEnji Cooper } 146