|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)df2.c 4.3 (Berkeley) 2/24/88"; ! 3: #endif ! 4: ! 5: #include "../condevs.h" ! 6: ! 7: /* ! 8: * df2opn(ph, flds, dev) dial remote machine ! 9: * ! 10: * return codes: ! 11: * file descriptor - succeeded ! 12: * FAIL - failed ! 13: */ ! 14: df2opn(ph, flds, dev) ! 15: char *ph; ! 16: char *flds[]; ! 17: struct Devices *dev; ! 18: { ! 19: char dcname[20], dnname[20], phone[MAXPH+2], c = 0; ! 20: #ifdef USG ! 21: struct termio ttbuf; ! 22: #endif USG ! 23: int dcf, dnf; ! 24: int nw, lt, pid, st, status; ! 25: unsigned timelim; ! 26: #ifdef TIOCFLUSH ! 27: int zero = 0; ! 28: #endif TIOCFLUSH ! 29: ! 30: sprintf(dnname, "/dev/%s", dev->D_calldev); ! 31: if (setjmp(Sjbuf)) { ! 32: logent(dnname, "CAN'T OPEN"); ! 33: DEBUG(4, "%s Open timed out\n", dnname); ! 34: return CF_NODEV; ! 35: } ! 36: signal(SIGALRM, alarmtr); ! 37: getnextfd(); ! 38: errno = 0; ! 39: alarm(10); ! 40: dnf = open(dnname, 2 ); ! 41: alarm(0); ! 42: next_fd = -1; ! 43: if (dnf < 0 && errno == EACCES) { ! 44: logent(dnname, "CAN'T OPEN"); ! 45: delock(dev->D_line); ! 46: logent("DEVICE", "NO"); ! 47: return CF_NODEV; ! 48: } ! 49: fioclex(dnf); ! 50: ! 51: sprintf(dcname, "/dev/%s", dev->D_line); ! 52: fixline(dnf, dev->D_speed); ! 53: sprintf(phone, "\02%s", ph); ! 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: write(dnf, "\01", 1); ! 77: sleep(1); ! 78: nw = write(dnf, phone, lt = strlen(phone)); ! 79: if (nw != lt) { ! 80: logent("DIALUP ACU write", _FAILED); ! 81: exit(1); ! 82: } ! 83: DEBUG(4, "ACU write ok%s\n", CNULL); ! 84: exit(0); ! 85: } ! 86: /* open line - will return on carrier */ ! 87: /* RT needs a sleep here because it returns immediately from open */ ! 88: ! 89: #if RT ! 90: sleep(15); ! 91: #endif ! 92: ! 93: if (read(dnf, &c, 1) != 1 || c != 'A') ! 94: dcf = -1; ! 95: else ! 96: dcf = 0; ! 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: dcf = dnf; ! 107: dnf = 0; ! 108: while ((nw = wait(<)) != pid && nw != -1) ! 109: ; ! 110: #ifdef USG ! 111: ioctl(dcf, TCGETA, &ttbuf); ! 112: if(!(ttbuf.c_cflag & HUPCL)) { ! 113: ttbuf.c_cflag |= HUPCL; ! 114: ioctl(dcf, TCSETA, &ttbuf); ! 115: } ! 116: #endif USG ! 117: alarm(0); ! 118: fflush(stdout); ! 119: fixline(dcf, dev->D_speed); ! 120: DEBUG(4, "Fork Stat %o\n", lt); ! 121: if (lt != 0) { ! 122: close(dcf); ! 123: if (dnf) ! 124: close(dnf); ! 125: delock(dev->D_line); ! 126: return CF_DIAL; ! 127: } ! 128: return dcf; ! 129: } ! 130: ! 131: /* ! 132: * df2cls() close the DF02/DF03 call unit ! 133: * ! 134: * return codes: none ! 135: */ ! 136: df2cls(fd) ! 137: register int fd; ! 138: { ! 139: if (fd > 0) { ! 140: close(fd); ! 141: sleep(5); ! 142: delock(devSel); ! 143: } ! 144: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.