1272343Sngie/*	$NetBSD: h_ffs_server.c,v 1.2 2012/08/24 20:25:50 jmmv Exp $	*/
2272343Sngie
3272343Sngie/*
4272343Sngie * rump server for advanced quota tests
5272343Sngie */
6272343Sngie
7272343Sngie#include "../common/h_fsmacros.h"
8272343Sngie
9272343Sngie#include <err.h>
10272343Sngie#include <semaphore.h>
11272343Sngie#include <sys/types.h>
12272343Sngie#include <sys/mount.h>
13272343Sngie
14272343Sngie#include <stdlib.h>
15272343Sngie#include <unistd.h>
16272343Sngie
17272343Sngie#include <ufs/ufs/ufsmount.h>
18272343Sngie
19272343Sngie#include <rump/rump.h>
20272343Sngie#include <rump/rump_syscalls.h>
21272343Sngie
22272343Sngieint background = 0;
23272343Sngie
24272343Sngiestatic void
25272343Sngieusage(void)
26272343Sngie{
27272343Sngie	fprintf(stderr, "usage: %s [-b] [-l] diskimage bindurl\n",
28272343Sngie	    getprogname());
29272343Sngie	exit(1);
30272343Sngie}
31272343Sngie
32272343Sngiestatic void
33272343Sngiedie(const char *reason, int error)
34272343Sngie{
35272343Sngie
36272343Sngie	warnx("%s: %s", reason, strerror(error));
37272343Sngie	if (background)
38272343Sngie		rump_daemonize_done(error);
39272343Sngie	exit(1);
40272343Sngie}
41272343Sngie
42272343Sngiestatic sem_t sigsem;
43272343Sngiestatic void
44272343Sngiesigreboot(int sig)
45272343Sngie{
46272343Sngie
47272343Sngie	sem_post(&sigsem);
48272343Sngie}
49272343Sngie
50272343Sngieint
51272343Sngiemain(int argc, char **argv)
52272343Sngie{
53272343Sngie	int error;
54272343Sngie	struct ufs_args uargs;
55272343Sngie	const char *filename;
56272343Sngie	const char *serverurl;
57272343Sngie	int log = 0;
58272343Sngie	int ch;
59272343Sngie
60272343Sngie	while ((ch = getopt(argc, argv, "bl")) != -1) {
61272343Sngie		switch(ch) {
62272343Sngie		case 'b':
63272343Sngie			background = 1;
64272343Sngie			break;
65272343Sngie		case 'l':
66272343Sngie			log = 1;
67272343Sngie			break;
68272343Sngie		default:
69272343Sngie			usage();
70272343Sngie		}
71272343Sngie	}
72272343Sngie	argc -= optind;
73272343Sngie	argv += optind;
74272343Sngie
75272343Sngie	if (argc != 2)
76272343Sngie		usage();
77272343Sngie
78272343Sngie	filename = argv[0];
79272343Sngie	serverurl = argv[1];
80272343Sngie
81272343Sngie	if (background) {
82272343Sngie		error = rump_daemonize_begin();
83272343Sngie		if (error)
84272343Sngie			errx(1, "rump daemonize: %s", strerror(error));
85272343Sngie	}
86272343Sngie
87272343Sngie	error = rump_init();
88272343Sngie	if (error)
89272343Sngie		die("rump init failed", error);
90272343Sngie
91272343Sngie	if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1)
92272343Sngie		die("mount point create", errno);
93272343Sngie	rump_pub_etfs_register("/diskdev", filename, RUMP_ETFS_BLK);
94272343Sngie	uargs.fspec = __UNCONST("/diskdev");
95272343Sngie	if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, (log) ? MNT_LOG : 0,
96272343Sngie	    &uargs, sizeof(uargs)) == -1)
97272343Sngie		die("mount ffs", errno);
98272343Sngie
99272343Sngie	error = rump_init_server(serverurl);
100272343Sngie	if (error)
101272343Sngie		die("rump server init failed", error);
102272343Sngie	if (background)
103272343Sngie		rump_daemonize_done(RUMP_DAEMONIZE_SUCCESS);
104272343Sngie
105272343Sngie	sem_init(&sigsem, 0, 0);
106272343Sngie	signal(SIGTERM, sigreboot);
107272343Sngie	signal(SIGINT, sigreboot);
108272343Sngie	sem_wait(&sigsem);
109272343Sngie
110272343Sngie	rump_sys_reboot(0, NULL);
111272343Sngie	/*NOTREACHED*/
112272343Sngie	return 0;
113272343Sngie}
114