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