xref: /csrg-svn/old/berknet/setup.c (revision 8206)
1*8206Smckusick static char sccsid[] = "@(#)setup.c	4.1	(Berkeley)	09/12/82";
2*8206Smckusick 
3*8206Smckusick /*
4*8206Smckusick 	setup.c
5*8206Smckusick 
6*8206Smckusick 	support procedures used in setting up the network
7*8206Smckusick 
8*8206Smckusick */
9*8206Smckusick 
10*8206Smckusick # include "defs.h"
11*8206Smckusick 
12*8206Smckusick char logfile[] =	LOGFILE;
13*8206Smckusick 
14*8206Smckusick /* global variables */
15*8206Smckusick struct daemonparms netd;
16*8206Smckusick 
17*8206Smckusick /*
18*8206Smckusick 	called in netdaemon and debugging software
19*8206Smckusick 	handles parameter lists to setup
20*8206Smckusick 	remote machine and pipes
21*8206Smckusick */
22*8206Smckusick setupdaemon(argc,argv)
23*8206Smckusick char **argv;{
24*8206Smckusick 	long timev;
25*8206Smckusick 	int timei;
26*8206Smckusick 	FILE *cfile;
27*8206Smckusick 
28*8206Smckusick 	parseargs(argc,argv);
29*8206Smckusick 
30*8206Smckusick 	cfile = fopen(INITFILE,"r");
31*8206Smckusick 	rdnetfile(cfile);
32*8206Smckusick 	fclose(cfile);
33*8206Smckusick 	err("remote %c local %c link %s inspeed %d outspeed %d length %d\n",
34*8206Smckusick 		remote,local,netd.dp_device,netd.dp_inspeed,
35*8206Smckusick 		netd.dp_outspeed,netd.dp_datasize);
36*8206Smckusick 	err("debug %d time %d count %d onlyuid %d usehispeed=%d hispeedlink='%s'\n",
37*8206Smckusick 		debugflg,netd.dp_oatime, netd.dp_maxbread,netd.dp_onlyuid,
38*8206Smckusick 		netd.dp_usehispeed, netd.dp_hispeedlink);
39*8206Smckusick 	err("sendonly %c rcvonly %c pipesim %c\n",
40*8206Smckusick 		chfromf(netd.dp_sndorcv < 0),chfromf(netd.dp_sndorcv > 0),
41*8206Smckusick 		chfromf(netd.dp_pipesim));
42*8206Smckusick 	setup(netd.dp_device);
43*8206Smckusick 	timev = gettime();
44*8206Smckusick 	timei = timev >> 16;
45*8206Smckusick 	srand(timei);
46*8206Smckusick }
47*8206Smckusick /*
48*8206Smckusick 
49*8206Smckusick see comment in netdaemon.c about the arguments
50*8206Smckusick 
51*8206Smckusick */
52*8206Smckusick parseargs(argc,argv)
53*8206Smckusick   char **argv; {
54*8206Smckusick 	char stemp[30];
55*8206Smckusick 	remote = 0;
56*8206Smckusick 	while(argc > 1 && argv[1][0] == '-'){
57*8206Smckusick 		argc--; argv++;
58*8206Smckusick 		switch(argv[0][1]){
59*8206Smckusick 		case '8':
60*8206Smckusick 			netd.dp_use8bit = 1;
61*8206Smckusick 			break;
62*8206Smckusick 		case 'd':
63*8206Smckusick 			debugflg = 1;
64*8206Smckusick 			break;
65*8206Smckusick 		case 'h':
66*8206Smckusick 			netd.dp_usehispeed = 1;
67*8206Smckusick 			break;
68*8206Smckusick 		case 'l':
69*8206Smckusick 			netd.dp_trynetl = 0;
70*8206Smckusick 			break;
71*8206Smckusick 		case 'm':
72*8206Smckusick 			harg(stemp);
73*8206Smckusick 			remote = lookup(stemp);
74*8206Smckusick 			break;
75*8206Smckusick 		case 'o':		/* only */
76*8206Smckusick 			if(argv[0][2] == 's')		/* only send */
77*8206Smckusick 				netd.dp_sndorcv = -1;
78*8206Smckusick 			else if(argv[0][2] == 'r') 	/* only receive */
79*8206Smckusick 				netd.dp_sndorcv = 1;
80*8206Smckusick 			else if(argv[0][2] == 'u')	/* only uid num */
81*8206Smckusick 				netd.dp_onlyuid = atoi(argv[1]);
82*8206Smckusick 			break;
83*8206Smckusick 		case 'p':
84*8206Smckusick 			harg(stemp);
85*8206Smckusick 			netd.dp_datasize = atol(stemp);
86*8206Smckusick 			break;
87*8206Smckusick 		case 'r':
88*8206Smckusick 			harg(stemp);
89*8206Smckusick 			netd.dp_rdfile = fdopen(atoi(stemp),"r");
90*8206Smckusick 			netd.dp_pipesim++;
91*8206Smckusick 			break;
92*8206Smckusick 		case 'w':
93*8206Smckusick 			harg(stemp);
94*8206Smckusick 			netd.dp_pwritefd = atoi(stemp);
95*8206Smckusick 			netd.dp_pipesim++;
96*8206Smckusick 			break;
97*8206Smckusick 		/* ignore unknown options */
98*8206Smckusick 		}
99*8206Smckusick 	}
100*8206Smckusick 	if(remote == 0){
101*8206Smckusick 		fprintf(stderr,"Error- must specify machine - use -m option\n");
102*8206Smckusick 		exit(EX_USAGE);
103*8206Smckusick 	}
104*8206Smckusick }
105*8206Smckusick /*
106*8206Smckusick 	set the correct mode on the link device
107*8206Smckusick */
108*8206Smckusick setup(str)
109*8206Smckusick   char *str; {
110*8206Smckusick 	struct sgttyb stt;
111*8206Smckusick # ifdef RAND
112*8206Smckusick 	struct {
113*8206Smckusick 		int     t_xflags;
114*8206Smckusick 		char    t_col;
115*8206Smckusick 		char	t_delct;
116*8206Smckusick 		char	t_outqc_cc;
117*8206Smckusick 		char	t_rawqc_cc;
118*8206Smckusick 	} exstt;
119*8206Smckusick #define OUT8BIT 01              /* All 8 bits on output */
120*8206Smckusick #define IN8BIT  02              /* All 8 bits on input  */
121*8206Smckusick # endif
122*8206Smckusick 
123*8206Smckusick 	initseqno();
124*8206Smckusick 	/* nothing to set up if we're simulating with pipes */
125*8206Smckusick 	if(netd.dp_pipesim)return;
126*8206Smckusick 
127*8206Smckusick 	if(netd.dp_usehispeed){
128*8206Smckusick 		str = netd.dp_hispeedlink;
129*8206Smckusick 		netd.dp_datasize = SENDLEN - ACKLENGTH;
130*8206Smckusick 		}
131*8206Smckusick 	if(str == 0 || str[0] == 0){
132*8206Smckusick 		err("invalid net device\n");
133*8206Smckusick 		exit(EX_OSFILE);
134*8206Smckusick 		}
135*8206Smckusick 	netd.dp_linefd = open(str,2);
136*8206Smckusick 	if(netd.dp_linefd < 0){
137*8206Smckusick 		perror(str);
138*8206Smckusick 		exit(EX_OSERR);
139*8206Smckusick 		}
140*8206Smckusick 	/* set exclusive use for line */
141*8206Smckusick 	if(ioctl(netd.dp_linefd,TIOCEXCL,&stt) != 0 ||
142*8206Smckusick 		gtty(netd.dp_linefd,&stt) < 0){
143*8206Smckusick 		perror(str);
144*8206Smckusick 		exit(EX_OSERR);
145*8206Smckusick 		}
146*8206Smckusick 	stt.sg_ispeed = netd.dp_inspeed;	/* user set baud */
147*8206Smckusick 	stt.sg_ospeed = netd.dp_outspeed;  	/* user-set baud */
148*8206Smckusick 	stt.sg_erase = stt.sg_kill = 0;		/* erase and kill off */
149*8206Smckusick 	stt.sg_flags = ANYP;	/* even and odd parity, off everything else */
150*8206Smckusick 	if(stty(netd.dp_linefd,&stt) < 0){
151*8206Smckusick 		perror(str);
152*8206Smckusick 		exit(EX_OSERR);
153*8206Smckusick 		}
154*8206Smckusick # ifdef RAND
155*8206Smckusick 	/* set device into 8-bit mode */
156*8206Smckusick 	if(gtty((2<<8)|netd.dp_linefd,&exstt) < 0){
157*8206Smckusick 		perror(str);
158*8206Smckusick 		exit(EX_OSERR);
159*8206Smckusick 		}
160*8206Smckusick 	exstt.t_xflags = OUT8BIT | IN8BIT;
161*8206Smckusick 	if(stty((2<<8)|netd.dp_linefd, &exstt) < 0){
162*8206Smckusick 		perror(str);
163*8206Smckusick 		exit(EX_OSERR);
164*8206Smckusick 		}
165*8206Smckusick # endif
166*8206Smckusick 	/* set my own line discipline */
167*8206Smckusick 	/* NETLDISC is defined in sgtty.h on the CSVAX */
168*8206Smckusick 	/* setting the line discipline must be done AFTER the sttys */
169*8206Smckusick # ifdef NETLDISC
170*8206Smckusick 	if(netd.dp_trynetl){
171*8206Smckusick 		netd.dp_linedis = NETLDISC;
172*8206Smckusick 		if(ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis) != 0){
173*8206Smckusick 			printf("error - line discipline\n");
174*8206Smckusick 			perror(str);
175*8206Smckusick 			printf("proceeding...\n");
176*8206Smckusick 			netd.dp_linedis = 0;
177*8206Smckusick 			}
178*8206Smckusick 		if(netd.dp_linedis){
179*8206Smckusick 			/* set the line into RAW mode */
180*8206Smckusick 			netd.dp_linedis = 0;
181*8206Smckusick 			ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis);
182*8206Smckusick 			netd.dp_linedis = NETLDISC;
183*8206Smckusick 			stt.sg_ispeed = netd.dp_inspeed;/* user set baud */
184*8206Smckusick 			stt.sg_ospeed = netd.dp_outspeed;  /* user-set baud */
185*8206Smckusick 			stt.sg_erase = stt.sg_kill = 0;
186*8206Smckusick 			stt.sg_flags = ANYP|RAW;	/* in raw mode */
187*8206Smckusick 			if(stty(netd.dp_linefd,&stt) < 0){
188*8206Smckusick 				perror(str);
189*8206Smckusick 				exit(EX_OSERR);
190*8206Smckusick 			}
191*8206Smckusick 			ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis);
192*8206Smckusick 			printf("Using network line discipline.\n");
193*8206Smckusick 		}
194*8206Smckusick 	}
195*8206Smckusick # endif
196*8206Smckusick }
197*8206Smckusick /*VARARGS0*/
198*8206Smckusick error(s,a,b,c,d,e,f,g,h)
199*8206Smckusick char *s; {
200*8206Smckusick 	char buf[10];
201*8206Smckusick 	if(remote != 0) sprintf(buf,"%s",longname(remote));
202*8206Smckusick 	else buf[0] = 0;
203*8206Smckusick 	fflush(stdout);
204*8206Smckusick 	if(debugflg){
205*8206Smckusick 		fprintf(stderr,s,a,b,c,d,e,f,g,h);
206*8206Smckusick 		putc('\n',stderr);
207*8206Smckusick 		}
208*8206Smckusick 	addtolog(remote,"Err %s: ",buf);
209*8206Smckusick 	addtolog(remote,s,a,b,c,d,e,f,g,h);
210*8206Smckusick 	addtolog(remote,"\n");
211*8206Smckusick 	}
212*8206Smckusick /* this is really not right - we should use the rcslog format */
213*8206Smckusick /* also, the user must be able to write on the
214*8206Smckusick    public logfile to get error messages such as
215*8206Smckusick    directory not found after he has
216*8206Smckusick    setuid'd from root
217*8206Smckusick */
218*8206Smckusick /*VARARGS0*/
219*8206Smckusick addtolog(mach,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n)
220*8206Smckusick char *s;
221*8206Smckusick {
222*8206Smckusick 	static FILE *log = NULL;
223*8206Smckusick 	struct stat statbuf;
224*8206Smckusick 	logfile[strlen(logfile)-1] = mach;
225*8206Smckusick 	if(log == NULL){
226*8206Smckusick 		if(stat(logfile,&statbuf) < 0)return;
227*8206Smckusick 		log = fopen(logfile,"a");
228*8206Smckusick 		}
229*8206Smckusick 	if(log == NULL)return;
230*8206Smckusick 	fseek(log,0L,2);
231*8206Smckusick 	fprintf(log,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
232*8206Smckusick 	fflush(log);
233*8206Smckusick 	debug(s,a,b,c,d,e,f,g,h,i,h,k,l,m,n);
234*8206Smckusick 	}
235