|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)biz31.c 4.7 (Berkeley) 6/25/83"; ! 3: #endif ! 4: ! 5: #include "tip.h" ! 6: ! 7: #define MAXRETRY 3 /* sync up retry count */ ! 8: #define DISCONNECT_CMD "\21\25\11\24" /* disconnection string */ ! 9: ! 10: static int sigALRM(); ! 11: static int timeout = 0; ! 12: static jmp_buf timeoutbuf; ! 13: ! 14: /* ! 15: * Dial up on a BIZCOMP Model 1031 with either ! 16: * tone dialing (mod = "f") ! 17: * pulse dialing (mod = "w") ! 18: */ ! 19: static int ! 20: biz_dialer(num, mod) ! 21: char *num, *mod; ! 22: { ! 23: register int connected = 0; ! 24: ! 25: if (!bizsync(FD)) { ! 26: logent(value(HOST), "", "biz", "out of sync"); ! 27: printf("bizcomp out of sync\n"); ! 28: delock(uucplock); ! 29: exit(0); ! 30: } ! 31: if (boolean(value(VERBOSE))) ! 32: printf("\nstarting call..."); ! 33: echo("#\rk$\r$\n"); /* disable auto-answer */ ! 34: echo("$>$.$ #\r"); /* tone/pulse dialing */ ! 35: echo(mod); ! 36: echo("$\r$\n"); ! 37: echo("$>$.$ #\re$ "); /* disconnection sequence */ ! 38: echo(DISCONNECT_CMD); ! 39: echo("\r$\n$\r$\n"); ! 40: echo("$>$.$ #\rr$ "); /* repeat dial */ ! 41: echo(num); ! 42: echo("\r$\n"); ! 43: if (boolean(value(VERBOSE))) ! 44: printf("ringing..."); ! 45: /* ! 46: * The reply from the BIZCOMP should be: ! 47: * `^G NO CONNECTION\r\n^G\r\n' failure ! 48: * ` CONNECTION\r\n^G' success ! 49: */ ! 50: connected = detect(" "); ! 51: #ifdef ACULOG ! 52: if (timeout) { ! 53: char line[80]; ! 54: ! 55: sprintf(line, "%d second dial timeout", ! 56: number(value(DIALTIMEOUT))); ! 57: logent(value(HOST), num, "biz", line); ! 58: } ! 59: #endif ! 60: if (!connected) ! 61: flush(" NO CONNECTION\r\n\07\r\n"); ! 62: else ! 63: flush("CONNECTION\r\n\07"); ! 64: if (timeout) ! 65: biz31_disconnect(); /* insurance */ ! 66: return (connected); ! 67: } ! 68: ! 69: biz31w_dialer(num, acu) ! 70: char *num, *acu; ! 71: { ! 72: ! 73: return (biz_dialer(num, "w")); ! 74: } ! 75: ! 76: biz31f_dialer(num, acu) ! 77: char *num, *acu; ! 78: { ! 79: ! 80: return (biz_dialer(num, "f")); ! 81: } ! 82: ! 83: biz31_disconnect() ! 84: { ! 85: ! 86: write(FD, DISCONNECT_CMD, 4); ! 87: sleep(2); ! 88: ioctl(FD, TIOCFLUSH); ! 89: } ! 90: ! 91: biz31_abort() ! 92: { ! 93: ! 94: write(FD, "\33", 1); ! 95: } ! 96: ! 97: static int ! 98: echo(s) ! 99: register char *s; ! 100: { ! 101: char c; ! 102: ! 103: while (c = *s++) switch (c) { ! 104: ! 105: case '$': ! 106: read(FD, &c, 1); ! 107: s++; ! 108: break; ! 109: ! 110: case '#': ! 111: c = *s++; ! 112: write(FD, &c, 1); ! 113: break; ! 114: ! 115: default: ! 116: write(FD, &c, 1); ! 117: read(FD, &c, 1); ! 118: } ! 119: } ! 120: ! 121: static int ! 122: sigALRM() ! 123: { ! 124: ! 125: timeout = 1; ! 126: longjmp(timeoutbuf, 1); ! 127: } ! 128: ! 129: static int ! 130: detect(s) ! 131: register char *s; ! 132: { ! 133: char c; ! 134: int (*f)(); ! 135: ! 136: f = signal(SIGALRM, sigALRM); ! 137: timeout = 0; ! 138: while (*s) { ! 139: if (setjmp(timeoutbuf)) { ! 140: printf("\07timeout waiting for reply\n"); ! 141: biz31_abort(); ! 142: break; ! 143: } ! 144: alarm(number(value(DIALTIMEOUT))); ! 145: read(FD, &c, 1); ! 146: alarm(0); ! 147: if (c != *s++) ! 148: break; ! 149: } ! 150: signal(SIGALRM, f); ! 151: return (timeout == 0); ! 152: } ! 153: ! 154: static int ! 155: flush(s) ! 156: register char *s; ! 157: { ! 158: char c; ! 159: int (*f)(); ! 160: ! 161: f = signal(SIGALRM, sigALRM); ! 162: while (*s++) { ! 163: if (setjmp(timeoutbuf)) ! 164: break; ! 165: alarm(10); ! 166: read(FD, &c, 1); ! 167: alarm(0); ! 168: } ! 169: signal(SIGALRM, f); ! 170: timeout = 0; /* guard against disconnection */ ! 171: } ! 172: ! 173: /* ! 174: * This convoluted piece of code attempts to get ! 175: * the bizcomp in sync. If you don't have the capacity or nread ! 176: * call there are gory ways to simulate this. ! 177: */ ! 178: static int ! 179: bizsync(fd) ! 180: { ! 181: #ifdef FIOCAPACITY ! 182: struct capacity b; ! 183: # define chars(b) ((b).cp_nbytes) ! 184: # define IOCTL FIOCAPACITY ! 185: #endif ! 186: #ifdef FIONREAD ! 187: long b; ! 188: # define chars(b) (b) ! 189: # define IOCTL FIONREAD ! 190: #endif ! 191: register int already = 0; ! 192: char buf[10]; ! 193: ! 194: retry: ! 195: if (ioctl(fd, IOCTL, (caddr_t)&b) >= 0 && chars(b) > 0) ! 196: ioctl(fd, TIOCFLUSH); ! 197: write(fd, "\rp>\r", 4); ! 198: sleep(1); ! 199: if (ioctl(fd, IOCTL, (caddr_t)&b) >= 0) { ! 200: if (chars(b) != 10) { ! 201: nono: ! 202: if (already > MAXRETRY) ! 203: return (0); ! 204: write(fd, DISCONNECT_CMD, 4); ! 205: sleep(2); ! 206: already++; ! 207: goto retry; ! 208: } else { ! 209: read(fd, buf, 10); ! 210: if (strncmp(buf, "p >\r\n\r\n>", 8)) ! 211: goto nono; ! 212: } ! 213: } ! 214: return (1); ! 215: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.