h_ffs_server.c revision 1.1.4.2 1 /* $NetBSD: h_ffs_server.c,v 1.1.4.2 2012/04/17 00:09:03 yamt 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