|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)va820.c 4.4 (Berkeley) 2/24/88";
3: #endif
4:
5: #include "../condevs.h"
6:
7: /*
8: * Racal-Vadic 'RV820' with 831 adaptor.
9: * BUGS:
10: * dialer baud rate is hardcoded
11: */
12: #define MAXDIG 30 /* set by switches inside adapter */
13: char c_abort = '\001';
14: char c_start = '\002';
15: char c_empty = '\017';
16: char c_end = '\003';
17:
18: va820opn(ph, flds, dev)
19: char *ph, *flds[];
20: struct Devices *dev;
21: {
22: register int va, i, child;
23: char c, acu[20], com[20];
24: char vadbuf[MAXDIG+2];
25: int nw, lt;
26: unsigned timelim;
27: struct sgttyb sg;
28:
29: child = -1;
30: if (strlen(ph) > MAXDIG) {
31: DEBUG(4, "BAD PHONE NUMBER %s\n", ph);
32: logent("rvadopn", "BAD PHONE NUMBER");
33: i = CF_DIAL;
34: goto ret;
35: }
36:
37: if (setjmp(Sjbuf)) {
38: logent("rvadopn", "TIMEOUT");
39: i = CF_DIAL;
40: goto ret;
41: }
42: DEBUG(4, "ACU %s\n", dev->D_calldev);
43: DEBUG(4, "LINE %s\n", dev->D_line);
44: sprintf(acu, "/dev/%s", dev->D_calldev);
45: getnextfd();
46: signal(SIGALRM, alarmtr);
47: alarm(10);
48: va = open(acu, 2);
49: alarm(0);
50: next_fd = -1;
51: if (va < 0) {
52: DEBUG(4, "ACU OPEN FAIL %d\n", errno);
53: logent(acu, "CAN'T OPEN");
54: i = CF_NODEV;
55: goto ret;
56: }
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: */
85: DEBUG(4, "DIALING %s\n", ph);
86: sprintf(vadbuf, "%c%s<%c%c", c_start, ph, c_empty, c_end);
87: timelim = 5 * strlen(ph);
88: alarm(timelim < 30 ? 30 : timelim);
89: nw = write(va, vadbuf, strlen(vadbuf)); /* Send Phone Number */
90: if (nw != strlen(vadbuf)) {
91: DEBUG(4,"BAD VA831 WRITE %d\n", nw);
92: logent(acu, "BAD WRITE");
93: goto failret;
94: }
95:
96: sprintf(com, "/dev/%s", dev->D_line);
97:
98: /* create child to open comm line */
99: if ((child = fork()) == 0) {
100: signal(SIGINT, SIG_DFL);
101: open(com, 0);
102: sleep(5);
103: _exit(1);
104: }
105:
106: DEBUG(4, "WAITING FOR ANSWER\n", 0);
107: if (read(va, &c, 1) != 1) {
108: logent("ACU READ", _FAILED);
109: goto failret;
110: }
111: switch(c) {
112: case 'A':
113: /* Fine! */
114: break;
115: case 'B':
116: DEBUG(2, "Line Busy / No Answer\n", 0);
117: goto failret;
118: case 'D':
119: DEBUG(2, "Dialer format error\n", 0);
120: goto failret;
121: case 'E':
122: DEBUG(2, "Dialer parity error\n", 0);
123: goto failret;
124: case 'F':
125: DEBUG(2, "Phone number too long\n", 0);
126: goto failret;
127: case 'G':
128: DEBUG(2, "Modem Busy\n", 0);
129: goto failret;
130: default:
131: DEBUG(2, "Unknown MACS return code '%c'\n", c&0177);
132: goto failret;
133: }
134: /*
135: * open line - will return on carrier
136: */
137: if ((i = open(com, 2)) < 0) {
138: if (errno == EIO)
139: logent("carrier", "LOST");
140: else
141: logent("dialup open", _FAILED);
142: goto failret;
143: }
144: DEBUG(2, "RVADIC opened %d\n", i);
145: fixline(i, dev->D_speed);
146: goto ret;
147: failret:
148: i = CF_DIAL;
149: ret:
150: alarm(0);
151: if (child != -1)
152: kill(child, SIGKILL);
153: close(va);
154: while ((nw = wait(<)) != child && nw != -1)
155: ;
156: return i;
157: }
158:
159: va820cls(fd)
160: register int fd;
161: {
162:
163: DEBUG(2, "RVADIC close %d\n", fd);
164: close(fd);
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.