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