xref: /freebsd-src/contrib/netbsd-tests/fs/nfs/nfsservice/rumpnfsd.c (revision c22165b4f1f5d38b681921797a44b3ba8c13b7e0)
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