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