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