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
quota_test0(const char * testopts)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
quota_test1(const char * testopts)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
quota_test2(const char * testopts)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
quota_test3(const char * testopts)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
quota_test4(const char * testopts)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
quota_test5(const char * testopts)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
usage(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
die(const char * reason,int error)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
sigreboot(int sig)37257718be8SEnji Cooper sigreboot(int sig)
37357718be8SEnji Cooper {
37457718be8SEnji Cooper
37557718be8SEnji Cooper sem_post(&sigsem);
37657718be8SEnji Cooper }
37757718be8SEnji Cooper
37857718be8SEnji Cooper int
main(int argc,char ** argv)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