new file organization
[unix-history] / usr / src / usr.bin / tip / aculib / v831.c
CommitLineData
05862919
SL
1#ifndef lint
2static char sccsid[] = "@(#)v831.c 4.4 (Berkeley) %G%";
3#endif
ab6afea0 4
3945ab7c 5#ifdef V831
ab6afea0
RC
6/*
7 * Routines for dialing up on Vadic 831
8 */
3945ab7c
RC
9#include <sys/time.h>
10
3945ab7c 11#include "tip.h"
ab6afea0 12
3945ab7c 13int v831_abort();
33b949e5 14static int alarmtr();
3945ab7c 15extern errno;
ab6afea0
RC
16
17static jmp_buf jmpbuf;
18static int child = -1;
19
20v831_dialer(num, acu)
3945ab7c 21 char *num, *acu;
ab6afea0 22{
3945ab7c
RC
23 int status, pid, connected = 1;
24 register int timelim;
25
26 if (boolean(value(VERBOSE)))
27 printf("\nstarting call...");
ab6afea0 28#ifdef DEBUG
3945ab7c 29 printf ("(acu=%s)\n", acu);
ab6afea0 30#endif
33b949e5 31 if ((AC = open(acu, O_RDWR)) < 0) {
3945ab7c
RC
32 if (errno == EBUSY)
33 printf("line busy...");
34 else
35 printf("acu open error...");
36 return (0);
37 }
38 if (setjmp(jmpbuf)) {
39 kill(child, SIGKILL);
40 close(AC);
41 return (0);
42 }
43 signal(SIGALRM, alarmtr);
44 timelim = 5 * strlen(num);
45 alarm(timelim < 30 ? 30 : timelim);
46 if ((child = fork()) == 0) {
47 /*
48 * ignore this stuff for aborts
49 */
50 signal(SIGALRM, SIG_IGN);
ab6afea0 51 signal(SIGINT, SIG_IGN);
3945ab7c
RC
52 signal(SIGQUIT, SIG_IGN);
53 sleep(2);
54 exit(dialit(num, acu) != 'A');
55 }
56 /*
57 * open line - will return on carrier
58 */
33b949e5 59 if ((FD = open(DV, O_RDWR)) < 0) {
ab6afea0 60#ifdef DEBUG
3945ab7c 61 printf("(after open, errno=%d)\n", errno);
ab6afea0 62#endif
3945ab7c
RC
63 if (errno == EIO)
64 printf("lost carrier...");
65 else
66 printf("dialup line open failed...");
67 alarm(0);
68 kill(child, SIGKILL);
69 close(AC);
70 return (0);
71 }
72 alarm(0);
73#ifdef notdef
74 ioctl(AC, TIOCHPCL, 0);
75#endif
76 signal(SIGALRM, SIG_DFL);
77 while ((pid = wait(&status)) != child && pid != -1)
78 ;
79 if (status) {
80 close(AC);
81 return (0);
82 }
83 return (1);
ab6afea0
RC
84}
85
33b949e5 86static
ab6afea0
RC
87alarmtr()
88{
33b949e5 89
3945ab7c
RC
90 alarm(0);
91 longjmp(jmpbuf, 1);
ab6afea0
RC
92}
93
94/*
95 * Insurance, for some reason we don't seem to be
96 * hanging up...
97 */
98v831_disconnect()
99{
3945ab7c
RC
100 struct sgttyb cntrl;
101
102 sleep(2);
ab6afea0 103#ifdef DEBUG
3945ab7c 104 printf("[disconnect: FD=%d]\n", FD);
ab6afea0 105#endif
3945ab7c
RC
106 if (FD > 0) {
107 ioctl(FD, TIOCCDTR, 0);
108 ioctl(FD, TIOCGETP, &cntrl);
109 cntrl.sg_ispeed = cntrl.sg_ospeed = 0;
110 ioctl(FD, TIOCSETP, &cntrl);
111 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL);
112 }
3945ab7c 113 close(FD);
ab6afea0
RC
114}
115
116v831_abort()
117{
33b949e5 118
ab6afea0 119#ifdef DEBUG
3945ab7c 120 printf("[abort: AC=%d]\n", AC);
ab6afea0 121#endif
3945ab7c
RC
122 sleep(2);
123 if (child > 0)
124 kill(child, SIGKILL);
125 if (AC > 0)
126 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL);
127 close(AC);
3945ab7c
RC
128 if (FD > 0)
129 ioctl(FD, TIOCCDTR, 0);
3945ab7c 130 close(FD);
ab6afea0
RC
131}
132#endif
133
3945ab7c
RC
134/*
135 * Sigh, this probably must be changed at each site.
136 */
137struct vaconfig {
138 char *vc_name;
139 char vc_rack;
140 char vc_modem;
141} vaconfig[] = {
142 { "/dev/cua0",'4','0' },
143 { "/dev/cua1",'4','1' },
144 { 0 }
145};
146
147#define pc(x) (c = x, write(AC,&c,1))
148#define ABORT 01
149#define SI 017
150#define STX 02
151#define ETX 03
152
33b949e5 153static
3945ab7c
RC
154dialit(phonenum, acu)
155 register char *phonenum;
156 char *acu;
ab6afea0 157{
3945ab7c
RC
158 register struct vaconfig *vp;
159 struct sgttyb cntrl;
160 char c, *sanitize();
161 int i, two = 2;
ab6afea0 162
3945ab7c 163 phonenum = sanitize(phonenum);
ab6afea0 164#ifdef DEBUG
3945ab7c 165 printf ("(dial phonenum=%s)\n", phonenum);
ab6afea0 166#endif
3945ab7c
RC
167 if (*phonenum == '<' && phonenum[1] == 0)
168 return ('Z');
169 for (vp = vaconfig; vp->vc_name; vp++)
170 if (strcmp(vp->vc_name, acu) == 0)
171 break;
172 if (vp->vc_name == 0) {
ab6afea0 173 printf("Unable to locate dialer (%s)\n", acu);
3945ab7c 174 return ('K');
ab6afea0 175 }
3945ab7c
RC
176 ioctl(AC, TIOCGETP, &cntrl);
177 cntrl.sg_ispeed = cntrl.sg_ospeed = B2400;
178 cntrl.sg_flags = RAW | EVENP | ODDP;
179 ioctl(AC, TIOCSETP, &cntrl);
180 ioctl(AC, TIOCFLUSH, &two);
181 pc(STX);
182 pc(vp->vc_rack);
183 pc(vp->vc_modem);
184 while (*phonenum && *phonenum != '<')
185 pc(*phonenum++);
186 pc(SI);
187 pc(ETX);
188 sleep(1);
189 i = read(AC, &c, 1);
ab6afea0 190#ifdef DEBUG
3945ab7c 191 printf("read %d chars, char=%c, errno %d\n", i, c, errno);
ab6afea0 192#endif
3945ab7c
RC
193 if (i != 1)
194 c = 'M';
195 if (c == 'B' || c == 'G') {
196 char cc, oc = c;
ab6afea0 197
3945ab7c
RC
198 pc(ABORT);
199 read(AC, &cc, 1);
ab6afea0 200#ifdef DEBUG
3945ab7c 201 printf("abort response=%c\n", cc);
ab6afea0 202#endif
3945ab7c
RC
203 c = oc;
204 v831_disconnect();
205 }
206 close(AC);
ab6afea0 207#ifdef DEBUG
3945ab7c 208 printf("dialit: returns %c\n", c);
ab6afea0 209#endif
3945ab7c 210 return (c);
ab6afea0 211}
3945ab7c
RC
212
213static char *
214sanitize(s)
215 register char *s;
ab6afea0 216{
3945ab7c
RC
217 static char buf[128];
218 register char *cp;
219
220 for (cp = buf; *s; s++) {
221 if (!isdigit(*s) && *s == '<' && *s != '_')
222 continue;
223 if (*s == '_')
224 *s = '=';
225 *cp++ = *s;
ab6afea0 226 }
3945ab7c
RC
227 *cp++ = 0;
228 return (buf);
ab6afea0 229}