xref: /netbsd-src/tests/fs/ffs/h_ffs_server.c (revision b757af438b42b93f8c6571f026d8b8ef3eaf5fc9)
1 /*	$NetBSD: h_ffs_server.c,v 1.1 2012/01/18 20:51:23 bouyer Exp $	*/
2 
3 /*
4  * rump server for advanced quota tests
5  */
6 
7 #include "../common/h_fsmacros.h"
8 
9 #include <err.h>
10 #include <semaphore.h>
11 #include <sys/types.h>
12 #include <sys/mount.h>
13 
14 #include <stdlib.h>
15 #include <unistd.h>
16 
17 #include <ufs/ufs/ufsmount.h>
18 
19 #include <rump/rump.h>
20 #include <rump/rump_syscalls.h>
21 
22 #include "../../h_macros.h"
23 
24 int background = 0;
25 
26 static void
27 usage(void)
28 {
29 	fprintf(stderr, "usage: %s [-b] [-l] diskimage bindurl\n",
30 	    getprogname());
31 	exit(1);
32 }
33 
34 static void
35 die(const char *reason, int error)
36 {
37 
38 	warnx("%s: %s", reason, strerror(error));
39 	if (background)
40 		rump_daemonize_done(error);
41 	exit(1);
42 }
43 
44 static sem_t sigsem;
45 static void
46 sigreboot(int sig)
47 {
48 
49 	sem_post(&sigsem);
50 }
51 
52 int
53 main(int argc, char **argv)
54 {
55 	int error;
56 	struct ufs_args uargs;
57 	const char *filename;
58 	const char *serverurl;
59 	int log = 0;
60 	int ch;
61 
62 	while ((ch = getopt(argc, argv, "bl")) != -1) {
63 		switch(ch) {
64 		case 'b':
65 			background = 1;
66 			break;
67 		case 'l':
68 			log = 1;
69 			break;
70 		default:
71 			usage();
72 		}
73 	}
74 	argc -= optind;
75 	argv += optind;
76 
77 	if (argc != 2)
78 		usage();
79 
80 	filename = argv[0];
81 	serverurl = argv[1];
82 
83 	if (background) {
84 		error = rump_daemonize_begin();
85 		if (error)
86 			errx(1, "rump daemonize: %s", strerror(error));
87 	}
88 
89 	error = rump_init();
90 	if (error)
91 		die("rump init failed", error);
92 
93 	if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1)
94 		atf_tc_fail_errno("mount point create");
95 	rump_pub_etfs_register("/diskdev", filename, RUMP_ETFS_BLK);
96 	uargs.fspec = __UNCONST("/diskdev");
97 	if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, (log) ? MNT_LOG : 0,
98 	    &uargs, sizeof(uargs)) == -1)
99 		die("mount ffs", errno);
100 
101 	error = rump_init_server(serverurl);
102 	if (error)
103 		die("rump server init failed", error);
104 	if (background)
105 		rump_daemonize_done(RUMP_DAEMONIZE_SUCCESS);
106 
107 	sem_init(&sigsem, 0, 0);
108 	signal(SIGTERM, sigreboot);
109 	signal(SIGINT, sigreboot);
110 	sem_wait(&sigsem);
111 
112 	rump_sys_reboot(0, NULL);
113 	/*NOTREACHED*/
114 	return 0;
115 }
116