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