📄 mount_9fs.c
字号:
/* * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Rick Macklem at The University of Guelph. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic const char copyright[] ="@(#) Copyright (c) 1992, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n";#endif /* not lint */#ifndef lint#if 0static char sccsid[] = "@(#)mount_nfs.c 8.11 (Berkeley) 5/4/95";#endifstatic const char rcsid[] = "$Id: mount_nfs.c,v 1.29 1998/07/06 07:15:53 charnier Exp $";#endif /* not lint */#include <sys/param.h>#include <sys/mount.h>#include <sys/stat.h>#include <sys/syslog.h>#include <rpc/rpc.h>#include <rpc/pmap_clnt.h>#include <rpc/pmap_prot.h>#ifdef ISO#include <netiso/iso.h>#endif#ifdef NFSKERB#include <kerberosIV/des.h>#include <kerberosIV/krb.h>#endif#include <sys/vnode.h>#include "9p.h"#include "9auth.h"#include "9fs.h"#include <pwd.h>#include <nfs/rpcv2.h>#include <nfs/nfsproto.h>#include <nfs/nfs.h>#include <nfs/nqnfs.h>#include <arpa/inet.h>#include <ctype.h>#include <err.h>#include <errno.h>#include <netdb.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <strings.h>#include <sysexits.h>#include <unistd.h>#include "mntopts.h"#define ALTF_BG 0x1#define ALTF_NOCONN 0x2#define ALTF_DUMBTIMR 0x4#define ALTF_INTR 0x8#define ALTF_KERB 0x10#define ALTF_NFSV3 0x20#define ALTF_RDIRPLUS 0x40#define ALTF_MNTUDP 0x80#define ALTF_RESVPORT 0x100#define ALTF_SEQPACKET 0x200#define ALTF_NQNFS 0x400#define ALTF_SOFT 0x800#define ALTF_TCP 0x1000#define ALTF_PORT 0x2000#define ALTF_NFSV2 0x4000#define ALTF_ACREGMIN 0x8000#define ALTF_ACREGMAX 0x10000#define ALTF_ACDIRMIN 0x20000#define ALTF_ACDIRMAX 0x40000struct mntopt mopts[] = { MOPT_STDOPTS, MOPT_FORCE, MOPT_UPDATE, MOPT_ASYNC, { "bg", 0, ALTF_BG, 1 }, { "conn", 1, ALTF_NOCONN, 1 }, { "dumbtimer", 0, ALTF_DUMBTIMR, 1 }, { "intr", 0, ALTF_INTR, 1 },#ifdef NFSKERB { "kerb", 0, ALTF_KERB, 1 },#endif { "nfsv3", 0, ALTF_NFSV3, 1 }, { "rdirplus", 0, ALTF_RDIRPLUS, 1 }, { "mntudp", 0, ALTF_MNTUDP, 1 }, { "resvport", 0, ALTF_RESVPORT, 1 },#ifdef ISO { "seqpacket", 0, ALTF_SEQPACKET, 1 },#endif { "nqnfs", 0, ALTF_NQNFS, 1 }, { "soft", 0, ALTF_SOFT, 1 }, { "tcp", 0, ALTF_TCP, 1 }, { "port=", 0, ALTF_PORT, 1 }, { "nfsv2", 0, ALTF_NFSV2, 1 }, { "acregmin=", 0, ALTF_ACREGMIN, 1 }, { "acregmax=", 0, ALTF_ACREGMAX, 1 }, { "acdirmin=", 0, ALTF_ACDIRMIN, 1 }, { "acdirmax=", 0, ALTF_ACDIRMAX, 1 }, { NULL }};struct u9fs_args u9fsdefargs = { 1, (struct sockaddr *)0, sizeof (struct sockaddr_in), SOCK_SEQPACKET, IPPROTO_IL, 0, 0, 0, 0, 0, (char *)0, 0, 0, SOCK_SEQPACKET, IPPROTO_IL,};struct nfhret { u_long stat; long vers; long auth; long fhsize; u_char nfh[NFSX_V3FHMAX];};#define DEF_RETRY 10000#define BGRND 1#define ISBGRND 2int retrycnt = DEF_RETRY;int opflags = 0;int nfsproto = IPPROTO_UDP;int mnttcp_ok = 1;u_short port_no = 0;enum { ANY, V2, V3} mountmode = ANY;#ifdef NFSKERBchar inst[INST_SZ];char realm[REALM_SZ];struct { u_long kind; KTEXT_ST kt;} ktick;struct nfsrpc_nickverf kverf;struct nfsrpc_fullblock kin, kout;NFSKERBKEY_T kivec;CREDENTIALS kcr;struct timeval ktv;NFSKERBKEYSCHED_T kerb_keysched;#endifint getnfsargs __P((char *, struct u9fs_args *));#ifdef ISOstruct iso_addr *iso_addr __P((const char *));#endifvoid set_rpc_maxgrouplist __P((int));void usage __P((void)) __dead2;int xdr_dir __P((XDR *, char *));int xdr_fh __P((XDR *, struct nfhret *));void gethostaddr(char * hostp, struct sockaddr_in * saddr);/* * Used to set mount flags with getmntopts. Call with dir=TRUE to * initialize altflags from the current mount flags. Call with * dir=FALSE to update mount flags with the new value of altflags after * the call to getmntopts. */static voidsetflags(int* altflags, int* nfsflags, int dir){#define F2(af, nf) \ if (dir) { \ if (*nfsflags & NFSMNT_##nf) \ *altflags |= ALTF_##af; \ else \ *altflags &= ~ALTF_##af; \ } else { \ if (*altflags & ALTF_##af) \ *nfsflags |= NFSMNT_##nf; \ else \ *nfsflags &= ~NFSMNT_##nf; \ }#define F(f) F2(f,f) F(NOCONN); F(DUMBTIMR); F2(INTR, INT);#ifdef NFSKERB F(KERB);#endif F(RDIRPLUS); F(RESVPORT); F(NQNFS); F(SOFT);#undef F#undef F2}intmain(argc, argv) int argc; char *argv[];{ register int c; register struct u9fs_args *nfsargsp; struct u9fs_args u9fsargs; struct nfsd_cargs ncd; int mntflags, altflags, i, nfssvc_flag, num; char *name, *p, *spec; struct vfsconf vfc; int error = 0; static struct sockaddr_in authaddr;#ifdef NFSKERB uid_t last_ruid; last_ruid = -1; (void)strcpy(realm, KRB_REALM); if (sizeof (struct nfsrpc_nickverf) != RPCX_NICKVERF || sizeof (struct nfsrpc_fullblock) != RPCX_FULLBLOCK || ((char *)&ktick.kt) - ((char *)&ktick) != NFSX_UNSIGNED || ((char *)ktick.kt.dat) - ((char *)&ktick) != 2 * NFSX_UNSIGNED) fprintf(stderr, "Yikes! NFSKERB structs not packed!!\n");#endif /* NFSKERB */ retrycnt = DEF_RETRY; mntflags = 0; altflags = 0; u9fsargs = u9fsdefargs; nfsargsp = &u9fsargs; while ((c = getopt(argc, argv, "23a:bcdD:g:I:iKL:lm:No:PpqR:r:sTt:w:x:Uu:")) != -1) switch (c) { case '2': mountmode = V2; break; case '3': mountmode = V3; break; case 'a': num = strtol(optarg, &p, 10); if (*p || num < 0) errx(1, "illegal -a value -- %s", optarg);#if 0 nfsargsp->readahead = num; nfsargsp->flags |= NFSMNT_READAHEAD;#endif break; case 'b': opflags |= BGRND; break; case 'c': nfsargsp->flags |= NFSMNT_NOCONN; break; case 'D': num = strtol(optarg, &p, 10); if (*p || num <= 0) errx(1, "illegal -D value -- %s", optarg);#if 0 nfsargsp->deadthresh = num; nfsargsp->flags |= NFSMNT_DEADTHRESH;#endif break; case 'd': nfsargsp->flags |= NFSMNT_DUMBTIMR; break; case 'g': num = strtol(optarg, &p, 10); if (*p || num <= 0) errx(1, "illegal -g value -- %s", optarg);#ifdef __FreeBSD__ set_rpc_maxgrouplist(num);#endif#if 0 nfsargsp->maxgrouplist = num; nfsargsp->flags |= NFSMNT_MAXGRPS;#endif break; case 'I': num = strtol(optarg, &p, 10); if (*p || num <= 0) errx(1, "illegal -I value -- %s", optarg); nfsargsp->readdirsize = num; nfsargsp->flags |= NFSMNT_READDIRSIZE; break; case 'i': nfsargsp->flags |= NFSMNT_INT; break;#ifdef NFSKERB case 'K': nfsargsp->flags |= NFSMNT_KERB; break;#endif case 'L': num = strtol(optarg, &p, 10); if (*p || num < 2) errx(1, "illegal -L value -- %s", optarg);#if 0 nfsargsp->leaseterm = num; nfsargsp->flags |= NFSMNT_LEASETERM;#endif break; case 'l': nfsargsp->flags |= NFSMNT_RDIRPLUS; break;#ifdef NFSKERB case 'm': (void)strncpy(realm, optarg, REALM_SZ - 1); realm[REALM_SZ - 1] = '\0'; break;#endif case 'N': nfsargsp->flags &= ~NFSMNT_RESVPORT; break; case 'o': altflags = 0; setflags(&altflags, &nfsargsp->flags, TRUE); if (mountmode == V2) altflags |= ALTF_NFSV2; else if (mountmode == V3) altflags |= ALTF_NFSV3; getmntopts(optarg, mopts, &mntflags, &altflags); setflags(&altflags, &nfsargsp->flags, FALSE); /* * Handle altflags which don't map directly to * mount flags. */ if(altflags & ALTF_BG) opflags |= BGRND; if(altflags & ALTF_MNTUDP) mnttcp_ok = 0;#ifdef ISO if(altflags & ALTF_SEQPACKET) nfsargsp->sotype = SOCK_SEQPACKET;#endif if(altflags & ALTF_TCP) { nfsargsp->sotype = SOCK_STREAM; nfsproto = IPPROTO_TCP; } if(altflags & ALTF_PORT) port_no = atoi(strstr(optarg, "port=") + 5); mountmode = ANY; if(altflags & ALTF_NFSV2) mountmode = V2; if(altflags & ALTF_NFSV3) mountmode = V3;#if 0 if(altflags & ALTF_ACREGMIN) nfsargsp->acregmin = atoi(strstr(optarg, "acregmin=") + 9); if(altflags & ALTF_ACREGMAX) nfsargsp->acregmax = atoi(strstr(optarg, "acregmax=") + 9); if(altflags & ALTF_ACDIRMIN) nfsargsp->acdirmin = atoi(strstr(optarg, "acdirmin=") + 9); if(altflags & ALTF_ACDIRMAX) nfsargsp->acdirmax = atoi(strstr(optarg, "acdirmax=") + 9);#endif break; case 'P': /* obsolete for NFSMNT_RESVPORT, now default */ break;#ifdef ISO case 'p': nfsargsp->sotype = SOCK_SEQPACKET; break;#endif case 'q': mountmode = V3; nfsargsp->flags |= NFSMNT_NQNFS; break; case 'R': num = strtol(optarg, &p, 10); if (*p || num <= 0) errx(1, "illegal -R value -- %s", optarg); retrycnt = num; break; case 'r': num = strtol(optarg, &p, 10); if (*p || num <= 0) errx(1, "illegal -r value -- %s", optarg); nfsargsp->rsize = num; nfsargsp->flags |= NFSMNT_RSIZE; break; case 's': nfsargsp->flags |= NFSMNT_SOFT; break; case 'T': nfsargsp->sotype = SOCK_STREAM; nfsproto = IPPROTO_TCP; break; case 't': num = strtol(optarg, &p, 10); if (*p || num <= 0) errx(1, "illegal -t value -- %s", optarg);#if 0 nfsargsp->timeo = num; nfsargsp->flags |= NFSMNT_TIMEO;#endif break; case 'w': num = strtol(optarg, &p, 10); if (*p || num <= 0) errx(1, "illegal -w value -- %s", optarg); nfsargsp->wsize = num; nfsargsp->flags |= NFSMNT_WSIZE; break; case 'x': num = strtol(optarg, &p, 10); if (*p || num <= 0) errx(1, "illegal -x value -- %s", optarg);#if 0 nfsargsp->retrans = num; nfsargsp->flags |= NFSMNT_RETRANS;#endif break; case 'U': mnttcp_ok = 0; break; case 'u': if( (p = index(optarg, '@')) ) { *p++ = 0; strncpy(nfsargsp->uname, optarg, U9FS_NAMELEN); gethostaddr(p, & authaddr); authaddr.sin_family = AF_INET; authaddr.sin_port = htons(U9AUTH_ILPORT); nfsargsp->authaddr = (struct sockaddr *) & authaddr; nfsargsp->authaddrlen = sizeof(authaddr); } else strncpy(nfsargsp->uname, optarg, U9FS_NAMELEN); break; default: usage(); break; } argc -= optind; argv += optind; if (argc != 2) { usage(); /* NOTREACHED */ } spec = *argv++; name = *argv; if (!getnfsargs(spec, nfsargsp)) exit(1);#ifdef __FreeBSD__ error = getvfsbyname("u9fs", &vfc); if (error && vfsisloadable("nfs")) { if(vfsload("nfs")) err(EX_OSERR, "vfsload(nfs)"); endvfsent(); /* clear cache */ error = getvfsbyname("nfs", &vfc); } if (error) errx(EX_OSERR, "nfs filesystem is not available"); if (mount(vfc.vfc_name, name, mntflags, nfsargsp)) err(1, "%s", name);#else if (mount("nfs", name, mntflags, nfsargsp)) err(1, "%s", name);#endif if (nfsargsp->flags & (NFSMNT_NQNFS | NFSMNT_KERB)) { if ((opflags & ISBGRND) == 0) { if ((i = fork())) { if (i == -1) err(1, "nqnfs 1");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -