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