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