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