Commit | Line | Data |
---|---|---|
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 | ||
14 | static char *sccsid = "@(#)v831.c 4.1 %G%"; | |
15 | ||
16 | struct mx_leaves { | |
17 | char *name; | |
18 | char rack,modem; | |
19 | } pdevs[] = {{"/dev/cua0",'4','0'}, {"/dev/cua1",'4','1'}, {0}}; | |
20 | ||
21 | struct 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 | ||
30 | int v831_abort(); | |
31 | ||
32 | int alarmtr(); | |
33 | ||
34 | static jmp_buf jmpbuf; | |
35 | static int child = -1; | |
36 | ||
37 | v831_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(<)) != 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 | ||
108 | alarmtr() | |
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 | */ | |
118 | v831_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 | ||
139 | v831_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 | ||
158 | static struct sgttyb cntrl; | |
159 | dialit(string, acu) | |
160 | register char *string; | |
161 | char *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 | } | |
231 | char * | |
232 | sanitize(string) | |
233 | register 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 | } |