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