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 448fae3551SRodney W. Grimes static char sccsid[] = "@(#)mount_nfs.c 8.3 (Berkeley) 3/27/94"; 458fae3551SRodney W. Grimes #endif /* not lint */ 468fae3551SRodney W. Grimes 478fae3551SRodney W. Grimes #include <sys/param.h> 488fae3551SRodney W. Grimes #include <sys/mount.h> 498fae3551SRodney W. Grimes #include <sys/socket.h> 508fae3551SRodney W. Grimes #include <sys/socketvar.h> 518fae3551SRodney W. Grimes #include <sys/stat.h> 528fae3551SRodney W. Grimes #include <sys/syslog.h> 538fae3551SRodney W. Grimes 548fae3551SRodney W. Grimes #include <rpc/rpc.h> 558fae3551SRodney W. Grimes #include <rpc/pmap_clnt.h> 568fae3551SRodney W. Grimes #include <rpc/pmap_prot.h> 578fae3551SRodney W. Grimes 588fae3551SRodney W. Grimes #ifdef ISO 598fae3551SRodney W. Grimes #include <netiso/iso.h> 608fae3551SRodney W. Grimes #endif 618fae3551SRodney W. Grimes 62a62dc406SDoug Rabson #ifdef NFSKERB 638fae3551SRodney W. Grimes #include <kerberosIV/des.h> 648fae3551SRodney W. Grimes #include <kerberosIV/krb.h> 658fae3551SRodney W. Grimes #endif 668fae3551SRodney W. Grimes 678fae3551SRodney W. Grimes #include <nfs/rpcv2.h> 68a62dc406SDoug Rabson #include <nfs/nfsproto.h> 69a62dc406SDoug Rabson #define _KERNEL 708fae3551SRodney W. Grimes #include <nfs/nfs.h> 71a62dc406SDoug Rabson #undef _KERNEL 728fae3551SRodney W. Grimes #include <nfs/nqnfs.h> 738fae3551SRodney W. Grimes 748fae3551SRodney W. Grimes #include <arpa/inet.h> 758fae3551SRodney W. Grimes 768fae3551SRodney W. Grimes #include <ctype.h> 778fae3551SRodney W. Grimes #include <err.h> 788fae3551SRodney W. Grimes #include <errno.h> 798fae3551SRodney W. Grimes #include <fcntl.h> 808fae3551SRodney W. Grimes #include <netdb.h> 818fae3551SRodney W. Grimes #include <signal.h> 828fae3551SRodney W. Grimes #include <stdio.h> 838fae3551SRodney W. Grimes #include <stdlib.h> 848fae3551SRodney W. Grimes #include <strings.h> 858fae3551SRodney W. Grimes #include <unistd.h> 868fae3551SRodney W. Grimes 878fae3551SRodney W. Grimes #include "mntopts.h" 888fae3551SRodney W. Grimes 89a62dc406SDoug Rabson #ifdef __FreeBSD__ 903fa88decSGarrett Wollman #define ALTF_BG 0x1 913fa88decSGarrett Wollman #define ALTF_NOCONN 0x2 923fa88decSGarrett Wollman #define ALTF_DUMBTIMR 0x4 933fa88decSGarrett Wollman #define ALTF_INTR 0x8 943fa88decSGarrett Wollman #define ALTF_KERB 0x10 95a62dc406SDoug Rabson #define ALTF_NFSV3 0x20 96a62dc406SDoug Rabson #define ALTF_RDIRPLUS 0x40 97a62dc406SDoug Rabson #define ALTF_MNTUDP 0x80 983fa88decSGarrett Wollman #define ALTF_RESVPORT 0x100 993fa88decSGarrett Wollman #define ALTF_SEQPACKET 0x200 1003fa88decSGarrett Wollman #define ALTF_NQNFS 0x400 1013fa88decSGarrett Wollman #define ALTF_SOFT 0x800 1023fa88decSGarrett Wollman #define ALTF_TCP 0x1000 103bc2cfd71SKarl Strickland #define ALTF_PORT 0x2000 1043fa88decSGarrett Wollman 1058fae3551SRodney W. Grimes struct mntopt mopts[] = { 1068fae3551SRodney W. Grimes MOPT_STDOPTS, 1078fae3551SRodney W. Grimes MOPT_FORCE, 1088fae3551SRodney W. Grimes MOPT_UPDATE, 1093fa88decSGarrett Wollman { "bg", 0, ALTF_BG, 1 }, 1103fa88decSGarrett Wollman { "conn", 1, ALTF_NOCONN, 1 }, 1113fa88decSGarrett Wollman { "dumbtimer", 0, ALTF_DUMBTIMR, 1 }, 1123fa88decSGarrett Wollman { "intr", 0, ALTF_INTR, 1 }, 113a62dc406SDoug Rabson #ifdef NFSKERB 1143fa88decSGarrett Wollman { "kerb", 0, ALTF_KERB, 1 }, 1153fa88decSGarrett Wollman #endif 116a62dc406SDoug Rabson { "nfsv3", 0, ALTF_NFSV3, 1 }, 117a62dc406SDoug Rabson { "rdirplus", 0, ALTF_RDIRPLUS, 1 }, 118a62dc406SDoug Rabson { "mntudp", 0, ALTF_MNTUDP, 1 }, 1193fa88decSGarrett Wollman { "resvport", 0, ALTF_RESVPORT, 1 }, 1203fa88decSGarrett Wollman #ifdef ISO 1213fa88decSGarrett Wollman { "seqpacket", 0, ALTF_SEQPACKET, 1 }, 1223fa88decSGarrett Wollman #endif 1233fa88decSGarrett Wollman { "nqnfs", 0, ALTF_NQNFS, 1 }, 1243fa88decSGarrett Wollman { "soft", 0, ALTF_SOFT, 1 }, 1253fa88decSGarrett Wollman { "tcp", 0, ALTF_TCP, 1 }, 126bc2cfd71SKarl Strickland { "port=", 0, ALTF_PORT, 1 }, 1278fae3551SRodney W. Grimes { NULL } 1288fae3551SRodney W. Grimes }; 129a62dc406SDoug Rabson #else 130a62dc406SDoug Rabson struct mntopt mopts[] = { 131a62dc406SDoug Rabson MOPT_STDOPTS, 132a62dc406SDoug Rabson MOPT_FORCE, 133a62dc406SDoug Rabson MOPT_UPDATE, 134a62dc406SDoug Rabson { NULL } 135a62dc406SDoug Rabson }; 136a62dc406SDoug Rabson #endif 1378fae3551SRodney W. Grimes 1388fae3551SRodney W. Grimes struct nfs_args nfsdefargs = { 1398fae3551SRodney W. Grimes (struct sockaddr *)0, 1408fae3551SRodney W. Grimes sizeof (struct sockaddr_in), 1418fae3551SRodney W. Grimes SOCK_DGRAM, 1428fae3551SRodney W. Grimes 0, 143a62dc406SDoug Rabson (u_char *)0, 144a62dc406SDoug Rabson 0, 1458fae3551SRodney W. Grimes 0, 1468fae3551SRodney W. Grimes NFS_WSIZE, 1478fae3551SRodney W. Grimes NFS_RSIZE, 148a62dc406SDoug Rabson NFS_READDIRSIZE, 149a62dc406SDoug Rabson 10, 1508fae3551SRodney W. Grimes NFS_RETRANS, 1518fae3551SRodney W. Grimes NFS_MAXGRPS, 1528fae3551SRodney W. Grimes NFS_DEFRAHEAD, 1538fae3551SRodney W. Grimes NQ_DEFLEASE, 1548fae3551SRodney W. Grimes NQ_DEADTHRESH, 1558fae3551SRodney W. Grimes (char *)0, 1568fae3551SRodney W. Grimes }; 1578fae3551SRodney W. Grimes 1588fae3551SRodney W. Grimes struct nfhret { 1598fae3551SRodney W. Grimes u_long stat; 160a62dc406SDoug Rabson long vers; 161a62dc406SDoug Rabson long auth; 162a62dc406SDoug Rabson long fhsize; 163a62dc406SDoug Rabson u_char nfh[NFSX_V3FHMAX]; 1648fae3551SRodney W. Grimes }; 1658fae3551SRodney W. Grimes #define DEF_RETRY 10000 1668fae3551SRodney W. Grimes #define BGRND 1 1678fae3551SRodney W. Grimes #define ISBGRND 2 1688fae3551SRodney W. Grimes int retrycnt = DEF_RETRY; 1698fae3551SRodney W. Grimes int opflags = 0; 170a62dc406SDoug Rabson int nfsproto = IPPROTO_UDP; 171a62dc406SDoug Rabson int mnttcp_ok = 1; 172bc2cfd71SKarl Strickland u_short port_no = 0; 1738fae3551SRodney W. Grimes 174a62dc406SDoug Rabson #ifdef NFSKERB 1758fae3551SRodney W. Grimes char inst[INST_SZ]; 1768fae3551SRodney W. Grimes char realm[REALM_SZ]; 177a62dc406SDoug Rabson struct { 178a62dc406SDoug Rabson u_long kind; 1798fae3551SRodney W. Grimes KTEXT_ST kt; 180a62dc406SDoug Rabson } ktick; 181a62dc406SDoug Rabson struct nfsrpc_nickverf kverf; 182a62dc406SDoug Rabson struct nfsrpc_fullblock kin, kout; 183a62dc406SDoug Rabson NFSKERBKEY_T kivec; 184a62dc406SDoug Rabson CREDENTIALS kcr; 185a62dc406SDoug Rabson struct timeval ktv; 186a62dc406SDoug Rabson NFSKERBKEYSCHED_T kerb_keysched; 1878fae3551SRodney W. Grimes #endif 1888fae3551SRodney W. Grimes 1898fae3551SRodney W. Grimes int getnfsargs __P((char *, struct nfs_args *)); 1908fae3551SRodney W. Grimes #ifdef ISO 1918fae3551SRodney W. Grimes struct iso_addr *iso_addr __P((const char *)); 1928fae3551SRodney W. Grimes #endif 1938fae3551SRodney W. Grimes void set_rpc_maxgrouplist __P((int)); 1948fae3551SRodney W. Grimes __dead void usage __P((void)); 1958fae3551SRodney W. Grimes int xdr_dir __P((XDR *, char *)); 1968fae3551SRodney W. Grimes int xdr_fh __P((XDR *, struct nfhret *)); 1978fae3551SRodney W. Grimes 1988fae3551SRodney W. Grimes int 1998fae3551SRodney W. Grimes main(argc, argv) 2008fae3551SRodney W. Grimes int argc; 2018fae3551SRodney W. Grimes char *argv[]; 2028fae3551SRodney W. Grimes { 2038fae3551SRodney W. Grimes register int c; 2048fae3551SRodney W. Grimes register struct nfs_args *nfsargsp; 2058fae3551SRodney W. Grimes struct nfs_args nfsargs; 2068fae3551SRodney W. Grimes struct nfsd_cargs ncd; 2073fa88decSGarrett Wollman int mntflags, altflags, i, nfssvc_flag, num; 2088fae3551SRodney W. Grimes char *name, *p, *spec; 209d599144dSGarrett Wollman struct vfsconf *vfc; 210a62dc406SDoug Rabson #ifdef NFSKERB 2118fae3551SRodney W. Grimes uid_t last_ruid; 2128fae3551SRodney W. Grimes 2138fae3551SRodney W. Grimes last_ruid = -1; 2148fae3551SRodney W. Grimes (void)strcpy(realm, KRB_REALM); 215a62dc406SDoug Rabson if (sizeof (struct nfsrpc_nickverf) != RPCX_NICKVERF || 216a62dc406SDoug Rabson sizeof (struct nfsrpc_fullblock) != RPCX_FULLBLOCK || 217a62dc406SDoug Rabson ((char *)&ktick.kt) - ((char *)&ktick) != NFSX_UNSIGNED || 218a62dc406SDoug Rabson ((char *)ktick.kt.dat) - ((char *)&ktick) != 2 * NFSX_UNSIGNED) 219a62dc406SDoug Rabson fprintf(stderr, "Yikes! NFSKERB structs not packed!!\n"); 220a62dc406SDoug Rabson #endif /* NFSKERB */ 2218fae3551SRodney W. Grimes retrycnt = DEF_RETRY; 2228fae3551SRodney W. Grimes 2238fae3551SRodney W. Grimes mntflags = 0; 2243fa88decSGarrett Wollman altflags = 0; 2258fae3551SRodney W. Grimes nfsargs = nfsdefargs; 2268fae3551SRodney W. Grimes nfsargsp = &nfsargs; 2278fae3551SRodney W. Grimes while ((c = getopt(argc, argv, 228a62dc406SDoug Rabson "3a:bcdD:g:I:iKL:lm:o:PpqR:r:sTt:w:x:U")) != EOF) 2298fae3551SRodney W. Grimes switch (c) { 230a62dc406SDoug Rabson case '3': 231a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_NFSV3; 232a62dc406SDoug Rabson break; 2338fae3551SRodney W. Grimes case 'a': 2348fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 2358fae3551SRodney W. Grimes if (*p || num < 0) 2368fae3551SRodney W. Grimes errx(1, "illegal -a value -- %s", optarg); 2378fae3551SRodney W. Grimes nfsargsp->readahead = num; 2388fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_READAHEAD; 2398fae3551SRodney W. Grimes break; 2408fae3551SRodney W. Grimes case 'b': 2418fae3551SRodney W. Grimes opflags |= BGRND; 2428fae3551SRodney W. Grimes break; 2438fae3551SRodney W. Grimes case 'c': 2448fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_NOCONN; 2458fae3551SRodney W. Grimes break; 2468fae3551SRodney W. Grimes case 'D': 2478fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 2488fae3551SRodney W. Grimes if (*p || num <= 0) 2498fae3551SRodney W. Grimes errx(1, "illegal -D value -- %s", optarg); 2508fae3551SRodney W. Grimes nfsargsp->deadthresh = num; 2518fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_DEADTHRESH; 2528fae3551SRodney W. Grimes break; 2538fae3551SRodney W. Grimes case 'd': 2548fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_DUMBTIMR; 2558fae3551SRodney W. Grimes break; 2568fae3551SRodney W. Grimes case 'g': 2578fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 2588fae3551SRodney W. Grimes if (*p || num <= 0) 2598fae3551SRodney W. Grimes errx(1, "illegal -g value -- %s", optarg); 260a62dc406SDoug Rabson #ifdef __FreeBSD__ 2618fae3551SRodney W. Grimes set_rpc_maxgrouplist(num); 262a62dc406SDoug Rabson #endif 2638fae3551SRodney W. Grimes nfsargsp->maxgrouplist = num; 2648fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_MAXGRPS; 2658fae3551SRodney W. Grimes break; 266a62dc406SDoug Rabson case 'I': 267a62dc406SDoug Rabson num = strtol(optarg, &p, 10); 268a62dc406SDoug Rabson if (*p || num <= 0) 269a62dc406SDoug Rabson errx(1, "illegal -I value -- %s", optarg); 270a62dc406SDoug Rabson nfsargsp->readdirsize = num; 271a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_READDIRSIZE; 272a62dc406SDoug Rabson break; 2738fae3551SRodney W. Grimes case 'i': 2748fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_INT; 2758fae3551SRodney W. Grimes break; 276a62dc406SDoug Rabson #ifdef NFSKERB 2778fae3551SRodney W. Grimes case 'K': 2788fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_KERB; 2798fae3551SRodney W. Grimes break; 2808fae3551SRodney W. Grimes #endif 2818fae3551SRodney W. Grimes case 'L': 2828fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 2838fae3551SRodney W. Grimes if (*p || num < 2) 2848fae3551SRodney W. Grimes errx(1, "illegal -L value -- %s", optarg); 2858fae3551SRodney W. Grimes nfsargsp->leaseterm = num; 2868fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_LEASETERM; 2878fae3551SRodney W. Grimes break; 2888fae3551SRodney W. Grimes case 'l': 289a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_RDIRPLUS; 2908fae3551SRodney W. Grimes break; 291a62dc406SDoug Rabson #ifdef NFSKERB 2928fae3551SRodney W. Grimes case 'm': 2938fae3551SRodney W. Grimes (void)strncpy(realm, optarg, REALM_SZ - 1); 2948fae3551SRodney W. Grimes realm[REALM_SZ - 1] = '\0'; 2958fae3551SRodney W. Grimes break; 2968fae3551SRodney W. Grimes #endif 2978fae3551SRodney W. Grimes case 'o': 298a62dc406SDoug Rabson #ifdef __FreeBSD__ 2993fa88decSGarrett Wollman getmntopts(optarg, mopts, &mntflags, &altflags); 3003fa88decSGarrett Wollman if(altflags & ALTF_BG) 3013fa88decSGarrett Wollman opflags |= BGRND; 3023fa88decSGarrett Wollman if(altflags & ALTF_NOCONN) 3033fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_NOCONN; 3043fa88decSGarrett Wollman if(altflags & ALTF_DUMBTIMR) 3053fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_DUMBTIMR; 3063fa88decSGarrett Wollman if(altflags & ALTF_INTR) 3073fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_INT; 308a62dc406SDoug Rabson #ifdef NFSKERB 3093fa88decSGarrett Wollman if(altflags & ALTF_KERB) 3103fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_KERB; 3113fa88decSGarrett Wollman #endif 312a62dc406SDoug Rabson if(altflags & ALTF_NFSV3) 313a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_NFSV3; 314a62dc406SDoug Rabson if(altflags & ALTF_RDIRPLUS) 315a62dc406SDoug Rabson nfsargsp->flags |= NFSMNT_RDIRPLUS; 316a62dc406SDoug Rabson if(altflags & ALTF_MNTUDP) 317a62dc406SDoug Rabson mnttcp_ok = 0; 3183fa88decSGarrett Wollman if(altflags & ALTF_RESVPORT) 3193fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_RESVPORT; 3203fa88decSGarrett Wollman #ifdef ISO 3213fa88decSGarrett Wollman if(altflags & ALTF_SEQPACKET) 3223fa88decSGarrett Wollman nfsargsp->sotype = SOCK_SEQPACKET; 3233fa88decSGarrett Wollman #endif 3243fa88decSGarrett Wollman if(altflags & ALTF_NQNFS) 325a62dc406SDoug Rabson nfsargsp->flags |= (NFSMNT_NQNFS|NFSMNT_NFSV3); 3263fa88decSGarrett Wollman if(altflags & ALTF_SOFT) 3273fa88decSGarrett Wollman nfsargsp->flags |= NFSMNT_SOFT; 328a62dc406SDoug Rabson if(altflags & ALTF_TCP) { 3293fa88decSGarrett Wollman nfsargsp->sotype = SOCK_STREAM; 330a62dc406SDoug Rabson nfsproto = IPPROTO_TCP; 331a62dc406SDoug Rabson } 332bc2cfd71SKarl Strickland if(altflags & ALTF_PORT) 333bc2cfd71SKarl Strickland port_no = atoi(strstr(optarg, "port=") + 5); 3343fa88decSGarrett Wollman altflags = 0; 335a62dc406SDoug Rabson #else 336a62dc406SDoug Rabson getmntopts(optarg, mopts, &mntflags); 337a62dc406SDoug Rabson #endif 3388fae3551SRodney W. Grimes break; 3398fae3551SRodney W. Grimes case 'P': 3408fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_RESVPORT; 3418fae3551SRodney W. Grimes break; 3428fae3551SRodney W. Grimes #ifdef ISO 3438fae3551SRodney W. Grimes case 'p': 3448fae3551SRodney W. Grimes nfsargsp->sotype = SOCK_SEQPACKET; 3458fae3551SRodney W. Grimes break; 3468fae3551SRodney W. Grimes #endif 3478fae3551SRodney W. Grimes case 'q': 348a62dc406SDoug Rabson nfsargsp->flags |= (NFSMNT_NQNFS | NFSMNT_NFSV3); 3498fae3551SRodney W. Grimes break; 3508fae3551SRodney W. Grimes case 'R': 3518fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3528fae3551SRodney W. Grimes if (*p || num <= 0) 3538fae3551SRodney W. Grimes errx(1, "illegal -R value -- %s", optarg); 3548fae3551SRodney W. Grimes retrycnt = num; 3558fae3551SRodney W. Grimes break; 3568fae3551SRodney W. Grimes case 'r': 3578fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3588fae3551SRodney W. Grimes if (*p || num <= 0) 3598fae3551SRodney W. Grimes errx(1, "illegal -r value -- %s", optarg); 3608fae3551SRodney W. Grimes nfsargsp->rsize = num; 3618fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_RSIZE; 3628fae3551SRodney W. Grimes break; 3638fae3551SRodney W. Grimes case 's': 3648fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_SOFT; 3658fae3551SRodney W. Grimes break; 3668fae3551SRodney W. Grimes case 'T': 3678fae3551SRodney W. Grimes nfsargsp->sotype = SOCK_STREAM; 368a62dc406SDoug Rabson nfsproto = IPPROTO_TCP; 3698fae3551SRodney W. Grimes break; 3708fae3551SRodney W. Grimes case 't': 3718fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3728fae3551SRodney W. Grimes if (*p || num <= 0) 3738fae3551SRodney W. Grimes errx(1, "illegal -t value -- %s", optarg); 3748fae3551SRodney W. Grimes nfsargsp->timeo = num; 3758fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_TIMEO; 3768fae3551SRodney W. Grimes break; 3778fae3551SRodney W. Grimes case 'w': 3788fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3798fae3551SRodney W. Grimes if (*p || num <= 0) 3808fae3551SRodney W. Grimes errx(1, "illegal -w value -- %s", optarg); 3818fae3551SRodney W. Grimes nfsargsp->wsize = num; 3828fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_WSIZE; 3838fae3551SRodney W. Grimes break; 3848fae3551SRodney W. Grimes case 'x': 3858fae3551SRodney W. Grimes num = strtol(optarg, &p, 10); 3868fae3551SRodney W. Grimes if (*p || num <= 0) 3878fae3551SRodney W. Grimes errx(1, "illegal -x value -- %s", optarg); 3888fae3551SRodney W. Grimes nfsargsp->retrans = num; 3898fae3551SRodney W. Grimes nfsargsp->flags |= NFSMNT_RETRANS; 3908fae3551SRodney W. Grimes break; 391a62dc406SDoug Rabson case 'U': 392a62dc406SDoug Rabson mnttcp_ok = 0; 393a62dc406SDoug Rabson break; 3948fae3551SRodney W. Grimes default: 3958fae3551SRodney W. Grimes usage(); 3968fae3551SRodney W. Grimes break; 3978fae3551SRodney W. Grimes } 3988fae3551SRodney W. Grimes argc -= optind; 3998fae3551SRodney W. Grimes argv += optind; 4008fae3551SRodney W. Grimes 4018fae3551SRodney W. Grimes if (argc != 2) 4022f21d07aSDavid Greenman usage(); 4038fae3551SRodney W. Grimes 4048fae3551SRodney W. Grimes spec = *argv++; 4058fae3551SRodney W. Grimes name = *argv; 4068fae3551SRodney W. Grimes 4078fae3551SRodney W. Grimes if (!getnfsargs(spec, nfsargsp)) 4088fae3551SRodney W. Grimes exit(1); 409d599144dSGarrett Wollman 410a62dc406SDoug Rabson #ifdef __FreeBSD__ 411d599144dSGarrett Wollman vfc = getvfsbyname("nfs"); 412d599144dSGarrett Wollman if(!vfc && vfsisloadable("nfs")) { 413d599144dSGarrett Wollman if(vfsload("nfs")) 414d599144dSGarrett Wollman err(1, "vfsload(nfs)"); 415d599144dSGarrett Wollman endvfsent(); /* flush cache */ 416d599144dSGarrett Wollman vfc = getvfsbyname("nfs"); 417d599144dSGarrett Wollman } 418d599144dSGarrett Wollman 419d599144dSGarrett Wollman if (mount(vfc ? vfc->vfc_index : MOUNT_NFS, name, mntflags, nfsargsp)) 420a62dc406SDoug Rabson #else 421a62dc406SDoug Rabson if (mount(MOUNT_NFS, name, mntflags, nfsargsp)) 422a62dc406SDoug Rabson #endif 4238fae3551SRodney W. Grimes err(1, "%s", name); 4248fae3551SRodney W. Grimes if (nfsargsp->flags & (NFSMNT_NQNFS | NFSMNT_KERB)) { 4258fae3551SRodney W. Grimes if ((opflags & ISBGRND) == 0) { 4268fae3551SRodney W. Grimes if (i = fork()) { 4278fae3551SRodney W. Grimes if (i == -1) 4288fae3551SRodney W. Grimes err(1, "nqnfs 1"); 4298fae3551SRodney W. Grimes exit(0); 4308fae3551SRodney W. Grimes } 4318fae3551SRodney W. Grimes (void) setsid(); 4328fae3551SRodney W. Grimes (void) close(STDIN_FILENO); 4338fae3551SRodney W. Grimes (void) close(STDOUT_FILENO); 4348fae3551SRodney W. Grimes (void) close(STDERR_FILENO); 4358fae3551SRodney W. Grimes (void) chdir("/"); 4368fae3551SRodney W. Grimes } 4378fae3551SRodney W. Grimes openlog("mount_nfs:", LOG_PID, LOG_DAEMON); 4388fae3551SRodney W. Grimes nfssvc_flag = NFSSVC_MNTD; 4398fae3551SRodney W. Grimes ncd.ncd_dirp = name; 4408fae3551SRodney W. Grimes while (nfssvc(nfssvc_flag, (caddr_t)&ncd) < 0) { 4418fae3551SRodney W. Grimes if (errno != ENEEDAUTH) { 4428fae3551SRodney W. Grimes syslog(LOG_ERR, "nfssvc err %m"); 4438fae3551SRodney W. Grimes continue; 4448fae3551SRodney W. Grimes } 4458fae3551SRodney W. Grimes nfssvc_flag = 4468fae3551SRodney W. Grimes NFSSVC_MNTD | NFSSVC_GOTAUTH | NFSSVC_AUTHINFAIL; 447a62dc406SDoug Rabson #ifdef NFSKERB 4488fae3551SRodney W. Grimes /* 4498fae3551SRodney W. Grimes * Set up as ncd_authuid for the kerberos call. 4508fae3551SRodney W. Grimes * Must set ruid to ncd_authuid and reset the 4518fae3551SRodney W. Grimes * ticket name iff ncd_authuid is not the same 4528fae3551SRodney W. Grimes * as last time, so that the right ticket file 4538fae3551SRodney W. Grimes * is found. 454a62dc406SDoug Rabson * Get the Kerberos credential structure so that 455a62dc406SDoug Rabson * we have the seesion key and get a ticket for 456a62dc406SDoug Rabson * this uid. 457a62dc406SDoug Rabson * For more info see the IETF Draft "Authentication 458a62dc406SDoug Rabson * in ONC RPC". 4598fae3551SRodney W. Grimes */ 4608fae3551SRodney W. Grimes if (ncd.ncd_authuid != last_ruid) { 46134728d6aSDoug Rabson char buf[512]; 46234728d6aSDoug Rabson (void)sprintf(buf, "%s%d", 46334728d6aSDoug Rabson TKT_ROOT, ncd.ncd_authuid); 46434728d6aSDoug Rabson krb_set_tkt_string(buf); 4658fae3551SRodney W. Grimes last_ruid = ncd.ncd_authuid; 4668fae3551SRodney W. Grimes } 467a62dc406SDoug Rabson setreuid(ncd.ncd_authuid, 0); 468a62dc406SDoug Rabson kret = krb_get_cred(NFS_KERBSRV, inst, realm, &kcr); 469a62dc406SDoug Rabson if (kret == RET_NOTKT) { 470a62dc406SDoug Rabson kret = get_ad_tkt(NFS_KERBSRV, inst, realm, 471a62dc406SDoug Rabson DEFAULT_TKT_LIFE); 472a62dc406SDoug Rabson if (kret == KSUCCESS) 473a62dc406SDoug Rabson kret = krb_get_cred(NFS_KERBSRV, inst, realm, 474a62dc406SDoug Rabson &kcr); 475a62dc406SDoug Rabson } 476a62dc406SDoug Rabson if (kret == KSUCCESS) 477a62dc406SDoug Rabson kret = krb_mk_req(&ktick.kt, NFS_KERBSRV, inst, 478a62dc406SDoug Rabson realm, 0); 479a62dc406SDoug Rabson 480a62dc406SDoug Rabson /* 481a62dc406SDoug Rabson * Fill in the AKN_FULLNAME authenticator and verfier. 482a62dc406SDoug Rabson * Along with the Kerberos ticket, we need to build 483a62dc406SDoug Rabson * the timestamp verifier and encrypt it in CBC mode. 484a62dc406SDoug Rabson */ 485a62dc406SDoug Rabson if (kret == KSUCCESS && 486a62dc406SDoug Rabson ktick.kt.length <= (RPCAUTH_MAXSIZ-3*NFSX_UNSIGNED) 487a62dc406SDoug Rabson && gettimeofday(&ktv, (struct timezone *)0) == 0) { 488a62dc406SDoug Rabson ncd.ncd_authtype = RPCAUTH_KERB4; 489a62dc406SDoug Rabson ncd.ncd_authstr = (u_char *)&ktick; 490a62dc406SDoug Rabson ncd.ncd_authlen = nfsm_rndup(ktick.kt.length) + 491a62dc406SDoug Rabson 3 * NFSX_UNSIGNED; 492a62dc406SDoug Rabson ncd.ncd_verfstr = (u_char *)&kverf; 493a62dc406SDoug Rabson ncd.ncd_verflen = sizeof (kverf); 494a62dc406SDoug Rabson bcopy((caddr_t)kcr.session, (caddr_t)ncd.ncd_key, 495a62dc406SDoug Rabson sizeof (kcr.session)); 496a62dc406SDoug Rabson kin.t1 = htonl(ktv.tv_sec); 497a62dc406SDoug Rabson kin.t2 = htonl(ktv.tv_usec); 498a62dc406SDoug Rabson kin.w1 = htonl(NFS_KERBTTL); 499a62dc406SDoug Rabson kin.w2 = htonl(NFS_KERBTTL - 1); 500a62dc406SDoug Rabson bzero((caddr_t)kivec, sizeof (kivec)); 501a62dc406SDoug Rabson 502a62dc406SDoug Rabson /* 503a62dc406SDoug Rabson * Encrypt kin in CBC mode using the session 504a62dc406SDoug Rabson * key in kcr. 505a62dc406SDoug Rabson */ 506a62dc406SDoug Rabson XXX 507a62dc406SDoug Rabson 508a62dc406SDoug Rabson /* 509a62dc406SDoug Rabson * Finally, fill the timestamp verifier into the 510a62dc406SDoug Rabson * authenticator and verifier. 511a62dc406SDoug Rabson */ 512a62dc406SDoug Rabson ktick.kind = htonl(RPCAKN_FULLNAME); 513a62dc406SDoug Rabson kverf.kind = htonl(RPCAKN_FULLNAME); 514a62dc406SDoug Rabson NFS_KERBW1(ktick.kt) = kout.w1; 515a62dc406SDoug Rabson ktick.kt.length = htonl(ktick.kt.length); 516a62dc406SDoug Rabson kverf.verf.t1 = kout.t1; 517a62dc406SDoug Rabson kverf.verf.t2 = kout.t2; 518a62dc406SDoug Rabson kverf.verf.w2 = kout.w2; 5198fae3551SRodney W. Grimes nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH; 5208fae3551SRodney W. Grimes } 521a62dc406SDoug Rabson setreuid(0, 0); 522a62dc406SDoug Rabson #endif /* NFSKERB */ 5238fae3551SRodney W. Grimes } 5248fae3551SRodney W. Grimes } 5258fae3551SRodney W. Grimes exit(0); 5268fae3551SRodney W. Grimes } 5278fae3551SRodney W. Grimes 5288fae3551SRodney W. Grimes int 5298fae3551SRodney W. Grimes getnfsargs(spec, nfsargsp) 5308fae3551SRodney W. Grimes char *spec; 5318fae3551SRodney W. Grimes struct nfs_args *nfsargsp; 5328fae3551SRodney W. Grimes { 5338fae3551SRodney W. Grimes register CLIENT *clp; 5348fae3551SRodney W. Grimes struct hostent *hp; 5358fae3551SRodney W. Grimes static struct sockaddr_in saddr; 5368fae3551SRodney W. Grimes #ifdef ISO 5378fae3551SRodney W. Grimes static struct sockaddr_iso isoaddr; 5388fae3551SRodney W. Grimes struct iso_addr *isop; 5398fae3551SRodney W. Grimes int isoflag = 0; 5408fae3551SRodney W. Grimes #endif 5418fae3551SRodney W. Grimes struct timeval pertry, try; 5428fae3551SRodney W. Grimes enum clnt_stat clnt_stat; 543a62dc406SDoug Rabson int so = RPC_ANYSOCK, i, nfsvers, mntvers; 5448fae3551SRodney W. Grimes char *hostp, *delimp; 545a62dc406SDoug Rabson #ifdef NFSKERB 5468fae3551SRodney W. Grimes char *cp; 5478fae3551SRodney W. Grimes #endif 5488fae3551SRodney W. Grimes u_short tport; 5498fae3551SRodney W. Grimes static struct nfhret nfhret; 5508fae3551SRodney W. Grimes static char nam[MNAMELEN + 1]; 5518fae3551SRodney W. Grimes 5528fae3551SRodney W. Grimes strncpy(nam, spec, MNAMELEN); 5538fae3551SRodney W. Grimes nam[MNAMELEN] = '\0'; 5548fae3551SRodney W. Grimes if ((delimp = strchr(spec, '@')) != NULL) { 5558fae3551SRodney W. Grimes hostp = delimp + 1; 5568fae3551SRodney W. Grimes } else if ((delimp = strchr(spec, ':')) != NULL) { 5578fae3551SRodney W. Grimes hostp = spec; 5588fae3551SRodney W. Grimes spec = delimp + 1; 5598fae3551SRodney W. Grimes } else { 5608fae3551SRodney W. Grimes warnx("no <host>:<dirpath> or <dirpath>@<host> spec"); 5618fae3551SRodney W. Grimes return (0); 5628fae3551SRodney W. Grimes } 5638fae3551SRodney W. Grimes *delimp = '\0'; 5648fae3551SRodney W. Grimes /* 5658fae3551SRodney W. Grimes * DUMB!! Until the mount protocol works on iso transport, we must 5668fae3551SRodney W. Grimes * supply both an iso and an inet address for the host. 5678fae3551SRodney W. Grimes */ 5688fae3551SRodney W. Grimes #ifdef ISO 5698fae3551SRodney W. Grimes if (!strncmp(hostp, "iso=", 4)) { 5708fae3551SRodney W. Grimes u_short isoport; 5718fae3551SRodney W. Grimes 5728fae3551SRodney W. Grimes hostp += 4; 5738fae3551SRodney W. Grimes isoflag++; 5748fae3551SRodney W. Grimes if ((delimp = strchr(hostp, '+')) == NULL) { 5758fae3551SRodney W. Grimes warnx("no iso+inet address"); 5768fae3551SRodney W. Grimes return (0); 5778fae3551SRodney W. Grimes } 5788fae3551SRodney W. Grimes *delimp = '\0'; 5798fae3551SRodney W. Grimes if ((isop = iso_addr(hostp)) == NULL) { 5808fae3551SRodney W. Grimes warnx("bad ISO address"); 5818fae3551SRodney W. Grimes return (0); 5828fae3551SRodney W. Grimes } 5838fae3551SRodney W. Grimes bzero((caddr_t)&isoaddr, sizeof (isoaddr)); 5848fae3551SRodney W. Grimes bcopy((caddr_t)isop, (caddr_t)&isoaddr.siso_addr, 5858fae3551SRodney W. Grimes sizeof (struct iso_addr)); 5868fae3551SRodney W. Grimes isoaddr.siso_len = sizeof (isoaddr); 5878fae3551SRodney W. Grimes isoaddr.siso_family = AF_ISO; 5888fae3551SRodney W. Grimes isoaddr.siso_tlen = 2; 5898fae3551SRodney W. Grimes isoport = htons(NFS_PORT); 5908fae3551SRodney W. Grimes bcopy((caddr_t)&isoport, TSEL(&isoaddr), isoaddr.siso_tlen); 5918fae3551SRodney W. Grimes hostp = delimp + 1; 5928fae3551SRodney W. Grimes } 5938fae3551SRodney W. Grimes #endif /* ISO */ 5948fae3551SRodney W. Grimes 5958fae3551SRodney W. Grimes /* 5968fae3551SRodney W. Grimes * Handle an internet host address and reverse resolve it if 5978fae3551SRodney W. Grimes * doing Kerberos. 5988fae3551SRodney W. Grimes */ 5998fae3551SRodney W. Grimes if (isdigit(*hostp)) { 6008fae3551SRodney W. Grimes if ((saddr.sin_addr.s_addr = inet_addr(hostp)) == -1) { 6018fae3551SRodney W. Grimes warnx("bad net address %s", hostp); 6028fae3551SRodney W. Grimes return (0); 6038fae3551SRodney W. Grimes } 60466e5de45SPoul-Henning Kamp } else if ((hp = gethostbyname(hostp)) != NULL) { 60566e5de45SPoul-Henning Kamp bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length); 60666e5de45SPoul-Henning Kamp } else { 6078fae3551SRodney W. Grimes warnx("can't get net id for host"); 6088fae3551SRodney W. Grimes return (0); 6098fae3551SRodney W. Grimes } 610a62dc406SDoug Rabson #ifdef NFSKERB 61166e5de45SPoul-Henning Kamp if ((nfsargsp->flags & NFSMNT_KERB)) { 61266e5de45SPoul-Henning Kamp if ((hp = gethostbyaddr((char *)&saddr.sin_addr.s_addr, 61366e5de45SPoul-Henning Kamp sizeof (u_long), AF_INET)) == (struct hostent *)0) { 61466e5de45SPoul-Henning Kamp warnx("can't reverse resolve net address"); 61566e5de45SPoul-Henning Kamp return (0); 61666e5de45SPoul-Henning Kamp } 61766e5de45SPoul-Henning Kamp bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length); 6188fae3551SRodney W. Grimes strncpy(inst, hp->h_name, INST_SZ); 6198fae3551SRodney W. Grimes inst[INST_SZ - 1] = '\0'; 6208fae3551SRodney W. Grimes if (cp = strchr(inst, '.')) 6218fae3551SRodney W. Grimes *cp = '\0'; 6228fae3551SRodney W. Grimes } 623a62dc406SDoug Rabson #endif /* NFSKERB */ 6248fae3551SRodney W. Grimes 625a62dc406SDoug Rabson if (nfsargsp->flags & NFSMNT_NFSV3) { 626a62dc406SDoug Rabson nfsvers = 3; 627a62dc406SDoug Rabson mntvers = 3; 628a62dc406SDoug Rabson } else { 629a62dc406SDoug Rabson nfsvers = 2; 630a62dc406SDoug Rabson mntvers = 1; 631a62dc406SDoug Rabson } 6328fae3551SRodney W. Grimes nfhret.stat = EACCES; /* Mark not yet successful */ 6338fae3551SRodney W. Grimes while (retrycnt > 0) { 6348fae3551SRodney W. Grimes saddr.sin_family = AF_INET; 6358fae3551SRodney W. Grimes saddr.sin_port = htons(PMAPPORT); 636bc2cfd71SKarl Strickland if ((tport = port_no ? port_no : 637bc2cfd71SKarl Strickland pmap_getport(&saddr, RPCPROG_NFS, 638a62dc406SDoug Rabson nfsvers, nfsproto)) == 0) { 6398fae3551SRodney W. Grimes if ((opflags & ISBGRND) == 0) 6408fae3551SRodney W. Grimes clnt_pcreateerror("NFS Portmap"); 6418fae3551SRodney W. Grimes } else { 6428fae3551SRodney W. Grimes saddr.sin_port = 0; 6438fae3551SRodney W. Grimes pertry.tv_sec = 10; 6448fae3551SRodney W. Grimes pertry.tv_usec = 0; 645a62dc406SDoug Rabson if (mnttcp_ok && nfsargsp->sotype == SOCK_STREAM) 646a62dc406SDoug Rabson clp = clnttcp_create(&saddr, RPCPROG_MNT, mntvers, 647a62dc406SDoug Rabson &so, 0, 0); 648a62dc406SDoug Rabson else 649a62dc406SDoug Rabson clp = clntudp_create(&saddr, RPCPROG_MNT, mntvers, 650a62dc406SDoug Rabson pertry, &so); 651a62dc406SDoug Rabson if (clp == NULL) { 6528fae3551SRodney W. Grimes if ((opflags & ISBGRND) == 0) 6530013dd1dSAndreas Schulz clnt_pcreateerror("Cannot MNT RPC"); 6548fae3551SRodney W. Grimes } else { 6558fae3551SRodney W. Grimes clp->cl_auth = authunix_create_default(); 6568fae3551SRodney W. Grimes try.tv_sec = 10; 6578fae3551SRodney W. Grimes try.tv_usec = 0; 658a62dc406SDoug Rabson if (nfsargsp->flags & NFSMNT_KERB) 659a62dc406SDoug Rabson nfhret.auth = RPCAUTH_KERB4; 660a62dc406SDoug Rabson else 661a62dc406SDoug Rabson nfhret.auth = RPCAUTH_UNIX; 662a62dc406SDoug Rabson nfhret.vers = mntvers; 6638fae3551SRodney W. Grimes clnt_stat = clnt_call(clp, RPCMNT_MOUNT, 6648fae3551SRodney W. Grimes xdr_dir, spec, xdr_fh, &nfhret, try); 6658fae3551SRodney W. Grimes if (clnt_stat != RPC_SUCCESS) { 6668fae3551SRodney W. Grimes if ((opflags & ISBGRND) == 0) 6678fae3551SRodney W. Grimes warnx("%s", clnt_sperror(clp, 6688fae3551SRodney W. Grimes "bad MNT RPC")); 6698fae3551SRodney W. Grimes } else { 6708fae3551SRodney W. Grimes auth_destroy(clp->cl_auth); 6718fae3551SRodney W. Grimes clnt_destroy(clp); 6728fae3551SRodney W. Grimes retrycnt = 0; 6738fae3551SRodney W. Grimes } 6748fae3551SRodney W. Grimes } 6758fae3551SRodney W. Grimes } 6768fae3551SRodney W. Grimes if (--retrycnt > 0) { 6778fae3551SRodney W. Grimes if (opflags & BGRND) { 6788fae3551SRodney W. Grimes opflags &= ~BGRND; 6798fae3551SRodney W. Grimes if (i = fork()) { 6808fae3551SRodney W. Grimes if (i == -1) 6818fae3551SRodney W. Grimes err(1, "nqnfs 2"); 6828fae3551SRodney W. Grimes exit(0); 6838fae3551SRodney W. Grimes } 6848fae3551SRodney W. Grimes (void) setsid(); 6858fae3551SRodney W. Grimes (void) close(STDIN_FILENO); 6868fae3551SRodney W. Grimes (void) close(STDOUT_FILENO); 6878fae3551SRodney W. Grimes (void) close(STDERR_FILENO); 6888fae3551SRodney W. Grimes (void) chdir("/"); 6898fae3551SRodney W. Grimes opflags |= ISBGRND; 6908fae3551SRodney W. Grimes } 6918fae3551SRodney W. Grimes sleep(60); 6928fae3551SRodney W. Grimes } 6938fae3551SRodney W. Grimes } 6948fae3551SRodney W. Grimes if (nfhret.stat) { 6958fae3551SRodney W. Grimes if (opflags & ISBGRND) 6968fae3551SRodney W. Grimes exit(1); 6972f21d07aSDavid Greenman errno = nfhret.stat; 6988fae3551SRodney W. Grimes warn("can't access %s", spec); 6998fae3551SRodney W. Grimes return (0); 7008fae3551SRodney W. Grimes } 7018fae3551SRodney W. Grimes saddr.sin_port = htons(tport); 7028fae3551SRodney W. Grimes #ifdef ISO 7038fae3551SRodney W. Grimes if (isoflag) { 7048fae3551SRodney W. Grimes nfsargsp->addr = (struct sockaddr *) &isoaddr; 7058fae3551SRodney W. Grimes nfsargsp->addrlen = sizeof (isoaddr); 7068fae3551SRodney W. Grimes } else 7078fae3551SRodney W. Grimes #endif /* ISO */ 7088fae3551SRodney W. Grimes { 7098fae3551SRodney W. Grimes nfsargsp->addr = (struct sockaddr *) &saddr; 7108fae3551SRodney W. Grimes nfsargsp->addrlen = sizeof (saddr); 7118fae3551SRodney W. Grimes } 712a62dc406SDoug Rabson nfsargsp->fh = nfhret.nfh; 713a62dc406SDoug Rabson nfsargsp->fhsize = nfhret.fhsize; 7148fae3551SRodney W. Grimes nfsargsp->hostname = nam; 7158fae3551SRodney W. Grimes return (1); 7168fae3551SRodney W. Grimes } 7178fae3551SRodney W. Grimes 7188fae3551SRodney W. Grimes /* 7198fae3551SRodney W. Grimes * xdr routines for mount rpc's 7208fae3551SRodney W. Grimes */ 7218fae3551SRodney W. Grimes int 7228fae3551SRodney W. Grimes xdr_dir(xdrsp, dirp) 7238fae3551SRodney W. Grimes XDR *xdrsp; 7248fae3551SRodney W. Grimes char *dirp; 7258fae3551SRodney W. Grimes { 7268fae3551SRodney W. Grimes return (xdr_string(xdrsp, &dirp, RPCMNT_PATHLEN)); 7278fae3551SRodney W. Grimes } 7288fae3551SRodney W. Grimes 7298fae3551SRodney W. Grimes int 7308fae3551SRodney W. Grimes xdr_fh(xdrsp, np) 7318fae3551SRodney W. Grimes XDR *xdrsp; 732a62dc406SDoug Rabson register struct nfhret *np; 7338fae3551SRodney W. Grimes { 734a62dc406SDoug Rabson register int i; 735a62dc406SDoug Rabson long auth, authcnt, authfnd = 0; 736a62dc406SDoug Rabson 737a62dc406SDoug Rabson if (!xdr_u_long(xdrsp, &np->stat)) 7388fae3551SRodney W. Grimes return (0); 7398fae3551SRodney W. Grimes if (np->stat) 7408fae3551SRodney W. Grimes return (1); 741a62dc406SDoug Rabson switch (np->vers) { 742a62dc406SDoug Rabson case 1: 743a62dc406SDoug Rabson np->fhsize = NFSX_V2FH; 744a62dc406SDoug Rabson return (xdr_opaque(xdrsp, (caddr_t)np->nfh, NFSX_V2FH)); 745a62dc406SDoug Rabson case 3: 746a62dc406SDoug Rabson if (!xdr_long(xdrsp, &np->fhsize)) 747a62dc406SDoug Rabson return (0); 748a62dc406SDoug Rabson if (np->fhsize <= 0 || np->fhsize > NFSX_V3FHMAX) 749a62dc406SDoug Rabson return (0); 750a62dc406SDoug Rabson if (!xdr_opaque(xdrsp, (caddr_t)np->nfh, np->fhsize)) 751a62dc406SDoug Rabson return (0); 752a62dc406SDoug Rabson if (!xdr_long(xdrsp, &authcnt)) 753a62dc406SDoug Rabson return (0); 754a62dc406SDoug Rabson for (i = 0; i < authcnt; i++) { 755a62dc406SDoug Rabson if (!xdr_long(xdrsp, &auth)) 756a62dc406SDoug Rabson return (0); 757a62dc406SDoug Rabson if (auth == np->auth) 758a62dc406SDoug Rabson authfnd++; 759a62dc406SDoug Rabson } 760a62dc406SDoug Rabson 761a62dc406SDoug Rabson /* 762a62dc406SDoug Rabson * Some servers, such as DEC's OSF/1 return a nil authenticator 763a62dc406SDoug Rabson * list to indicate RPCAUTH_UNIX. 764a62dc406SDoug Rabson */ 765a62dc406SDoug Rabson if (!authfnd && (authcnt > 0 || np->auth != RPCAUTH_UNIX)) 766a62dc406SDoug Rabson np->stat = EAUTH; 767a62dc406SDoug Rabson return (1); 768a62dc406SDoug Rabson }; 769a62dc406SDoug Rabson return (0); 7708fae3551SRodney W. Grimes } 7718fae3551SRodney W. Grimes 7728fae3551SRodney W. Grimes __dead void 7738fae3551SRodney W. Grimes usage() 7748fae3551SRodney W. Grimes { 775a62dc406SDoug Rabson (void)fprintf(stderr, "\ 776a62dc406SDoug Rabson usage: mount_nfs [-3KPTUbcdilqs] [-D deadthresh] [-I readdirsize]\n\ 777a62dc406SDoug Rabson [-L leaseterm] [-R retrycnt] [-a maxreadahead] [-g maxgroups]\n\ 778a62dc406SDoug Rabson [-m realm] [-o options] [-r readsize] [-t timeout] [-w writesize]\n\ 779a62dc406SDoug Rabson [-x retrans] rhost:path node\n"); 7808fae3551SRodney W. Grimes exit(1); 7818fae3551SRodney W. Grimes } 782