1 static char sccsid[] = "@(#)setup.c 4.2 (Berkeley) 10/03/82";
2
3 /*
4 setup.c
5
6 support procedures used in setting up the network
7
8 */
9
10 # include "defs.h"
11
12 char logfile[] = LOGFILE;
13
14 /* global variables */
15 struct daemonparms netd;
16
17 /*
18 called in netdaemon and debugging software
19 handles parameter lists to setup
20 remote machine and pipes
21 */
setupdaemon(argc,argv)22 setupdaemon(argc,argv)
23 char **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
49 see comment in netdaemon.c about the arguments
50
51 */
parseargs(argc,argv)52 parseargs(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 */
setup(str)108 setup(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 */
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){
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*/
error(s,a,b,c,d,e,f,g,h)203 error(s,a,b,c,d,e,f,g,h)
204 char *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*/
addtolog(mach,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n)224 addtolog(mach,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n)
225 char *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 }
240