xref: /csrg-svn/old/berknet/setup.c (revision 8292)
1*8292Scomay static char sccsid[] = "@(#)setup.c	4.2	(Berkeley)	10/03/82";
28206Smckusick 
38206Smckusick /*
48206Smckusick 	setup.c
58206Smckusick 
68206Smckusick 	support procedures used in setting up the network
78206Smckusick 
88206Smckusick */
98206Smckusick 
108206Smckusick # include "defs.h"
118206Smckusick 
128206Smckusick char logfile[] =	LOGFILE;
138206Smckusick 
148206Smckusick /* global variables */
158206Smckusick struct daemonparms netd;
168206Smckusick 
178206Smckusick /*
188206Smckusick 	called in netdaemon and debugging software
198206Smckusick 	handles parameter lists to setup
208206Smckusick 	remote machine and pipes
218206Smckusick */
setupdaemon(argc,argv)228206Smckusick setupdaemon(argc,argv)
238206Smckusick char **argv;{
248206Smckusick 	long timev;
258206Smckusick 	int timei;
268206Smckusick 	FILE *cfile;
278206Smckusick 
288206Smckusick 	parseargs(argc,argv);
298206Smckusick 
308206Smckusick 	cfile = fopen(INITFILE,"r");
318206Smckusick 	rdnetfile(cfile);
328206Smckusick 	fclose(cfile);
338206Smckusick 	err("remote %c local %c link %s inspeed %d outspeed %d length %d\n",
348206Smckusick 		remote,local,netd.dp_device,netd.dp_inspeed,
358206Smckusick 		netd.dp_outspeed,netd.dp_datasize);
368206Smckusick 	err("debug %d time %d count %d onlyuid %d usehispeed=%d hispeedlink='%s'\n",
378206Smckusick 		debugflg,netd.dp_oatime, netd.dp_maxbread,netd.dp_onlyuid,
388206Smckusick 		netd.dp_usehispeed, netd.dp_hispeedlink);
398206Smckusick 	err("sendonly %c rcvonly %c pipesim %c\n",
408206Smckusick 		chfromf(netd.dp_sndorcv < 0),chfromf(netd.dp_sndorcv > 0),
418206Smckusick 		chfromf(netd.dp_pipesim));
428206Smckusick 	setup(netd.dp_device);
438206Smckusick 	timev = gettime();
448206Smckusick 	timei = timev >> 16;
458206Smckusick 	srand(timei);
468206Smckusick }
478206Smckusick /*
488206Smckusick 
498206Smckusick see comment in netdaemon.c about the arguments
508206Smckusick 
518206Smckusick */
parseargs(argc,argv)528206Smckusick parseargs(argc,argv)
538206Smckusick   char **argv; {
548206Smckusick 	char stemp[30];
558206Smckusick 	remote = 0;
568206Smckusick 	while(argc > 1 && argv[1][0] == '-'){
578206Smckusick 		argc--; argv++;
588206Smckusick 		switch(argv[0][1]){
598206Smckusick 		case '8':
608206Smckusick 			netd.dp_use8bit = 1;
618206Smckusick 			break;
628206Smckusick 		case 'd':
638206Smckusick 			debugflg = 1;
648206Smckusick 			break;
658206Smckusick 		case 'h':
668206Smckusick 			netd.dp_usehispeed = 1;
678206Smckusick 			break;
688206Smckusick 		case 'l':
698206Smckusick 			netd.dp_trynetl = 0;
708206Smckusick 			break;
718206Smckusick 		case 'm':
728206Smckusick 			harg(stemp);
738206Smckusick 			remote = lookup(stemp);
748206Smckusick 			break;
758206Smckusick 		case 'o':		/* only */
768206Smckusick 			if(argv[0][2] == 's')		/* only send */
778206Smckusick 				netd.dp_sndorcv = -1;
788206Smckusick 			else if(argv[0][2] == 'r') 	/* only receive */
798206Smckusick 				netd.dp_sndorcv = 1;
808206Smckusick 			else if(argv[0][2] == 'u')	/* only uid num */
818206Smckusick 				netd.dp_onlyuid = atoi(argv[1]);
828206Smckusick 			break;
838206Smckusick 		case 'p':
848206Smckusick 			harg(stemp);
858206Smckusick 			netd.dp_datasize = atol(stemp);
868206Smckusick 			break;
878206Smckusick 		case 'r':
888206Smckusick 			harg(stemp);
898206Smckusick 			netd.dp_rdfile = fdopen(atoi(stemp),"r");
908206Smckusick 			netd.dp_pipesim++;
918206Smckusick 			break;
928206Smckusick 		case 'w':
938206Smckusick 			harg(stemp);
948206Smckusick 			netd.dp_pwritefd = atoi(stemp);
958206Smckusick 			netd.dp_pipesim++;
968206Smckusick 			break;
978206Smckusick 		/* ignore unknown options */
988206Smckusick 		}
998206Smckusick 	}
1008206Smckusick 	if(remote == 0){
1018206Smckusick 		fprintf(stderr,"Error- must specify machine - use -m option\n");
1028206Smckusick 		exit(EX_USAGE);
1038206Smckusick 	}
1048206Smckusick }
1058206Smckusick /*
1068206Smckusick 	set the correct mode on the link device
1078206Smckusick */
setup(str)1088206Smckusick setup(str)
1098206Smckusick   char *str; {
1108206Smckusick 	struct sgttyb stt;
1118206Smckusick # ifdef RAND
1128206Smckusick 	struct {
1138206Smckusick 		int     t_xflags;
1148206Smckusick 		char    t_col;
1158206Smckusick 		char	t_delct;
1168206Smckusick 		char	t_outqc_cc;
1178206Smckusick 		char	t_rawqc_cc;
1188206Smckusick 	} exstt;
1198206Smckusick #define OUT8BIT 01              /* All 8 bits on output */
1208206Smckusick #define IN8BIT  02              /* All 8 bits on input  */
1218206Smckusick # endif
1228206Smckusick 
1238206Smckusick 	initseqno();
1248206Smckusick 	/* nothing to set up if we're simulating with pipes */
1258206Smckusick 	if(netd.dp_pipesim)return;
1268206Smckusick 
1278206Smckusick 	if(netd.dp_usehispeed){
1288206Smckusick 		str = netd.dp_hispeedlink;
1298206Smckusick 		netd.dp_datasize = SENDLEN - ACKLENGTH;
1308206Smckusick 		}
1318206Smckusick 	if(str == 0 || str[0] == 0){
1328206Smckusick 		err("invalid net device\n");
1338206Smckusick 		exit(EX_OSFILE);
1348206Smckusick 		}
1358206Smckusick 	netd.dp_linefd = open(str,2);
1368206Smckusick 	if(netd.dp_linefd < 0){
1378206Smckusick 		perror(str);
1388206Smckusick 		exit(EX_OSERR);
1398206Smckusick 		}
1408206Smckusick 	/* set exclusive use for line */
141*8292Scomay #ifdef TIOCEXCL
142*8292Scomay #ifdef VAX
143*8292Scomay 	(void)
144*8292Scomay #endif
145*8292Scomay 	ioctl(netd.dp_linefd,TIOCEXCL,&stt);
146*8292Scomay #endif
147*8292Scomay 	if(gtty(netd.dp_linefd,&stt) < 0){
1488206Smckusick 		perror(str);
1498206Smckusick 		exit(EX_OSERR);
1508206Smckusick 		}
1518206Smckusick 	stt.sg_ispeed = netd.dp_inspeed;	/* user set baud */
1528206Smckusick 	stt.sg_ospeed = netd.dp_outspeed;  	/* user-set baud */
1538206Smckusick 	stt.sg_erase = stt.sg_kill = 0;		/* erase and kill off */
1548206Smckusick 	stt.sg_flags = ANYP;	/* even and odd parity, off everything else */
1558206Smckusick 	if(stty(netd.dp_linefd,&stt) < 0){
1568206Smckusick 		perror(str);
1578206Smckusick 		exit(EX_OSERR);
1588206Smckusick 		}
1598206Smckusick # ifdef RAND
1608206Smckusick 	/* set device into 8-bit mode */
1618206Smckusick 	if(gtty((2<<8)|netd.dp_linefd,&exstt) < 0){
1628206Smckusick 		perror(str);
1638206Smckusick 		exit(EX_OSERR);
1648206Smckusick 		}
1658206Smckusick 	exstt.t_xflags = OUT8BIT | IN8BIT;
1668206Smckusick 	if(stty((2<<8)|netd.dp_linefd, &exstt) < 0){
1678206Smckusick 		perror(str);
1688206Smckusick 		exit(EX_OSERR);
1698206Smckusick 		}
1708206Smckusick # endif
1718206Smckusick 	/* set my own line discipline */
1728206Smckusick 	/* NETLDISC is defined in sgtty.h on the CSVAX */
1738206Smckusick 	/* setting the line discipline must be done AFTER the sttys */
1748206Smckusick # ifdef NETLDISC
1758206Smckusick 	if(netd.dp_trynetl){
1768206Smckusick 		netd.dp_linedis = NETLDISC;
1778206Smckusick 		if(ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis) != 0){
1788206Smckusick 			printf("error - line discipline\n");
1798206Smckusick 			perror(str);
1808206Smckusick 			printf("proceeding...\n");
1818206Smckusick 			netd.dp_linedis = 0;
1828206Smckusick 			}
1838206Smckusick 		if(netd.dp_linedis){
1848206Smckusick 			/* set the line into RAW mode */
1858206Smckusick 			netd.dp_linedis = 0;
1868206Smckusick 			ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis);
1878206Smckusick 			netd.dp_linedis = NETLDISC;
1888206Smckusick 			stt.sg_ispeed = netd.dp_inspeed;/* user set baud */
1898206Smckusick 			stt.sg_ospeed = netd.dp_outspeed;  /* user-set baud */
1908206Smckusick 			stt.sg_erase = stt.sg_kill = 0;
1918206Smckusick 			stt.sg_flags = ANYP|RAW;	/* in raw mode */
1928206Smckusick 			if(stty(netd.dp_linefd,&stt) < 0){
1938206Smckusick 				perror(str);
1948206Smckusick 				exit(EX_OSERR);
1958206Smckusick 			}
1968206Smckusick 			ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis);
1978206Smckusick 			printf("Using network line discipline.\n");
1988206Smckusick 		}
1998206Smckusick 	}
2008206Smckusick # endif
2018206Smckusick }
2028206Smckusick /*VARARGS0*/
error(s,a,b,c,d,e,f,g,h)2038206Smckusick error(s,a,b,c,d,e,f,g,h)
2048206Smckusick char *s; {
2058206Smckusick 	char buf[10];
2068206Smckusick 	if(remote != 0) sprintf(buf,"%s",longname(remote));
2078206Smckusick 	else buf[0] = 0;
2088206Smckusick 	fflush(stdout);
2098206Smckusick 	if(debugflg){
2108206Smckusick 		fprintf(stderr,s,a,b,c,d,e,f,g,h);
2118206Smckusick 		putc('\n',stderr);
2128206Smckusick 		}
2138206Smckusick 	addtolog(remote,"Err %s: ",buf);
2148206Smckusick 	addtolog(remote,s,a,b,c,d,e,f,g,h);
2158206Smckusick 	addtolog(remote,"\n");
2168206Smckusick 	}
2178206Smckusick /* this is really not right - we should use the rcslog format */
2188206Smckusick /* also, the user must be able to write on the
2198206Smckusick    public logfile to get error messages such as
2208206Smckusick    directory not found after he has
2218206Smckusick    setuid'd from root
2228206Smckusick */
2238206Smckusick /*VARARGS0*/
addtolog(mach,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n)2248206Smckusick addtolog(mach,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n)
2258206Smckusick char *s;
2268206Smckusick {
2278206Smckusick 	static FILE *log = NULL;
2288206Smckusick 	struct stat statbuf;
2298206Smckusick 	logfile[strlen(logfile)-1] = mach;
2308206Smckusick 	if(log == NULL){
2318206Smckusick 		if(stat(logfile,&statbuf) < 0)return;
2328206Smckusick 		log = fopen(logfile,"a");
2338206Smckusick 		}
2348206Smckusick 	if(log == NULL)return;
2358206Smckusick 	fseek(log,0L,2);
2368206Smckusick 	fprintf(log,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
2378206Smckusick 	fflush(log);
2388206Smckusick 	debug(s,a,b,c,d,e,f,g,h,i,h,k,l,m,n);
2398206Smckusick 	}
240