Commit | Line | Data |
---|---|---|
de978a6b RC |
1 | #ifndef lint |
2 | static 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 */ | |
14 | char c_abort = '\001'; | |
15 | char c_start = '\002'; | |
16 | char c_empty = '\017'; | |
17 | char c_end = '\003'; | |
18 | ||
19 | va820opn(ph, flds, dev) | |
20 | char *ph, *flds[]; | |
21 | struct 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; | |
149 | failret: | |
150 | i = CF_DIAL; | |
151 | ret: | |
152 | alarm(0); | |
153 | if (child != -1) | |
154 | kill(child, SIGKILL); | |
155 | close(va); | |
156 | while ((nw = wait(<)) != child && nw != -1) | |
157 | ; | |
158 | return i; | |
159 | } | |
160 | ||
161 | va820cls(fd) | |
162 | register int fd; | |
163 | { | |
164 | ||
165 | DEBUG(2, "RVADIC close %d\n", fd); | |
166 | close(fd); | |
167 | } | |
168 | #endif VA820 |