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