1*46d1235fSjmmv /* $NetBSD: h_ffs_server.c,v 1.2 2012/08/24 20:25:50 jmmv Exp $ */
294276795Sbouyer
394276795Sbouyer /*
494276795Sbouyer * rump server for advanced quota tests
594276795Sbouyer */
694276795Sbouyer
794276795Sbouyer #include "../common/h_fsmacros.h"
894276795Sbouyer
994276795Sbouyer #include <err.h>
1094276795Sbouyer #include <semaphore.h>
1194276795Sbouyer #include <sys/types.h>
1294276795Sbouyer #include <sys/mount.h>
1394276795Sbouyer
1494276795Sbouyer #include <stdlib.h>
1594276795Sbouyer #include <unistd.h>
1694276795Sbouyer
1794276795Sbouyer #include <ufs/ufs/ufsmount.h>
1894276795Sbouyer
1994276795Sbouyer #include <rump/rump.h>
2094276795Sbouyer #include <rump/rump_syscalls.h>
2194276795Sbouyer
2294276795Sbouyer int background = 0;
2394276795Sbouyer
2494276795Sbouyer static void
usage(void)2594276795Sbouyer usage(void)
2694276795Sbouyer {
2794276795Sbouyer fprintf(stderr, "usage: %s [-b] [-l] diskimage bindurl\n",
2894276795Sbouyer getprogname());
2994276795Sbouyer exit(1);
3094276795Sbouyer }
3194276795Sbouyer
3294276795Sbouyer static void
die(const char * reason,int error)3394276795Sbouyer die(const char *reason, int error)
3494276795Sbouyer {
3594276795Sbouyer
3694276795Sbouyer warnx("%s: %s", reason, strerror(error));
3794276795Sbouyer if (background)
3894276795Sbouyer rump_daemonize_done(error);
3994276795Sbouyer exit(1);
4094276795Sbouyer }
4194276795Sbouyer
4294276795Sbouyer static sem_t sigsem;
4394276795Sbouyer static void
sigreboot(int sig)4494276795Sbouyer sigreboot(int sig)
4594276795Sbouyer {
4694276795Sbouyer
4794276795Sbouyer sem_post(&sigsem);
4894276795Sbouyer }
4994276795Sbouyer
5094276795Sbouyer int
main(int argc,char ** argv)5194276795Sbouyer main(int argc, char **argv)
5294276795Sbouyer {
5394276795Sbouyer int error;
5494276795Sbouyer struct ufs_args uargs;
5594276795Sbouyer const char *filename;
5694276795Sbouyer const char *serverurl;
5794276795Sbouyer int log = 0;
5894276795Sbouyer int ch;
5994276795Sbouyer
6094276795Sbouyer while ((ch = getopt(argc, argv, "bl")) != -1) {
6194276795Sbouyer switch(ch) {
6294276795Sbouyer case 'b':
6394276795Sbouyer background = 1;
6494276795Sbouyer break;
6594276795Sbouyer case 'l':
6694276795Sbouyer log = 1;
6794276795Sbouyer break;
6894276795Sbouyer default:
6994276795Sbouyer usage();
7094276795Sbouyer }
7194276795Sbouyer }
7294276795Sbouyer argc -= optind;
7394276795Sbouyer argv += optind;
7494276795Sbouyer
7594276795Sbouyer if (argc != 2)
7694276795Sbouyer usage();
7794276795Sbouyer
7894276795Sbouyer filename = argv[0];
7994276795Sbouyer serverurl = argv[1];
8094276795Sbouyer
8194276795Sbouyer if (background) {
8294276795Sbouyer error = rump_daemonize_begin();
8394276795Sbouyer if (error)
8494276795Sbouyer errx(1, "rump daemonize: %s", strerror(error));
8594276795Sbouyer }
8694276795Sbouyer
8794276795Sbouyer error = rump_init();
8894276795Sbouyer if (error)
8994276795Sbouyer die("rump init failed", error);
9094276795Sbouyer
9194276795Sbouyer if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1)
92*46d1235fSjmmv die("mount point create", errno);
9394276795Sbouyer rump_pub_etfs_register("/diskdev", filename, RUMP_ETFS_BLK);
9494276795Sbouyer uargs.fspec = __UNCONST("/diskdev");
9594276795Sbouyer if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, (log) ? MNT_LOG : 0,
9694276795Sbouyer &uargs, sizeof(uargs)) == -1)
9794276795Sbouyer die("mount ffs", errno);
9894276795Sbouyer
9994276795Sbouyer error = rump_init_server(serverurl);
10094276795Sbouyer if (error)
10194276795Sbouyer die("rump server init failed", error);
10294276795Sbouyer if (background)
10394276795Sbouyer rump_daemonize_done(RUMP_DAEMONIZE_SUCCESS);
10494276795Sbouyer
10594276795Sbouyer sem_init(&sigsem, 0, 0);
10694276795Sbouyer signal(SIGTERM, sigreboot);
10794276795Sbouyer signal(SIGINT, sigreboot);
10894276795Sbouyer sem_wait(&sigsem);
10994276795Sbouyer
11094276795Sbouyer rump_sys_reboot(0, NULL);
11194276795Sbouyer /*NOTREACHED*/
11294276795Sbouyer return 0;
11394276795Sbouyer }
114