1*63d1fd59SEnji Cooper /* $NetBSD: h_quota2_tests.c,v 1.5 2017/01/13 21:30:39 christos Exp $ */ 257718be8SEnji Cooper 357718be8SEnji Cooper /* 457718be8SEnji Cooper * rump server for advanced quota tests 557718be8SEnji Cooper * this one includes functions to run against the filesystem before 657718be8SEnji Cooper * starting to handle rump requests from clients. 757718be8SEnji Cooper */ 857718be8SEnji Cooper 957718be8SEnji Cooper #include "../common/h_fsmacros.h" 1057718be8SEnji Cooper 1157718be8SEnji Cooper #include <err.h> 1257718be8SEnji Cooper #include <semaphore.h> 1357718be8SEnji Cooper #include <sys/types.h> 1457718be8SEnji Cooper #include <sys/mount.h> 1557718be8SEnji Cooper 1657718be8SEnji Cooper #include <stdlib.h> 1757718be8SEnji Cooper #include <unistd.h> 1857718be8SEnji Cooper 1957718be8SEnji Cooper #include <ufs/ufs/ufsmount.h> 2057718be8SEnji Cooper #include <dev/fssvar.h> 2157718be8SEnji Cooper 2257718be8SEnji Cooper #include <rump/rump.h> 2357718be8SEnji Cooper #include <rump/rump_syscalls.h> 2457718be8SEnji Cooper 25*63d1fd59SEnji Cooper #include "h_macros.h" 2657718be8SEnji Cooper 2757718be8SEnji Cooper int background = 0; 2857718be8SEnji Cooper 2957718be8SEnji Cooper #define TEST_NONROOT_ID 1 3057718be8SEnji Cooper 3157718be8SEnji Cooper static int 3257718be8SEnji Cooper quota_test0(const char *testopts) 3357718be8SEnji Cooper { 3457718be8SEnji Cooper static char buf[512]; 3557718be8SEnji Cooper int fd; 3657718be8SEnji Cooper int error; 3757718be8SEnji Cooper unsigned int i; 3857718be8SEnji Cooper int chowner = 1; 3957718be8SEnji Cooper for (i =0; testopts && i < strlen(testopts); i++) { 4057718be8SEnji Cooper switch(testopts[i]) { 4157718be8SEnji Cooper case 'C': 4257718be8SEnji Cooper chowner = 0; 4357718be8SEnji Cooper break; 4457718be8SEnji Cooper default: 4557718be8SEnji Cooper errx(1, "test4: unknown option %c", testopts[i]); 4657718be8SEnji Cooper } 4757718be8SEnji Cooper } 4857718be8SEnji Cooper if (chowner) 4957718be8SEnji Cooper rump_sys_chown(".", TEST_NONROOT_ID, TEST_NONROOT_ID); 5057718be8SEnji Cooper rump_sys_chmod(".", 0777); 5157718be8SEnji Cooper if (rump_sys_setegid(TEST_NONROOT_ID) != 0) { 5257718be8SEnji Cooper error = errno; 5357718be8SEnji Cooper warn("rump_sys_setegid"); 5457718be8SEnji Cooper return error; 5557718be8SEnji Cooper } 5657718be8SEnji Cooper if (rump_sys_seteuid(TEST_NONROOT_ID) != 0) { 5757718be8SEnji Cooper error = errno; 5857718be8SEnji Cooper warn("rump_sys_seteuid"); 5957718be8SEnji Cooper return error; 6057718be8SEnji Cooper } 6157718be8SEnji Cooper fd = rump_sys_open("test_fillup", O_CREAT | O_RDWR, 0644); 6257718be8SEnji Cooper if (fd < 0) { 6357718be8SEnji Cooper error = errno; 6457718be8SEnji Cooper warn("rump_sys_open"); 6557718be8SEnji Cooper } else { 6657718be8SEnji Cooper while (rump_sys_write(fd, buf, sizeof(buf)) == sizeof(buf)) 6757718be8SEnji Cooper error = 0; 6857718be8SEnji Cooper error = errno; 6957718be8SEnji Cooper } 7057718be8SEnji Cooper rump_sys_close(fd); 7157718be8SEnji Cooper rump_sys_seteuid(0); 7257718be8SEnji Cooper rump_sys_setegid(0); 7357718be8SEnji Cooper return error; 7457718be8SEnji Cooper } 7557718be8SEnji Cooper 7657718be8SEnji Cooper static int 7757718be8SEnji Cooper quota_test1(const char *testopts) 7857718be8SEnji Cooper { 7957718be8SEnji Cooper static char buf[512]; 8057718be8SEnji Cooper int fd; 8157718be8SEnji Cooper int error; 8257718be8SEnji Cooper rump_sys_chown(".", TEST_NONROOT_ID, TEST_NONROOT_ID); 8357718be8SEnji Cooper rump_sys_chmod(".", 0777); 8457718be8SEnji Cooper if (rump_sys_setegid(TEST_NONROOT_ID) != 0) { 8557718be8SEnji Cooper error = errno; 8657718be8SEnji Cooper warn("rump_sys_setegid"); 8757718be8SEnji Cooper return error; 8857718be8SEnji Cooper } 8957718be8SEnji Cooper if (rump_sys_seteuid(TEST_NONROOT_ID) != 0) { 9057718be8SEnji Cooper error = errno; 9157718be8SEnji Cooper warn("rump_sys_seteuid"); 9257718be8SEnji Cooper return error; 9357718be8SEnji Cooper } 9457718be8SEnji Cooper fd = rump_sys_open("test_fillup", O_CREAT | O_RDWR, 0644); 9557718be8SEnji Cooper if (fd < 0) { 9657718be8SEnji Cooper error = errno; 9757718be8SEnji Cooper warn("rump_sys_open"); 9857718be8SEnji Cooper } else { 9957718be8SEnji Cooper /* 10057718be8SEnji Cooper * write up to the soft limit, wait a bit, an try to 10157718be8SEnji Cooper * keep on writing 10257718be8SEnji Cooper */ 10357718be8SEnji Cooper int i; 10457718be8SEnji Cooper 10557718be8SEnji Cooper /* write 2k: with the directory this makes 2.5K */ 10657718be8SEnji Cooper for (i = 0; i < 4; i++) { 10757718be8SEnji Cooper error = rump_sys_write(fd, buf, sizeof(buf)); 10857718be8SEnji Cooper if (error != sizeof(buf)) 10957718be8SEnji Cooper err(1, "write failed early"); 11057718be8SEnji Cooper } 11157718be8SEnji Cooper sleep(2); 11257718be8SEnji Cooper /* now try to write an extra .5k */ 11357718be8SEnji Cooper if (rump_sys_write(fd, buf, sizeof(buf)) != sizeof(buf)) 11457718be8SEnji Cooper error = errno; 11557718be8SEnji Cooper else 11657718be8SEnji Cooper error = 0; 11757718be8SEnji Cooper } 11857718be8SEnji Cooper rump_sys_close(fd); 11957718be8SEnji Cooper rump_sys_seteuid(0); 12057718be8SEnji Cooper rump_sys_setegid(0); 12157718be8SEnji Cooper return error; 12257718be8SEnji Cooper } 12357718be8SEnji Cooper 12457718be8SEnji Cooper static int 12557718be8SEnji Cooper quota_test2(const char *testopts) 12657718be8SEnji Cooper { 12757718be8SEnji Cooper static char buf[512]; 12857718be8SEnji Cooper int fd; 12957718be8SEnji Cooper int error; 13057718be8SEnji Cooper int i; 13157718be8SEnji Cooper rump_sys_chown(".", TEST_NONROOT_ID, TEST_NONROOT_ID); 13257718be8SEnji Cooper rump_sys_chmod(".", 0777); 13357718be8SEnji Cooper if (rump_sys_setegid(TEST_NONROOT_ID) != 0) { 13457718be8SEnji Cooper error = errno; 13557718be8SEnji Cooper warn("rump_sys_setegid"); 13657718be8SEnji Cooper return error; 13757718be8SEnji Cooper } 13857718be8SEnji Cooper if (rump_sys_seteuid(TEST_NONROOT_ID) != 0) { 13957718be8SEnji Cooper error = errno; 14057718be8SEnji Cooper warn("rump_sys_seteuid"); 14157718be8SEnji Cooper return error; 14257718be8SEnji Cooper } 14357718be8SEnji Cooper 14457718be8SEnji Cooper for (i = 0; ; i++) { 14557718be8SEnji Cooper sprintf(buf, "file%d", i); 14657718be8SEnji Cooper fd = rump_sys_open(buf, O_CREAT | O_RDWR, 0644); 14757718be8SEnji Cooper if (fd < 0) 14857718be8SEnji Cooper break; 14957718be8SEnji Cooper sprintf(buf, "test file no %d", i); 15057718be8SEnji Cooper rump_sys_write(fd, buf, strlen(buf)); 15157718be8SEnji Cooper rump_sys_close(fd); 15257718be8SEnji Cooper } 15357718be8SEnji Cooper error = errno; 15457718be8SEnji Cooper 15557718be8SEnji Cooper rump_sys_close(fd); 15657718be8SEnji Cooper rump_sys_seteuid(0); 15757718be8SEnji Cooper rump_sys_setegid(0); 15857718be8SEnji Cooper return error; 15957718be8SEnji Cooper } 16057718be8SEnji Cooper 16157718be8SEnji Cooper static int 16257718be8SEnji Cooper quota_test3(const char *testopts) 16357718be8SEnji Cooper { 16457718be8SEnji Cooper static char buf[512]; 16557718be8SEnji Cooper int fd; 16657718be8SEnji Cooper int error; 16757718be8SEnji Cooper int i; 16857718be8SEnji Cooper rump_sys_chown(".", TEST_NONROOT_ID, TEST_NONROOT_ID); 16957718be8SEnji Cooper rump_sys_chmod(".", 0777); 17057718be8SEnji Cooper if (rump_sys_setegid(TEST_NONROOT_ID) != 0) { 17157718be8SEnji Cooper error = errno; 17257718be8SEnji Cooper warn("rump_sys_setegid"); 17357718be8SEnji Cooper return error; 17457718be8SEnji Cooper } 17557718be8SEnji Cooper if (rump_sys_seteuid(TEST_NONROOT_ID) != 0) { 17657718be8SEnji Cooper error = errno; 17757718be8SEnji Cooper warn("rump_sys_seteuid"); 17857718be8SEnji Cooper return error; 17957718be8SEnji Cooper } 18057718be8SEnji Cooper 18157718be8SEnji Cooper /* 18257718be8SEnji Cooper * create files one past the soft limit: one less as we already own the 18357718be8SEnji Cooper * root directory 18457718be8SEnji Cooper */ 18557718be8SEnji Cooper for (i = 0; i < 4; i++) { 18657718be8SEnji Cooper sprintf(buf, "file%d", i); 18757718be8SEnji Cooper fd = rump_sys_open(buf, O_EXCL| O_CREAT | O_RDWR, 0644); 18857718be8SEnji Cooper if (fd < 0) 18957718be8SEnji Cooper err(1, "file create failed early"); 19057718be8SEnji Cooper sprintf(buf, "test file no %d", i); 19157718be8SEnji Cooper rump_sys_write(fd, buf, strlen(buf)); 19257718be8SEnji Cooper rump_sys_close(fd); 19357718be8SEnji Cooper } 19457718be8SEnji Cooper /* now create an extra file after grace time: this should fail */ 19557718be8SEnji Cooper sleep(2); 19657718be8SEnji Cooper sprintf(buf, "file%d", i); 19757718be8SEnji Cooper fd = rump_sys_open(buf, O_EXCL| O_CREAT | O_RDWR, 0644); 19857718be8SEnji Cooper if (fd < 0) 19957718be8SEnji Cooper error = errno; 20057718be8SEnji Cooper else 20157718be8SEnji Cooper error = 0; 20257718be8SEnji Cooper 20357718be8SEnji Cooper rump_sys_close(fd); 20457718be8SEnji Cooper rump_sys_seteuid(0); 20557718be8SEnji Cooper rump_sys_setegid(0); 20657718be8SEnji Cooper return error; 20757718be8SEnji Cooper } 20857718be8SEnji Cooper 20957718be8SEnji Cooper static int 21057718be8SEnji Cooper quota_test4(const char *testopts) 21157718be8SEnji Cooper { 21257718be8SEnji Cooper static char buf[512]; 21357718be8SEnji Cooper int fd, fssfd; 21457718be8SEnji Cooper struct fss_set fss; 21557718be8SEnji Cooper unsigned int i; 21657718be8SEnji Cooper int unl=0; 21757718be8SEnji Cooper int unconf=0; 21857718be8SEnji Cooper 21957718be8SEnji Cooper /* 22057718be8SEnji Cooper * take an internal snapshot of the filesystem, and create a new 22157718be8SEnji Cooper * file with some data 22257718be8SEnji Cooper */ 22357718be8SEnji Cooper rump_sys_chown(".", 0, 0); 22457718be8SEnji Cooper rump_sys_chmod(".", 0777); 22557718be8SEnji Cooper 22657718be8SEnji Cooper for (i =0; testopts && i < strlen(testopts); i++) { 22757718be8SEnji Cooper switch(testopts[i]) { 22857718be8SEnji Cooper case 'L': 22957718be8SEnji Cooper unl++; 23057718be8SEnji Cooper break; 23157718be8SEnji Cooper case 'C': 23257718be8SEnji Cooper unconf++; 23357718be8SEnji Cooper break; 23457718be8SEnji Cooper default: 23557718be8SEnji Cooper errx(1, "test4: unknown option %c", testopts[i]); 23657718be8SEnji Cooper } 23757718be8SEnji Cooper } 23857718be8SEnji Cooper 23957718be8SEnji Cooper /* first create the snapshot */ 24057718be8SEnji Cooper 24157718be8SEnji Cooper fd = rump_sys_open(FSTEST_MNTNAME "/le_snap", O_CREAT | O_RDWR, 0777); 24257718be8SEnji Cooper if (fd == -1) 24357718be8SEnji Cooper err(1, "create " FSTEST_MNTNAME "/le_snap"); 24457718be8SEnji Cooper rump_sys_close(fd); 24557718be8SEnji Cooper fssfd = rump_sys_open("/dev/rfss0", O_RDWR); 24657718be8SEnji Cooper if (fssfd == -1) 24757718be8SEnji Cooper err(1, "cannot open fss"); 24857718be8SEnji Cooper memset(&fss, 0, sizeof(fss)); 24957718be8SEnji Cooper fss.fss_mount = __UNCONST("/mnt"); 25057718be8SEnji Cooper fss.fss_bstore = __UNCONST(FSTEST_MNTNAME "/le_snap"); 25157718be8SEnji Cooper fss.fss_csize = 0; 25257718be8SEnji Cooper if (rump_sys_ioctl(fssfd, FSSIOCSET, &fss) == -1) 25357718be8SEnji Cooper err(1, "create snapshot"); 25457718be8SEnji Cooper if (unl) { 25557718be8SEnji Cooper if (rump_sys_unlink(FSTEST_MNTNAME "/le_snap") == -1) 25657718be8SEnji Cooper err(1, "unlink snapshot"); 25757718be8SEnji Cooper } 25857718be8SEnji Cooper 25957718be8SEnji Cooper /* now create some extra files */ 26057718be8SEnji Cooper 26157718be8SEnji Cooper for (i = 0; i < 4; i++) { 26257718be8SEnji Cooper sprintf(buf, "file%d", i); 26357718be8SEnji Cooper fd = rump_sys_open(buf, O_EXCL| O_CREAT | O_RDWR, 0644); 26457718be8SEnji Cooper if (fd < 0) 26557718be8SEnji Cooper err(1, "create %s", buf); 26657718be8SEnji Cooper sprintf(buf, "test file no %d", i); 26757718be8SEnji Cooper rump_sys_write(fd, buf, strlen(buf)); 26857718be8SEnji Cooper rump_sys_close(fd); 26957718be8SEnji Cooper } 27057718be8SEnji Cooper if (unconf) 27157718be8SEnji Cooper if (rump_sys_ioctl(fssfd, FSSIOCCLR, NULL) == -1) 27257718be8SEnji Cooper err(1, "unconfigure snapshot"); 27357718be8SEnji Cooper return 0; 27457718be8SEnji Cooper } 27557718be8SEnji Cooper 27657718be8SEnji Cooper static int 27757718be8SEnji Cooper quota_test5(const char *testopts) 27857718be8SEnji Cooper { 27957718be8SEnji Cooper static char buf[512]; 28057718be8SEnji Cooper int fd; 28157718be8SEnji Cooper int remount = 0; 28257718be8SEnji Cooper int unlnk = 0; 28357718be8SEnji Cooper int log = 0; 28457718be8SEnji Cooper unsigned int i; 28557718be8SEnji Cooper 28657718be8SEnji Cooper for (i =0; testopts && i < strlen(testopts); i++) { 28757718be8SEnji Cooper switch(testopts[i]) { 28857718be8SEnji Cooper case 'L': 28957718be8SEnji Cooper log++; 29057718be8SEnji Cooper break; 29157718be8SEnji Cooper case 'R': 29257718be8SEnji Cooper remount++; 29357718be8SEnji Cooper break; 29457718be8SEnji Cooper case 'U': 29557718be8SEnji Cooper unlnk++; 29657718be8SEnji Cooper break; 29757718be8SEnji Cooper default: 29857718be8SEnji Cooper errx(1, "test4: unknown option %c", testopts[i]); 29957718be8SEnji Cooper } 30057718be8SEnji Cooper } 30157718be8SEnji Cooper if (remount) { 30257718be8SEnji Cooper struct ufs_args uargs; 30357718be8SEnji Cooper uargs.fspec = __UNCONST("/diskdev"); 30457718be8SEnji Cooper /* remount the fs read/write */ 30557718be8SEnji Cooper if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, 30657718be8SEnji Cooper MNT_UPDATE | (log ? MNT_LOG : 0), 30757718be8SEnji Cooper &uargs, sizeof(uargs)) == -1) 30857718be8SEnji Cooper err(1, "mount ffs rw %s", FSTEST_MNTNAME); 30957718be8SEnji Cooper } 31057718be8SEnji Cooper 31157718be8SEnji Cooper if (unlnk) { 31257718be8SEnji Cooper /* 31357718be8SEnji Cooper * open and unlink a file 31457718be8SEnji Cooper */ 31557718be8SEnji Cooper 31657718be8SEnji Cooper fd = rump_sys_open("unlinked_file", 31757718be8SEnji Cooper O_EXCL| O_CREAT | O_RDWR, 0644); 31857718be8SEnji Cooper if (fd < 0) 31957718be8SEnji Cooper err(1, "create %s", "unlinked_file"); 32057718be8SEnji Cooper sprintf(buf, "test unlinked_file"); 32157718be8SEnji Cooper rump_sys_write(fd, buf, strlen(buf)); 32257718be8SEnji Cooper if (rump_sys_unlink("unlinked_file") == -1) 32357718be8SEnji Cooper err(1, "unlink unlinked_file"); 32457718be8SEnji Cooper if (rump_sys_fsync(fd) == -1) 32557718be8SEnji Cooper err(1, "fsync unlinked_file"); 32657718be8SEnji Cooper rump_sys_reboot(RUMP_RB_NOSYNC, NULL); 32757718be8SEnji Cooper errx(1, "reboot failed"); 32857718be8SEnji Cooper return 1; 32957718be8SEnji Cooper } 33057718be8SEnji Cooper return 0; 33157718be8SEnji Cooper } 33257718be8SEnji Cooper 33357718be8SEnji Cooper struct quota_test { 33457718be8SEnji Cooper int (*func)(const char *); 33557718be8SEnji Cooper const char *desc; 33657718be8SEnji Cooper }; 33757718be8SEnji Cooper 33857718be8SEnji Cooper struct quota_test quota_tests[] = { 33957718be8SEnji Cooper { quota_test0, "write up to hard limit"}, 34057718be8SEnji Cooper { quota_test1, "write beyond the soft limit after grace time"}, 34157718be8SEnji Cooper { quota_test2, "create file up to hard limit"}, 34257718be8SEnji Cooper { quota_test3, "create file beyond the soft limit after grace time"}, 34357718be8SEnji Cooper { quota_test4, "take a snapshot and add some data"}, 34457718be8SEnji Cooper { quota_test5, "open and unlink a file"}, 34557718be8SEnji Cooper }; 34657718be8SEnji Cooper 34757718be8SEnji Cooper static void 34857718be8SEnji Cooper usage(void) 34957718be8SEnji Cooper { 35057718be8SEnji Cooper unsigned int test; 35157718be8SEnji Cooper fprintf(stderr, "usage: %s [-b] [-l] test# diskimage bindurl\n", 35257718be8SEnji Cooper getprogname()); 35357718be8SEnji Cooper fprintf(stderr, "available tests:\n"); 35457718be8SEnji Cooper for (test = 0; test < sizeof(quota_tests) / sizeof(quota_tests[0]); 35557718be8SEnji Cooper test++) 35657718be8SEnji Cooper fprintf(stderr, "\t%d: %s\n", test, quota_tests[test].desc); 35757718be8SEnji Cooper exit(1); 35857718be8SEnji Cooper } 35957718be8SEnji Cooper 36057718be8SEnji Cooper static void 36157718be8SEnji Cooper die(const char *reason, int error) 36257718be8SEnji Cooper { 36357718be8SEnji Cooper 36457718be8SEnji Cooper warnx("%s: %s", reason, strerror(error)); 36557718be8SEnji Cooper if (background) 36657718be8SEnji Cooper rump_daemonize_done(error); 36757718be8SEnji Cooper exit(1); 36857718be8SEnji Cooper } 36957718be8SEnji Cooper 37057718be8SEnji Cooper static sem_t sigsem; 37157718be8SEnji Cooper static void 37257718be8SEnji Cooper sigreboot(int sig) 37357718be8SEnji Cooper { 37457718be8SEnji Cooper 37557718be8SEnji Cooper sem_post(&sigsem); 37657718be8SEnji Cooper } 37757718be8SEnji Cooper 37857718be8SEnji Cooper int 37957718be8SEnji Cooper main(int argc, char **argv) 38057718be8SEnji Cooper { 38157718be8SEnji Cooper int error; 38257718be8SEnji Cooper u_long test; 38357718be8SEnji Cooper char *end; 38457718be8SEnji Cooper struct ufs_args uargs; 38557718be8SEnji Cooper const char *filename; 38657718be8SEnji Cooper const char *serverurl; 38757718be8SEnji Cooper const char *topts = NULL; 38857718be8SEnji Cooper int mntopts = 0; 38957718be8SEnji Cooper int ch; 39057718be8SEnji Cooper 39157718be8SEnji Cooper while ((ch = getopt(argc, argv, "blo:r")) != -1) { 39257718be8SEnji Cooper switch(ch) { 39357718be8SEnji Cooper case 'b': 39457718be8SEnji Cooper background = 1; 39557718be8SEnji Cooper break; 39657718be8SEnji Cooper case 'l': 39757718be8SEnji Cooper mntopts |= MNT_LOG; 39857718be8SEnji Cooper break; 39957718be8SEnji Cooper case 'r': 40057718be8SEnji Cooper mntopts |= MNT_RDONLY; 40157718be8SEnji Cooper break; 40257718be8SEnji Cooper case 'o': 40357718be8SEnji Cooper topts = optarg; 40457718be8SEnji Cooper break; 40557718be8SEnji Cooper default: 40657718be8SEnji Cooper usage(); 40757718be8SEnji Cooper } 40857718be8SEnji Cooper } 40957718be8SEnji Cooper argc -= optind; 41057718be8SEnji Cooper argv += optind; 41157718be8SEnji Cooper 41257718be8SEnji Cooper if (argc != 3) 41357718be8SEnji Cooper usage(); 41457718be8SEnji Cooper 41557718be8SEnji Cooper filename = argv[1]; 41657718be8SEnji Cooper serverurl = argv[2]; 41757718be8SEnji Cooper 41857718be8SEnji Cooper test = strtoul(argv[0], &end, 10); 41957718be8SEnji Cooper if (*end != '\0') { 42057718be8SEnji Cooper usage(); 42157718be8SEnji Cooper } 42257718be8SEnji Cooper if (test > sizeof(quota_tests) / sizeof(quota_tests[0])) { 42357718be8SEnji Cooper usage(); 42457718be8SEnji Cooper } 42557718be8SEnji Cooper 42657718be8SEnji Cooper if (background) { 42757718be8SEnji Cooper error = rump_daemonize_begin(); 42857718be8SEnji Cooper if (error) 42957718be8SEnji Cooper errx(1, "rump daemonize: %s", strerror(error)); 43057718be8SEnji Cooper } 43157718be8SEnji Cooper 43257718be8SEnji Cooper error = rump_init(); 43357718be8SEnji Cooper if (error) 43457718be8SEnji Cooper die("rump init failed", error); 43557718be8SEnji Cooper 43657718be8SEnji Cooper if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1) 43757718be8SEnji Cooper err(1, "mount point create"); 43857718be8SEnji Cooper rump_pub_etfs_register("/diskdev", filename, RUMP_ETFS_BLK); 43957718be8SEnji Cooper uargs.fspec = __UNCONST("/diskdev"); 44057718be8SEnji Cooper if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, mntopts, 44157718be8SEnji Cooper &uargs, sizeof(uargs)) == -1) 44257718be8SEnji Cooper die("mount ffs", errno); 44357718be8SEnji Cooper 44457718be8SEnji Cooper if (rump_sys_chdir(FSTEST_MNTNAME) == -1) 44557718be8SEnji Cooper err(1, "cd %s", FSTEST_MNTNAME); 44657718be8SEnji Cooper error = quota_tests[test].func(topts); 44757718be8SEnji Cooper if (error) { 44857718be8SEnji Cooper fprintf(stderr, " test %lu: %s returned %d: %s\n", 44957718be8SEnji Cooper test, quota_tests[test].desc, error, strerror(error)); 45057718be8SEnji Cooper } 45157718be8SEnji Cooper if (rump_sys_chdir("/") == -1) 45257718be8SEnji Cooper err(1, "cd /"); 45357718be8SEnji Cooper 45457718be8SEnji Cooper error = rump_init_server(serverurl); 45557718be8SEnji Cooper if (error) 45657718be8SEnji Cooper die("rump server init failed", error); 45757718be8SEnji Cooper if (background) 45857718be8SEnji Cooper rump_daemonize_done(RUMP_DAEMONIZE_SUCCESS); 45957718be8SEnji Cooper 46057718be8SEnji Cooper sem_init(&sigsem, 0, 0); 46157718be8SEnji Cooper signal(SIGTERM, sigreboot); 46257718be8SEnji Cooper signal(SIGINT, sigreboot); 46357718be8SEnji Cooper sem_wait(&sigsem); 46457718be8SEnji Cooper 46557718be8SEnji Cooper rump_sys_reboot(0, NULL); 46657718be8SEnji Cooper /*NOTREACHED*/ 46757718be8SEnji Cooper return 0; 46857718be8SEnji Cooper } 469