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