1*57718be8SEnji Cooper /* $NetBSD: rumpnfsd.c,v 1.8 2014/05/12 15:31:07 christos Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper /*- 4*57718be8SEnji Cooper * Copyright (c) 2010 The NetBSD Foundation, Inc. 5*57718be8SEnji Cooper * 6*57718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 7*57718be8SEnji Cooper * modification, are permitted provided that the following conditions 8*57718be8SEnji Cooper * are met: 9*57718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 10*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 11*57718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 12*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 13*57718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 14*57718be8SEnji Cooper * 15*57718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 16*57718be8SEnji Cooper * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17*57718be8SEnji Cooper * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18*57718be8SEnji Cooper * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*57718be8SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*57718be8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21*57718be8SEnji Cooper * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*57718be8SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*57718be8SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*57718be8SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*57718be8SEnji Cooper * SUCH DAMAGE. 26*57718be8SEnji Cooper */ 27*57718be8SEnji Cooper 28*57718be8SEnji Cooper #include <sys/types.h> 29*57718be8SEnji Cooper 30*57718be8SEnji Cooper #include <dlfcn.h> 31*57718be8SEnji Cooper #include <err.h> 32*57718be8SEnji Cooper #include <errno.h> 33*57718be8SEnji Cooper #include <pthread.h> 34*57718be8SEnji Cooper #include <semaphore.h> 35*57718be8SEnji Cooper #include <stdio.h> 36*57718be8SEnji Cooper #include <stdlib.h> 37*57718be8SEnji Cooper #include <string.h> 38*57718be8SEnji Cooper #include <syslog.h> 39*57718be8SEnji Cooper #include <unistd.h> 40*57718be8SEnji Cooper 41*57718be8SEnji Cooper void *mountd_main(void *); 42*57718be8SEnji Cooper void *rpcbind_main(void *); 43*57718be8SEnji Cooper int nfsd_main(int, char **); 44*57718be8SEnji Cooper 45*57718be8SEnji Cooper sem_t gensem; 46*57718be8SEnji Cooper 47*57718be8SEnji Cooper #include "../../../net/config/netconfig.c" 48*57718be8SEnji Cooper #include "../../common/h_fsmacros.h" 49*57718be8SEnji Cooper #include "svc_fdset.h" 50*57718be8SEnji Cooper 51*57718be8SEnji Cooper #include <rump/rump.h> 52*57718be8SEnji Cooper #include <rump/rump_syscalls.h> 53*57718be8SEnji Cooper 54*57718be8SEnji Cooper int 55*57718be8SEnji Cooper main(int argc, char *argv[]) 56*57718be8SEnji Cooper { 57*57718be8SEnji Cooper const char *ethername, *ethername_ro; 58*57718be8SEnji Cooper const char *serveraddr, *serveraddr_ro; 59*57718be8SEnji Cooper const char *netmask; 60*57718be8SEnji Cooper const char *exportpath; 61*57718be8SEnji Cooper const char *imagename; 62*57718be8SEnji Cooper char ifname[IFNAMSIZ], ifname_ro[IFNAMSIZ]; 63*57718be8SEnji Cooper void *fsarg; 64*57718be8SEnji Cooper pthread_t t; 65*57718be8SEnji Cooper int rv; 66*57718be8SEnji Cooper 67*57718be8SEnji Cooper /* for netcfg */ 68*57718be8SEnji Cooper noatf = 1; 69*57718be8SEnji Cooper 70*57718be8SEnji Cooper /* use defaults? */ 71*57718be8SEnji Cooper if (argc == 1) { 72*57718be8SEnji Cooper ethername = "etherbus"; 73*57718be8SEnji Cooper ethername_ro = "etherbus_ro"; 74*57718be8SEnji Cooper serveraddr = "10.3.2.1"; 75*57718be8SEnji Cooper serveraddr_ro = "10.4.2.1"; 76*57718be8SEnji Cooper netmask = "255.255.255.0"; 77*57718be8SEnji Cooper exportpath = "/myexport"; 78*57718be8SEnji Cooper imagename = "ffs.img"; 79*57718be8SEnji Cooper } else { 80*57718be8SEnji Cooper ethername = argv[1]; 81*57718be8SEnji Cooper ethername_ro = argv[2]; 82*57718be8SEnji Cooper serveraddr = argv[3]; 83*57718be8SEnji Cooper serveraddr_ro = argv[4]; 84*57718be8SEnji Cooper netmask = argv[5]; 85*57718be8SEnji Cooper exportpath = argv[6]; 86*57718be8SEnji Cooper imagename = argv[7]; 87*57718be8SEnji Cooper } 88*57718be8SEnji Cooper 89*57718be8SEnji Cooper rump_init(); 90*57718be8SEnji Cooper init_fdsets(); 91*57718be8SEnji Cooper 92*57718be8SEnji Cooper rv = rump_pub_etfs_register("/etc/exports", "./exports", RUMP_ETFS_REG); 93*57718be8SEnji Cooper if (rv) { 94*57718be8SEnji Cooper errx(1, "register /etc/exports: %s", strerror(rv)); 95*57718be8SEnji Cooper } 96*57718be8SEnji Cooper 97*57718be8SEnji Cooper /* mini-mtree for mountd */ 98*57718be8SEnji Cooper static const char *const dirs[] = { "/var", "/var/run", "/var/db" }; 99*57718be8SEnji Cooper for (size_t i = 0; i < __arraycount(dirs); i++) 100*57718be8SEnji Cooper if (rump_sys_mkdir(dirs[i], 0777) == -1) 101*57718be8SEnji Cooper err(1, "can't mkdir `%s'", dirs[i]); 102*57718be8SEnji Cooper 103*57718be8SEnji Cooper if (ffs_fstest_newfs(NULL, &fsarg, 104*57718be8SEnji Cooper imagename, FSTEST_IMGSIZE, NULL) != 0) 105*57718be8SEnji Cooper err(1, "newfs failed"); 106*57718be8SEnji Cooper if (ffs_fstest_mount(NULL, fsarg, exportpath, 0) != 0) 107*57718be8SEnji Cooper err(1, "mount failed"); 108*57718be8SEnji Cooper 109*57718be8SEnji Cooper #if 0 110*57718be8SEnji Cooper /* 111*57718be8SEnji Cooper * Serve from host instead of dedicated mount? 112*57718be8SEnji Cooper * THIS IS MORE EVIL THAN MURRAY THE DEMONIC TALKING SKULL! 113*57718be8SEnji Cooper */ 114*57718be8SEnji Cooper 115*57718be8SEnji Cooper if (ukfs_modload("/usr/lib/librumpfs_syspuffs.so") < 1) 116*57718be8SEnji Cooper errx(1, "modload"); 117*57718be8SEnji Cooper 118*57718be8SEnji Cooper mount_syspuffs_parseargs(__arraycount(pnullarg), pnullarg, 119*57718be8SEnji Cooper &args, &mntflags, canon_dev, canon_dir); 120*57718be8SEnji Cooper if ((ukfs = ukfs_mount(MOUNT_PUFFS, "/", UKFS_DEFAULTMP, MNT_RDONLY, 121*57718be8SEnji Cooper &args, sizeof(args))) == NULL) 122*57718be8SEnji Cooper err(1, "mount"); 123*57718be8SEnji Cooper 124*57718be8SEnji Cooper if (ukfs_modload("/usr/lib/librumpfs_nfsserver.so") < 1) 125*57718be8SEnji Cooper errx(1, "modload"); 126*57718be8SEnji Cooper #endif 127*57718be8SEnji Cooper 128*57718be8SEnji Cooper if (sem_init(&gensem, 1, 0) == -1) 129*57718be8SEnji Cooper err(1, "gensem init"); 130*57718be8SEnji Cooper 131*57718be8SEnji Cooper /* create interface */ 132*57718be8SEnji Cooper netcfg_rump_makeshmif(ethername, ifname); 133*57718be8SEnji Cooper netcfg_rump_if(ifname, serveraddr, netmask); 134*57718be8SEnji Cooper 135*57718be8SEnji Cooper netcfg_rump_makeshmif(ethername_ro, ifname_ro); 136*57718be8SEnji Cooper netcfg_rump_if(ifname_ro, serveraddr_ro, netmask); 137*57718be8SEnji Cooper 138*57718be8SEnji Cooper /* 139*57718be8SEnji Cooper * No syslogging, thanks. 140*57718be8SEnji Cooper * XXX: "0" does not modify the mask, so pick something 141*57718be8SEnji Cooper * which is unlikely to cause any logging 142*57718be8SEnji Cooper */ 143*57718be8SEnji Cooper setlogmask(0x10000000); 144*57718be8SEnji Cooper 145*57718be8SEnji Cooper if (pthread_create(&t, NULL, rpcbind_main, NULL) == -1) 146*57718be8SEnji Cooper err(1, "rpcbind"); 147*57718be8SEnji Cooper sem_wait(&gensem); 148*57718be8SEnji Cooper 149*57718be8SEnji Cooper if (pthread_create(&t, NULL, mountd_main, NULL) == -1) 150*57718be8SEnji Cooper err(1, "mountd"); 151*57718be8SEnji Cooper sem_wait(&gensem); 152*57718be8SEnji Cooper 153*57718be8SEnji Cooper rv = 0; 154*57718be8SEnji Cooper /* signal the other process we're almost done */ 155*57718be8SEnji Cooper if (write(3, &rv, 4) != 4) 156*57718be8SEnji Cooper errx(1, "magic write failed"); 157*57718be8SEnji Cooper 158*57718be8SEnji Cooper { 159*57718be8SEnji Cooper char *nfsargv[] = { __UNCONST("nfsd"), NULL }; 160*57718be8SEnji Cooper nfsd_main(1, nfsargv); 161*57718be8SEnji Cooper } 162*57718be8SEnji Cooper /*NOTREACHED*/ 163*57718be8SEnji Cooper 164*57718be8SEnji Cooper return 0; 165*57718be8SEnji Cooper } 166