117773Sralph #ifndef lint 2*46875Sbostic static char sccsid[] = "@(#)dn.c 4.4 (Berkeley) 03/02/91"; 317773Sralph #endif 417773Sralph 5*46875Sbostic #include "condevs.h" 623697Sbloom #define ACULAST "-<" 717773Sralph 817773Sralph /*** 917773Sralph * dnopn(ph, flds, dev) dial remote machine 1017773Sralph * 1117773Sralph * return codes: 1217773Sralph * file descriptor - succeeded 1317773Sralph * FAIL - failed 1417773Sralph */ 1517773Sralph dnopn(ph, flds, dev) 1617773Sralph char *ph; 1717773Sralph char *flds[]; 1817773Sralph struct Devices *dev; 1917773Sralph { 2017773Sralph char dcname[20], dnname[20], phone[MAXPH+2], c = 0; 2123697Sbloom #ifdef USG 2217773Sralph struct termio ttbuf; 2323697Sbloom #endif USG 2417773Sralph int dnf, dcf; 2517773Sralph int nw, lt, pid, status; 2617773Sralph unsigned timelim; 2723697Sbloom #ifdef TIOCFLUSH 2823697Sbloom int zero = 0; 2923697Sbloom #endif TIOCFLUSH 3017773Sralph 3117773Sralph sprintf(dnname, "/dev/%s", dev->D_calldev); 3217773Sralph errno = 0; 3317773Sralph 3417773Sralph if (setjmp(Sjbuf)) { 3517773Sralph logent(dnname, "CAN'T OPEN"); 3617773Sralph DEBUG(4, "%s Open timed out\n", dnname); 3717773Sralph return(CF_NODEV); 3817773Sralph } 3917773Sralph signal(SIGALRM, alarmtr); 4017773Sralph getnextfd(); 4117773Sralph alarm(10); 4217773Sralph dnf = open(dnname, 1); 4317773Sralph alarm(0); 4417773Sralph next_fd = -1; 4517773Sralph if (dnf < 0 && errno == EACCES) { 4617773Sralph logent(dnname, "CAN'T OPEN"); 4717773Sralph logent("DEVICE", "NO"); 4817773Sralph return CF_NODEV; 4917773Sralph } 5017773Sralph fioclex(dnf); 5117773Sralph 5217773Sralph sprintf(dcname, "/dev/%s", dev->D_line); 5317773Sralph sprintf(phone, "%s%s", ph, ACULAST); 5417773Sralph DEBUG(4, "dc - %s, ", dcname); 5517773Sralph DEBUG(4, "acu - %s\n", dnname); 5617773Sralph pid = 0; 5717773Sralph if (setjmp(Sjbuf)) { 5817773Sralph logent("DIALUP DN write", "TIMEOUT"); 5917773Sralph if (pid) 6017773Sralph kill(pid, 9); 6117773Sralph delock(dev->D_line); 6217773Sralph if (dnf) 6317773Sralph close(dnf); 6417773Sralph return CF_DIAL; 6517773Sralph } 6617773Sralph signal(SIGALRM, alarmtr); 6717773Sralph timelim = 5 * strlen(phone); 6817773Sralph alarm(timelim < 30 ? 30 : timelim); 6917773Sralph if ((pid = fork()) == 0) { 7017773Sralph sleep(2); 7117773Sralph fclose(stdin); 7217773Sralph fclose(stdout); 7317773Sralph #ifdef TIOCFLUSH 7423697Sbloom ioctl(dnf, TIOCFLUSH, &zero); 7523697Sbloom #endif TIOCFLUSH 7617773Sralph nw = write(dnf, phone, lt = strlen(phone)); 7717773Sralph if (nw != lt) { 7817773Sralph logent("DIALUP ACU write", _FAILED); 7917773Sralph exit(1); 8017773Sralph } 8117773Sralph DEBUG(4, "ACU write ok\n", CNULL); 8217773Sralph exit(0); 8317773Sralph } 8417773Sralph /* open line - will return on carrier */ 8517773Sralph /* RT needs a sleep here because it returns immediately from open */ 8617773Sralph 8717773Sralph #if RT 8817773Sralph sleep(15); 8917773Sralph #endif 9017773Sralph 9117773Sralph getnextfd(); 9217773Sralph errno = 0; 9317773Sralph dcf = open(dcname, 2); 9417773Sralph next_fd = -1; 9517773Sralph if (dcf < 0 && errno == EACCES) 9617773Sralph logent(dcname, "CAN'T OPEN"); 9717773Sralph DEBUG(4, "dcf is %d\n", dcf); 9817773Sralph if (dcf < 0) { 9917773Sralph logent("DIALUP LINE open", _FAILED); 10017773Sralph alarm(0); 10117773Sralph kill(pid, 9); 10217773Sralph close(dnf); 10317773Sralph delock(dev->D_line); 10417773Sralph return CF_DIAL; 10517773Sralph } 10617773Sralph while ((nw = wait(<)) != pid && nw != -1) 10717773Sralph ; 10823697Sbloom #ifdef USG 10917773Sralph ioctl(dcf, TCGETA, &ttbuf); 11017773Sralph if(!(ttbuf.c_cflag & HUPCL)) { 11117773Sralph ttbuf.c_cflag |= HUPCL; 11217773Sralph ioctl(dcf, TCSETA, &ttbuf); 11317773Sralph } 11423697Sbloom #endif USG 11517773Sralph alarm(0); 11617773Sralph fflush(stdout); 11717773Sralph fixline(dcf, dev->D_speed); 11817773Sralph DEBUG(4, "Fork Stat %o\n", lt); 11917773Sralph if (lt != 0) { 12017773Sralph close(dcf); 12117773Sralph if (dnf) 12217773Sralph close(dnf); 12317773Sralph delock(dev->D_line); 12417773Sralph return CF_DIAL; 12517773Sralph } 12617773Sralph return dcf; 12717773Sralph } 12817773Sralph 12917773Sralph /*** 13017773Sralph * dncls() close dn type call unit 13117773Sralph * 13217773Sralph * return codes: None 13317773Sralph */ 13417773Sralph dncls(fd) 13517773Sralph register int fd; 13617773Sralph { 13717773Sralph if (fd > 0) { 13817773Sralph close(fd); 13917773Sralph sleep(5); 14017773Sralph delock(devSel); 14117773Sralph } 14217773Sralph } 143