1 /*-
2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)va820.c 8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11
12 #include "condevs.h"
13
14 /*
15 * Racal-Vadic 'RV820' with 831 adaptor.
16 * BUGS:
17 * dialer baud rate is hardcoded
18 */
19 #define MAXDIG 30 /* set by switches inside adapter */
20 char c_abort = '\001';
21 char c_start = '\002';
22 char c_empty = '\017';
23 char c_end = '\003';
24
va820opn(ph,flds,dev)25 va820opn(ph, flds, dev)
26 char *ph, *flds[];
27 struct Devices *dev;
28 {
29 register int va, i, child;
30 char c, acu[20], com[20];
31 char vadbuf[MAXDIG+2];
32 int nw, lt;
33 unsigned timelim;
34 struct sgttyb sg;
35
36 child = -1;
37 if (strlen(ph) > MAXDIG) {
38 DEBUG(4, "BAD PHONE NUMBER %s\n", ph);
39 logent("rvadopn", "BAD PHONE NUMBER");
40 i = CF_DIAL;
41 goto ret;
42 }
43
44 if (setjmp(Sjbuf)) {
45 logent("rvadopn", "TIMEOUT");
46 i = CF_DIAL;
47 goto ret;
48 }
49 DEBUG(4, "ACU %s\n", dev->D_calldev);
50 DEBUG(4, "LINE %s\n", dev->D_line);
51 sprintf(acu, "/dev/%s", dev->D_calldev);
52 getnextfd();
53 signal(SIGALRM, alarmtr);
54 alarm(10);
55 va = open(acu, 2);
56 alarm(0);
57 next_fd = -1;
58 if (va < 0) {
59 DEBUG(4, "ACU OPEN FAIL %d\n", errno);
60 logent(acu, "CAN'T OPEN");
61 i = CF_NODEV;
62 goto ret;
63 }
64 /*
65 * Set speed and modes on dialer and clear any
66 * previous requests
67 */
68 DEBUG(4, "SETTING UP VA831 (%d)\n", va);
69 ioctl(va, TIOCGETP, &sg);
70 sg.sg_ispeed = sg.sg_ospeed = B1200;
71 sg.sg_flags |= RAW;
72 sg.sg_flags &= ~ECHO;
73 ioctl(va, TIOCSETP, &sg);
74 DEBUG(4, "CLEARING VA831\n", 0);
75 if ( write(va, &c_abort, 1) != 1) {
76 DEBUG(4,"BAD VA831 WRITE %d\n", errno);
77 logent(acu, "CAN'T CLEAR");
78 i = CF_DIAL;
79 goto ret;
80 }
81 sleep(1); /* XXX */
82 read(va, &c, 1);
83 if (c != 'B') {
84 DEBUG(4,"BAD VA831 RESPONSE %c\n", c);
85 logent(acu, "CAN'T CLEAR");
86 i = CF_DIAL;
87 goto ret;
88 }
89 /*
90 * Build the dialing sequence for the adapter
91 */
92 DEBUG(4, "DIALING %s\n", ph);
93 sprintf(vadbuf, "%c%s<%c%c", c_start, ph, c_empty, c_end);
94 timelim = 5 * strlen(ph);
95 alarm(timelim < 30 ? 30 : timelim);
96 nw = write(va, vadbuf, strlen(vadbuf)); /* Send Phone Number */
97 if (nw != strlen(vadbuf)) {
98 DEBUG(4,"BAD VA831 WRITE %d\n", nw);
99 logent(acu, "BAD WRITE");
100 goto failret;
101 }
102
103 sprintf(com, "/dev/%s", dev->D_line);
104
105 /* create child to open comm line */
106 if ((child = fork()) == 0) {
107 signal(SIGINT, SIG_DFL);
108 open(com, 0);
109 sleep(5);
110 _exit(1);
111 }
112
113 DEBUG(4, "WAITING FOR ANSWER\n", 0);
114 if (read(va, &c, 1) != 1) {
115 logent("ACU READ", _FAILED);
116 goto failret;
117 }
118 switch(c) {
119 case 'A':
120 /* Fine! */
121 break;
122 case 'B':
123 DEBUG(2, "Line Busy / No Answer\n", 0);
124 goto failret;
125 case 'D':
126 DEBUG(2, "Dialer format error\n", 0);
127 goto failret;
128 case 'E':
129 DEBUG(2, "Dialer parity error\n", 0);
130 goto failret;
131 case 'F':
132 DEBUG(2, "Phone number too long\n", 0);
133 goto failret;
134 case 'G':
135 DEBUG(2, "Modem Busy\n", 0);
136 goto failret;
137 default:
138 DEBUG(2, "Unknown MACS return code '%c'\n", c&0177);
139 goto failret;
140 }
141 /*
142 * open line - will return on carrier
143 */
144 if ((i = open(com, 2)) < 0) {
145 if (errno == EIO)
146 logent("carrier", "LOST");
147 else
148 logent("dialup open", _FAILED);
149 goto failret;
150 }
151 DEBUG(2, "RVADIC opened %d\n", i);
152 fixline(i, dev->D_speed);
153 goto ret;
154 failret:
155 i = CF_DIAL;
156 ret:
157 alarm(0);
158 if (child != -1)
159 kill(child, SIGKILL);
160 close(va);
161 while ((nw = wait(<)) != child && nw != -1)
162 ;
163 return i;
164 }
165
va820cls(fd)166 va820cls(fd)
167 register int fd;
168 {
169
170 DEBUG(2, "RVADIC close %d\n", fd);
171 close(fd);
172 }
173