1*8292Scomay static char sccsid[] = "@(#)setup.c 4.2 (Berkeley) 10/03/82";
28206Smckusick
38206Smckusick /*
48206Smckusick setup.c
58206Smckusick
68206Smckusick support procedures used in setting up the network
78206Smckusick
88206Smckusick */
98206Smckusick
108206Smckusick # include "defs.h"
118206Smckusick
128206Smckusick char logfile[] = LOGFILE;
138206Smckusick
148206Smckusick /* global variables */
158206Smckusick struct daemonparms netd;
168206Smckusick
178206Smckusick /*
188206Smckusick called in netdaemon and debugging software
198206Smckusick handles parameter lists to setup
208206Smckusick remote machine and pipes
218206Smckusick */
setupdaemon(argc,argv)228206Smckusick setupdaemon(argc,argv)
238206Smckusick char **argv;{
248206Smckusick long timev;
258206Smckusick int timei;
268206Smckusick FILE *cfile;
278206Smckusick
288206Smckusick parseargs(argc,argv);
298206Smckusick
308206Smckusick cfile = fopen(INITFILE,"r");
318206Smckusick rdnetfile(cfile);
328206Smckusick fclose(cfile);
338206Smckusick err("remote %c local %c link %s inspeed %d outspeed %d length %d\n",
348206Smckusick remote,local,netd.dp_device,netd.dp_inspeed,
358206Smckusick netd.dp_outspeed,netd.dp_datasize);
368206Smckusick err("debug %d time %d count %d onlyuid %d usehispeed=%d hispeedlink='%s'\n",
378206Smckusick debugflg,netd.dp_oatime, netd.dp_maxbread,netd.dp_onlyuid,
388206Smckusick netd.dp_usehispeed, netd.dp_hispeedlink);
398206Smckusick err("sendonly %c rcvonly %c pipesim %c\n",
408206Smckusick chfromf(netd.dp_sndorcv < 0),chfromf(netd.dp_sndorcv > 0),
418206Smckusick chfromf(netd.dp_pipesim));
428206Smckusick setup(netd.dp_device);
438206Smckusick timev = gettime();
448206Smckusick timei = timev >> 16;
458206Smckusick srand(timei);
468206Smckusick }
478206Smckusick /*
488206Smckusick
498206Smckusick see comment in netdaemon.c about the arguments
508206Smckusick
518206Smckusick */
parseargs(argc,argv)528206Smckusick parseargs(argc,argv)
538206Smckusick char **argv; {
548206Smckusick char stemp[30];
558206Smckusick remote = 0;
568206Smckusick while(argc > 1 && argv[1][0] == '-'){
578206Smckusick argc--; argv++;
588206Smckusick switch(argv[0][1]){
598206Smckusick case '8':
608206Smckusick netd.dp_use8bit = 1;
618206Smckusick break;
628206Smckusick case 'd':
638206Smckusick debugflg = 1;
648206Smckusick break;
658206Smckusick case 'h':
668206Smckusick netd.dp_usehispeed = 1;
678206Smckusick break;
688206Smckusick case 'l':
698206Smckusick netd.dp_trynetl = 0;
708206Smckusick break;
718206Smckusick case 'm':
728206Smckusick harg(stemp);
738206Smckusick remote = lookup(stemp);
748206Smckusick break;
758206Smckusick case 'o': /* only */
768206Smckusick if(argv[0][2] == 's') /* only send */
778206Smckusick netd.dp_sndorcv = -1;
788206Smckusick else if(argv[0][2] == 'r') /* only receive */
798206Smckusick netd.dp_sndorcv = 1;
808206Smckusick else if(argv[0][2] == 'u') /* only uid num */
818206Smckusick netd.dp_onlyuid = atoi(argv[1]);
828206Smckusick break;
838206Smckusick case 'p':
848206Smckusick harg(stemp);
858206Smckusick netd.dp_datasize = atol(stemp);
868206Smckusick break;
878206Smckusick case 'r':
888206Smckusick harg(stemp);
898206Smckusick netd.dp_rdfile = fdopen(atoi(stemp),"r");
908206Smckusick netd.dp_pipesim++;
918206Smckusick break;
928206Smckusick case 'w':
938206Smckusick harg(stemp);
948206Smckusick netd.dp_pwritefd = atoi(stemp);
958206Smckusick netd.dp_pipesim++;
968206Smckusick break;
978206Smckusick /* ignore unknown options */
988206Smckusick }
998206Smckusick }
1008206Smckusick if(remote == 0){
1018206Smckusick fprintf(stderr,"Error- must specify machine - use -m option\n");
1028206Smckusick exit(EX_USAGE);
1038206Smckusick }
1048206Smckusick }
1058206Smckusick /*
1068206Smckusick set the correct mode on the link device
1078206Smckusick */
setup(str)1088206Smckusick setup(str)
1098206Smckusick char *str; {
1108206Smckusick struct sgttyb stt;
1118206Smckusick # ifdef RAND
1128206Smckusick struct {
1138206Smckusick int t_xflags;
1148206Smckusick char t_col;
1158206Smckusick char t_delct;
1168206Smckusick char t_outqc_cc;
1178206Smckusick char t_rawqc_cc;
1188206Smckusick } exstt;
1198206Smckusick #define OUT8BIT 01 /* All 8 bits on output */
1208206Smckusick #define IN8BIT 02 /* All 8 bits on input */
1218206Smckusick # endif
1228206Smckusick
1238206Smckusick initseqno();
1248206Smckusick /* nothing to set up if we're simulating with pipes */
1258206Smckusick if(netd.dp_pipesim)return;
1268206Smckusick
1278206Smckusick if(netd.dp_usehispeed){
1288206Smckusick str = netd.dp_hispeedlink;
1298206Smckusick netd.dp_datasize = SENDLEN - ACKLENGTH;
1308206Smckusick }
1318206Smckusick if(str == 0 || str[0] == 0){
1328206Smckusick err("invalid net device\n");
1338206Smckusick exit(EX_OSFILE);
1348206Smckusick }
1358206Smckusick netd.dp_linefd = open(str,2);
1368206Smckusick if(netd.dp_linefd < 0){
1378206Smckusick perror(str);
1388206Smckusick exit(EX_OSERR);
1398206Smckusick }
1408206Smckusick /* set exclusive use for line */
141*8292Scomay #ifdef TIOCEXCL
142*8292Scomay #ifdef VAX
143*8292Scomay (void)
144*8292Scomay #endif
145*8292Scomay ioctl(netd.dp_linefd,TIOCEXCL,&stt);
146*8292Scomay #endif
147*8292Scomay if(gtty(netd.dp_linefd,&stt) < 0){
1488206Smckusick perror(str);
1498206Smckusick exit(EX_OSERR);
1508206Smckusick }
1518206Smckusick stt.sg_ispeed = netd.dp_inspeed; /* user set baud */
1528206Smckusick stt.sg_ospeed = netd.dp_outspeed; /* user-set baud */
1538206Smckusick stt.sg_erase = stt.sg_kill = 0; /* erase and kill off */
1548206Smckusick stt.sg_flags = ANYP; /* even and odd parity, off everything else */
1558206Smckusick if(stty(netd.dp_linefd,&stt) < 0){
1568206Smckusick perror(str);
1578206Smckusick exit(EX_OSERR);
1588206Smckusick }
1598206Smckusick # ifdef RAND
1608206Smckusick /* set device into 8-bit mode */
1618206Smckusick if(gtty((2<<8)|netd.dp_linefd,&exstt) < 0){
1628206Smckusick perror(str);
1638206Smckusick exit(EX_OSERR);
1648206Smckusick }
1658206Smckusick exstt.t_xflags = OUT8BIT | IN8BIT;
1668206Smckusick if(stty((2<<8)|netd.dp_linefd, &exstt) < 0){
1678206Smckusick perror(str);
1688206Smckusick exit(EX_OSERR);
1698206Smckusick }
1708206Smckusick # endif
1718206Smckusick /* set my own line discipline */
1728206Smckusick /* NETLDISC is defined in sgtty.h on the CSVAX */
1738206Smckusick /* setting the line discipline must be done AFTER the sttys */
1748206Smckusick # ifdef NETLDISC
1758206Smckusick if(netd.dp_trynetl){
1768206Smckusick netd.dp_linedis = NETLDISC;
1778206Smckusick if(ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis) != 0){
1788206Smckusick printf("error - line discipline\n");
1798206Smckusick perror(str);
1808206Smckusick printf("proceeding...\n");
1818206Smckusick netd.dp_linedis = 0;
1828206Smckusick }
1838206Smckusick if(netd.dp_linedis){
1848206Smckusick /* set the line into RAW mode */
1858206Smckusick netd.dp_linedis = 0;
1868206Smckusick ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis);
1878206Smckusick netd.dp_linedis = NETLDISC;
1888206Smckusick stt.sg_ispeed = netd.dp_inspeed;/* user set baud */
1898206Smckusick stt.sg_ospeed = netd.dp_outspeed; /* user-set baud */
1908206Smckusick stt.sg_erase = stt.sg_kill = 0;
1918206Smckusick stt.sg_flags = ANYP|RAW; /* in raw mode */
1928206Smckusick if(stty(netd.dp_linefd,&stt) < 0){
1938206Smckusick perror(str);
1948206Smckusick exit(EX_OSERR);
1958206Smckusick }
1968206Smckusick ioctl(netd.dp_linefd,TIOCSETD,&netd.dp_linedis);
1978206Smckusick printf("Using network line discipline.\n");
1988206Smckusick }
1998206Smckusick }
2008206Smckusick # endif
2018206Smckusick }
2028206Smckusick /*VARARGS0*/
error(s,a,b,c,d,e,f,g,h)2038206Smckusick error(s,a,b,c,d,e,f,g,h)
2048206Smckusick char *s; {
2058206Smckusick char buf[10];
2068206Smckusick if(remote != 0) sprintf(buf,"%s",longname(remote));
2078206Smckusick else buf[0] = 0;
2088206Smckusick fflush(stdout);
2098206Smckusick if(debugflg){
2108206Smckusick fprintf(stderr,s,a,b,c,d,e,f,g,h);
2118206Smckusick putc('\n',stderr);
2128206Smckusick }
2138206Smckusick addtolog(remote,"Err %s: ",buf);
2148206Smckusick addtolog(remote,s,a,b,c,d,e,f,g,h);
2158206Smckusick addtolog(remote,"\n");
2168206Smckusick }
2178206Smckusick /* this is really not right - we should use the rcslog format */
2188206Smckusick /* also, the user must be able to write on the
2198206Smckusick public logfile to get error messages such as
2208206Smckusick directory not found after he has
2218206Smckusick setuid'd from root
2228206Smckusick */
2238206Smckusick /*VARARGS0*/
addtolog(mach,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n)2248206Smckusick addtolog(mach,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n)
2258206Smckusick char *s;
2268206Smckusick {
2278206Smckusick static FILE *log = NULL;
2288206Smckusick struct stat statbuf;
2298206Smckusick logfile[strlen(logfile)-1] = mach;
2308206Smckusick if(log == NULL){
2318206Smckusick if(stat(logfile,&statbuf) < 0)return;
2328206Smckusick log = fopen(logfile,"a");
2338206Smckusick }
2348206Smckusick if(log == NULL)return;
2358206Smckusick fseek(log,0L,2);
2368206Smckusick fprintf(log,s,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
2378206Smckusick fflush(log);
2388206Smckusick debug(s,a,b,c,d,e,f,g,h,i,h,k,l,m,n);
2398206Smckusick }
240