void nfsd() { struct sockaddr_in sin; int sock; bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(NFS_PORT); sin.sin_addr.s_addr = INADDR_ANY; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { nfsd_debug("nfsd: can't create nfsd socket\n"); return; } if (bind(sock, &sin, sizeof(sin)) < 0) { nfsd_debug("nfsd: can't bind to port %d\n", NFS_PORT); return; } rpcTaskInit(); nfsd_main(sock); }
int main(int argc, char *argv[]) { const char *ethername, *ethername_ro; const char *serveraddr, *serveraddr_ro; const char *netmask; const char *exportpath; const char *imagename; char ifname[IFNAMSIZ], ifname_ro[IFNAMSIZ]; void *fsarg; pthread_t t; int rv; /* for netcfg */ noatf = 1; /* use defaults? */ if (argc == 1) { ethername = "etherbus"; ethername_ro = "etherbus_ro"; serveraddr = "10.3.2.1"; serveraddr_ro = "10.4.2.1"; netmask = "255.255.255.0"; exportpath = "/myexport"; imagename = "ffs.img"; } else { ethername = argv[1]; ethername_ro = argv[2]; serveraddr = argv[3]; serveraddr_ro = argv[4]; netmask = argv[5]; exportpath = argv[6]; imagename = argv[7]; } rump_init(); svc_fdset_init(SVC_FDSET_MT); rv = rump_pub_etfs_register("/etc/exports", "./exports", RUMP_ETFS_REG); if (rv) { errx(1, "register /etc/exports: %s", strerror(rv)); } /* mini-mtree for mountd */ static const char *const dirs[] = { "/var", "/var/run", "/var/db" }; for (size_t i = 0; i < __arraycount(dirs); i++) if (rump_sys_mkdir(dirs[i], 0777) == -1) err(1, "can't mkdir `%s'", dirs[i]); if (ffs_fstest_newfs(NULL, &fsarg, imagename, FSTEST_IMGSIZE, NULL) != 0) err(1, "newfs failed"); if (ffs_fstest_mount(NULL, fsarg, exportpath, 0) != 0) err(1, "mount failed"); #if 0 /* * Serve from host instead of dedicated mount? * THIS IS MORE EVIL THAN MURRAY THE DEMONIC TALKING SKULL! */ if (ukfs_modload("/usr/lib/librumpfs_syspuffs.so") < 1) errx(1, "modload"); mount_syspuffs_parseargs(__arraycount(pnullarg), pnullarg, &args, &mntflags, canon_dev, canon_dir); if ((ukfs = ukfs_mount(MOUNT_PUFFS, "/", UKFS_DEFAULTMP, MNT_RDONLY, &args, sizeof(args))) == NULL) err(1, "mount"); if (ukfs_modload("/usr/lib/librumpfs_nfsserver.so") < 1) errx(1, "modload"); #endif if (sem_init(&gensem, 1, 0) == -1) err(1, "gensem init"); /* create interface */ netcfg_rump_makeshmif(ethername, ifname); netcfg_rump_if(ifname, serveraddr, netmask); netcfg_rump_makeshmif(ethername_ro, ifname_ro); netcfg_rump_if(ifname_ro, serveraddr_ro, netmask); /* * No syslogging, thanks. * XXX: "0" does not modify the mask, so pick something * which is unlikely to cause any logging */ setlogmask(0x10000000); if (pthread_create(&t, NULL, rpcbind_main, NULL) == -1) err(1, "rpcbind"); sem_wait(&gensem); if (pthread_create(&t, NULL, mountd_main, NULL) == -1) err(1, "mountd"); sem_wait(&gensem); rv = 0; /* signal the other process we're almost done */ if (write(3, &rv, 4) != 4) errx(1, "magic write failed"); { char *nfsargv[] = { __UNCONST("nfsd"), NULL }; nfsd_main(1, nfsargv); } /*NOTREACHED*/ return 0; }