⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mount_9fs.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -