1*640235e2SEnji Cooper /* $NetBSD: rumpnfsd.c,v 1.9 2015/11/08 02:45:16 christos Exp $ */
257718be8SEnji Cooper
357718be8SEnji Cooper /*-
457718be8SEnji Cooper * Copyright (c) 2010 The NetBSD Foundation, Inc.
557718be8SEnji Cooper *
657718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without
757718be8SEnji Cooper * modification, are permitted provided that the following conditions
857718be8SEnji Cooper * are met:
957718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright
1057718be8SEnji Cooper * notice, this list of conditions and the following disclaimer.
1157718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright
1257718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the
1357718be8SEnji Cooper * documentation and/or other materials provided with the distribution.
1457718be8SEnji Cooper *
1557718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
1657718be8SEnji Cooper * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1757718be8SEnji Cooper * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1857718be8SEnji Cooper * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1957718be8SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2057718be8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2157718be8SEnji Cooper * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2257718be8SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2357718be8SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2457718be8SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2557718be8SEnji Cooper * SUCH DAMAGE.
2657718be8SEnji Cooper */
2757718be8SEnji Cooper
2857718be8SEnji Cooper #include <sys/types.h>
2957718be8SEnji Cooper
3057718be8SEnji Cooper #include <dlfcn.h>
3157718be8SEnji Cooper #include <err.h>
3257718be8SEnji Cooper #include <errno.h>
3357718be8SEnji Cooper #include <pthread.h>
3457718be8SEnji Cooper #include <semaphore.h>
3557718be8SEnji Cooper #include <stdio.h>
3657718be8SEnji Cooper #include <stdlib.h>
3757718be8SEnji Cooper #include <string.h>
3857718be8SEnji Cooper #include <syslog.h>
3957718be8SEnji Cooper #include <unistd.h>
40*640235e2SEnji Cooper #include <rpc/rpc.h>
4157718be8SEnji Cooper
4257718be8SEnji Cooper void *mountd_main(void *);
4357718be8SEnji Cooper void *rpcbind_main(void *);
4457718be8SEnji Cooper int nfsd_main(int, char **);
4557718be8SEnji Cooper
4657718be8SEnji Cooper sem_t gensem;
4757718be8SEnji Cooper
4857718be8SEnji Cooper #include "../../../net/config/netconfig.c"
4957718be8SEnji Cooper #include "../../common/h_fsmacros.h"
5057718be8SEnji Cooper #include "svc_fdset.h"
5157718be8SEnji Cooper
5257718be8SEnji Cooper #include <rump/rump.h>
5357718be8SEnji Cooper #include <rump/rump_syscalls.h>
5457718be8SEnji Cooper
5557718be8SEnji Cooper int
main(int argc,char * argv[])5657718be8SEnji Cooper main(int argc, char *argv[])
5757718be8SEnji Cooper {
5857718be8SEnji Cooper const char *ethername, *ethername_ro;
5957718be8SEnji Cooper const char *serveraddr, *serveraddr_ro;
6057718be8SEnji Cooper const char *netmask;
6157718be8SEnji Cooper const char *exportpath;
6257718be8SEnji Cooper const char *imagename;
6357718be8SEnji Cooper char ifname[IFNAMSIZ], ifname_ro[IFNAMSIZ];
6457718be8SEnji Cooper void *fsarg;
6557718be8SEnji Cooper pthread_t t;
6657718be8SEnji Cooper int rv;
6757718be8SEnji Cooper
6857718be8SEnji Cooper /* for netcfg */
6957718be8SEnji Cooper noatf = 1;
7057718be8SEnji Cooper
7157718be8SEnji Cooper /* use defaults? */
7257718be8SEnji Cooper if (argc == 1) {
7357718be8SEnji Cooper ethername = "etherbus";
7457718be8SEnji Cooper ethername_ro = "etherbus_ro";
7557718be8SEnji Cooper serveraddr = "10.3.2.1";
7657718be8SEnji Cooper serveraddr_ro = "10.4.2.1";
7757718be8SEnji Cooper netmask = "255.255.255.0";
7857718be8SEnji Cooper exportpath = "/myexport";
7957718be8SEnji Cooper imagename = "ffs.img";
8057718be8SEnji Cooper } else {
8157718be8SEnji Cooper ethername = argv[1];
8257718be8SEnji Cooper ethername_ro = argv[2];
8357718be8SEnji Cooper serveraddr = argv[3];
8457718be8SEnji Cooper serveraddr_ro = argv[4];
8557718be8SEnji Cooper netmask = argv[5];
8657718be8SEnji Cooper exportpath = argv[6];
8757718be8SEnji Cooper imagename = argv[7];
8857718be8SEnji Cooper }
8957718be8SEnji Cooper
9057718be8SEnji Cooper rump_init();
91*640235e2SEnji Cooper svc_fdset_init(SVC_FDSET_MT);
9257718be8SEnji Cooper
9357718be8SEnji Cooper rv = rump_pub_etfs_register("/etc/exports", "./exports", RUMP_ETFS_REG);
9457718be8SEnji Cooper if (rv) {
9557718be8SEnji Cooper errx(1, "register /etc/exports: %s", strerror(rv));
9657718be8SEnji Cooper }
9757718be8SEnji Cooper
9857718be8SEnji Cooper /* mini-mtree for mountd */
9957718be8SEnji Cooper static const char *const dirs[] = { "/var", "/var/run", "/var/db" };
10057718be8SEnji Cooper for (size_t i = 0; i < __arraycount(dirs); i++)
10157718be8SEnji Cooper if (rump_sys_mkdir(dirs[i], 0777) == -1)
10257718be8SEnji Cooper err(1, "can't mkdir `%s'", dirs[i]);
10357718be8SEnji Cooper
10457718be8SEnji Cooper if (ffs_fstest_newfs(NULL, &fsarg,
10557718be8SEnji Cooper imagename, FSTEST_IMGSIZE, NULL) != 0)
10657718be8SEnji Cooper err(1, "newfs failed");
10757718be8SEnji Cooper if (ffs_fstest_mount(NULL, fsarg, exportpath, 0) != 0)
10857718be8SEnji Cooper err(1, "mount failed");
10957718be8SEnji Cooper
11057718be8SEnji Cooper #if 0
11157718be8SEnji Cooper /*
11257718be8SEnji Cooper * Serve from host instead of dedicated mount?
11357718be8SEnji Cooper * THIS IS MORE EVIL THAN MURRAY THE DEMONIC TALKING SKULL!
11457718be8SEnji Cooper */
11557718be8SEnji Cooper
11657718be8SEnji Cooper if (ukfs_modload("/usr/lib/librumpfs_syspuffs.so") < 1)
11757718be8SEnji Cooper errx(1, "modload");
11857718be8SEnji Cooper
11957718be8SEnji Cooper mount_syspuffs_parseargs(__arraycount(pnullarg), pnullarg,
12057718be8SEnji Cooper &args, &mntflags, canon_dev, canon_dir);
12157718be8SEnji Cooper if ((ukfs = ukfs_mount(MOUNT_PUFFS, "/", UKFS_DEFAULTMP, MNT_RDONLY,
12257718be8SEnji Cooper &args, sizeof(args))) == NULL)
12357718be8SEnji Cooper err(1, "mount");
12457718be8SEnji Cooper
12557718be8SEnji Cooper if (ukfs_modload("/usr/lib/librumpfs_nfsserver.so") < 1)
12657718be8SEnji Cooper errx(1, "modload");
12757718be8SEnji Cooper #endif
12857718be8SEnji Cooper
12957718be8SEnji Cooper if (sem_init(&gensem, 1, 0) == -1)
13057718be8SEnji Cooper err(1, "gensem init");
13157718be8SEnji Cooper
13257718be8SEnji Cooper /* create interface */
13357718be8SEnji Cooper netcfg_rump_makeshmif(ethername, ifname);
13457718be8SEnji Cooper netcfg_rump_if(ifname, serveraddr, netmask);
13557718be8SEnji Cooper
13657718be8SEnji Cooper netcfg_rump_makeshmif(ethername_ro, ifname_ro);
13757718be8SEnji Cooper netcfg_rump_if(ifname_ro, serveraddr_ro, netmask);
13857718be8SEnji Cooper
13957718be8SEnji Cooper /*
14057718be8SEnji Cooper * No syslogging, thanks.
14157718be8SEnji Cooper * XXX: "0" does not modify the mask, so pick something
14257718be8SEnji Cooper * which is unlikely to cause any logging
14357718be8SEnji Cooper */
14457718be8SEnji Cooper setlogmask(0x10000000);
14557718be8SEnji Cooper
14657718be8SEnji Cooper if (pthread_create(&t, NULL, rpcbind_main, NULL) == -1)
14757718be8SEnji Cooper err(1, "rpcbind");
14857718be8SEnji Cooper sem_wait(&gensem);
14957718be8SEnji Cooper
15057718be8SEnji Cooper if (pthread_create(&t, NULL, mountd_main, NULL) == -1)
15157718be8SEnji Cooper err(1, "mountd");
15257718be8SEnji Cooper sem_wait(&gensem);
15357718be8SEnji Cooper
15457718be8SEnji Cooper rv = 0;
15557718be8SEnji Cooper /* signal the other process we're almost done */
15657718be8SEnji Cooper if (write(3, &rv, 4) != 4)
15757718be8SEnji Cooper errx(1, "magic write failed");
15857718be8SEnji Cooper
15957718be8SEnji Cooper {
16057718be8SEnji Cooper char *nfsargv[] = { __UNCONST("nfsd"), NULL };
16157718be8SEnji Cooper nfsd_main(1, nfsargv);
16257718be8SEnji Cooper }
16357718be8SEnji Cooper /*NOTREACHED*/
16457718be8SEnji Cooper
16557718be8SEnji Cooper return 0;
16657718be8SEnji Cooper }
167