]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/netbsd-tests/fs/ffs/h_ffs_server.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / netbsd-tests / fs / ffs / h_ffs_server.c
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
25 usage(void)
26 {
27         fprintf(stderr, "usage: %s [-b] [-l] diskimage bindurl\n",
28             getprogname());
29         exit(1);
30 }
31
32 static void
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
44 sigreboot(int sig)
45 {
46
47         sem_post(&sigsem);
48 }
49
50 int 
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 }