18fae3551SRodney W. Grimes /* 28fae3551SRodney W. Grimes * Copyright (c) 1992, 1993, 1994 38fae3551SRodney W. Grimes * The Regents of the University of California. All rights reserved. 48fae3551SRodney W. Grimes * 58fae3551SRodney W. Grimes * This code is derived from software contributed to Berkeley by 68fae3551SRodney W. Grimes * Rick Macklem at The University of Guelph. 78fae3551SRodney W. Grimes * 88fae3551SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 98fae3551SRodney W. Grimes * modification, are permitted provided that the following conditions 108fae3551SRodney W. Grimes * are met: 118fae3551SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 128fae3551SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 138fae3551SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 148fae3551SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 158fae3551SRodney W. Grimes * documentation and/or other materials provided with the distribution. 168fae3551SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 178fae3551SRodney W. Grimes * must display the following acknowledgement: 188fae3551SRodney W. Grimes * This product includes software developed by the University of 198fae3551SRodney W. Grimes * California, Berkeley and its contributors. 208fae3551SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 218fae3551SRodney W. Grimes * may be used to endorse or promote products derived from this software 228fae3551SRodney W. Grimes * without specific prior written permission. 238fae3551SRodney W. Grimes * 248fae3551SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 258fae3551SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 268fae3551SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 278fae3551SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 288fae3551SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 298fae3551SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 308fae3551SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 318fae3551SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 328fae3551SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 338fae3551SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 348fae3551SRodney W. Grimes * SUCH DAMAGE. 358fae3551SRodney W. Grimes */ 368fae3551SRodney W. Grimes 378fae3551SRodney W. Grimes #ifndef lint 388fae3551SRodney W. Grimes static char copyright[] = 398fae3551SRodney W. Grimes "@(#) Copyright (c) 1992, 1993, 1994\n\ 408fae3551SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 418fae3551SRodney W. Grimes #endif /* not lint */ 428fae3551SRodney W. Grimes 438fae3551SRodney W. Grimes #ifndef lint 445e074e31SGarrett Wollman /* 458fae3551SRodney W. Grimes static char sccsid[] = "@(#)mount_nfs.c 8.3 (Berkeley) 3/27/94"; 465e074e31SGarrett Wollman */ 475e074e31SGarrett Wollman static const char rcsid[] = 485e074e31SGarrett Wollman "$Id$"; 498fae3551SRodney W. Grimes #endif /* not lint */ 508fae3551SRodney W. Grimes 518fae3551SRodney W. Grimes #include <sys/param.h> 528fae3551SRodney W. Grimes #include <sys/mount.h> 538fae3551SRodney W. Grimes #include <sys/socket.h> 548fae3551SRodney W. Grimes #include <sys/socketvar.h> 558fae3551SRodney W. Grimes #include <sys/stat.h> 568fae3551SRodney W. Grimes #include <sys/syslog.h> 578fae3551SRodney W. Grimes 588fae3551SRodney W. Grimes #include <rpc/rpc.h> 598fae3551SRodney W. Grimes #include <rpc/pmap_clnt.h> 608fae3551SRodney W. Grimes #include <rpc/pmap_prot.h> 618fae3551SRodney W. Grimes 628fae3551SRodney W. Grimes #ifdef ISO 638fae3551SRodney W. Grimes #include <netiso/iso.h> 648fae3551SRodney W. Grimes #endif 658fae3551SRodney W. Grimes 66a62dc406SDoug Rabson #ifdef NFSKERB 67bbff7ca5SMark Murray #include <des.h> 688fae3551SRodney W. Grimes #include <kerberosIV/krb.h> 698fae3551SRodney W. Grimes #endif 708fae3551SRodney W. Grimes 718fae3551SRodney W. Grimes #include <nfs/rpcv2.h> 72a62dc406SDoug Rabson #include <nfs/nfsproto.h> 73a62dc406SDoug Rabson #define _KERNEL 748fae3551SRodney W. Grimes #include <nfs/nfs.h> 75a62dc406SDoug Rabson #undef _KERNEL 768fae3551SRodney W. Grimes #include <nfs/nqnfs.h> 778fae3551SRodney W. Grimes 788fae3551SRodney W. Grimes #include <arpa/inet.h> 798fae3551SRodney W. Grimes 808fae3551SRodney W. Grimes #include <ctype.h> 818fae3551SRodney W. Grimes #include <err.h> 828fae3551SRodney W. Grimes #include <errno.h> 838fae3551SRodney W. Grimes #include <fcntl.h> 848fae3551SRodney W. Grimes #include <netdb.h> 858fae3551SRodney W. Grimes #include <signal.h> 868fae3551SRodney W. Grimes #include <stdio.h> 878fae3551SRodney W. Grimes #include <stdlib.h> 888fae3551SRodney W. Grimes #include <strings.h> 895e074e31SGarrett Wollman #include <sysexits.h> 908fae3551SRodney W. Grimes #include <unistd.h> 918fae3551SRodney W. Grimes 928fae3551SRodney W. Grimes #include "mntopts.h" 938fae3551SRodney W. Grimes 94a62dc406SDoug Rabson #ifdef __FreeBSD__ 953fa88decSGarrett Wollman #define ALTF_BG 0x1 963fa88decSGarrett Wollman #define ALTF_NOCONN 0x2 973fa88decSGarrett Wollman #define ALTF_DUMBTIMR 0x4 983fa88decSGarrett Wollman #define ALTF_INTR 0x8 993fa88decSGarrett Wollman #define ALTF_KERB 0x10 100a62dc406SDoug Rabson #define ALTF_NFSV3 0x20 101a62dc406SDoug Rabson #define ALTF_RDIRPLUS 0x40 102a62dc406SDoug Rabson #define ALTF_MNTUDP 0x80 1033fa88decSGarrett Wollman #define ALTF_RESVPORT 0x100 1043fa88decSGarrett Wollman #define ALTF_SEQPACKET 0x200 1053fa88decSGarrett Wollman #define ALTF_NQNFS 0x400 1063fa88decSGarrett Wollman #define ALTF_SOFT 0x800 1073fa88decSGarrett Wollman #define ALTF_TCP 0x1000 108bc2cfd71SKarl Strickland #define ALTF_PORT 0x2000 1093fa88decSGarrett Wollman 1108fae3551SRodney W. Grimes struct mntopt mopts[] = { 1118fae3551SRodney W. Grimes MOPT_STDOPTS, 1128fae3551SRodney W. Grimes MOPT_FORCE, 1138fae3551SRodney W. Grimes MOPT_UPDATE, 1143fa88decSGarrett Wollman { "bg", 0, ALTF_BG, 1 }, 1153fa88decSGarrett Wollman { "conn", 1, ALTF_NOCONN, 1 }, 1163fa88decSGarrett Wollman { "dumbtimer", 0, ALTF_DUMBTIMR, 1 }, 1173fa88decSGarrett Wollman { "intr", 0, ALTF_INTR, 1 }, 118a62dc406SDoug Rabson #ifdef NFSKERB 1193fa88decSGarrett Wollman { "kerb", 0, ALTF_KERB, 1 }, 1203fa88decSGarrett Wollman #endif 121a62dc406SDoug Rabson { "nfsv3", 0, ALTF_NFSV3, 1 }, 122a62dc406SDoug Rabson { "rdirplus", 0, ALTF_RDIRPLUS, 1 }, 123a62dc406SDoug Rabson { "mntudp", 0, ALTF_MNTUDP, 1 }, 1243fa88decSGarrett Wollman { "resvport", 0, ALTF_RESVPORT, 1 }, 1253fa88decSGarrett Wollman #ifdef ISO 1263fa88decSGarrett Wollman { "seqpacket", 0, ALTF_SEQPACKET, 1 }, 1273fa88decSGarrett Wollman #endif 1283fa88decSGarrett Wollman { "nqnfs", 0, ALTF_NQNFS, 1 }, 1293fa88decSGarrett Wollman { "soft", 0, ALTF_SOFT, 1 }, 1303fa88decSGarrett Wollman { "tcp", 0, ALTF_TCP, 1 }, 131bc2cfd71SKarl Strickland { "port=", 0, ALTF_PORT, 1 }, 1328fae3551SRodney W. Grimes { NULL } 1338fae3551SRodney W. Grimes }; 134a62dc406SDoug Rabson #else 135a62dc406SDoug Rabson struct mntopt mopts[] = { 136a62dc406SDoug Rabson MOPT_STDOPTS, 137a62dc406SDoug Rabson MOPT_FORCE, 138a62dc406SDoug Rabson MOPT_UPDATE, 139a62dc406SDoug Rabson { NULL } 140a62dc406SDoug Rabson }; 141a62dc406SDoug Rabson #endif 1428fae3551SRodney W. Grimes 1438fae3551SRodney W. Grimes struct nfs_args nfsdefargs = { 1448fae3551SRodney W. Grimes (struct sockaddr *)0, 1458fae3551SRodney W. Grimes sizeof (struct sockaddr_in), 1468fae3551SRodney W. Grimes SOCK_DGRAM, 1478fae3551SRodney W. Grimes 0, 148a62dc406SDoug Rabson (u_char *)0, 149a62dc406SDoug Rabson 0, 1508fae3551SRodney W. Grimes 0, 1518fae3551SRodney W. Grimes NFS_WSIZE, 1528fae3551SRodney W. Grimes NFS_RSIZE, 153a62dc406SDoug Rabson NFS_READDIRSIZE, 154a62dc406SDoug Rabson 10, 1558fae3551SRodney W. Grimes NFS_RETRANS, 1568fae3551SRodney W. Grimes NFS_MAXGRPS, 1578fae3551SRodney W. Grimes NFS_DEFRAHEAD, 1588fae3551SRodney W. Grimes NQ_DEFLEASE, 1598fae3551SRodney W. Grimes NQ_DEADTHRESH, 1608fae3551SRodney W. Grimes (char *)0, 1618fae3551SRodney W. Grimes }; 1628fae3551SRodney W. Grimes 1638fae3551SRodney W. Grimes struct nfhret { 1648fae3551SRodney W. Grimes u_long stat; 165a62dc406SDoug Rabson long vers; 166a62dc406SDoug Rabson long auth; 167a62dc406SDoug Rabson long fhsize; 168a62dc406SDoug Rabson u_char nfh[NFSX_V3FHMAX]; 1698fae3551SRodney W. Grimes }; 1708fae3551SRodney W. Grimes #define DEF_RETRY 10000 1718fae3551SRodney W. Grimes #define BGRND 1 1728fae3551SRodney W. Grimes #define ISBGRND 2 1738fae3551SRodney W. Grimes int retrycnt = DEF_RETRY; 1748fae3551SRodney W. Grimes int opflags = 0; 175a62dc406SDoug Rabson int nfsproto = IPPROTO_UDP; 176a62dc406SDoug Rabson int mnttcp_ok = 1; 177bc2cfd71SKarl Strickland u_short port_no = 0; 1788fae3551SRodney W. Grimes 179a62dc406SDoug Rabson #ifdef NFSKERB 1808fae3551SRodney W. Grimes char inst[INST_SZ]; 1818fae3551SRodney W. Grimes char realm[REALM_SZ]; 182a62dc406SDoug Rabson struct { 183a62dc406SDoug Rabson u_long kind; 1848fae3551SRodney W. Grimes KTEXT_ST kt; 185a62dc406SDoug Rabson } ktick; 186a62dc406SDoug Rabson struct nfsrpc_nickverf kverf; 187a62dc406SDoug Rabson struct nfsrpc_fullblock kin, kout; 188a62dc406SDoug Rabson NFSKERBKEY_T kivec; 189a62dc406SDoug Rabson CREDENTIALS kcr; 190a62dc406SDoug Rabson struct timeval ktv; 191a62dc406SDoug Rabson NFSKERBKEYSCHED_T kerb_keysched; 1928fae3551SRodney W. Grimes #endif 1938fae3551SRodney W. Grimes 1948fae3551SRodney W. Grimes int getnfsargs __P((char *, struct nfs_args *)); 1958fae3551SRodney W. Grimes #ifdef ISO 1968fae3551SRodney W. Grimes struct iso_addr *iso_addr __P((const char *)); 1978fae3551SRodney W. Grimes #endif 1988fae3551SRodney W. Grimes void set_rpc_maxgrouplist __P((int)); 1998fae3551SRodney W. Grimes __dead void usage __P((void)); 2008fae3551SRodney W. Grimes int xdr_dir __P((XDR *, char *)); 2018fae3551SRodney W. Grimes int xdr_fh __P((XDR *, struct nfhret *)); 2028fae3551SRodney W. Grimes 2038fae3551SRodney W. Grimes int 2048fae3551SRodney W. Grimes main(argc, argv) 2058fae3551SRodney W. Grimes int argc; 2068fae3551SRodney W. Grimes char *argv[]; 2078fae3551SRodney W. Grimes { 2088fae3551SRodney W. Grimes register int c; 2098fae3551SRodney W. Grimes register struct nfs_args *nfsargsp; 2108fae3551SRodney W. Grimes struct nfs_args nfsargs; 2118fae3551SRodney W. Grimes struct nfsd_cargs ncd; 2123fa88decSGarrett Wollman int mntflags, altflags, i, nfssvc_flag, num; 2138fae3551SRodney W. Grimes char *name, *p, *spec; 214d599144dSGarrett Wollman struct vfsconf *vfc; 215a62dc406SDoug Rabson #ifdef NFSKERB 2168fae3551SRodney W. Grimes uid_t last_ruid; 2178fae3551SRodney W. Grimes 2188fae3551SRodney W. Grimes last_ruid = -1; 2198fae3551SRodney W. Grimes (void)strcpy(realm, KRB_REALM); 220a62dc406SDoug Rabson if (sizeof (struct nfsrpc_nickverf) != RPCX_NICKVERF || 221a62dc406SDoug Rabson sizeof (struct nfsrpc_fullblock) != RPCX_FULLBLOCK || 222a62dc406SDoug Rabson ((char *)&ktick.kt) - ((char *)&ktick) != NFSX_UNSIGNED || 223a62dc406SDoug Rabson ((char *)ktick.kt.dat) - ((char *)&ktick) != 2 * NFSX_UNSIGNED) 224a62dc406SDoug Rabson fprintf(stderr, "Yikes! NFSKERB structs not packed!!\n"); 225a62dc406SDoug Rabson #endif /* NFSKERB */ 2268fae3551SRodney W. Grimes retrycnt = DEF_RETRY; 2278fae3551SRodney W. Grimes 2288fae3551SRodney W. Grimes mntflags = 0; 2293fa88decSGarrett Wollman altflags = 0; 2308fae3551SRodney W. Grimes nfsargs = nfsdefargs; 2318fae3551SRodney W. Grimes nfsargsp = &nfsargs; 2328fae3551SRodney W. Grimes while ((c = getopt(argc, argv, 233a62dc406SDoug Rabson "3a:bcdD:g:I:iKL:lm:o:PpqR:r:sTt:w:x:U")) != EOF) 2348fae3551SRodney W. Grimes switch (c) { 235a62dc406SDoug Rabson case '3': 236a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_NFSV3; 237a62dc406SDoug Rabson break; 2388fae3551SRodney W. Grimes case 'a': 2398fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 2408fae3551SRodney W. Grimes if (*p || num < 0) 2418fae3551SRodney W. Grimes errx(1, "illegal -a value -- %s", optarg); 2428fae3551SRodney W. Grimes nfsargsp->readahead = num; 2438fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_READAHEAD; 2448fae3551SRodney W. Grimes break; 2458fae3551SRodney W. Grimes case 'b': 2468fae3551SRodney W. Grimes opflags |= BGRND; 2478fae3551SRodney W. Grimes break; 2488fae3551SRodney W. Grimes case 'c': 2498fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_NOCONN; 2508fae3551SRodney W. Grimes break; 2518fae3551SRodney W. Grimes case 'D': 2528fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 2538fae3551SRodney W. Grimes if (*p || num <= 0) 2548fae3551SRodney W. Grimes errx(1, "illegal -D value -- %s", optarg); 2558fae3551SRodney W. Grimes nfsargsp->deadthresh = num; 2568fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_DEADTHRESH; 2578fae3551SRodney W. Grimes break; 2588fae3551SRodney W. Grimes case 'd': 2598fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_DUMBTIMR; 2608fae3551SRodney W. Grimes break; 2618fae3551SRodney W. Grimes case 'g': 2628fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 2638fae3551SRodney W. Grimes if (*p || num <= 0) 2648fae3551SRodney W. Grimes errx(1, "illegal -g value -- %s", optarg); 265a62dc406SDoug Rabson #ifdef __FreeBSD__ 2668fae3551SRodney W. Grimes set_rpc_maxgrouplist(num); 267a62dc406SDoug Rabson #endif 2688fae3551SRodney W. Grimes nfsargsp->maxgrouplist = num; 2698fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_MAXGRPS; 2708fae3551SRodney W. Grimes break; 271a62dc406SDoug Rabson case 'I': 272a62dc406SDoug Rabson num = strtol(optarg, &p, 10); 273a62dc406SDoug Rabson if (*p || num <= 0) 274a62dc406SDoug Rabson errx(1, "illegal -I value -- %s", optarg); 275a62dc406SDoug Rabson nfsargsp->readdirsize = num; 276a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_READDIRSIZE; 277a62dc406SDoug Rabson break; 2788fae3551SRodney W. Grimes case 'i': 2798fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_INT; 2808fae3551SRodney W. Grimes break; 281a62dc406SDoug Rabson #ifdef NFSKERB 2828fae3551SRodney W. Grimes case 'K': 2838fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_KERB; 2848fae3551SRodney W. Grimes break; 2858fae3551SRodney W. Grimes #endif 2868fae3551SRodney W. Grimes case 'L': 2878fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 2888fae3551SRodney W. Grimes if (*p || num < 2) 2898fae3551SRodney W. Grimes errx(1, "illegal -L value -- %s", optarg); 2908fae3551SRodney W. Grimes nfsargsp->leaseterm = num; 2918fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_LEASETERM; 2928fae3551SRodney W. Grimes break; 2938fae3551SRodney W. Grimes case 'l': 294a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_RDIRPLUS; 2958fae3551SRodney W. Grimes break; 296a62dc406SDoug Rabson #ifdef NFSKERB 2978fae3551SRodney W. Grimes case 'm': 2988fae3551SRodney W. Grimes (void)strncpy(realm, optarg, REALM_SZ - 1); 2998fae3551SRodney W. Grimes realm[REALM_SZ - 1] = '\0'; 3008fae3551SRodney W. Grimes break; 3018fae3551SRodney W. Grimes #endif 3028fae3551SRodney W. Grimes case 'o': 303a62dc406SDoug Rabson #ifdef __FreeBSD__ 3043fa88decSGarrett Wollman getmntopts(optarg, mopts, &mntflags, &altflags); 3053fa88decSGarrett Wollman if(altflags & ALTF_BG) 3063fa88decSGarrett Wollman opflags |= BGRND; 3073fa88decSGarrett Wollman if(altflags & ALTF_NOCONN) 3083fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_NOCONN; 3093fa88decSGarrett Wollman if(altflags & ALTF_DUMBTIMR) 3103fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_DUMBTIMR; 3113fa88decSGarrett Wollman if(altflags & ALTF_INTR) 3123fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_INT; 313a62dc406SDoug Rabson #ifdef NFSKERB 3143fa88decSGarrett Wollman if(altflags & ALTF_KERB) 3153fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_KERB; 3163fa88decSGarrett Wollman #endif 317a62dc406SDoug Rabson if(altflags & ALTF_NFSV3) 318a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_NFSV3; 319a62dc406SDoug Rabson if(altflags & ALTF_RDIRPLUS) 320a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_RDIRPLUS; 321a62dc406SDoug Rabson if(altflags & ALTF_MNTUDP) 322a62dc406SDoug Rabson mnttcp_ok = 0; 3233fa88decSGarrett Wollman if(altflags & ALTF_RESVPORT) 3243fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_RESVPORT; 3253fa88decSGarrett Wollman #ifdef ISO 3263fa88decSGarrett Wollman if(altflags & ALTF_SEQPACKET) 3273fa88decSGarrett Wollman nfsargsp->sotype = SOCK_SEQPACKET; 3283fa88decSGarrett Wollman #endif 3293fa88decSGarrett Wollman if(altflags & ALTF_NQNFS) 330a62dc406SDoug Rabson nfsargsp->flags |= (NFSMNT_NQNFS|NFSMNT_NFSV3); 3313fa88decSGarrett Wollman if(altflags & ALTF_SOFT) 3323fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_SOFT; 333a62dc406SDoug Rabson if(altflags & ALTF_TCP) { 3343fa88decSGarrett Wollman nfsargsp->sotype = SOCK_STREAM; 335a62dc406SDoug Rabson nfsproto = IPPROTO_TCP; 336a62dc406SDoug Rabson } 337bc2cfd71SKarl Strickland if(altflags & ALTF_PORT) 338bc2cfd71SKarl Strickland port_no = atoi(strstr(optarg, "port=") + 5); 3393fa88decSGarrett Wollman altflags = 0; 340a62dc406SDoug Rabson #else 341a62dc406SDoug Rabson getmntopts(optarg, mopts, &mntflags); 342a62dc406SDoug Rabson #endif 3438fae3551SRodney W. Grimes break; 3448fae3551SRodney W. Grimes case 'P': 3458fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_RESVPORT; 3468fae3551SRodney W. Grimes break; 3478fae3551SRodney W. Grimes #ifdef ISO 3488fae3551SRodney W. Grimes case 'p': 3498fae3551SRodney W. Grimes nfsargsp->sotype = SOCK_SEQPACKET; 3508fae3551SRodney W. Grimes break; 3518fae3551SRodney W. Grimes #endif 3528fae3551SRodney W. Grimes case 'q': 353a62dc406SDoug Rabson nfsargsp->flags |= (NFSMNT_NQNFS | NFSMNT_NFSV3); 3548fae3551SRodney W. Grimes break; 3558fae3551SRodney W. Grimes case 'R': 3568fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3578fae3551SRodney W. Grimes if (*p || num <= 0) 3588fae3551SRodney W. Grimes errx(1, "illegal -R value -- %s", optarg); 3598fae3551SRodney W. Grimes retrycnt = num; 3608fae3551SRodney W. Grimes break; 3618fae3551SRodney W. Grimes case 'r': 3628fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3638fae3551SRodney W. Grimes if (*p || num <= 0) 3648fae3551SRodney W. Grimes errx(1, "illegal -r value -- %s", optarg); 3658fae3551SRodney W. Grimes nfsargsp->rsize = num; 3668fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_RSIZE; 3678fae3551SRodney W. Grimes break; 3688fae3551SRodney W. Grimes case 's': 3698fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_SOFT; 3708fae3551SRodney W. Grimes break; 3718fae3551SRodney W. Grimes case 'T': 3728fae3551SRodney W. Grimes nfsargsp->sotype = SOCK_STREAM; 373a62dc406SDoug Rabson nfsproto = IPPROTO_TCP; 3748fae3551SRodney W. Grimes break; 3758fae3551SRodney W. Grimes case 't': 3768fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3778fae3551SRodney W. Grimes if (*p || num <= 0) 3788fae3551SRodney W. Grimes errx(1, "illegal -t value -- %s", optarg); 3798fae3551SRodney W. Grimes nfsargsp->timeo = num; 3808fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_TIMEO; 3818fae3551SRodney W. Grimes break; 3828fae3551SRodney W. Grimes case 'w': 3838fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3848fae3551SRodney W. Grimes if (*p || num <= 0) 3858fae3551SRodney W. Grimes errx(1, "illegal -w value -- %s", optarg); 3868fae3551SRodney W. Grimes nfsargsp->wsize = num; 3878fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_WSIZE; 3888fae3551SRodney W. Grimes break; 3898fae3551SRodney W. Grimes case 'x': 3908fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3918fae3551SRodney W. Grimes if (*p || num <= 0) 3928fae3551SRodney W. Grimes errx(1, "illegal -x value -- %s", optarg); 3938fae3551SRodney W. Grimes nfsargsp->retrans = num; 3948fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_RETRANS; 3958fae3551SRodney W. Grimes break; 396a62dc406SDoug Rabson case 'U': 397a62dc406SDoug Rabson mnttcp_ok = 0; 398a62dc406SDoug Rabson break; 3998fae3551SRodney W. Grimes default: 4008fae3551SRodney W. Grimes usage(); 4018fae3551SRodney W. Grimes break; 4028fae3551SRodney W. Grimes } 4038fae3551SRodney W. Grimes argc -= optind; 4048fae3551SRodney W. Grimes argv += optind; 4058fae3551SRodney W. Grimes 4068fae3551SRodney W. Grimes if (argc != 2) 4072f21d07aSDavid Greenman usage(); 4088fae3551SRodney W. Grimes 4098fae3551SRodney W. Grimes spec = *argv++; 4108fae3551SRodney W. Grimes name = *argv; 4118fae3551SRodney W. Grimes 4128fae3551SRodney W. Grimes if (!getnfsargs(spec, nfsargsp)) 4138fae3551SRodney W. Grimes exit(1); 414d599144dSGarrett Wollman 415a62dc406SDoug Rabson #ifdef __FreeBSD__ 416d599144dSGarrett Wollman vfc = getvfsbyname("nfs"); 417d599144dSGarrett Wollman if(!vfc && vfsisloadable("nfs")) { 418d599144dSGarrett Wollman if(vfsload("nfs")) 4195e074e31SGarrett Wollman err(EX_OSERR, "vfsload(nfs)"); 420d599144dSGarrett Wollman endvfsent(); /* flush cache */ 421d599144dSGarrett Wollman vfc = getvfsbyname("nfs"); 422d599144dSGarrett Wollman } 4235e074e31SGarrett Wollman if (!vfc) 4245e074e31SGarrett Wollman errx(EX_OSERR, "nfs filesystem is not loadable"); 425d599144dSGarrett Wollman 4265e074e31SGarrett Wollman if (mount(vfc->vfc_index, name, mntflags, nfsargsp)) 427a62dc406SDoug Rabson #else 428a62dc406SDoug Rabson if (mount(MOUNT_NFS, name, mntflags, nfsargsp)) 429a62dc406SDoug Rabson #endif 4308fae3551SRodney W. Grimes err(1, "%s", name); 4318fae3551SRodney W. Grimes if (nfsargsp->flags & (NFSMNT_NQNFS | NFSMNT_KERB)) { 4328fae3551SRodney W. Grimes if ((opflags & ISBGRND) == 0) { 4338fae3551SRodney W. Grimes if (i = fork()) { 4348fae3551SRodney W. Grimes if (i == -1) 4358fae3551SRodney W. Grimes err(1, "nqnfs 1"); 4368fae3551SRodney W. Grimes exit(0); 4378fae3551SRodney W. Grimes } 4388fae3551SRodney W. Grimes (void) setsid(); 4398fae3551SRodney W. Grimes (void) close(STDIN_FILENO); 4408fae3551SRodney W. Grimes (void) close(STDOUT_FILENO); 4418fae3551SRodney W. Grimes (void) close(STDERR_FILENO); 4428fae3551SRodney W. Grimes (void) chdir("/"); 4438fae3551SRodney W. Grimes } 4448fae3551SRodney W. Grimes openlog("mount_nfs:", LOG_PID, LOG_DAEMON); 4458fae3551SRodney W. Grimes nfssvc_flag = NFSSVC_MNTD; 4468fae3551SRodney W. Grimes ncd.ncd_dirp = name; 4478fae3551SRodney W. Grimes while (nfssvc(nfssvc_flag, (caddr_t)&ncd) < 0) { 4488fae3551SRodney W. Grimes if (errno != ENEEDAUTH) { 4498fae3551SRodney W. Grimes syslog(LOG_ERR, "nfssvc err %m"); 4508fae3551SRodney W. Grimes continue; 4518fae3551SRodney W. Grimes } 4528fae3551SRodney W. Grimes nfssvc_flag = 4538fae3551SRodney W. Grimes NFSSVC_MNTD | NFSSVC_GOTAUTH | NFSSVC_AUTHINFAIL; 454a62dc406SDoug Rabson #ifdef NFSKERB 4558fae3551SRodney W. Grimes /* 4568fae3551SRodney W. Grimes * Set up as ncd_authuid for the kerberos call. 4578fae3551SRodney W. Grimes * Must set ruid to ncd_authuid and reset the 4588fae3551SRodney W. Grimes * ticket name iff ncd_authuid is not the same 4598fae3551SRodney W. Grimes * as last time, so that the right ticket file 4608fae3551SRodney W. Grimes * is found. 461a62dc406SDoug Rabson * Get the Kerberos credential structure so that 462a62dc406SDoug Rabson * we have the seesion key and get a ticket for 463a62dc406SDoug Rabson * this uid. 464a62dc406SDoug Rabson * For more info see the IETF Draft "Authentication 465a62dc406SDoug Rabson * in ONC RPC". 4668fae3551SRodney W. Grimes */ 4678fae3551SRodney W. Grimes if (ncd.ncd_authuid != last_ruid) { 46834728d6aSDoug Rabson char buf[512]; 46934728d6aSDoug Rabson (void)sprintf(buf, "%s%d", 47034728d6aSDoug Rabson TKT_ROOT, ncd.ncd_authuid); 47134728d6aSDoug Rabson krb_set_tkt_string(buf); 4728fae3551SRodney W. Grimes last_ruid = ncd.ncd_authuid; 4738fae3551SRodney W. Grimes } 474a62dc406SDoug Rabson setreuid(ncd.ncd_authuid, 0); 475a62dc406SDoug Rabson kret = krb_get_cred(NFS_KERBSRV, inst, realm, &kcr); 476a62dc406SDoug Rabson if (kret == RET_NOTKT) { 477a62dc406SDoug Rabson kret = get_ad_tkt(NFS_KERBSRV, inst, realm, 478a62dc406SDoug Rabson DEFAULT_TKT_LIFE); 479a62dc406SDoug Rabson if (kret == KSUCCESS) 480a62dc406SDoug Rabson kret = krb_get_cred(NFS_KERBSRV, inst, realm, 481a62dc406SDoug Rabson &kcr); 482a62dc406SDoug Rabson } 483a62dc406SDoug Rabson if (kret == KSUCCESS) 484a62dc406SDoug Rabson kret = krb_mk_req(&ktick.kt, NFS_KERBSRV, inst, 485a62dc406SDoug Rabson realm, 0); 486a62dc406SDoug Rabson 487a62dc406SDoug Rabson /* 488a62dc406SDoug Rabson * Fill in the AKN_FULLNAME authenticator and verfier. 489a62dc406SDoug Rabson * Along with the Kerberos ticket, we need to build 490a62dc406SDoug Rabson * the timestamp verifier and encrypt it in CBC mode. 491a62dc406SDoug Rabson */ 492a62dc406SDoug Rabson if (kret == KSUCCESS && 493a62dc406SDoug Rabson ktick.kt.length <= (RPCAUTH_MAXSIZ-3*NFSX_UNSIGNED) 494a62dc406SDoug Rabson && gettimeofday(&ktv, (struct timezone *)0) == 0) { 495a62dc406SDoug Rabson ncd.ncd_authtype = RPCAUTH_KERB4; 496a62dc406SDoug Rabson ncd.ncd_authstr = (u_char *)&ktick; 497a62dc406SDoug Rabson ncd.ncd_authlen = nfsm_rndup(ktick.kt.length) + 498a62dc406SDoug Rabson 3 * NFSX_UNSIGNED; 499a62dc406SDoug Rabson ncd.ncd_verfstr = (u_char *)&kverf; 500a62dc406SDoug Rabson ncd.ncd_verflen = sizeof (kverf); 501a62dc406SDoug Rabson bcopy((caddr_t)kcr.session, (caddr_t)ncd.ncd_key, 502a62dc406SDoug Rabson sizeof (kcr.session)); 503a62dc406SDoug Rabson kin.t1 = htonl(ktv.tv_sec); 504a62dc406SDoug Rabson kin.t2 = htonl(ktv.tv_usec); 505a62dc406SDoug Rabson kin.w1 = htonl(NFS_KERBTTL); 506a62dc406SDoug Rabson kin.w2 = htonl(NFS_KERBTTL - 1); 507a62dc406SDoug Rabson bzero((caddr_t)kivec, sizeof (kivec)); 508a62dc406SDoug Rabson 509a62dc406SDoug Rabson /* 510a62dc406SDoug Rabson * Encrypt kin in CBC mode using the session 511a62dc406SDoug Rabson * key in kcr. 512a62dc406SDoug Rabson */ 513a62dc406SDoug Rabson XXX 514a62dc406SDoug Rabson 515a62dc406SDoug Rabson /* 516a62dc406SDoug Rabson * Finally, fill the timestamp verifier into the 517a62dc406SDoug Rabson * authenticator and verifier. 518a62dc406SDoug Rabson */ 519a62dc406SDoug Rabson ktick.kind = htonl(RPCAKN_FULLNAME); 520a62dc406SDoug Rabson kverf.kind = htonl(RPCAKN_FULLNAME); 521a62dc406SDoug Rabson NFS_KERBW1(ktick.kt) = kout.w1; 522a62dc406SDoug Rabson ktick.kt.length = htonl(ktick.kt.length); 523a62dc406SDoug Rabson kverf.verf.t1 = kout.t1; 524a62dc406SDoug Rabson kverf.verf.t2 = kout.t2; 525a62dc406SDoug Rabson kverf.verf.w2 = kout.w2; 5268fae3551SRodney W. Grimes nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH; 5278fae3551SRodney W. Grimes } 528a62dc406SDoug Rabson setreuid(0, 0); 529a62dc406SDoug Rabson #endif /* NFSKERB */ 5308fae3551SRodney W. Grimes } 5318fae3551SRodney W. Grimes } 5328fae3551SRodney W. Grimes exit(0); 5338fae3551SRodney W. Grimes } 5348fae3551SRodney W. Grimes 5358fae3551SRodney W. Grimes int 5368fae3551SRodney W. Grimes getnfsargs(spec, nfsargsp) 5378fae3551SRodney W. Grimes char *spec; 5388fae3551SRodney W. Grimes struct nfs_args *nfsargsp; 5398fae3551SRodney W. Grimes { 5408fae3551SRodney W. Grimes register CLIENT *clp; 5418fae3551SRodney W. Grimes struct hostent *hp; 5428fae3551SRodney W. Grimes static struct sockaddr_in saddr; 5438fae3551SRodney W. Grimes #ifdef ISO 5448fae3551SRodney W. Grimes static struct sockaddr_iso isoaddr; 5458fae3551SRodney W. Grimes struct iso_addr *isop; 5468fae3551SRodney W. Grimes int isoflag = 0; 5478fae3551SRodney W. Grimes #endif 5488fae3551SRodney W. Grimes struct timeval pertry, try; 5498fae3551SRodney W. Grimes enum clnt_stat clnt_stat; 550a62dc406SDoug Rabson int so = RPC_ANYSOCK, i, nfsvers, mntvers; 5518fae3551SRodney W. Grimes char *hostp, *delimp; 552a62dc406SDoug Rabson #ifdef NFSKERB 5538fae3551SRodney W. Grimes char *cp; 5548fae3551SRodney W. Grimes #endif 5558fae3551SRodney W. Grimes u_short tport; 5568fae3551SRodney W. Grimes static struct nfhret nfhret; 5578fae3551SRodney W. Grimes static char nam[MNAMELEN + 1]; 5588fae3551SRodney W. Grimes 5598fae3551SRodney W. Grimes strncpy(nam, spec, MNAMELEN); 5608fae3551SRodney W. Grimes nam[MNAMELEN] = '\0'; 5618fae3551SRodney W. Grimes if ((delimp = strchr(spec, '@')) != NULL) { 5628fae3551SRodney W. Grimes hostp = delimp + 1; 5638fae3551SRodney W. Grimes } else if ((delimp = strchr(spec, ':')) != NULL) { 5648fae3551SRodney W. Grimes hostp = spec; 5658fae3551SRodney W. Grimes spec = delimp + 1; 5668fae3551SRodney W. Grimes } else { 5678fae3551SRodney W. Grimes warnx("no <host>:<dirpath> or <dirpath>@<host> spec"); 5688fae3551SRodney W. Grimes return (0); 5698fae3551SRodney W. Grimes } 5708fae3551SRodney W. Grimes *delimp = '\0'; 5718fae3551SRodney W. Grimes /* 5728fae3551SRodney W. Grimes * DUMB!! Until the mount protocol works on iso transport, we must 5738fae3551SRodney W. Grimes * supply both an iso and an inet address for the host. 5748fae3551SRodney W. Grimes */ 5758fae3551SRodney W. Grimes #ifdef ISO 5768fae3551SRodney W. Grimes if (!strncmp(hostp, "iso=", 4)) { 5778fae3551SRodney W. Grimes u_short isoport; 5788fae3551SRodney W. Grimes 5798fae3551SRodney W. Grimes hostp += 4; 5808fae3551SRodney W. Grimes isoflag++; 5818fae3551SRodney W. Grimes if ((delimp = strchr(hostp, '+')) == NULL) { 5828fae3551SRodney W. Grimes warnx("no iso+inet address"); 5838fae3551SRodney W. Grimes return (0); 5848fae3551SRodney W. Grimes } 5858fae3551SRodney W. Grimes *delimp = '\0'; 5868fae3551SRodney W. Grimes if ((isop = iso_addr(hostp)) == NULL) { 5878fae3551SRodney W. Grimes warnx("bad ISO address"); 5888fae3551SRodney W. Grimes return (0); 5898fae3551SRodney W. Grimes } 5908fae3551SRodney W. Grimes bzero((caddr_t)&isoaddr, sizeof (isoaddr)); 5918fae3551SRodney W. Grimes bcopy((caddr_t)isop, (caddr_t)&isoaddr.siso_addr, 5928fae3551SRodney W. Grimes sizeof (struct iso_addr)); 5938fae3551SRodney W. Grimes isoaddr.siso_len = sizeof (isoaddr); 5948fae3551SRodney W. Grimes isoaddr.siso_family = AF_ISO; 5958fae3551SRodney W. Grimes isoaddr.siso_tlen = 2; 5968fae3551SRodney W. Grimes isoport = htons(NFS_PORT); 5978fae3551SRodney W. Grimes bcopy((caddr_t)&isoport, TSEL(&isoaddr), isoaddr.siso_tlen); 5988fae3551SRodney W. Grimes hostp = delimp + 1; 5998fae3551SRodney W. Grimes } 6008fae3551SRodney W. Grimes #endif /* ISO */ 6018fae3551SRodney W. Grimes 6028fae3551SRodney W. Grimes /* 6038fae3551SRodney W. Grimes * Handle an internet host address and reverse resolve it if 6048fae3551SRodney W. Grimes * doing Kerberos. 6058fae3551SRodney W. Grimes */ 6068fae3551SRodney W. Grimes if (isdigit(*hostp)) { 6078fae3551SRodney W. Grimes if ((saddr.sin_addr.s_addr = inet_addr(hostp)) == -1) { 6088fae3551SRodney W. Grimes warnx("bad net address %s", hostp); 6098fae3551SRodney W. Grimes return (0); 6108fae3551SRodney W. Grimes } 61166e5de45SPoul-Henning Kamp } else if ((hp = gethostbyname(hostp)) != NULL) { 61266e5de45SPoul-Henning Kamp bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length); 61366e5de45SPoul-Henning Kamp } else { 6148fae3551SRodney W. Grimes warnx("can't get net id for host"); 6158fae3551SRodney W. Grimes return (0); 6168fae3551SRodney W. Grimes } 617a62dc406SDoug Rabson #ifdef NFSKERB 61866e5de45SPoul-Henning Kamp if ((nfsargsp->flags & NFSMNT_KERB)) { 61966e5de45SPoul-Henning Kamp if ((hp = gethostbyaddr((char *)&saddr.sin_addr.s_addr, 62066e5de45SPoul-Henning Kamp sizeof (u_long), AF_INET)) == (struct hostent *)0) { 62166e5de45SPoul-Henning Kamp warnx("can't reverse resolve net address"); 62266e5de45SPoul-Henning Kamp return (0); 62366e5de45SPoul-Henning Kamp } 62466e5de45SPoul-Henning Kamp bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length); 6258fae3551SRodney W. Grimes strncpy(inst, hp->h_name, INST_SZ); 6268fae3551SRodney W. Grimes inst[INST_SZ - 1] = '\0'; 6278fae3551SRodney W. Grimes if (cp = strchr(inst, '.')) 6288fae3551SRodney W. Grimes *cp = '\0'; 6298fae3551SRodney W. Grimes } 630a62dc406SDoug Rabson #endif /* NFSKERB */ 6318fae3551SRodney W. Grimes 632a62dc406SDoug Rabson if (nfsargsp->flags & NFSMNT_NFSV3) { 633a62dc406SDoug Rabson nfsvers = 3; 634a62dc406SDoug Rabson mntvers = 3; 635a62dc406SDoug Rabson } else { 636a62dc406SDoug Rabson nfsvers = 2; 637a62dc406SDoug Rabson mntvers = 1; 638a62dc406SDoug Rabson } 6398fae3551SRodney W. Grimes nfhret.stat = EACCES; /* Mark not yet successful */ 6408fae3551SRodney W. Grimes while (retrycnt > 0) { 6418fae3551SRodney W. Grimes saddr.sin_family = AF_INET; 6428fae3551SRodney W. Grimes saddr.sin_port = htons(PMAPPORT); 643bc2cfd71SKarl Strickland if ((tport = port_no ? port_no : 644bc2cfd71SKarl Strickland pmap_getport(&saddr, RPCPROG_NFS, 645a62dc406SDoug Rabson nfsvers, nfsproto)) == 0) { 6468fae3551SRodney W. Grimes if ((opflags & ISBGRND) == 0) 6478fae3551SRodney W. Grimes clnt_pcreateerror("NFS Portmap"); 6488fae3551SRodney W. Grimes } else { 6498fae3551SRodney W. Grimes saddr.sin_port = 0; 6508fae3551SRodney W. Grimes pertry.tv_sec = 10; 6518fae3551SRodney W. Grimes pertry.tv_usec = 0; 652a62dc406SDoug Rabson if (mnttcp_ok && nfsargsp->sotype == SOCK_STREAM) 653a62dc406SDoug Rabson clp = clnttcp_create(&saddr, RPCPROG_MNT, mntvers, 654a62dc406SDoug Rabson &so, 0, 0); 655a62dc406SDoug Rabson else 656a62dc406SDoug Rabson clp = clntudp_create(&saddr, RPCPROG_MNT, mntvers, 657a62dc406SDoug Rabson pertry, &so); 658a62dc406SDoug Rabson if (clp == NULL) { 6598fae3551SRodney W. Grimes if ((opflags & ISBGRND) == 0) 6600013dd1dSAndreas Schulz clnt_pcreateerror("Cannot MNT RPC"); 6618fae3551SRodney W. Grimes } else { 6628fae3551SRodney W. Grimes clp->cl_auth = authunix_create_default(); 6638fae3551SRodney W. Grimes try.tv_sec = 10; 6648fae3551SRodney W. Grimes try.tv_usec = 0; 665a62dc406SDoug Rabson if (nfsargsp->flags & NFSMNT_KERB) 666a62dc406SDoug Rabson nfhret.auth = RPCAUTH_KERB4; 667a62dc406SDoug Rabson else 668a62dc406SDoug Rabson nfhret.auth = RPCAUTH_UNIX; 669a62dc406SDoug Rabson nfhret.vers = mntvers; 6708fae3551SRodney W. Grimes clnt_stat = clnt_call(clp, RPCMNT_MOUNT, 6718fae3551SRodney W. Grimes xdr_dir, spec, xdr_fh, &nfhret, try); 6728fae3551SRodney W. Grimes if (clnt_stat != RPC_SUCCESS) { 6738fae3551SRodney W. Grimes if ((opflags & ISBGRND) == 0) 6748fae3551SRodney W. Grimes warnx("%s", clnt_sperror(clp, 6758fae3551SRodney W. Grimes "bad MNT RPC")); 6768fae3551SRodney W. Grimes } else { 6778fae3551SRodney W. Grimes auth_destroy(clp->cl_auth); 6788fae3551SRodney W. Grimes clnt_destroy(clp); 6798fae3551SRodney W. Grimes retrycnt = 0; 6808fae3551SRodney W. Grimes } 6818fae3551SRodney W. Grimes } 6828fae3551SRodney W. Grimes } 6838fae3551SRodney W. Grimes if (--retrycnt > 0) { 6848fae3551SRodney W. Grimes if (opflags & BGRND) { 6858fae3551SRodney W. Grimes opflags &= ~BGRND; 6868fae3551SRodney W. Grimes if (i = fork()) { 6878fae3551SRodney W. Grimes if (i == -1) 6888fae3551SRodney W. Grimes err(1, "nqnfs 2"); 6898fae3551SRodney W. Grimes exit(0); 6908fae3551SRodney W. Grimes } 6918fae3551SRodney W. Grimes (void) setsid(); 6928fae3551SRodney W. Grimes (void) close(STDIN_FILENO); 6938fae3551SRodney W. Grimes (void) close(STDOUT_FILENO); 6948fae3551SRodney W. Grimes (void) close(STDERR_FILENO); 6958fae3551SRodney W. Grimes (void) chdir("/"); 6968fae3551SRodney W. Grimes opflags |= ISBGRND; 6978fae3551SRodney W. Grimes } 6988fae3551SRodney W. Grimes sleep(60); 6998fae3551SRodney W. Grimes } 7008fae3551SRodney W. Grimes } 7018fae3551SRodney W. Grimes if (nfhret.stat) { 7028fae3551SRodney W. Grimes if (opflags & ISBGRND) 7038fae3551SRodney W. Grimes exit(1); 7042f21d07aSDavid Greenman errno = nfhret.stat; 7058fae3551SRodney W. Grimes warn("can't access %s", spec); 7068fae3551SRodney W. Grimes return (0); 7078fae3551SRodney W. Grimes } 7088fae3551SRodney W. Grimes saddr.sin_port = htons(tport); 7098fae3551SRodney W. Grimes #ifdef ISO 7108fae3551SRodney W. Grimes if (isoflag) { 7118fae3551SRodney W. Grimes nfsargsp->addr = (struct sockaddr *) &isoaddr; 7128fae3551SRodney W. Grimes nfsargsp->addrlen = sizeof (isoaddr); 7138fae3551SRodney W. Grimes } else 7148fae3551SRodney W. Grimes #endif /* ISO */ 7158fae3551SRodney W. Grimes { 7168fae3551SRodney W. Grimes nfsargsp->addr = (struct sockaddr *) &saddr; 7178fae3551SRodney W. Grimes nfsargsp->addrlen = sizeof (saddr); 7188fae3551SRodney W. Grimes } 719a62dc406SDoug Rabson nfsargsp->fh = nfhret.nfh; 720a62dc406SDoug Rabson nfsargsp->fhsize = nfhret.fhsize; 7218fae3551SRodney W. Grimes nfsargsp->hostname = nam; 7228fae3551SRodney W. Grimes return (1); 7238fae3551SRodney W. Grimes } 7248fae3551SRodney W. Grimes 7258fae3551SRodney W. Grimes /* 7268fae3551SRodney W. Grimes * xdr routines for mount rpc's 7278fae3551SRodney W. Grimes */ 7288fae3551SRodney W. Grimes int 7298fae3551SRodney W. Grimes xdr_dir(xdrsp, dirp) 7308fae3551SRodney W. Grimes XDR *xdrsp; 7318fae3551SRodney W. Grimes char *dirp; 7328fae3551SRodney W. Grimes { 7338fae3551SRodney W. Grimes return (xdr_string(xdrsp, &dirp, RPCMNT_PATHLEN)); 7348fae3551SRodney W. Grimes } 7358fae3551SRodney W. Grimes 7368fae3551SRodney W. Grimes int 7378fae3551SRodney W. Grimes xdr_fh(xdrsp, np) 7388fae3551SRodney W. Grimes XDR *xdrsp; 739a62dc406SDoug Rabson register struct nfhret *np; 7408fae3551SRodney W. Grimes { 741a62dc406SDoug Rabson register int i; 742a62dc406SDoug Rabson long auth, authcnt, authfnd = 0; 743a62dc406SDoug Rabson 744a62dc406SDoug Rabson if (!xdr_u_long(xdrsp, &np->stat)) 7458fae3551SRodney W. Grimes return (0); 7468fae3551SRodney W. Grimes if (np->stat) 7478fae3551SRodney W. Grimes return (1); 748a62dc406SDoug Rabson switch (np->vers) { 749a62dc406SDoug Rabson case 1: 750a62dc406SDoug Rabson np->fhsize = NFSX_V2FH; 751a62dc406SDoug Rabson return (xdr_opaque(xdrsp, (caddr_t)np->nfh, NFSX_V2FH)); 752a62dc406SDoug Rabson case 3: 753a62dc406SDoug Rabson if (!xdr_long(xdrsp, &np->fhsize)) 754a62dc406SDoug Rabson return (0); 755a62dc406SDoug Rabson if (np->fhsize <= 0 || np->fhsize > NFSX_V3FHMAX) 756a62dc406SDoug Rabson return (0); 757a62dc406SDoug Rabson if (!xdr_opaque(xdrsp, (caddr_t)np->nfh, np->fhsize)) 758a62dc406SDoug Rabson return (0); 759a62dc406SDoug Rabson if (!xdr_long(xdrsp, &authcnt)) 760a62dc406SDoug Rabson return (0); 761a62dc406SDoug Rabson for (i = 0; i < authcnt; i++) { 762a62dc406SDoug Rabson if (!xdr_long(xdrsp, &auth)) 763a62dc406SDoug Rabson return (0); 764a62dc406SDoug Rabson if (auth == np->auth) 765a62dc406SDoug Rabson authfnd++; 766a62dc406SDoug Rabson } 767a62dc406SDoug Rabson 768a62dc406SDoug Rabson /* 769a62dc406SDoug Rabson * Some servers, such as DEC's OSF/1 return a nil authenticator 770a62dc406SDoug Rabson * list to indicate RPCAUTH_UNIX. 771a62dc406SDoug Rabson */ 772a62dc406SDoug Rabson if (!authfnd && (authcnt > 0 || np->auth != RPCAUTH_UNIX)) 773a62dc406SDoug Rabson np->stat = EAUTH; 774a62dc406SDoug Rabson return (1); 775a62dc406SDoug Rabson }; 776a62dc406SDoug Rabson return (0); 7778fae3551SRodney W. Grimes } 7788fae3551SRodney W. Grimes 7798fae3551SRodney W. Grimes __dead void 7808fae3551SRodney W. Grimes usage() 7818fae3551SRodney W. Grimes { 782a62dc406SDoug Rabson (void)fprintf(stderr, "\ 783a62dc406SDoug Rabson usage: mount_nfs [-3KPTUbcdilqs] [-D deadthresh] [-I readdirsize]\n\ 784a62dc406SDoug Rabson [-L leaseterm] [-R retrycnt] [-a maxreadahead] [-g maxgroups]\n\ 785a62dc406SDoug Rabson [-m realm] [-o options] [-r readsize] [-t timeout] [-w writesize]\n\ 786a62dc406SDoug Rabson [-x retrans] rhost:path node\n"); 7878fae3551SRodney W. Grimes exit(1); 7888fae3551SRodney W. Grimes } 789