fix for multi-homing problem; glob done wrong
[unix-history] / usr / src / usr.bin / tip / aculib / v831.c
CommitLineData
ab6afea0
RC
1/* 831.c 4.1 83/5/10 */
2
3#if V831
4/*
5 * Routines for dialing up on Vadic 831
6 */
7#include "tip.h"
8#include <setjmp.h>
9#include <errno.h>
10#include <sgtty.h>
11#include <sys/file.h>
12#include <time.h>
13
14static char *sccsid = "@(#)v831.c 4.1 %G%";
15
16struct mx_leaves {
17 char *name;
18 char rack,modem;
19} pdevs[] = {{"/dev/cua0",'4','0'}, {"/dev/cua1",'4','1'}, {0}};
20
21struct timeval zerotime = {0L, 0L};
22
23#define unlike(a,b) (strcmp(a,b))
24#define pc(x) (c = x, write(AC,&c,1))
25#define ABORT 01
26#define SI 017
27#define STX 02
28#define ETX 03
29
30int v831_abort();
31
32int alarmtr();
33
34static jmp_buf jmpbuf;
35static int child = -1;
36
37v831_dialer(num, acu)
38 char *num, *acu;
39{
40 extern errno;
41 char *p, *q, phone[40];
42 char char_rv;
43 int lt, nw, connected = 1;
44 register int timelim;
45
46 if (boolean(value(VERBOSE)))
47 printf("\nstarting call...");
48#ifdef DEBUG
49 printf ("(acu=%s)", acu);
50#endif
51 if ((AC = open(acu, FRDWR)) < 0) {
52 if (errno == EBUSY)
53 printf("line busy...");
54 else
55 printf("acu open error...");
56 return (0);
57 }
58 if (setjmp(jmpbuf)) {
59 kill(child, SIGKILL);
60 close(AC);
61 return (0);
62 }
63 signal(SIGALRM, alarmtr);
64 timelim = 5 * strlen(num);
65 alarm(timelim < 30 ? 30 : timelim);
66 if ((child = fork()) == 0) {
67 /*
68 * ignore this stuff for aborts
69 */
70 signal(SIGALRM, SIG_IGN);
71 signal(SIGINT, SIG_IGN);
72 signal(SIGQUIT, SIG_IGN);
73 sleep(2);
74 /*nw = write(AC, num, lt = strlen(num));*/
75 char_rv = dialit (num, acu);
76 exit(char_rv != 'A');
77 }
78 /*
79 * open line - will return on carrier
80 */
81 if ((FD = open(DV, 2)) < 0) {
82#ifdef DEBUG
83 printf("(after open, errno=%d)", errno);
84#endif
85 if (errno == EIO)
86 printf("lost carrier...");
87 else
88 printf("dialup line open failed...");
89 alarm(0);
90 kill(child, SIGKILL);
91 close(AC);
92 return (0);
93 }
94 alarm(0);
95 /*ioctl(AC, TIOCHPCL, 0);*/
96 signal(SIGALRM, SIG_DFL);
97 while ((nw = wait(&lt)) != child && nw != -1)
98 ;
99 fflush(stdout);
100 /*close(AC);*/
101 if (lt != 0) {
102 close(AC);
103 return (0);
104 }
105 return (1);
106}
107
108alarmtr()
109{
110 alarm(0);
111 longjmp(jmpbuf, 1);
112}
113
114/*
115 * Insurance, for some reason we don't seem to be
116 * hanging up...
117 */
118v831_disconnect()
119{
120 struct sgttyb cntrl;
121 sleep(2);
122#ifdef VMUNIX
123#ifdef DEBUG
124 printf ("[disconnect: FD=%d]", FD);
125#endif
126 if (FD > 0)
127 {
128 ioctl (FD, TIOCCDTR, 0);
129 ioctl (FD, TIOCGETP, &cntrl);
130 cntrl.sg_ispeed = 0;
131 cntrl.sg_ospeed = 0;
132 ioctl (FD, TIOCSETP, &cntrl);
133 ioctl (FD, TIOCNXCL, (struct sgttyb *)NULL);
134 }
135#endif
136 close(FD);
137}
138
139v831_abort()
140{
141#ifdef DEBUG
142 printf ("[abort: AC=%d]", AC);
143#endif
144 sleep(2);
145 if (child > 0)
146 kill(child, SIGKILL);
147 if (AC > 0)
148 ioctl (FD, TIOCNXCL, (struct sgttyb *)NULL);
149 close(AC);
150#ifdef VMUNIX
151 if (FD > 0)
152 ioctl(FD, TIOCCDTR, 0);
153#endif
154 close(FD);
155}
156#endif
157
158static struct sgttyb cntrl;
159dialit(string, acu)
160register char *string;
161char *acu;
162{
163 char c, cc, *sanitize();
164 int i;
165 register struct mx_leaves *lp = pdevs;
166 int test;
167 int nfds, fdsmask;
168
169 string = sanitize(string);
170#ifdef DEBUG
171 printf ("(dial string=%s)", string);
172#endif
173 if(*string=='<' && string[1]==0) {
174 return('Z');
175 }
176
177 while(test = unlike(lp->name,acu))
178 if(lp->name==0) {
179 printf("Unable to locate dialer (%s)\n", acu);
180 return('K');
181 } else lp++;
182
183
184 gtty (AC,&cntrl); /* set raw, -echo, 2400 Baud */
185 cntrl.sg_ispeed = cntrl.sg_ospeed = B2400;
186 cntrl.sg_flags = RAW | EVENP | ODDP;
187 stty (AC,&cntrl);
188
189 /* check for characters waiting from dialer (throw them away) */
190
191 fdsmask = 1<<AC;
192#ifdef DEBUG
193 printf ("{select returns=%d}", select (20, &fdsmask, 0, 0, &zerotime));
194#endif
195
196 pc (STX); pc (lp->rack); pc (lp->modem);
197 for (;*string && *string!='<'; string++)
198 {
199#ifdef DEBUG
200 printf ("%c", *string);
201#endif
202 pc(*string);
203 }
204 pc(SI); pc(ETX);
205
206 sleep (1);
207 i = read (AC, &c, 1);
208#ifdef DEBUG
209 printf ("read response of %d chars, char = %c\n", i, c);
210 printf ("and errno is %d\n", errno);
211#endif
212
213 if (i !=1) c = 'M';
214 if (c=='B' || c=='G') {
215 char oc = c;
216 pc(ABORT);
217 read (AC, &cc, 1);
218#ifdef DEBUG
219 printf ("abort response=%c\n", cc);
220#endif
221 c = oc;
222 v831_disconnect ();
223 }
224
225 close(AC);
226#ifdef DEBUG
227 printf ("dialit: returns %c\n", c);
228#endif
229 return(c);
230}
231char *
232sanitize(string)
233register char *string;
234{
235 static char buf[512];
236 register char *cp = buf;
237 for(;*string; string++) {
238 switch(*string) {
239 case '0': case '1': case '2': case '3': case '4':
240 case '5': case '6': case '7': case '8': case '9': case '<':
241 *cp++ = *string;
242 break;
243 case '_':
244 *cp++ = '=';
245 break;
246 }
247 }
248 *cp++ = 0;
249 return(buf);
250}