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