1 /* $NetBSD: h_ffs_server.c,v 1.1 2012/01/18 20:51:23 bouyer 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