1 /*
2 * Copyright 2000 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
5
6 /*
7 * Copyright (c) 1983 Regents of the University of California.
8 * All rights reserved. The Berkeley software License Agreement
9 * specifies the terms and conditions for redistribution.
10 */
11
12 #pragma ident "%Z%%M% %I% %E% SMI"
13
14 /*
15 * Routines for calling up on a Vadic 3451 Modem
16 */
17 #include "tip.h"
18
19 static int expect(char *);
20 static int notin(char *, char *);
21 static int prefix(char *, char *);
22 static void vawrite(char *, int);
23 static void alarmtr(void);
24
25 static sigjmp_buf Sjbuf;
26
27 /* ARGSUSED */
28 int
v3451_dialer(char * num,char * acu)29 v3451_dialer(char *num, char *acu)
30 {
31 int ok;
32 sig_handler_t func;
33 struct termios buf;
34 int slow = number(value(BAUDRATE)) < 1200;
35 char phone[50];
36 #ifdef ACULOG
37 char line[80];
38 #endif
39
40 /*
41 * Get in synch
42 */
43 vawrite("I\r", 1 + slow);
44 vawrite("I\r", 1 + slow);
45 vawrite("I\r", 1 + slow);
46 vawrite("\005\r", 2 + slow);
47 if (!expect("READY")) {
48 (void) printf("can't synchronize with vadic 3451\n");
49 #ifdef ACULOG
50 logent(value(HOST), num, "vadic", "can't synch up");
51 #endif
52 return (0);
53 }
54 (void) ioctl(FD, TCGETS, &buf);
55 buf.c_cflag |= HUPCL;
56 (void) ioctl(FD, TCSETSF, &buf);
57 (void) sleep(1);
58 vawrite("D\r", 2 + slow);
59 if (!expect("NUMBER?")) {
60 (void) printf("Vadic will not accept dial command\n");
61 #ifdef ACULOG
62 logent(value(HOST), num, "vadic", "will not accept dial");
63 #endif
64 return (0);
65 }
66 (void) strlcpy(phone, num, sizeof (phone));
67 (void) strlcat(phone, "\r", sizeof (phone));
68 vawrite(phone, 1 + slow);
69 if (!expect(phone)) {
70 (void) printf("Vadic will not accept phone number\n");
71 #ifdef ACULOG
72 logent(value(HOST), num, "vadic", "will not accept number");
73 #endif
74 return (0);
75 }
76 func = signal(SIGINT, SIG_IGN);
77 /*
78 * You cannot interrupt the Vadic when its dialing;
79 * even dropping DTR does not work (definitely a
80 * brain damaged design).
81 */
82 vawrite("\r", 1 + slow);
83 vawrite("\r", 1 + slow);
84 if (!expect("DIALING:")) {
85 (void) printf("Vadic failed to dial\n");
86 #ifdef ACULOG
87 logent(value(HOST), num, "vadic", "failed to dial");
88 #endif
89 return (0);
90 }
91 if (boolean(value(VERBOSE)))
92 (void) printf("\ndialing...");
93 ok = expect("ON LINE");
94 (void) signal(SIGINT, func);
95 if (!ok) {
96 (void) printf("call failed\n");
97 #ifdef ACULOG
98 logent(value(HOST), num, "vadic", "call failed");
99 #endif
100 return (0);
101 }
102 (void) ioctl(FD, TCFLSH, TCOFLUSH);
103 return (1);
104 }
105
106 void
v3451_disconnect(void)107 v3451_disconnect(void)
108 {
109
110 (void) close(FD);
111 }
112
113 void
v3451_abort(void)114 v3451_abort(void)
115 {
116
117 (void) close(FD);
118 }
119
120 static void
vawrite(char * cp,int delay)121 vawrite(char *cp, int delay)
122 {
123
124 for (; *cp; (void) sleep(delay), cp++)
125 (void) write(FD, cp, 1);
126 }
127
128 static int
expect(char * cp)129 expect(char *cp)
130 {
131 char buf[300];
132 char *rp = buf;
133 int timeout = 30, online = 0;
134
135 if (strcmp(cp, "\"\"") == 0)
136 return (1);
137 *rp = 0;
138 /*
139 * If we are waiting for the Vadic to complete
140 * dialing and get a connection, allow more time
141 * Unfortunately, the Vadic times out 24 seconds after
142 * the last digit is dialed
143 */
144 online = strcmp(cp, "ON LINE") == 0;
145 if (online)
146 timeout = number(value(DIALTIMEOUT));
147 (void) signal(SIGALRM, (sig_handler_t)alarmtr);
148 if (sigsetjmp(Sjbuf, 1))
149 return (0);
150 (void) alarm(timeout);
151 while (notin(cp, buf) && rp < buf + sizeof (buf) - 1) {
152 if (online && notin("FAILED CALL", buf) == 0)
153 return (0);
154 if (read(FD, rp, 1) < 0) {
155 (void) alarm(0);
156 return (0);
157 }
158 if (*rp &= 0177)
159 rp++;
160 *rp = '\0';
161 }
162 (void) alarm(0);
163 return (1);
164 }
165
166 static void
alarmtr(void)167 alarmtr(void)
168 {
169
170 siglongjmp(Sjbuf, 1);
171 }
172
173 static int
notin(char * sh,char * lg)174 notin(char *sh, char *lg)
175 {
176
177 for (; *lg; lg++)
178 if (prefix(sh, lg))
179 return (0);
180 return (1);
181 }
182
183 static int
prefix(char * s1,char * s2)184 prefix(char *s1, char *s2)
185 {
186 char c;
187
188 while ((c = *s1++) == *s2++)
189 if (c == '\0')
190 return (1);
191 return (c == '\0');
192 }
193