xref: /csrg-svn/sbin/mount_nfs/mount_nfs.c (revision 52112)
1*52112Smckusick /*
2*52112Smckusick  * Copyright (c) 1992 The Regents of the University of California.
3*52112Smckusick  * All rights reserved.
4*52112Smckusick  *
5*52112Smckusick  * This code is derived from software contributed to Berkeley by
6*52112Smckusick  * Rick Macklem at The University of Guelph.
7*52112Smckusick  *
8*52112Smckusick  * %sccs.include.redist.c%
9*52112Smckusick  */
10*52112Smckusick 
11*52112Smckusick #ifndef lint
12*52112Smckusick char copyright[] =
13*52112Smckusick "@(#) Copyright (c) 1992 The Regents of the University of California.\n\
14*52112Smckusick  All rights reserved.\n";
15*52112Smckusick #endif /* not lint */
16*52112Smckusick 
17*52112Smckusick #ifndef lint
18*52112Smckusick static char sccsid[] = "@(#)mount_nfs.c	5.1 (Berkeley) 01/06/92";
19*52112Smckusick #endif /* not lint */
20*52112Smckusick 
21*52112Smckusick #include <stdio.h>
22*52112Smckusick #include <signal.h>
23*52112Smckusick #include <strings.h>
24*52112Smckusick #include <sys/syslog.h>
25*52112Smckusick #include <sys/param.h>
26*52112Smckusick #include <sys/file.h>
27*52112Smckusick #include <sys/errno.h>
28*52112Smckusick #include <sys/ucred.h>
29*52112Smckusick #include <sys/mount.h>
30*52112Smckusick #include <sys/socket.h>
31*52112Smckusick #include <sys/socketvar.h>
32*52112Smckusick #include <netdb.h>
33*52112Smckusick #include <rpc/rpc.h>
34*52112Smckusick #include <rpc/pmap_clnt.h>
35*52112Smckusick #include <rpc/pmap_prot.h>
36*52112Smckusick #ifdef ISO
37*52112Smckusick #include <netiso/iso.h>
38*52112Smckusick #endif
39*52112Smckusick #ifdef KERBEROS
40*52112Smckusick #include <kerberosIV/krb.h>
41*52112Smckusick #endif
42*52112Smckusick #include <nfs/rpcv2.h>
43*52112Smckusick #include <nfs/nfsv2.h>
44*52112Smckusick #include <nfs/nfs.h>
45*52112Smckusick #include <nfs/nqnfs.h>
46*52112Smckusick 
47*52112Smckusick int xdr_dir(), xdr_fh();
48*52112Smckusick struct nfs_args nfsdefargs = {
49*52112Smckusick 	(struct sockaddr *)0,
50*52112Smckusick 	sizeof (struct sockaddr_in),
51*52112Smckusick 	SOCK_DGRAM,
52*52112Smckusick 	0,
53*52112Smckusick 	(nfsv2fh_t *)0,
54*52112Smckusick 	0,
55*52112Smckusick 	NFS_WSIZE,
56*52112Smckusick 	NFS_RSIZE,
57*52112Smckusick 	NFS_TIMEO,
58*52112Smckusick 	NFS_RETRANS,
59*52112Smckusick 	NFS_MAXGRPS,
60*52112Smckusick 	NFS_DEFRAHEAD,
61*52112Smckusick 	NQ_DEFLEASE,
62*52112Smckusick 	NQ_DEADTHRESH,
63*52112Smckusick 	(char *)0,
64*52112Smckusick };
65*52112Smckusick 
66*52112Smckusick struct nfhret {
67*52112Smckusick 	u_long	stat;
68*52112Smckusick 	nfsv2fh_t nfh;
69*52112Smckusick };
70*52112Smckusick #define	DEF_RETRY	10000
71*52112Smckusick #define	BGRND	1
72*52112Smckusick #define	ISBGRND	2
73*52112Smckusick int retrycnt = DEF_RETRY;
74*52112Smckusick int opflags = 0;
75*52112Smckusick extern int errno;
76*52112Smckusick 
77*52112Smckusick #ifdef ISO
78*52112Smckusick struct iso_addr *iso_addr();
79*52112Smckusick #endif
80*52112Smckusick 
81*52112Smckusick #ifdef KERBEROS
82*52112Smckusick char inst[INST_SZ];
83*52112Smckusick char realm[REALM_SZ];
84*52112Smckusick KTEXT_ST kt;
85*52112Smckusick #endif
86*52112Smckusick 
87*52112Smckusick main(argc, argv, arge)
88*52112Smckusick 	int argc;
89*52112Smckusick 	char **argv;
90*52112Smckusick 	char **arge;
91*52112Smckusick {
92*52112Smckusick 	struct nfs_args nfsargs;
93*52112Smckusick 	register int c;
94*52112Smckusick 	register struct nfs_args *nfsargsp = &nfsargs;
95*52112Smckusick 	struct nfsd_cargs ncd;
96*52112Smckusick 	int num, flags = 0, match = 1, i, nfssvc_flag;
97*52112Smckusick 	char *spec, *name;
98*52112Smckusick 	uid_t last_ruid = -1;
99*52112Smckusick 	extern int optind;
100*52112Smckusick 	extern char *optarg;
101*52112Smckusick 
102*52112Smckusick #ifdef KERBEROS
103*52112Smckusick 	strcpy(realm, KRB_REALM);
104*52112Smckusick #endif
105*52112Smckusick 	nfsargs = nfsdefargs;
106*52112Smckusick 	retrycnt = DEF_RETRY;
107*52112Smckusick 	if (argc <= 1)
108*52112Smckusick 		Usage(argc, argv);
109*52112Smckusick 	while ((c = getopt(argc, argv, "bsiTpMlqdckF:R:r:w:t:x:g:a:L:D:Km:"))
110*52112Smckusick 		!= EOF)
111*52112Smckusick 		switch (c) {
112*52112Smckusick 		case 'b':
113*52112Smckusick 			opflags |= BGRND;
114*52112Smckusick 			break;
115*52112Smckusick 		case 's':
116*52112Smckusick 			nfsargsp->flags |= NFSMNT_SOFT;
117*52112Smckusick 			break;
118*52112Smckusick 		case 'i':
119*52112Smckusick 			nfsargsp->flags |= NFSMNT_INT;
120*52112Smckusick 			break;
121*52112Smckusick 		case 'T':
122*52112Smckusick 			nfsargsp->sotype = SOCK_STREAM;
123*52112Smckusick 			break;
124*52112Smckusick #ifdef ISO
125*52112Smckusick 		case 'p':
126*52112Smckusick 			nfsargsp->sotype = SOCK_SEQPACKET;
127*52112Smckusick 			break;
128*52112Smckusick #endif
129*52112Smckusick 		case 'M':
130*52112Smckusick 			nfsargsp->flags |= NFSMNT_MYWRITE;
131*52112Smckusick 			break;
132*52112Smckusick 		case 'l':
133*52112Smckusick 			nfsargsp->flags |= NFSMNT_RDIRALOOK;
134*52112Smckusick 			break;
135*52112Smckusick 		case 'q':
136*52112Smckusick 			nfsargsp->flags |= NFSMNT_NQNFS;
137*52112Smckusick 			break;
138*52112Smckusick 		case 'd':
139*52112Smckusick 			nfsargsp->flags |= NFSMNT_DUMBTIMR;
140*52112Smckusick 			break;
141*52112Smckusick 		case 'c':
142*52112Smckusick 			nfsargsp->flags |= NFSMNT_NOCONN;
143*52112Smckusick 			break;
144*52112Smckusick 		case 'k':
145*52112Smckusick 			nfsargsp->flags |= NFSMNT_NQLOOKLEASE;
146*52112Smckusick 			break;
147*52112Smckusick 		case 'F':
148*52112Smckusick 			if ((num = atoi(optarg)) != 0)
149*52112Smckusick 				flags = num;
150*52112Smckusick 			break;
151*52112Smckusick 		case 'R':
152*52112Smckusick 			if ((num = atoi(optarg)) > 0)
153*52112Smckusick 				retrycnt = num;
154*52112Smckusick 			break;
155*52112Smckusick 		case 'r':
156*52112Smckusick 			if ((num = atoi(optarg)) > 0) {
157*52112Smckusick 				nfsargsp->rsize = num;
158*52112Smckusick 				nfsargsp->flags |= NFSMNT_RSIZE;
159*52112Smckusick 			}
160*52112Smckusick 			break;
161*52112Smckusick 		case 'w':
162*52112Smckusick 			if ((num = atoi(optarg)) > 0) {
163*52112Smckusick 				nfsargsp->wsize = num;
164*52112Smckusick 				nfsargsp->flags |= NFSMNT_WSIZE;
165*52112Smckusick 			}
166*52112Smckusick 			break;
167*52112Smckusick 		case 't':
168*52112Smckusick 			if ((num = atoi(optarg)) > 0) {
169*52112Smckusick 				nfsargsp->timeo = num;
170*52112Smckusick 				nfsargsp->flags |= NFSMNT_TIMEO;
171*52112Smckusick 			}
172*52112Smckusick 			break;
173*52112Smckusick 		case 'x':
174*52112Smckusick 			if ((num = atoi(optarg)) > 0) {
175*52112Smckusick 				nfsargsp->retrans = num;
176*52112Smckusick 				nfsargsp->flags |= NFSMNT_RETRANS;
177*52112Smckusick 			}
178*52112Smckusick 			break;
179*52112Smckusick 		case 'g':
180*52112Smckusick 			if ((num = atoi(optarg)) > 0) {
181*52112Smckusick 				nfsargsp->maxgrouplist = num;
182*52112Smckusick 				nfsargsp->flags |= NFSMNT_MAXGRPS;
183*52112Smckusick 			}
184*52112Smckusick 			break;
185*52112Smckusick 		case 'a':
186*52112Smckusick 			if ((num = atoi(optarg)) >= 0) {
187*52112Smckusick 				nfsargsp->readahead = num;
188*52112Smckusick 				nfsargsp->flags |= NFSMNT_READAHEAD;
189*52112Smckusick 			}
190*52112Smckusick 			break;
191*52112Smckusick 		case 'L':
192*52112Smckusick 			if ((num = atoi(optarg)) >= 2) {
193*52112Smckusick 				nfsargsp->leaseterm = num;
194*52112Smckusick 				nfsargsp->flags |= NFSMNT_LEASETERM;
195*52112Smckusick 			}
196*52112Smckusick 			break;
197*52112Smckusick 		case 'D':
198*52112Smckusick 			if ((num = atoi(optarg)) > 0) {
199*52112Smckusick 				nfsargsp->deadthresh = num;
200*52112Smckusick 				nfsargsp->flags |= NFSMNT_DEADTHRESH;
201*52112Smckusick 			}
202*52112Smckusick 			break;
203*52112Smckusick #ifdef KERBEROS
204*52112Smckusick 		case 'K':
205*52112Smckusick 			nfsargsp->flags |= NFSMNT_KERB;
206*52112Smckusick 			break;
207*52112Smckusick 		case 'm':
208*52112Smckusick 			strncpy(realm, optarg, REALM_SZ - 1);
209*52112Smckusick 			realm[REALM_SZ - 1] = '\0';
210*52112Smckusick 			break;
211*52112Smckusick #endif /* KERBEROS */
212*52112Smckusick 		default:
213*52112Smckusick 			Usage(argc, argv);
214*52112Smckusick 		};
215*52112Smckusick 	if ((argc - optind) == 2) {
216*52112Smckusick 		spec = argv[optind];
217*52112Smckusick 		name = argv[optind + 1];
218*52112Smckusick 	} else
219*52112Smckusick 		Usage(argc, argv);
220*52112Smckusick 	if (getnfsargs(spec, nfsargsp)) {
221*52112Smckusick 		if (mount(MOUNT_NFS, name, flags, nfsargsp))
222*52112Smckusick 			exit(1);
223*52112Smckusick 		if (nfsargsp->flags & (NFSMNT_NQNFS | NFSMNT_KERB)) {
224*52112Smckusick 			if ((opflags & ISBGRND) == 0) {
225*52112Smckusick 				if (i = fork()) {
226*52112Smckusick 					if (i == -1) {
227*52112Smckusick 						perror("nqnfs");
228*52112Smckusick 						exit(1);
229*52112Smckusick 					}
230*52112Smckusick 					exit();
231*52112Smckusick 				}
232*52112Smckusick 				(void) setsid();
233*52112Smckusick 				(void) close(0);
234*52112Smckusick 				(void) close(1);
235*52112Smckusick 				(void) close(2);
236*52112Smckusick 				(void) chdir("/");
237*52112Smckusick 			}
238*52112Smckusick 			openlog("mount_nfs:", LOG_PID, LOG_DAEMON);
239*52112Smckusick 			nfssvc_flag = NFSSVC_MNTD;
240*52112Smckusick 			ncd.ncd_dirp = name;
241*52112Smckusick 			while (nfssvc(nfssvc_flag, (caddr_t)&ncd) < 0) {
242*52112Smckusick 			    if (errno == ENEEDAUTH) {
243*52112Smckusick syslog(LOG_ERR, "in eacces");
244*52112Smckusick 				nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH |
245*52112Smckusick 					NFSSVC_AUTHINFAIL;
246*52112Smckusick #ifdef KERBEROS
247*52112Smckusick syslog(LOG_ERR,"Callin krb uid=%d inst=%s realm=%s",ncd.ncd_authuid,inst,realm);
248*52112Smckusick 				/*
249*52112Smckusick 				 * Set up as ncd_authuid for the kerberos call.
250*52112Smckusick 				 * Must set ruid to ncd_authuid and reset the
251*52112Smckusick 				 * ticket name iff ncd_authuid is not the same
252*52112Smckusick 				 * as last time, so that the right ticket file
253*52112Smckusick 				 * is found.
254*52112Smckusick 				 */
255*52112Smckusick 				if (ncd.ncd_authuid != last_ruid) {
256*52112Smckusick 					krb_set_tkt_string("");
257*52112Smckusick 					last_ruid = ncd.ncd_authuid;
258*52112Smckusick 				}
259*52112Smckusick 				setreuid(ncd.ncd_authuid, 0);
260*52112Smckusick 				if (krb_mk_req(&kt, "rcmd", inst, realm, 0) ==
261*52112Smckusick 				    KSUCCESS &&
262*52112Smckusick 				    kt.length <= (RPCAUTH_MAXSIZ - 2*NFSX_UNSIGNED)) {
263*52112Smckusick syslog(LOG_ERR,"Got it\n");
264*52112Smckusick 				    ncd.ncd_authtype = RPCAUTH_NQNFS;
265*52112Smckusick 				    ncd.ncd_authlen = kt.length;
266*52112Smckusick 				    ncd.ncd_authstr = (char *)kt.dat;
267*52112Smckusick 				    nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH;
268*52112Smckusick 				}
269*52112Smckusick 				setreuid(0, 0);
270*52112Smckusick syslog(LOG_ERR,"ktlen=%d\n", kt.length);
271*52112Smckusick #endif /* KERBEROS */
272*52112Smckusick 			    } else
273*52112Smckusick 				syslog(LOG_ERR, "nfssvc err %m");
274*52112Smckusick 			}
275*52112Smckusick 		}
276*52112Smckusick 		exit();
277*52112Smckusick 	} else
278*52112Smckusick 		exit(1);
279*52112Smckusick }
280*52112Smckusick 
281*52112Smckusick getnfsargs(spec, nfsargsp)
282*52112Smckusick 	char *spec;
283*52112Smckusick 	struct nfs_args *nfsargsp;
284*52112Smckusick {
285*52112Smckusick 	register CLIENT *clp;
286*52112Smckusick 	struct hostent *hp;
287*52112Smckusick 	static struct sockaddr_in saddr;
288*52112Smckusick #ifdef ISO
289*52112Smckusick 	static struct sockaddr_iso isoaddr;
290*52112Smckusick 	struct iso_addr *isop;
291*52112Smckusick #endif
292*52112Smckusick 	struct timeval pertry, try;
293*52112Smckusick 	enum clnt_stat clnt_stat;
294*52112Smckusick 	int so = RPC_ANYSOCK, isoflag = 0, i;
295*52112Smckusick 	char *hostp, *delimp, *cp;
296*52112Smckusick 	u_short tport;
297*52112Smckusick 	static struct nfhret nfhret;
298*52112Smckusick 	static char nam[MNAMELEN + 1];
299*52112Smckusick 
300*52112Smckusick 	strncpy(nam, spec, MNAMELEN);
301*52112Smckusick 	nam[MNAMELEN] = '\0';
302*52112Smckusick 	if ((delimp = index(spec, '@')) != NULL) {
303*52112Smckusick 		hostp = delimp + 1;
304*52112Smckusick 	} else if ((delimp = index(spec, ':')) != NULL) {
305*52112Smckusick 		hostp = spec;
306*52112Smckusick 		spec = delimp + 1;
307*52112Smckusick 	} else {
308*52112Smckusick 		fprintf(stderr,
309*52112Smckusick 		    "No <host>:<dirpath> or <dirpath>@<host> spec\n");
310*52112Smckusick 		return (0);
311*52112Smckusick 	}
312*52112Smckusick 	*delimp = '\0';
313*52112Smckusick 	/*
314*52112Smckusick 	 * DUMB!! Until the mount protocol works on iso transport, we must
315*52112Smckusick 	 * supply both an iso and an inet address for the host.
316*52112Smckusick 	 */
317*52112Smckusick #ifdef ISO
318*52112Smckusick 	if (!strncmp(hostp, "iso=", 4)) {
319*52112Smckusick 		u_short isoport;
320*52112Smckusick 
321*52112Smckusick 		hostp += 4;
322*52112Smckusick 		isoflag++;
323*52112Smckusick 		if ((delimp = index(hostp, '+')) == NULL) {
324*52112Smckusick 			fprintf(stderr, "No iso+inet address\n");
325*52112Smckusick 			return (0);
326*52112Smckusick 		}
327*52112Smckusick 		*delimp = '\0';
328*52112Smckusick 		if ((isop = iso_addr(hostp)) == NULL) {
329*52112Smckusick 			fprintf(stderr, "Bad iso address\n");
330*52112Smckusick 			return (0);
331*52112Smckusick 		}
332*52112Smckusick 		bzero((caddr_t)&isoaddr, sizeof (isoaddr));
333*52112Smckusick 		bcopy((caddr_t)isop, (caddr_t)&isoaddr.siso_addr,
334*52112Smckusick 			sizeof (struct iso_addr));
335*52112Smckusick 		isoaddr.siso_len = sizeof (isoaddr);
336*52112Smckusick 		isoaddr.siso_family = AF_ISO;
337*52112Smckusick 		isoaddr.siso_tlen = 2;
338*52112Smckusick 		isoport = htons(NFS_PORT);
339*52112Smckusick 		bcopy((caddr_t)&isoport, TSEL(&isoaddr), isoaddr.siso_tlen);
340*52112Smckusick 		hostp = delimp + 1;
341*52112Smckusick 	}
342*52112Smckusick #endif /* ISO */
343*52112Smckusick 
344*52112Smckusick 	/*
345*52112Smckusick 	 * Handle an internet host address and reverse resolve it if
346*52112Smckusick 	 * doing Kerberos.
347*52112Smckusick 	 */
348*52112Smckusick 	if (isdigit(*hostp)) {
349*52112Smckusick 		if ((saddr.sin_addr.s_addr = inet_addr(hostp)) == -1) {
350*52112Smckusick 			fprintf(stderr, "Bad net addr %s\n", hostp);
351*52112Smckusick 			return (0);
352*52112Smckusick 		}
353*52112Smckusick 		if ((nfsargsp->flags & NFSMNT_KERB) &&
354*52112Smckusick 		    (hp = gethostbyaddr((char *)&saddr.sin_addr.s_addr,
355*52112Smckusick 			sizeof (u_long), AF_INET)) == (struct hostent *)0) {
356*52112Smckusick 			fprintf(stderr, "Can't reverse resolve net addr\n");
357*52112Smckusick 			return (0);
358*52112Smckusick 		}
359*52112Smckusick 	} else if ((hp = gethostbyname(hostp)) == NULL) {
360*52112Smckusick 		fprintf(stderr, "Can't get net id for host\n");
361*52112Smckusick 		return (0);
362*52112Smckusick 	}
363*52112Smckusick #ifdef KERBEROS
364*52112Smckusick 	if (nfsargsp->flags & NFSMNT_KERB) {
365*52112Smckusick 		strncpy(inst, hp->h_name, INST_SZ);
366*52112Smckusick 		inst[INST_SZ - 1] = '\0';
367*52112Smckusick 		if (cp = index(inst, '.'))
368*52112Smckusick 			*cp = '\0';
369*52112Smckusick 	}
370*52112Smckusick #endif /* KERBEROS */
371*52112Smckusick 
372*52112Smckusick 	bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length);
373*52112Smckusick 	nfhret.stat = EACCES;	/* Mark not yet successful */
374*52112Smckusick 	while (retrycnt > 0) {
375*52112Smckusick 		saddr.sin_family = AF_INET;
376*52112Smckusick 		saddr.sin_port = htons(PMAPPORT);
377*52112Smckusick 		if ((tport = pmap_getport(&saddr, RPCPROG_NFS,
378*52112Smckusick 		    NFS_VER2, IPPROTO_UDP)) == 0) {
379*52112Smckusick 			if ((opflags & ISBGRND) == 0)
380*52112Smckusick 				clnt_pcreateerror("NFS Portmap");
381*52112Smckusick 		} else {
382*52112Smckusick 			saddr.sin_port = 0;
383*52112Smckusick 			pertry.tv_sec = 10;
384*52112Smckusick 			pertry.tv_usec = 0;
385*52112Smckusick 			if ((clp = clntudp_create(&saddr, RPCPROG_MNT,
386*52112Smckusick 			    RPCMNT_VER1, pertry, &so)) == NULL) {
387*52112Smckusick 				if ((opflags & ISBGRND) == 0)
388*52112Smckusick 					clnt_pcreateerror("Cannot MNT PRC");
389*52112Smckusick 			} else {
390*52112Smckusick 				clp->cl_auth = authunix_create_default();
391*52112Smckusick 				try.tv_sec = 10;
392*52112Smckusick 				try.tv_usec = 0;
393*52112Smckusick 				clnt_stat = clnt_call(clp, RPCMNT_MOUNT,
394*52112Smckusick 				    xdr_dir, spec, xdr_fh, &nfhret, try);
395*52112Smckusick 				if (clnt_stat != RPC_SUCCESS) {
396*52112Smckusick 					if ((opflags & ISBGRND) == 0)
397*52112Smckusick 						clnt_perror(clp, "Bad MNT RPC");
398*52112Smckusick 				} else {
399*52112Smckusick 					auth_destroy(clp->cl_auth);
400*52112Smckusick 					clnt_destroy(clp);
401*52112Smckusick 					retrycnt = 0;
402*52112Smckusick 				}
403*52112Smckusick 			}
404*52112Smckusick 		}
405*52112Smckusick 		if (--retrycnt > 0) {
406*52112Smckusick 			if (opflags & BGRND) {
407*52112Smckusick 				opflags &= ~BGRND;
408*52112Smckusick 				if (i = fork()) {
409*52112Smckusick 					if (i == -1) {
410*52112Smckusick 						perror("nqnfs");
411*52112Smckusick 						exit(1);
412*52112Smckusick 					}
413*52112Smckusick 					exit();
414*52112Smckusick 				}
415*52112Smckusick 				(void) setsid();
416*52112Smckusick 				(void) close(0);
417*52112Smckusick 				(void) close(1);
418*52112Smckusick 				(void) close(2);
419*52112Smckusick 				(void) chdir("/");
420*52112Smckusick 				opflags |= ISBGRND;
421*52112Smckusick 			}
422*52112Smckusick 			sleep(60);
423*52112Smckusick 		}
424*52112Smckusick 	}
425*52112Smckusick 	if (nfhret.stat) {
426*52112Smckusick 		if (opflags & ISBGRND)
427*52112Smckusick 			exit(1);
428*52112Smckusick 		fprintf(stderr, "Can't access %s: ", spec);
429*52112Smckusick 		errno = nfhret.stat;
430*52112Smckusick 		perror(NULL);
431*52112Smckusick 		return (0);
432*52112Smckusick 	}
433*52112Smckusick 	saddr.sin_port = htons(tport);
434*52112Smckusick #ifdef ISO
435*52112Smckusick 	if (isoflag) {
436*52112Smckusick 		nfsargsp->addr = (struct sockaddr *) &isoaddr;
437*52112Smckusick 		nfsargsp->addrlen = sizeof (isoaddr);
438*52112Smckusick 	} else
439*52112Smckusick #endif /* ISO */
440*52112Smckusick 	{
441*52112Smckusick 		nfsargsp->addr = (struct sockaddr *) &saddr;
442*52112Smckusick 		nfsargsp->addrlen = sizeof (saddr);
443*52112Smckusick 	}
444*52112Smckusick 	nfsargsp->fh = &nfhret.nfh;
445*52112Smckusick 	nfsargsp->hostname = nam;
446*52112Smckusick 	return (1);
447*52112Smckusick }
448*52112Smckusick 
449*52112Smckusick /*
450*52112Smckusick  * xdr routines for mount rpc's
451*52112Smckusick  */
452*52112Smckusick xdr_dir(xdrsp, dirp)
453*52112Smckusick 	XDR *xdrsp;
454*52112Smckusick 	char *dirp;
455*52112Smckusick {
456*52112Smckusick 	return (xdr_string(xdrsp, &dirp, RPCMNT_PATHLEN));
457*52112Smckusick }
458*52112Smckusick 
459*52112Smckusick xdr_fh(xdrsp, np)
460*52112Smckusick 	XDR *xdrsp;
461*52112Smckusick 	struct nfhret *np;
462*52112Smckusick {
463*52112Smckusick 	if (!xdr_u_long(xdrsp, &(np->stat)))
464*52112Smckusick 		return (0);
465*52112Smckusick 	if (np->stat)
466*52112Smckusick 		return (1);
467*52112Smckusick 	return (xdr_opaque(xdrsp, (caddr_t)&(np->nfh), NFSX_FH));
468*52112Smckusick }
469*52112Smckusick 
470*52112Smckusick Usage(argc, argv)
471*52112Smckusick 	int argc;
472*52112Smckusick 	char *argv[];
473*52112Smckusick {
474*52112Smckusick 	register int i;
475*52112Smckusick 
476*52112Smckusick 	for (i = 0; i < argc; i++)
477*52112Smckusick 		fprintf(stderr, "%s ", argv[i]);
478*52112Smckusick 	fprintf(stderr, "\nBad mount_nfs arg\n");
479*52112Smckusick 	exit(1);
480*52112Smckusick }
481