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