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

📄 rfsetup.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/*	@(#)rfsetup.c 1.1 92/07/30 SMI 	*//*	Copyright (c) 1984 AT&T	*//*	  All Rights Reserved  	*//*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*//*	The copyright notice above does not evidence any   	*//*	actual or intended publication of such source code.	*/#ident	"@(#)rfsetup:rfsetup.c	1.8"#include <fcntl.h>#include <string.h>#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/stropts.h>#include <sys/conf.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <sys/mount.h>#include <rfs/nserve.h>#include <rfs/cirmgr.h>#include <rfs/rfsys.h>#include <rfs/pn.h>#include <rfs/hetero.h>#include <sys/types.h>#include <rpc/rpc.h>#include <rfs/ns_xdr.h>#ifdef LOGGING#define FPRINTF	fprintf#define FFLUSH	fflush#else#define FPRINTF	no_fn#define FFLUSH	no_fn#endif#define DEBUG_FILE "/usr/net/servers/rfs/rfs.log"#define MAX_DB_SIZE 100000static	FILE	*Debugfd = stderr;static	int	Mypid;static	int	op;static	char	canonbuf[20];static	int	flags = 0;extern	int	errno;extern	int	t_errno;extern	ndata_t	ndata;extern	pntab_t sw_tab[];pnhdr_t pnhdr;main(){	int fd;	int sfd;	struct gdpmisc gdpmisc;	fd = 0;			/* transport endpoint */	(void) t_sync(fd);	gdpmisc.hetero = gdpmisc.version = 0;	logsetup();#ifdef LOGGING	logrequest();#endif	if (banter(fd) < 0)		d_exit(fd);	switch (op) {	case RF_NS:	/*	 * Pass fd to name server process and exit.	 * if pass fails, close stream and exit.	 */		if ((sfd = open(NS_PIPE, O_RDWR)) < 0) {			FPRINTF(Debugfd,			   "(%5d) cannot open ns channel, errno=%d\n",			   Mypid, errno);			FFLUSH(Debugfd);			d_exit(fd);		}		(void) poptli(fd);		if (ioctl(fd, I_PUSH, "tirdwr") < 0) {			FPRINTF(Debugfd,			   "(%5d) can't push TIRDWR, errno=%d\n",			   Mypid,errno);			FFLUSH(Debugfd);			d_exit(fd);		}		if (ioctl(sfd, I_SENDFD, fd) < 0) {			FPRINTF(Debugfd,			   "(%5d) can't I_SENDFD fd to ns, errno=%d\n",			   Mypid,errno);			FFLUSH(Debugfd);			d_exit(fd);		}		(void) exit(0);	case RF_RF:	/* read token of client, along with rest of negotiation data */	/* here we would also read specific du opcode and switch (i.e. case MNT) */		if ((gdpmisc.version =		     negotiate(fd,NULL,RFS_SERVER)) < 0 ) {			FPRINTF(Debugfd,"(%5d) negotiations failed\n",				Mypid);			FFLUSH(Debugfd);			d_exit(fd);		}		gdpmisc.hetero = ndata.n_hetero;		ndata.n_token.t_id = RFS_SERVER;		(void) poptli(fd);		if (rfsys(RF_FWFD, fd, &ndata.n_token, &gdpmisc) <0) {			FPRINTF(Debugfd,			   "(%5d) can't do FWFD, errno=%d\n",Mypid,errno);			FFLUSH(Debugfd);			d_exit(fd);		}		uidmap(0, (char *)NULL, (char *)NULL, &ndata.n_netname[0], 0);		uidmap(1, (char *)NULL, (char *)NULL, &ndata.n_netname[0], 0);                FPRINTF(Debugfd,"(%5d) setup circuit for client %s\n", Mypid,                                        ndata.n_token.t_uname);                FFLUSH(Debugfd);		(void) exit(0);	default:		FPRINTF(Debugfd,"(%5d) invalid opcode %d\n",Mypid,op);		FFLUSH(Debugfd);		(void) exit(1);	} /* end switch */	/* NOTREACHED */}banter(fd)int fd;{	int	i;	pnhdr_t rpnhdr;	/*	 * get header from client - 	 *	 * format of header is	4 char opcode	 *			canon long hi version	 *			canon long lo version	 */	if ((i =rf_rcv(fd, canonbuf, CANON_CLEN, &flags)) != CANON_CLEN) {		FPRINTF(Debugfd,			"(%5d) t_rcv opcode failed, t_errno=%d, errno=%d\n",			Mypid,t_errno,errno);		if (i != CANON_CLEN)			FPRINTF(Debugfd, "(%5d) t_rcv only returned %d bytes\n",				Mypid, i);		FFLUSH(Debugfd);		return(-1);	}	if (fcanon(rfs_pnhdr, canonbuf, &pnhdr) == 0) {		FPRINTF(Debugfd,"(%5d) fcanon returned 0\n",Mypid);		FFLUSH(Debugfd);		return(-1);	}	/* check on version mapping */	if((pnhdr.pn_lo > HI_VER) || (pnhdr.pn_hi < LO_VER )) {		FPRINTF(Debugfd,		   "(%5d) bad version local hi=%d lo=%d, rem hi=%d,lo=%d\n",		   Mypid,HI_VER,LO_VER,pnhdr.pn_lo,pnhdr.pn_hi);		FFLUSH(Debugfd);		rpnhdr.pn_hi = -1;	} else  {		if(pnhdr.pn_hi < HI_VER)			rpnhdr.pn_lo = rpnhdr.pn_hi = pnhdr.pn_hi;		else			rpnhdr.pn_lo = rpnhdr.pn_hi = HI_VER;	}	op = get_opcode(&pnhdr);#ifdef LOGGING	logopcode();#endif	if (op < 0) {		FPRINTF(Debugfd, "(%5d) invalid opcode\n",Mypid);		FFLUSH(Debugfd);		return(-1);	}	/* send back version we are talking in */	strncpy(&rpnhdr.pn_op[0],sw_tab[RF_AK].sw_opcode,OPCODLEN);	if ((i = tcanon(rfs_pnhdr,&rpnhdr, canonbuf)) == 0) {		FPRINTF(Debugfd,"(%5d) version fcanon returned 0\n",Mypid);		FFLUSH(Debugfd);		return(-1);	}	if (t_snd(fd, canonbuf, i, 0) != i) {		FPRINTF(Debugfd,		    "(%5d) response t_snd failed, t_errno=%d, errno=%d\n",		    Mypid,t_errno,errno);		FFLUSH(Debugfd);		return(-1);	}	return(rpnhdr.pn_hi);}intget_opcode(ptr)pnhdr_t *ptr;{	int i;	for (i = 0; i < NUMSWENT; i++)		if (strcmp(ptr->pn_op, sw_tab[i].sw_opcode) == 0)			break;	if (i >= NUMSWENT)		return(-1);	return(sw_tab[i].sw_idx);}d_exit(fd)int fd;{	char modname[FMNAMESZ+1];	FPRINTF(Debugfd,"(%5d) exit\n",Mypid);	FFLUSH(Debugfd);	if (ioctl(fd, I_LOOK, modname) >= 0) {		if (strcmp(modname, TIMOD) == 0)			(void) t_snddis(fd);	}	(void) exit(2);}#ifdef LOGGINGintlogrequest(){	char	*getenv();	char	*addr = getenv("NLSADDR");	char	*provider = getenv("NLSPROVIDER");	FPRINTF(Debugfd,"(%5d) Rcvd req from addr=%s, provider=%s\n",		Mypid,(addr)?addr:"UNK",(provider)?provider:"UNK");	FFLUSH(Debugfd);}intlogopcode(){	char	*opcode;	char	errval[BUFSIZ];	switch (op) {	case RF_NS:		opcode="RFS name service";		break;	case RF_RF:		opcode="RFS remote mount";		break;	default:		opcode=errval;		sprintf(opcode,"UNKNOWN(%d)",op);		break;	}	FPRINTF(Debugfd,"(%5d) request = %s\n",Mypid,opcode);	FFLUSH(Debugfd);}#endifintlogsetup(){	struct stat	sbuf;	int tempfd;	char *openflag;	Mypid = getpid();	(void) close(2);#ifndef LOGGING	(void) close(1);	return;#else	openflag = "w";	if (stat(DEBUG_FILE,&sbuf) == 0) {		/* if file is too big, truncate it and start over */		if (sbuf.st_size <= MAX_DB_SIZE)			openflag = "a";	}	/* freopen does auto close of open stream */	if ((Debugfd = freopen(DEBUG_FILE,openflag,stdout)) == NULL) {		if ((Debugfd = fopen("/dev/null","w")) == NULL) {			Debugfd = stderr;			return;		}	}	if ((tempfd = dup(1)) != 2) {		if (tempfd >= 1)			(void) close(tempfd);		(void) close(2);	}#endif}intpoptli(fd)int fd;{	char modname[FMNAMESZ+1];	if (ioctl(fd, I_LOOK, modname) >= 0) {		if (strcmp(modname, TIMOD) == 0) {			if (ioctl(fd, I_POP) < 0) {				FPRINTF(Debugfd, "(%5d) can't pop TIMOD, errno=%d\n",					Mypid,errno);				FFLUSH(Debugfd);			}		}	}	return(0);}/* VARARGS */no_fn() {} /* dummy function for FPRINTF and FFLUSH */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -