1272343Sngie/* $NetBSD: h_ffs_server.c,v 1.2 2012/08/24 20:25:50 jmmv Exp $ */ 2272343Sngie 3272343Sngie/* 4272343Sngie * rump server for advanced quota tests 5272343Sngie */ 6272343Sngie 7272343Sngie#include "../common/h_fsmacros.h" 8272343Sngie 9272343Sngie#include <err.h> 10272343Sngie#include <semaphore.h> 11272343Sngie#include <sys/types.h> 12272343Sngie#include <sys/mount.h> 13272343Sngie 14272343Sngie#include <stdlib.h> 15272343Sngie#include <unistd.h> 16272343Sngie 17272343Sngie#include <ufs/ufs/ufsmount.h> 18272343Sngie 19272343Sngie#include <rump/rump.h> 20272343Sngie#include <rump/rump_syscalls.h> 21272343Sngie 22272343Sngieint background = 0; 23272343Sngie 24272343Sngiestatic void 25272343Sngieusage(void) 26272343Sngie{ 27272343Sngie fprintf(stderr, "usage: %s [-b] [-l] diskimage bindurl\n", 28272343Sngie getprogname()); 29272343Sngie exit(1); 30272343Sngie} 31272343Sngie 32272343Sngiestatic void 33272343Sngiedie(const char *reason, int error) 34272343Sngie{ 35272343Sngie 36272343Sngie warnx("%s: %s", reason, strerror(error)); 37272343Sngie if (background) 38272343Sngie rump_daemonize_done(error); 39272343Sngie exit(1); 40272343Sngie} 41272343Sngie 42272343Sngiestatic sem_t sigsem; 43272343Sngiestatic void 44272343Sngiesigreboot(int sig) 45272343Sngie{ 46272343Sngie 47272343Sngie sem_post(&sigsem); 48272343Sngie} 49272343Sngie 50272343Sngieint 51272343Sngiemain(int argc, char **argv) 52272343Sngie{ 53272343Sngie int error; 54272343Sngie struct ufs_args uargs; 55272343Sngie const char *filename; 56272343Sngie const char *serverurl; 57272343Sngie int log = 0; 58272343Sngie int ch; 59272343Sngie 60272343Sngie while ((ch = getopt(argc, argv, "bl")) != -1) { 61272343Sngie switch(ch) { 62272343Sngie case 'b': 63272343Sngie background = 1; 64272343Sngie break; 65272343Sngie case 'l': 66272343Sngie log = 1; 67272343Sngie break; 68272343Sngie default: 69272343Sngie usage(); 70272343Sngie } 71272343Sngie } 72272343Sngie argc -= optind; 73272343Sngie argv += optind; 74272343Sngie 75272343Sngie if (argc != 2) 76272343Sngie usage(); 77272343Sngie 78272343Sngie filename = argv[0]; 79272343Sngie serverurl = argv[1]; 80272343Sngie 81272343Sngie if (background) { 82272343Sngie error = rump_daemonize_begin(); 83272343Sngie if (error) 84272343Sngie errx(1, "rump daemonize: %s", strerror(error)); 85272343Sngie } 86272343Sngie 87272343Sngie error = rump_init(); 88272343Sngie if (error) 89272343Sngie die("rump init failed", error); 90272343Sngie 91272343Sngie if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1) 92272343Sngie die("mount point create", errno); 93272343Sngie rump_pub_etfs_register("/diskdev", filename, RUMP_ETFS_BLK); 94272343Sngie uargs.fspec = __UNCONST("/diskdev"); 95272343Sngie if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, (log) ? MNT_LOG : 0, 96272343Sngie &uargs, sizeof(uargs)) == -1) 97272343Sngie die("mount ffs", errno); 98272343Sngie 99272343Sngie error = rump_init_server(serverurl); 100272343Sngie if (error) 101272343Sngie die("rump server init failed", error); 102272343Sngie if (background) 103272343Sngie rump_daemonize_done(RUMP_DAEMONIZE_SUCCESS); 104272343Sngie 105272343Sngie sem_init(&sigsem, 0, 0); 106272343Sngie signal(SIGTERM, sigreboot); 107272343Sngie signal(SIGINT, sigreboot); 108272343Sngie sem_wait(&sigsem); 109272343Sngie 110272343Sngie rump_sys_reboot(0, NULL); 111272343Sngie /*NOTREACHED*/ 112272343Sngie return 0; 113272343Sngie} 114