1*17771Sralph #ifndef lint 2*17771Sralph static char sccsid[] = "@(#)df2.c 4.1 (Berkeley) 01/22/85"; 3*17771Sralph #endif 4*17771Sralph 5*17771Sralph #include "../condevs.h" 6*17771Sralph #ifdef DF02 7*17771Sralph 8*17771Sralph /* 9*17771Sralph * df2opn(ph, flds, dev) dial remote machine 10*17771Sralph * 11*17771Sralph * return codes: 12*17771Sralph * file descriptor - succeeded 13*17771Sralph * FAIL - failed 14*17771Sralph */ 15*17771Sralph df2opn(ph, flds, dev) 16*17771Sralph char *ph; 17*17771Sralph char *flds[]; 18*17771Sralph struct Devices *dev; 19*17771Sralph { 20*17771Sralph char dcname[20], dnname[20], phone[MAXPH+2], c = 0; 21*17771Sralph #ifdef SYSIII 22*17771Sralph struct termio ttbuf; 23*17771Sralph #endif 24*17771Sralph int dcf, dnf; 25*17771Sralph int nw, lt, pid, st, status; 26*17771Sralph unsigned timelim; 27*17771Sralph 28*17771Sralph sprintf(dnname, "/dev/%s", dev->D_calldev); 29*17771Sralph if (setjmp(Sjbuf)) { 30*17771Sralph logent(dnname, "CAN'T OPEN"); 31*17771Sralph DEBUG(4, "%s Open timed out\n", dnname); 32*17771Sralph return CF_NODEV; 33*17771Sralph } 34*17771Sralph signal(SIGALRM, alarmtr); 35*17771Sralph getnextfd(); 36*17771Sralph errno = 0; 37*17771Sralph alarm(10); 38*17771Sralph dnf = open(dnname, 2 ); 39*17771Sralph alarm(0); 40*17771Sralph next_fd = -1; 41*17771Sralph if (dnf < 0 && errno == EACCES) { 42*17771Sralph logent(dnname, "CAN'T OPEN"); 43*17771Sralph delock(dev->D_line); 44*17771Sralph logent("DEVICE", "NO"); 45*17771Sralph return CF_NODEV; 46*17771Sralph } 47*17771Sralph fioclex(dnf); 48*17771Sralph 49*17771Sralph sprintf(dcname, "/dev/%s", dev->D_line); 50*17771Sralph fixline(dnf, dev->D_speed); 51*17771Sralph sprintf(phone, "\02%s", ph); 52*17771Sralph DEBUG(4, "dc - %s, ", dcname); 53*17771Sralph DEBUG(4, "acu - %s\n", dnname); 54*17771Sralph pid = 0; 55*17771Sralph if (setjmp(Sjbuf)) { 56*17771Sralph logent("DIALUP DN write", "TIMEOUT"); 57*17771Sralph if (pid) 58*17771Sralph kill(pid, 9); 59*17771Sralph delock(dev->D_line); 60*17771Sralph if (dnf) 61*17771Sralph close(dnf); 62*17771Sralph return CF_DIAL; 63*17771Sralph } 64*17771Sralph signal(SIGALRM, alarmtr); 65*17771Sralph timelim = 5 * strlen(phone); 66*17771Sralph alarm(timelim < 30 ? 30 : timelim); 67*17771Sralph if ((pid = fork()) == 0) { 68*17771Sralph sleep(2); 69*17771Sralph fclose(stdin); 70*17771Sralph fclose(stdout); 71*17771Sralph #ifdef TIOCFLUSH 72*17771Sralph ioctl(dnf, TIOCFLUSH, STBNULL); 73*17771Sralph #endif TIOCFLUSH 74*17771Sralph write(dnf, "\01", 1); 75*17771Sralph sleep(1); 76*17771Sralph nw = write(dnf, phone, lt = strlen(phone)); 77*17771Sralph if (nw != lt) { 78*17771Sralph logent("DIALUP ACU write", _FAILED); 79*17771Sralph exit(1); 80*17771Sralph } 81*17771Sralph DEBUG(4, "ACU write ok%s\n", CNULL); 82*17771Sralph exit(0); 83*17771Sralph } 84*17771Sralph /* open line - will return on carrier */ 85*17771Sralph /* RT needs a sleep here because it returns immediately from open */ 86*17771Sralph 87*17771Sralph #if RT 88*17771Sralph sleep(15); 89*17771Sralph #endif 90*17771Sralph 91*17771Sralph if (read(dnf, &c, 1) != 1 || c != 'A') 92*17771Sralph dcf = -1; 93*17771Sralph else 94*17771Sralph dcf = 0; 95*17771Sralph DEBUG(4, "dcf is %d\n", dcf); 96*17771Sralph if (dcf < 0) { 97*17771Sralph logent("DIALUP LINE open", _FAILED); 98*17771Sralph alarm(0); 99*17771Sralph kill(pid, 9); 100*17771Sralph close(dnf); 101*17771Sralph delock(dev->D_line); 102*17771Sralph return CF_DIAL; 103*17771Sralph } 104*17771Sralph dcf = dnf; 105*17771Sralph dnf = 0; 106*17771Sralph while ((nw = wait(<)) != pid && nw != -1) 107*17771Sralph ; 108*17771Sralph #ifdef SYSIII 109*17771Sralph ioctl(dcf, TCGETA, &ttbuf); 110*17771Sralph if(!(ttbuf.c_cflag & HUPCL)) { 111*17771Sralph ttbuf.c_cflag |= HUPCL; 112*17771Sralph ioctl(dcf, TCSETA, &ttbuf); 113*17771Sralph } 114*17771Sralph #endif SYSIII 115*17771Sralph alarm(0); 116*17771Sralph fflush(stdout); 117*17771Sralph fixline(dcf, dev->D_speed); 118*17771Sralph DEBUG(4, "Fork Stat %o\n", lt); 119*17771Sralph if (lt != 0) { 120*17771Sralph close(dcf); 121*17771Sralph if (dnf) 122*17771Sralph close(dnf); 123*17771Sralph delock(dev->D_line); 124*17771Sralph return CF_DIAL; 125*17771Sralph } 126*17771Sralph return dcf; 127*17771Sralph } 128*17771Sralph 129*17771Sralph /* 130*17771Sralph * df2cls() close the DF02/DF03 call unit 131*17771Sralph * 132*17771Sralph * return codes: none 133*17771Sralph */ 134*17771Sralph df2cls(fd) 135*17771Sralph register int fd; 136*17771Sralph { 137*17771Sralph if (fd > 0) { 138*17771Sralph close(fd); 139*17771Sralph sleep(5); 140*17771Sralph delock(devSel); 141*17771Sralph } 142*17771Sralph } 143*17771Sralph #endif DF02 144