xref: /csrg-svn/sbin/mount_nfs/mount_nfs.c (revision 52989)
152112Smckusick /*
252112Smckusick  * Copyright (c) 1992 The Regents of the University of California.
352112Smckusick  * All rights reserved.
452112Smckusick  *
552112Smckusick  * This code is derived from software contributed to Berkeley by
652112Smckusick  * Rick Macklem at The University of Guelph.
752112Smckusick  *
852112Smckusick  * %sccs.include.redist.c%
952112Smckusick  */
1052112Smckusick 
1152112Smckusick #ifndef lint
1252112Smckusick char copyright[] =
1352112Smckusick "@(#) Copyright (c) 1992 The Regents of the University of California.\n\
1452112Smckusick  All rights reserved.\n";
1552112Smckusick #endif /* not lint */
1652112Smckusick 
1752112Smckusick #ifndef lint
18*52989Smckusick static char sccsid[] = "@(#)mount_nfs.c	5.2 (Berkeley) 03/17/92";
1952112Smckusick #endif /* not lint */
2052112Smckusick 
2152112Smckusick #include <stdio.h>
2252112Smckusick #include <signal.h>
2352112Smckusick #include <strings.h>
2452112Smckusick #include <sys/syslog.h>
2552112Smckusick #include <sys/param.h>
2652112Smckusick #include <sys/file.h>
2752112Smckusick #include <sys/errno.h>
2852112Smckusick #include <sys/ucred.h>
2952112Smckusick #include <sys/mount.h>
3052112Smckusick #include <sys/socket.h>
3152112Smckusick #include <sys/socketvar.h>
3252112Smckusick #include <netdb.h>
3352112Smckusick #include <rpc/rpc.h>
3452112Smckusick #include <rpc/pmap_clnt.h>
3552112Smckusick #include <rpc/pmap_prot.h>
3652112Smckusick #ifdef ISO
3752112Smckusick #include <netiso/iso.h>
3852112Smckusick #endif
3952112Smckusick #ifdef KERBEROS
4052112Smckusick #include <kerberosIV/krb.h>
4152112Smckusick #endif
4252112Smckusick #include <nfs/rpcv2.h>
4352112Smckusick #include <nfs/nfsv2.h>
4452112Smckusick #include <nfs/nfs.h>
4552112Smckusick #include <nfs/nqnfs.h>
4652112Smckusick 
4752112Smckusick int xdr_dir(), xdr_fh();
4852112Smckusick struct nfs_args nfsdefargs = {
4952112Smckusick 	(struct sockaddr *)0,
5052112Smckusick 	sizeof (struct sockaddr_in),
5152112Smckusick 	SOCK_DGRAM,
5252112Smckusick 	0,
5352112Smckusick 	(nfsv2fh_t *)0,
5452112Smckusick 	0,
5552112Smckusick 	NFS_WSIZE,
5652112Smckusick 	NFS_RSIZE,
5752112Smckusick 	NFS_TIMEO,
5852112Smckusick 	NFS_RETRANS,
5952112Smckusick 	NFS_MAXGRPS,
6052112Smckusick 	NFS_DEFRAHEAD,
6152112Smckusick 	NQ_DEFLEASE,
6252112Smckusick 	NQ_DEADTHRESH,
6352112Smckusick 	(char *)0,
6452112Smckusick };
6552112Smckusick 
6652112Smckusick struct nfhret {
6752112Smckusick 	u_long	stat;
6852112Smckusick 	nfsv2fh_t nfh;
6952112Smckusick };
7052112Smckusick #define	DEF_RETRY	10000
7152112Smckusick #define	BGRND	1
7252112Smckusick #define	ISBGRND	2
7352112Smckusick int retrycnt = DEF_RETRY;
7452112Smckusick int opflags = 0;
7552112Smckusick extern int errno;
7652112Smckusick 
7752112Smckusick #ifdef ISO
7852112Smckusick struct iso_addr *iso_addr();
7952112Smckusick #endif
8052112Smckusick 
8152112Smckusick #ifdef KERBEROS
8252112Smckusick char inst[INST_SZ];
8352112Smckusick char realm[REALM_SZ];
8452112Smckusick KTEXT_ST kt;
8552112Smckusick #endif
8652112Smckusick 
8752112Smckusick main(argc, argv, arge)
8852112Smckusick 	int argc;
8952112Smckusick 	char **argv;
9052112Smckusick 	char **arge;
9152112Smckusick {
9252112Smckusick 	struct nfs_args nfsargs;
9352112Smckusick 	register int c;
9452112Smckusick 	register struct nfs_args *nfsargsp = &nfsargs;
9552112Smckusick 	struct nfsd_cargs ncd;
9652112Smckusick 	int num, flags = 0, match = 1, i, nfssvc_flag;
9752112Smckusick 	char *spec, *name;
9852112Smckusick 	uid_t last_ruid = -1;
9952112Smckusick 	extern int optind;
10052112Smckusick 	extern char *optarg;
10152112Smckusick 
10252112Smckusick #ifdef KERBEROS
10352112Smckusick 	strcpy(realm, KRB_REALM);
10452112Smckusick #endif
10552112Smckusick 	nfsargs = nfsdefargs;
10652112Smckusick 	retrycnt = DEF_RETRY;
10752112Smckusick 	if (argc <= 1)
10852112Smckusick 		Usage(argc, argv);
109*52989Smckusick 	while ((c = getopt(argc, argv, "bsiTpMlqdckPF:R:r:w:t:x:g:a:L:D:Km:"))
11052112Smckusick 		!= EOF)
11152112Smckusick 		switch (c) {
11252112Smckusick 		case 'b':
11352112Smckusick 			opflags |= BGRND;
11452112Smckusick 			break;
11552112Smckusick 		case 's':
11652112Smckusick 			nfsargsp->flags |= NFSMNT_SOFT;
11752112Smckusick 			break;
11852112Smckusick 		case 'i':
11952112Smckusick 			nfsargsp->flags |= NFSMNT_INT;
12052112Smckusick 			break;
12152112Smckusick 		case 'T':
12252112Smckusick 			nfsargsp->sotype = SOCK_STREAM;
12352112Smckusick 			break;
12452112Smckusick #ifdef ISO
12552112Smckusick 		case 'p':
12652112Smckusick 			nfsargsp->sotype = SOCK_SEQPACKET;
12752112Smckusick 			break;
12852112Smckusick #endif
12952112Smckusick 		case 'M':
13052112Smckusick 			nfsargsp->flags |= NFSMNT_MYWRITE;
13152112Smckusick 			break;
13252112Smckusick 		case 'l':
13352112Smckusick 			nfsargsp->flags |= NFSMNT_RDIRALOOK;
13452112Smckusick 			break;
13552112Smckusick 		case 'q':
13652112Smckusick 			nfsargsp->flags |= NFSMNT_NQNFS;
13752112Smckusick 			break;
13852112Smckusick 		case 'd':
13952112Smckusick 			nfsargsp->flags |= NFSMNT_DUMBTIMR;
14052112Smckusick 			break;
14152112Smckusick 		case 'c':
14252112Smckusick 			nfsargsp->flags |= NFSMNT_NOCONN;
14352112Smckusick 			break;
14452112Smckusick 		case 'k':
14552112Smckusick 			nfsargsp->flags |= NFSMNT_NQLOOKLEASE;
14652112Smckusick 			break;
147*52989Smckusick 		case 'P':
148*52989Smckusick 			nfsargsp->flags |= NFSMNT_RESVPORT;
149*52989Smckusick 			break;
15052112Smckusick 		case 'F':
15152112Smckusick 			if ((num = atoi(optarg)) != 0)
15252112Smckusick 				flags = num;
15352112Smckusick 			break;
15452112Smckusick 		case 'R':
15552112Smckusick 			if ((num = atoi(optarg)) > 0)
15652112Smckusick 				retrycnt = num;
15752112Smckusick 			break;
15852112Smckusick 		case 'r':
15952112Smckusick 			if ((num = atoi(optarg)) > 0) {
16052112Smckusick 				nfsargsp->rsize = num;
16152112Smckusick 				nfsargsp->flags |= NFSMNT_RSIZE;
16252112Smckusick 			}
16352112Smckusick 			break;
16452112Smckusick 		case 'w':
16552112Smckusick 			if ((num = atoi(optarg)) > 0) {
16652112Smckusick 				nfsargsp->wsize = num;
16752112Smckusick 				nfsargsp->flags |= NFSMNT_WSIZE;
16852112Smckusick 			}
16952112Smckusick 			break;
17052112Smckusick 		case 't':
17152112Smckusick 			if ((num = atoi(optarg)) > 0) {
17252112Smckusick 				nfsargsp->timeo = num;
17352112Smckusick 				nfsargsp->flags |= NFSMNT_TIMEO;
17452112Smckusick 			}
17552112Smckusick 			break;
17652112Smckusick 		case 'x':
17752112Smckusick 			if ((num = atoi(optarg)) > 0) {
17852112Smckusick 				nfsargsp->retrans = num;
17952112Smckusick 				nfsargsp->flags |= NFSMNT_RETRANS;
18052112Smckusick 			}
18152112Smckusick 			break;
18252112Smckusick 		case 'g':
18352112Smckusick 			if ((num = atoi(optarg)) > 0) {
18452112Smckusick 				nfsargsp->maxgrouplist = num;
18552112Smckusick 				nfsargsp->flags |= NFSMNT_MAXGRPS;
18652112Smckusick 			}
18752112Smckusick 			break;
18852112Smckusick 		case 'a':
18952112Smckusick 			if ((num = atoi(optarg)) >= 0) {
19052112Smckusick 				nfsargsp->readahead = num;
19152112Smckusick 				nfsargsp->flags |= NFSMNT_READAHEAD;
19252112Smckusick 			}
19352112Smckusick 			break;
19452112Smckusick 		case 'L':
19552112Smckusick 			if ((num = atoi(optarg)) >= 2) {
19652112Smckusick 				nfsargsp->leaseterm = num;
19752112Smckusick 				nfsargsp->flags |= NFSMNT_LEASETERM;
19852112Smckusick 			}
19952112Smckusick 			break;
20052112Smckusick 		case 'D':
20152112Smckusick 			if ((num = atoi(optarg)) > 0) {
20252112Smckusick 				nfsargsp->deadthresh = num;
20352112Smckusick 				nfsargsp->flags |= NFSMNT_DEADTHRESH;
20452112Smckusick 			}
20552112Smckusick 			break;
20652112Smckusick #ifdef KERBEROS
20752112Smckusick 		case 'K':
20852112Smckusick 			nfsargsp->flags |= NFSMNT_KERB;
20952112Smckusick 			break;
21052112Smckusick 		case 'm':
21152112Smckusick 			strncpy(realm, optarg, REALM_SZ - 1);
21252112Smckusick 			realm[REALM_SZ - 1] = '\0';
21352112Smckusick 			break;
21452112Smckusick #endif /* KERBEROS */
21552112Smckusick 		default:
21652112Smckusick 			Usage(argc, argv);
21752112Smckusick 		};
21852112Smckusick 	if ((argc - optind) == 2) {
21952112Smckusick 		spec = argv[optind];
22052112Smckusick 		name = argv[optind + 1];
22152112Smckusick 	} else
22252112Smckusick 		Usage(argc, argv);
22352112Smckusick 	if (getnfsargs(spec, nfsargsp)) {
22452112Smckusick 		if (mount(MOUNT_NFS, name, flags, nfsargsp))
22552112Smckusick 			exit(1);
22652112Smckusick 		if (nfsargsp->flags & (NFSMNT_NQNFS | NFSMNT_KERB)) {
22752112Smckusick 			if ((opflags & ISBGRND) == 0) {
22852112Smckusick 				if (i = fork()) {
22952112Smckusick 					if (i == -1) {
23052112Smckusick 						perror("nqnfs");
23152112Smckusick 						exit(1);
23252112Smckusick 					}
23352112Smckusick 					exit();
23452112Smckusick 				}
23552112Smckusick 				(void) setsid();
23652112Smckusick 				(void) close(0);
23752112Smckusick 				(void) close(1);
23852112Smckusick 				(void) close(2);
23952112Smckusick 				(void) chdir("/");
24052112Smckusick 			}
24152112Smckusick 			openlog("mount_nfs:", LOG_PID, LOG_DAEMON);
24252112Smckusick 			nfssvc_flag = NFSSVC_MNTD;
24352112Smckusick 			ncd.ncd_dirp = name;
24452112Smckusick 			while (nfssvc(nfssvc_flag, (caddr_t)&ncd) < 0) {
24552112Smckusick 			    if (errno == ENEEDAUTH) {
24652112Smckusick syslog(LOG_ERR, "in eacces");
24752112Smckusick 				nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH |
24852112Smckusick 					NFSSVC_AUTHINFAIL;
24952112Smckusick #ifdef KERBEROS
25052112Smckusick syslog(LOG_ERR,"Callin krb uid=%d inst=%s realm=%s",ncd.ncd_authuid,inst,realm);
25152112Smckusick 				/*
25252112Smckusick 				 * Set up as ncd_authuid for the kerberos call.
25352112Smckusick 				 * Must set ruid to ncd_authuid and reset the
25452112Smckusick 				 * ticket name iff ncd_authuid is not the same
25552112Smckusick 				 * as last time, so that the right ticket file
25652112Smckusick 				 * is found.
25752112Smckusick 				 */
25852112Smckusick 				if (ncd.ncd_authuid != last_ruid) {
25952112Smckusick 					krb_set_tkt_string("");
26052112Smckusick 					last_ruid = ncd.ncd_authuid;
26152112Smckusick 				}
26252112Smckusick 				setreuid(ncd.ncd_authuid, 0);
26352112Smckusick 				if (krb_mk_req(&kt, "rcmd", inst, realm, 0) ==
26452112Smckusick 				    KSUCCESS &&
26552112Smckusick 				    kt.length <= (RPCAUTH_MAXSIZ - 2*NFSX_UNSIGNED)) {
26652112Smckusick syslog(LOG_ERR,"Got it\n");
26752112Smckusick 				    ncd.ncd_authtype = RPCAUTH_NQNFS;
26852112Smckusick 				    ncd.ncd_authlen = kt.length;
26952112Smckusick 				    ncd.ncd_authstr = (char *)kt.dat;
27052112Smckusick 				    nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH;
27152112Smckusick 				}
27252112Smckusick 				setreuid(0, 0);
27352112Smckusick syslog(LOG_ERR,"ktlen=%d\n", kt.length);
27452112Smckusick #endif /* KERBEROS */
27552112Smckusick 			    } else
27652112Smckusick 				syslog(LOG_ERR, "nfssvc err %m");
27752112Smckusick 			}
27852112Smckusick 		}
27952112Smckusick 		exit();
28052112Smckusick 	} else
28152112Smckusick 		exit(1);
28252112Smckusick }
28352112Smckusick 
28452112Smckusick getnfsargs(spec, nfsargsp)
28552112Smckusick 	char *spec;
28652112Smckusick 	struct nfs_args *nfsargsp;
28752112Smckusick {
28852112Smckusick 	register CLIENT *clp;
28952112Smckusick 	struct hostent *hp;
29052112Smckusick 	static struct sockaddr_in saddr;
29152112Smckusick #ifdef ISO
29252112Smckusick 	static struct sockaddr_iso isoaddr;
29352112Smckusick 	struct iso_addr *isop;
29452112Smckusick #endif
29552112Smckusick 	struct timeval pertry, try;
29652112Smckusick 	enum clnt_stat clnt_stat;
29752112Smckusick 	int so = RPC_ANYSOCK, isoflag = 0, i;
29852112Smckusick 	char *hostp, *delimp, *cp;
29952112Smckusick 	u_short tport;
30052112Smckusick 	static struct nfhret nfhret;
30152112Smckusick 	static char nam[MNAMELEN + 1];
30252112Smckusick 
30352112Smckusick 	strncpy(nam, spec, MNAMELEN);
30452112Smckusick 	nam[MNAMELEN] = '\0';
30552112Smckusick 	if ((delimp = index(spec, '@')) != NULL) {
30652112Smckusick 		hostp = delimp + 1;
30752112Smckusick 	} else if ((delimp = index(spec, ':')) != NULL) {
30852112Smckusick 		hostp = spec;
30952112Smckusick 		spec = delimp + 1;
31052112Smckusick 	} else {
31152112Smckusick 		fprintf(stderr,
31252112Smckusick 		    "No <host>:<dirpath> or <dirpath>@<host> spec\n");
31352112Smckusick 		return (0);
31452112Smckusick 	}
31552112Smckusick 	*delimp = '\0';
31652112Smckusick 	/*
31752112Smckusick 	 * DUMB!! Until the mount protocol works on iso transport, we must
31852112Smckusick 	 * supply both an iso and an inet address for the host.
31952112Smckusick 	 */
32052112Smckusick #ifdef ISO
32152112Smckusick 	if (!strncmp(hostp, "iso=", 4)) {
32252112Smckusick 		u_short isoport;
32352112Smckusick 
32452112Smckusick 		hostp += 4;
32552112Smckusick 		isoflag++;
32652112Smckusick 		if ((delimp = index(hostp, '+')) == NULL) {
32752112Smckusick 			fprintf(stderr, "No iso+inet address\n");
32852112Smckusick 			return (0);
32952112Smckusick 		}
33052112Smckusick 		*delimp = '\0';
33152112Smckusick 		if ((isop = iso_addr(hostp)) == NULL) {
33252112Smckusick 			fprintf(stderr, "Bad iso address\n");
33352112Smckusick 			return (0);
33452112Smckusick 		}
33552112Smckusick 		bzero((caddr_t)&isoaddr, sizeof (isoaddr));
33652112Smckusick 		bcopy((caddr_t)isop, (caddr_t)&isoaddr.siso_addr,
33752112Smckusick 			sizeof (struct iso_addr));
33852112Smckusick 		isoaddr.siso_len = sizeof (isoaddr);
33952112Smckusick 		isoaddr.siso_family = AF_ISO;
34052112Smckusick 		isoaddr.siso_tlen = 2;
34152112Smckusick 		isoport = htons(NFS_PORT);
34252112Smckusick 		bcopy((caddr_t)&isoport, TSEL(&isoaddr), isoaddr.siso_tlen);
34352112Smckusick 		hostp = delimp + 1;
34452112Smckusick 	}
34552112Smckusick #endif /* ISO */
34652112Smckusick 
34752112Smckusick 	/*
34852112Smckusick 	 * Handle an internet host address and reverse resolve it if
34952112Smckusick 	 * doing Kerberos.
35052112Smckusick 	 */
35152112Smckusick 	if (isdigit(*hostp)) {
35252112Smckusick 		if ((saddr.sin_addr.s_addr = inet_addr(hostp)) == -1) {
35352112Smckusick 			fprintf(stderr, "Bad net addr %s\n", hostp);
35452112Smckusick 			return (0);
35552112Smckusick 		}
35652112Smckusick 		if ((nfsargsp->flags & NFSMNT_KERB) &&
35752112Smckusick 		    (hp = gethostbyaddr((char *)&saddr.sin_addr.s_addr,
35852112Smckusick 			sizeof (u_long), AF_INET)) == (struct hostent *)0) {
35952112Smckusick 			fprintf(stderr, "Can't reverse resolve net addr\n");
36052112Smckusick 			return (0);
36152112Smckusick 		}
36252112Smckusick 	} else if ((hp = gethostbyname(hostp)) == NULL) {
36352112Smckusick 		fprintf(stderr, "Can't get net id for host\n");
36452112Smckusick 		return (0);
36552112Smckusick 	}
36652112Smckusick #ifdef KERBEROS
36752112Smckusick 	if (nfsargsp->flags & NFSMNT_KERB) {
36852112Smckusick 		strncpy(inst, hp->h_name, INST_SZ);
36952112Smckusick 		inst[INST_SZ - 1] = '\0';
37052112Smckusick 		if (cp = index(inst, '.'))
37152112Smckusick 			*cp = '\0';
37252112Smckusick 	}
37352112Smckusick #endif /* KERBEROS */
37452112Smckusick 
37552112Smckusick 	bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length);
37652112Smckusick 	nfhret.stat = EACCES;	/* Mark not yet successful */
37752112Smckusick 	while (retrycnt > 0) {
37852112Smckusick 		saddr.sin_family = AF_INET;
37952112Smckusick 		saddr.sin_port = htons(PMAPPORT);
38052112Smckusick 		if ((tport = pmap_getport(&saddr, RPCPROG_NFS,
38152112Smckusick 		    NFS_VER2, IPPROTO_UDP)) == 0) {
38252112Smckusick 			if ((opflags & ISBGRND) == 0)
38352112Smckusick 				clnt_pcreateerror("NFS Portmap");
38452112Smckusick 		} else {
38552112Smckusick 			saddr.sin_port = 0;
38652112Smckusick 			pertry.tv_sec = 10;
38752112Smckusick 			pertry.tv_usec = 0;
38852112Smckusick 			if ((clp = clntudp_create(&saddr, RPCPROG_MNT,
38952112Smckusick 			    RPCMNT_VER1, pertry, &so)) == NULL) {
39052112Smckusick 				if ((opflags & ISBGRND) == 0)
39152112Smckusick 					clnt_pcreateerror("Cannot MNT PRC");
39252112Smckusick 			} else {
39352112Smckusick 				clp->cl_auth = authunix_create_default();
39452112Smckusick 				try.tv_sec = 10;
39552112Smckusick 				try.tv_usec = 0;
39652112Smckusick 				clnt_stat = clnt_call(clp, RPCMNT_MOUNT,
39752112Smckusick 				    xdr_dir, spec, xdr_fh, &nfhret, try);
39852112Smckusick 				if (clnt_stat != RPC_SUCCESS) {
39952112Smckusick 					if ((opflags & ISBGRND) == 0)
40052112Smckusick 						clnt_perror(clp, "Bad MNT RPC");
40152112Smckusick 				} else {
40252112Smckusick 					auth_destroy(clp->cl_auth);
40352112Smckusick 					clnt_destroy(clp);
40452112Smckusick 					retrycnt = 0;
40552112Smckusick 				}
40652112Smckusick 			}
40752112Smckusick 		}
40852112Smckusick 		if (--retrycnt > 0) {
40952112Smckusick 			if (opflags & BGRND) {
41052112Smckusick 				opflags &= ~BGRND;
41152112Smckusick 				if (i = fork()) {
41252112Smckusick 					if (i == -1) {
41352112Smckusick 						perror("nqnfs");
41452112Smckusick 						exit(1);
41552112Smckusick 					}
41652112Smckusick 					exit();
41752112Smckusick 				}
41852112Smckusick 				(void) setsid();
41952112Smckusick 				(void) close(0);
42052112Smckusick 				(void) close(1);
42152112Smckusick 				(void) close(2);
42252112Smckusick 				(void) chdir("/");
42352112Smckusick 				opflags |= ISBGRND;
42452112Smckusick 			}
42552112Smckusick 			sleep(60);
42652112Smckusick 		}
42752112Smckusick 	}
42852112Smckusick 	if (nfhret.stat) {
42952112Smckusick 		if (opflags & ISBGRND)
43052112Smckusick 			exit(1);
43152112Smckusick 		fprintf(stderr, "Can't access %s: ", spec);
43252112Smckusick 		errno = nfhret.stat;
43352112Smckusick 		perror(NULL);
43452112Smckusick 		return (0);
43552112Smckusick 	}
43652112Smckusick 	saddr.sin_port = htons(tport);
43752112Smckusick #ifdef ISO
43852112Smckusick 	if (isoflag) {
43952112Smckusick 		nfsargsp->addr = (struct sockaddr *) &isoaddr;
44052112Smckusick 		nfsargsp->addrlen = sizeof (isoaddr);
44152112Smckusick 	} else
44252112Smckusick #endif /* ISO */
44352112Smckusick 	{
44452112Smckusick 		nfsargsp->addr = (struct sockaddr *) &saddr;
44552112Smckusick 		nfsargsp->addrlen = sizeof (saddr);
44652112Smckusick 	}
44752112Smckusick 	nfsargsp->fh = &nfhret.nfh;
44852112Smckusick 	nfsargsp->hostname = nam;
44952112Smckusick 	return (1);
45052112Smckusick }
45152112Smckusick 
45252112Smckusick /*
45352112Smckusick  * xdr routines for mount rpc's
45452112Smckusick  */
45552112Smckusick xdr_dir(xdrsp, dirp)
45652112Smckusick 	XDR *xdrsp;
45752112Smckusick 	char *dirp;
45852112Smckusick {
45952112Smckusick 	return (xdr_string(xdrsp, &dirp, RPCMNT_PATHLEN));
46052112Smckusick }
46152112Smckusick 
46252112Smckusick xdr_fh(xdrsp, np)
46352112Smckusick 	XDR *xdrsp;
46452112Smckusick 	struct nfhret *np;
46552112Smckusick {
46652112Smckusick 	if (!xdr_u_long(xdrsp, &(np->stat)))
46752112Smckusick 		return (0);
46852112Smckusick 	if (np->stat)
46952112Smckusick 		return (1);
47052112Smckusick 	return (xdr_opaque(xdrsp, (caddr_t)&(np->nfh), NFSX_FH));
47152112Smckusick }
47252112Smckusick 
47352112Smckusick Usage(argc, argv)
47452112Smckusick 	int argc;
47552112Smckusick 	char *argv[];
47652112Smckusick {
47752112Smckusick 	register int i;
47852112Smckusick 
47952112Smckusick 	for (i = 0; i < argc; i++)
48052112Smckusick 		fprintf(stderr, "%s ", argv[i]);
48152112Smckusick 	fprintf(stderr, "\nBad mount_nfs arg\n");
48252112Smckusick 	exit(1);
48352112Smckusick }
484