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 */ 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 */ 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 */ 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*/ 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*/ 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