*BSD News Article 79749


Return to BSD News archive

Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!nntp.coast.net!news.kei.com!news.mathworks.com!howland.erols.net!Frankfurt.Germany.EU.net!Stuttgart.Germany.EU.net!main.Germany.EU.net!Dortmund.Germany.EU.net!interface-business.de!usenet
From: j@ida.interface-business.de (J Wunsch)
Newsgroups: comp.unix.bsd.netbsd.misc
Subject: Re: Netbooting NetBSD/SPARC from FreeBSD-box
Date: 2 Oct 1996 14:09:08 GMT
Organization: interface business GmbH, Dresden
Lines: 216
Message-ID: <52tt24$asp@innocence.interface-business.de>
References: <51s4j3$2n0@charm.il.ft.hse.nl> <51ul84$68@pier2.bayarea.net>
  <3246E21F.FF6D5DF@freebsd.org>
Reply-To: joerg_wunsch@interface-business.de (Joerg Wunsch)
NNTP-Posting-Host: ida.interface-business.de
X-Newsreader: knews 0.9.6
X-Phone: +49-351-31809-14
X-Fax: +49-351-3361187
X-PGP-Fingerprint: DC 47 E6 E4 FF A6 E9 8F  93 21 E0 7D F9 12 D6 4E

"Jordan K. Hubbard" <jkh@FreeBSD.org> wrote:

> Ah, and a P.S. from FreeBSD's mountd manpage:
> 
>      -r      The -r option allows mount RPCs requests for regular files
> to be
>              served.

Yep, it has been back-ported from FreeBSD-current to be included in
2.1.5.  For the curious, here's the diff between FreeBSD 2.1R and
2.1.5R.  Maybe it's even applicable to NetBSD?

Index: mountd.8
===================================================================
RCS file: /home/ncvs/src/sbin/mountd/mountd.8,v
retrieving revision 1.3
retrieving revision 1.3.4.1
diff -u -r1.3 -r1.3.4.1
--- mountd.8	1995/02/22 21:42:48	1.3
+++ mountd.8	1996/01/11 00:12:44	1.3.4.1
@@ -30,7 +30,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\"     From: @(#)mountd.8	8.1 (Berkeley) 6/9/93
-.\"	$Id: mountd.8,v 1.3 1995/02/22 21:42:48 ats Exp $
+.\"	$Id: mountd.8,v 1.3.4.1 1996/01/11 00:12:44 joerg Exp $
 .\"
 .Dd September 22, 1994
 .Dt MOUNTD 8
@@ -42,7 +42,7 @@
 mount requests
 .Sh SYNOPSIS
 .Nm /sbin/mountd
-.Op Fl n
+.Op Fl nr
 .Op Ar exportsfile
 .Sh DESCRIPTION
 .Xr Mountd
@@ -65,6 +65,15 @@
 option allows non-root mount requests to be served.
 This should only be specified if there are clients such as PC's,
 that require it.
+.It Fl r
+The
+.Fl r
+option allows mount RPCs requests for regular files to be served.
+Although this seems to violate the mount protocol specification, some diskless
+workstations do mount requests for their swapfiles and expect them to be
+regular files. Since a regular file cannot be specified in /etc/exports, the
+entire file system that the swapfiles reside in will have to be exported with
+the ``-alldirs'' flag.
 .It Ar exportsfile
 The
 .Ar exportsfile
Index: mountd.c
===================================================================
RCS file: /home/ncvs/src/sbin/mountd/mountd.c,v
retrieving revision 1.8
retrieving revision 1.8.2.2
diff -u -r1.8 -r1.8.2.2
--- mountd.c	1995/06/11 19:30:46	1.8
+++ mountd.c	1996/01/11 00:12:45	1.8.2.2
@@ -43,7 +43,7 @@
 #ifndef lint
 /*static char sccsid[] = "From: @(#)mountd.c	8.8 (Berkeley) 2/20/94";*/
 static const char rcsid[] =
-	"$Id: mountd.c,v 1.8 1995/06/11 19:30:46 rgrimes Exp $";
+	"$Id: mountd.c,v 1.8.2.2 1996/01/11 00:12:45 joerg Exp $";
 #endif /*not lint*/
 
 #include <sys/param.h>
@@ -205,7 +205,8 @@
 	1,
 	{ (gid_t) -2 }
 };
-int root_only = 1;
+int resvport_only = 1;
+int dir_only = 1;
 int opt_flags;
 /* Bits for above */
 #define	OP_MAPROOT	0x01
@@ -238,6 +239,7 @@
 {
 	SVCXPRT *udptransp, *tcptransp;
 	int c;
+#ifdef __FreeBSD__
 	struct vfsconf *vfc;
 
 	vfc = getvfsbyname("nfs");
@@ -250,17 +252,21 @@
 	if(!vfc) {
 		errx(1, "NFS support is not available in the running kernel");
 	}
+#endif	/* __FreeBSD__ */
 
-	while ((c = getopt(argc, argv, "dn")) != EOF)
+	while ((c = getopt(argc, argv, "dnr")) != EOF)
 		switch (c) {
+		case 'n':
+			resvport_only = 0;
+			break;
+		case 'r':
+			dir_only = 0;
+			break;
 		case 'd':
 			debug = debug ? 0 : 1;
 			break;
-		case 'n':
-			root_only = 0;
-			break;
 		default:
-			fprintf(stderr, "Usage: mountd [-n] [export_file]\n");
+			fprintf(stderr, "Usage: mountd [-r] [-n] [export_file]\n");
 			exit(1);
 		};
 	argc -= optind;
@@ -329,6 +335,7 @@
 	struct statfs fsb;
 	struct hostent *hp;
 	u_long saddr;
+	u_short sport;
 	char rpcpath[RPCMNT_PATHLEN+1], dirpath[MAXPATHLEN];
 	int bad = ENOENT, omask, defset;
 	uid_t uid = -2;
@@ -345,6 +352,7 @@
 	}
 
 	saddr = transp->xp_raddr.sin_addr.s_addr;
+	sport = ntohs(transp->xp_raddr.sin_port);
 	hp = (struct hostent *)NULL;
 	switch (rqstp->rq_proc) {
 	case NULLPROC:
@@ -352,7 +360,7 @@
 			syslog(LOG_ERR, "Can't send reply");
 		return;
 	case RPCMNT_MOUNT:
-		if ((uid != 0 && root_only) || uid == -2) {
+		if (sport >= IPPORT_RESERVED && resvport_only) {
 			svcerr_weakauth(transp);
 			return;
 		}
@@ -363,11 +371,13 @@
 
 		/*
 		 * Get the real pathname and make sure it is a directory
-		 * that exists.
+		 * or a regular file if the -r option was specified
+		 * and it exists.
 		 */
 		if (realpath(rpcpath, dirpath) == 0 ||
 		    stat(dirpath, &stb) < 0 ||
-		    (stb.st_mode & S_IFMT) != S_IFDIR ||
+		    (!S_ISDIR(stb.st_mode) &&
+		     (dir_only || !S_ISREG(stb.st_mode))) ||
 		    statfs(dirpath, &fsb) < 0) {
 			chdir("/");	/* Just in case realpath doesn't */
 			if (debug)
@@ -421,7 +431,7 @@
 			syslog(LOG_ERR, "Can't send reply");
 		return;
 	case RPCMNT_UMOUNT:
-		if ((uid != 0 && root_only) || uid == -2) {
+		if (sport >= IPPORT_RESERVED && resvport_only) {
 			svcerr_weakauth(transp);
 			return;
 		}
@@ -437,7 +447,7 @@
 		del_mlist(inet_ntoa(transp->xp_raddr.sin_addr), dirpath);
 		return;
 	case RPCMNT_UMNTALL:
-		if ((uid != 0 && root_only) || uid == -2) {
+		if (sport >= IPPORT_RESERVED && resvport_only) {
 			svcerr_weakauth(transp);
 			return;
 		}
@@ -832,7 +842,7 @@
 			hpe = (struct hostent *)malloc(sizeof(struct hostent));
 			if (hpe == (struct hostent *)NULL)
 				out_of_mem();
-			hpe->h_name = "Default";
+			hpe->h_name = strdup("Default");
 			hpe->h_addrtype = AF_INET;
 			hpe->h_length = sizeof (u_long);
 			hpe->h_addr_list = (char **)NULL;
Index: netgroup.5
===================================================================
RCS file: /home/ncvs/src/sbin/mountd/netgroup.5,v
retrieving revision 1.1.1.1.6.1
retrieving revision 1.1.1.1.6.2
diff -u -r1.1.1.1.6.1 -r1.1.1.1.6.2
--- netgroup.5	1995/08/26 06:16:47	1.1.1.1.6.1
+++ netgroup.5	1996/01/30 14:00:38	1.1.1.1.6.2
@@ -90,7 +90,7 @@
 .Nm netgroup
 memberships are computed on the fly. By contrast, the NIS
 .Nm netgroup
-database consists of three seperate maps (netgroup, netgroup.byuser
+database consists of three separate maps (netgroup, netgroup.byuser
 and netgroup.byhost) that are keyed to allow
 .Fn innetgr 3
 lookups to be done quickly. The FreeBSD
@@ -118,7 +118,7 @@
 .Nm netgroup
 information (with no NIS '+' token), then only the local
 .Nm netgroup
-information will be processed (and NIS will be ingored).
+information will be processed (and NIS will be ignored).
 .It
 If
 .Pa /etc/netgroup


-- 
J"org Wunsch					       Unix support engineer
joerg_wunsch@interface-business.de       http://www.interface-business.de/~j