BSD 4_1c_2 development
[unix-history] / usr / src / usr.bin / tip / ventel.c
CommitLineData
a0c21c7b
C
1/* ventel.c 1.2 82/07/29 */
2
3#if VENTEL
4/*
5 * Routines for calling up on a Ventel Modem
6 */
7#include "tip.h"
8#include <setjmp.h>
9#include <errno.h>
10
11#define MAXRETRY 5
12#define DISCONNECT "\03" /* ^C */
13
14static int sigALRM();
15static int timeout = 0;
16
17ven_dialer(num, acu)
18 register char *num;
19 char *acu;
20{
21 register char *cp;
22 register int connected = 0;
23 char c;
24#ifdef ACULOG
25 char line[80];
26#endif
27 /*
28 * Get in synch with a couple of carriage returns
29 */
30 if (!vensync(FD)) {
31 printf("can't synchronize with ventel\n");
32#ifdef ACULOG
33 logent(value(HOST), num, "ventel", "can't synch up");
34#endif
35 return (0);
36 }
37 if (boolean(value(VERBOSE)))
38 printf("\ndialing...");
39 fflush(stdout);
40 ioctl(FD, TIOCHPCL, 0);
41 echo("k$\r$\n$D$I$A$L$:$ <");
42 for (cp = num; *cp; cp++) {
43 sleep(1);
44 write(FD, cp, 1);
45 read(FD, &c, 1);
46 }
47 echo(">\r$\n");
48 if (gobble('\n'))
49 connected = gobble('!');
50 ioctl(FD, TIOCFLUSH);
51#ifdef ACULOG
52 if (timeout) {
53 sprintf(line, "%d second dial timeout",
54 number(value(DIALTIMEOUT)));
55 logent(value(HOST), num, "ventel", line);
56 }
57#endif
58 if (timeout)
59 ven_disconnect(); /* insurance */
60 return (connected);
61}
62
63ven_disconnect()
64{
65 close(FD);
66}
67
68ven_abort()
69{
70 write(FD, "\03", 1);
71 close(FD);
72}
73
74static int
75echo(s)
76 register char *s;
77{
78 char c;
79
80 while (c = *s++) switch (c) {
81
82 case '$':
83 read(FD, &c, 1);
84 s++;
85 break;
86
87 case '#':
88 c = *s++;
89 write(FD, &c, 1);
90 break;
91
92 default:
93 write(FD, &c, 1);
94 read(FD, &c, 1);
95 }
96}
97
98static int
99sigALRM()
100{
101 signal(SIGALRM, SIG_IGN);
102 printf("\07timeout waiting for reply\n");
103 timeout = 1;
104}
105
106static int
107gobble(s)
108 register char s;
109{
110 char c;
111
112 signal(SIGALRM, sigALRM);
113 timeout = 0;
114 do {
115 alarm(number(value(DIALTIMEOUT)));
116 read(FD, &c, 1);
117 c &= 0177;
118 alarm(0);
119#ifdef notdef
120 if (boolean(value(VERBOSE)))
121 putchar(c);
122#endif
123 if (timeout)
124 return (0);
125 } while (c != '\n' && c != s);
126 signal(SIGALRM, SIG_DFL);
127 return (c == s);
128}
129
130#define min(a,b) ((a)>(b)?(b):(a))
131/*
132 * This convoluted piece of code attempts to get
133 * the ventel in sync. If you don't have the capacity or nread
134 * call there are gory ways to simulate this.
135 */
136static int
137vensync(fd)
138{
139 long nread;
140 register int already = 0, nbytes;
141 char buf[60];
142
143 /*
144 * Toggle DTR to force anyone off that might have left
145 * the modem connected, and insure a consistent state
146 * to start from.
147 *
148 * If you don't have the ioctl calls to diddle directly
149 * with DTR, you can always try setting the baud rate to 0.
150 */
151 ioctl(FD, TIOCCDTR, 0);
152 sleep(2);
153 ioctl(FD, TIOCSDTR, 0);
154 while (already < MAXRETRY) {
155 /*
156 * After reseting the modem, send it two \r's to
157 * autobaud on. Make sure to delay between them
158 * so the modem can frame the incoming characters.
159 */
160 write(fd, "\r", 1);
161 sleep(1);
162 write(fd, "\r", 1);
163 sleep(3);
164 if (ioctl(fd, FIONREAD, (caddr_t)&nread) >= 0) {
165 nbytes = nread;
166 while (nbytes > 0) {
167 read(fd, buf, min(nbytes, 60));
168 if ((buf[nbytes-1]&0177) == '$')
169 return (1);
170 nbytes -= min(nbytes, 60);
171 }
172 sleep(1);
173 already++;
174 }
175 }
176 return (0);
177}
178#endif