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