|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)ventel.c 1.5 (Berkeley) 6/25/83"; ! 3: #endif ! 4: ! 5: /* ! 6: * Routines for calling up on a Ventel Modem ! 7: * The Ventel is expected to be strapped for "no echo". ! 8: */ ! 9: #include "tip.h" ! 10: ! 11: #define MAXRETRY 5 ! 12: ! 13: static int sigALRM(); ! 14: static int timeout = 0; ! 15: static jmp_buf timeoutbuf; ! 16: ! 17: ven_dialer(num, acu) ! 18: register char *num; ! 19: char *acu; ! 20: { ! 21: register char *cp; ! 22: register int connected = 0; ! 23: #ifdef ACULOG ! 24: char line[80]; ! 25: #endif ! 26: /* ! 27: * Get in synch with a couple of carriage returns ! 28: */ ! 29: if (!vensync(FD)) { ! 30: printf("can't synchronize with ventel\n"); ! 31: #ifdef ACULOG ! 32: logent(value(HOST), num, "ventel", "can't synch up"); ! 33: #endif ! 34: return (0); ! 35: } ! 36: if (boolean(value(VERBOSE))) ! 37: printf("\ndialing..."); ! 38: fflush(stdout); ! 39: ioctl(FD, TIOCHPCL, 0); ! 40: echo("#k$\r$\n$D$I$A$L$:$ "); ! 41: for (cp = num; *cp; cp++) { ! 42: sleep(1); ! 43: write(FD, cp, 1); ! 44: } ! 45: echo("\r$\n"); ! 46: if (gobble('\n')) ! 47: connected = gobble('!'); ! 48: ioctl(FD, TIOCFLUSH); ! 49: #ifdef ACULOG ! 50: if (timeout) { ! 51: sprintf(line, "%d second dial timeout", ! 52: number(value(DIALTIMEOUT))); ! 53: logent(value(HOST), num, "ventel", line); ! 54: } ! 55: #endif ! 56: if (timeout) ! 57: ven_disconnect(); /* insurance */ ! 58: return (connected); ! 59: } ! 60: ! 61: ven_disconnect() ! 62: { ! 63: ! 64: close(FD); ! 65: } ! 66: ! 67: ven_abort() ! 68: { ! 69: ! 70: write(FD, "\03", 1); ! 71: close(FD); ! 72: } ! 73: ! 74: static int ! 75: echo(s) ! 76: register char *s; ! 77: { ! 78: char c; ! 79: ! 80: while (c = *s++) switch (c) { ! 81: ! 82: case '$': ! 83: read(FD, &c, 1); ! 84: s++; ! 85: break; ! 86: ! 87: case '#': ! 88: c = *s++; ! 89: write(FD, &c, 1); ! 90: break; ! 91: ! 92: default: ! 93: write(FD, &c, 1); ! 94: read(FD, &c, 1); ! 95: } ! 96: } ! 97: ! 98: static int ! 99: sigALRM() ! 100: { ! 101: ! 102: printf("\07timeout waiting for reply\n"); ! 103: timeout = 1; ! 104: longjmp(timeoutbuf, 1); ! 105: } ! 106: ! 107: static int ! 108: gobble(match) ! 109: register char match; ! 110: { ! 111: char c; ! 112: int (*f)(); ! 113: ! 114: signal(SIGALRM, sigALRM); ! 115: timeout = 0; ! 116: do { ! 117: if (setjmp(timeoutbuf)) { ! 118: signal(SIGALRM, f); ! 119: return (0); ! 120: } ! 121: alarm(number(value(DIALTIMEOUT))); ! 122: read(FD, &c, 1); ! 123: alarm(0); ! 124: c &= 0177; ! 125: #ifdef notdef ! 126: if (boolean(value(VERBOSE))) ! 127: putchar(c); ! 128: #endif ! 129: } while (c != '\n' && c != match); ! 130: signal(SIGALRM, SIG_DFL); ! 131: return (c == match); ! 132: } ! 133: ! 134: #define min(a,b) ((a)>(b)?(b):(a)) ! 135: /* ! 136: * This convoluted piece of code attempts to get ! 137: * the ventel in sync. If you don't have FIONREAD ! 138: * there are gory ways to simulate this. ! 139: */ ! 140: static int ! 141: vensync(fd) ! 142: { ! 143: int already = 0, nread; ! 144: char buf[60]; ! 145: ! 146: /* ! 147: * Toggle DTR to force anyone off that might have left ! 148: * the modem connected, and insure a consistent state ! 149: * to start from. ! 150: * ! 151: * If you don't have the ioctl calls to diddle directly ! 152: * with DTR, you can always try setting the baud rate to 0. ! 153: */ ! 154: ioctl(FD, TIOCCDTR, 0); ! 155: sleep(2); ! 156: ioctl(FD, TIOCSDTR, 0); ! 157: while (already < MAXRETRY) { ! 158: /* ! 159: * After reseting the modem, send it two \r's to ! 160: * autobaud on. Make sure to delay between them ! 161: * so the modem can frame the incoming characters. ! 162: */ ! 163: write(fd, "\r", 1); ! 164: sleep(1); ! 165: write(fd, "\r", 1); ! 166: sleep(3); ! 167: if (ioctl(fd, FIONREAD, (caddr_t)&nread) < 0) { ! 168: perror("tip: ioctl"); ! 169: continue; ! 170: } ! 171: while (nread > 0) { ! 172: read(fd, buf, min(nread, 60)); ! 173: if ((buf[nread - 1] & 0177) == '$') ! 174: return (1); ! 175: nread -= min(nread, 60); ! 176: } ! 177: sleep(1); ! 178: already++; ! 179: } ! 180: return (0); ! 181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.