117771Sralph #ifndef lint 2*23696Sbloom static char sccsid[] = "@(#)df2.c 4.2 (Berkeley) 06/23/85"; 317771Sralph #endif 417771Sralph 517771Sralph #include "../condevs.h" 617771Sralph #ifdef DF02 717771Sralph 817771Sralph /* 917771Sralph * df2opn(ph, flds, dev) dial remote machine 1017771Sralph * 1117771Sralph * return codes: 1217771Sralph * file descriptor - succeeded 1317771Sralph * FAIL - failed 1417771Sralph */ 1517771Sralph df2opn(ph, flds, dev) 1617771Sralph char *ph; 1717771Sralph char *flds[]; 1817771Sralph struct Devices *dev; 1917771Sralph { 2017771Sralph char dcname[20], dnname[20], phone[MAXPH+2], c = 0; 21*23696Sbloom #ifdef USG 2217771Sralph struct termio ttbuf; 23*23696Sbloom #endif USG 2417771Sralph int dcf, dnf; 2517771Sralph int nw, lt, pid, st, status; 2617771Sralph unsigned timelim; 27*23696Sbloom #ifdef TIOCFLUSH 28*23696Sbloom int zero = 0; 29*23696Sbloom #endif TIOCFLUSH 3017771Sralph 3117771Sralph sprintf(dnname, "/dev/%s", dev->D_calldev); 3217771Sralph if (setjmp(Sjbuf)) { 3317771Sralph logent(dnname, "CAN'T OPEN"); 3417771Sralph DEBUG(4, "%s Open timed out\n", dnname); 3517771Sralph return CF_NODEV; 3617771Sralph } 3717771Sralph signal(SIGALRM, alarmtr); 3817771Sralph getnextfd(); 3917771Sralph errno = 0; 4017771Sralph alarm(10); 4117771Sralph dnf = open(dnname, 2 ); 4217771Sralph alarm(0); 4317771Sralph next_fd = -1; 4417771Sralph if (dnf < 0 && errno == EACCES) { 4517771Sralph logent(dnname, "CAN'T OPEN"); 4617771Sralph delock(dev->D_line); 4717771Sralph logent("DEVICE", "NO"); 4817771Sralph return CF_NODEV; 4917771Sralph } 5017771Sralph fioclex(dnf); 5117771Sralph 5217771Sralph sprintf(dcname, "/dev/%s", dev->D_line); 5317771Sralph fixline(dnf, dev->D_speed); 5417771Sralph sprintf(phone, "\02%s", ph); 5517771Sralph DEBUG(4, "dc - %s, ", dcname); 5617771Sralph DEBUG(4, "acu - %s\n", dnname); 5717771Sralph pid = 0; 5817771Sralph if (setjmp(Sjbuf)) { 5917771Sralph logent("DIALUP DN write", "TIMEOUT"); 6017771Sralph if (pid) 6117771Sralph kill(pid, 9); 6217771Sralph delock(dev->D_line); 6317771Sralph if (dnf) 6417771Sralph close(dnf); 6517771Sralph return CF_DIAL; 6617771Sralph } 6717771Sralph signal(SIGALRM, alarmtr); 6817771Sralph timelim = 5 * strlen(phone); 6917771Sralph alarm(timelim < 30 ? 30 : timelim); 7017771Sralph if ((pid = fork()) == 0) { 7117771Sralph sleep(2); 7217771Sralph fclose(stdin); 7317771Sralph fclose(stdout); 7417771Sralph #ifdef TIOCFLUSH 75*23696Sbloom ioctl(dnf, TIOCFLUSH, &zero); 7617771Sralph #endif TIOCFLUSH 7717771Sralph write(dnf, "\01", 1); 7817771Sralph sleep(1); 7917771Sralph nw = write(dnf, phone, lt = strlen(phone)); 8017771Sralph if (nw != lt) { 8117771Sralph logent("DIALUP ACU write", _FAILED); 8217771Sralph exit(1); 8317771Sralph } 8417771Sralph DEBUG(4, "ACU write ok%s\n", CNULL); 8517771Sralph exit(0); 8617771Sralph } 8717771Sralph /* open line - will return on carrier */ 8817771Sralph /* RT needs a sleep here because it returns immediately from open */ 8917771Sralph 9017771Sralph #if RT 9117771Sralph sleep(15); 9217771Sralph #endif 9317771Sralph 9417771Sralph if (read(dnf, &c, 1) != 1 || c != 'A') 9517771Sralph dcf = -1; 9617771Sralph else 9717771Sralph dcf = 0; 9817771Sralph DEBUG(4, "dcf is %d\n", dcf); 9917771Sralph if (dcf < 0) { 10017771Sralph logent("DIALUP LINE open", _FAILED); 10117771Sralph alarm(0); 10217771Sralph kill(pid, 9); 10317771Sralph close(dnf); 10417771Sralph delock(dev->D_line); 10517771Sralph return CF_DIAL; 10617771Sralph } 10717771Sralph dcf = dnf; 10817771Sralph dnf = 0; 10917771Sralph while ((nw = wait(<)) != pid && nw != -1) 11017771Sralph ; 111*23696Sbloom #ifdef USG 11217771Sralph ioctl(dcf, TCGETA, &ttbuf); 11317771Sralph if(!(ttbuf.c_cflag & HUPCL)) { 11417771Sralph ttbuf.c_cflag |= HUPCL; 11517771Sralph ioctl(dcf, TCSETA, &ttbuf); 11617771Sralph } 117*23696Sbloom #endif USG 11817771Sralph alarm(0); 11917771Sralph fflush(stdout); 12017771Sralph fixline(dcf, dev->D_speed); 12117771Sralph DEBUG(4, "Fork Stat %o\n", lt); 12217771Sralph if (lt != 0) { 12317771Sralph close(dcf); 12417771Sralph if (dnf) 12517771Sralph close(dnf); 12617771Sralph delock(dev->D_line); 12717771Sralph return CF_DIAL; 12817771Sralph } 12917771Sralph return dcf; 13017771Sralph } 13117771Sralph 13217771Sralph /* 13317771Sralph * df2cls() close the DF02/DF03 call unit 13417771Sralph * 13517771Sralph * return codes: none 13617771Sralph */ 13717771Sralph df2cls(fd) 13817771Sralph register int fd; 13917771Sralph { 14017771Sralph if (fd > 0) { 14117771Sralph close(fd); 14217771Sralph sleep(5); 14317771Sralph delock(devSel); 14417771Sralph } 14517771Sralph } 14617771Sralph #endif DF02 147