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