|
|
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[] = "@(#)v3451.c 5.1 (Berkeley) 4/30/85";
9: #endif not lint
10:
11: /*
12: * Routines for calling up on a Vadic 3451 Modem
13: */
14: #include "tip.h"
15:
16: static jmp_buf Sjbuf;
17:
18: v3451_dialer(num, acu)
19: register char *num;
20: char *acu;
21: {
22: int ok, (*func)();
23: int slow = number(value(BAUDRATE)) < 1200, rw = 2;
24: char phone[50];
25: #ifdef ACULOG
26: char line[80];
27: #endif
28:
29: /*
30: * Get in synch
31: */
32: vawrite("I\r", 1 + slow);
33: vawrite("I\r", 1 + slow);
34: vawrite("I\r", 1 + slow);
35: vawrite("\005\r", 2 + slow);
36: if (!expect("READY")) {
37: printf("can't synchronize with vadic 3451\n");
38: #ifdef ACULOG
39: logent(value(HOST), num, "vadic", "can't synch up");
40: #endif
41: return (0);
42: }
43: ioctl(FD, TIOCHPCL, 0);
44: sleep(1);
45: vawrite("D\r", 2 + slow);
46: if (!expect("NUMBER?")) {
47: printf("Vadic will not accept dial command\n");
48: #ifdef ACULOG
49: logent(value(HOST), num, "vadic", "will not accept dial");
50: #endif
51: return (0);
52: }
53: strcpy(phone, num);
54: strcat(phone, "\r");
55: vawrite(phone, 1 + slow);
56: if (!expect(phone)) {
57: printf("Vadic will not accept phone number\n");
58: #ifdef ACULOG
59: logent(value(HOST), num, "vadic", "will not accept number");
60: #endif
61: return (0);
62: }
63: func = signal(SIGINT,SIG_IGN);
64: /*
65: * You cannot interrupt the Vadic when its dialing;
66: * even dropping DTR does not work (definitely a
67: * brain damaged design).
68: */
69: vawrite("\r", 1 + slow);
70: vawrite("\r", 1 + slow);
71: if (!expect("DIALING:")) {
72: printf("Vadic failed to dial\n");
73: #ifdef ACULOG
74: logent(value(HOST), num, "vadic", "failed to dial");
75: #endif
76: return (0);
77: }
78: if (boolean(value(VERBOSE)))
79: printf("\ndialing...");
80: ok = expect("ON LINE");
81: signal(SIGINT, func);
82: if (!ok) {
83: printf("call failed\n");
84: #ifdef ACULOG
85: logent(value(HOST), num, "vadic", "call failed");
86: #endif
87: return (0);
88: }
89: ioctl(FD, TIOCFLUSH, &rw);
90: return (1);
91: }
92:
93: v3451_disconnect()
94: {
95:
96: close(FD);
97: }
98:
99: v3451_abort()
100: {
101:
102: close(FD);
103: }
104:
105: static
106: vawrite(cp, delay)
107: register char *cp;
108: int delay;
109: {
110:
111: for (; *cp; sleep(delay), cp++)
112: write(FD, cp, 1);
113: }
114:
115: static
116: expect(cp)
117: register char *cp;
118: {
119: char buf[300];
120: register char *rp = buf;
121: int alarmtr(), timeout = 30, online = 0;
122:
123: if (strcmp(cp, "\"\"") == 0)
124: return (1);
125: *rp = 0;
126: /*
127: * If we are waiting for the Vadic to complete
128: * dialing and get a connection, allow more time
129: * Unfortunately, the Vadic times out 24 seconds after
130: * the last digit is dialed
131: */
132: online = strcmp(cp, "ON LINE") == 0;
133: if (online)
134: timeout = number(value(DIALTIMEOUT));
135: signal(SIGALRM, alarmtr);
136: if (setjmp(Sjbuf))
137: return (0);
138: alarm(timeout);
139: while (notin(cp, buf) && rp < buf + sizeof (buf) - 1) {
140: if (online && notin("FAILED CALL", buf) == 0)
141: return (0);
142: if (read(FD, rp, 1) < 0) {
143: alarm(0);
144: return (0);
145: }
146: if (*rp &= 0177)
147: rp++;
148: *rp = '\0';
149: }
150: alarm(0);
151: return (1);
152: }
153:
154: static
155: alarmtr()
156: {
157:
158: longjmp(Sjbuf, 1);
159: }
160:
161: static
162: notin(sh, lg)
163: char *sh, *lg;
164: {
165:
166: for (; *lg; lg++)
167: if (prefix(sh, lg))
168: return (0);
169: return (1);
170: }
171:
172: static
173: prefix(s1, s2)
174: register char *s1, *s2;
175: {
176: register char c;
177:
178: while ((c = *s1++) == *s2++)
179: if (c == '\0')
180: return (1);
181: return (c == '\0');
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.