|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)vmacs.c 4.3 (Berkeley) 10/10/85";
3: #endif
4:
5: #include "../condevs.h"
6: #ifdef VMACS
7: /*
8: * Racal-Vadic 'RV811' MACS system with 831 adaptor.
9: *
10: * A typical 300 baud L-devices entry is
11: * ACU /dev/tty10 /dev/tty11,48,1200 300 vmacs
12: * where tty10 is the communication line (D_Line),
13: * tty11 is the dialer line (D_calldev),
14: * the '4' is the dialer address + modem type (viz. dialer 0, Bell 103),
15: * and the '8' is the communication port
16: * (Note: Based on RVMACS version for 820 dialer. This version
17: * developed by Doug Kingston @ BRL, 13 December 83.)
18: */
19:
20: #define SOH 01 /* Abort */
21: #define STX 02 /* Access Adaptor */
22: #define ETX 03 /* Transfer to Dialer */
23: #define SI 017 /* Buffer Empty (end of phone number) */
24:
25: vmacsopn(ph, flds, dev)
26: char *ph, *flds[];
27: struct Devices *dev;
28: {
29: register int va, i, child;
30: register char *p;
31: char c, acu[20], com[20];
32: char modem, dialer;
33: int dialspeed;
34: char c_STX = STX;
35: char c_ETX = ETX;
36: char c_SI = SI;
37: char c_SOH = SOH;
38:
39: /* create child to open comm line */
40: child = -1;
41: sprintf(com, "/dev/%s", dev->D_line);
42: if ((child = fork()) == 0) {
43: signal(SIGINT, SIG_DFL);
44: open(com, 0);
45: DEBUG(5, "%s Opened.", com);
46: sleep(5);
47: exit(1);
48: }
49:
50: if ((p = index(dev->D_calldev, ',')) == NULL) {
51: DEBUG(2, "No dialer/modem specification\n", 0);
52: goto failret;
53: }
54: *p++ = '\0';
55: if (*p < '0' || *p > '7') {
56: logent(p, "Bad dialer address/modem type");
57: goto failret;
58: }
59: dialer = *p++;
60: if (*p < '0' || *p > '>') {
61: logent(p, "Bad modem address");
62: goto failret;
63: }
64: modem = *p++;
65: if (*p++ == ',')
66: dialspeed = atoi (p);
67: else
68: dialspeed = dev->D_speed;
69: if (setjmp(Sjbuf)) {
70: logent("vmacsopn", "TIMEOUT");
71: i = CF_DIAL;
72: goto ret;
73: }
74: DEBUG(4, "STARTING CALL\n", 0);
75: sprintf(acu, "/dev/%s", dev->D_calldev);
76: getnextfd();
77: signal(SIGALRM, alarmtr);
78: alarm(60);
79: if ((va = open(acu, 2)) < 0) {
80: logent(acu, "CAN'T OPEN");
81: i = CF_NODEV;
82: goto ret;
83: }
84: DEBUG(5, "ACU %s opened.\n", acu);
85: next_fd = -1;
86: fixline(va, dialspeed);
87:
88: write(va, &c_SOH, 1); /* abort, reset the dialer */
89: do {
90: if (read (va, &c, 1) != 1) {
91: logent ("MACS initialization", _FAILED);
92: goto failret;
93: }
94: } while ((c&0177) != 'B');
95: DEBUG(5, "ACU initialized\n", 0);
96:
97: write(va, &c_STX, 1); /* start text, access adaptor */
98: write(va, &dialer, 1); /* send dialer address digit */
99: write(va, &modem, 1); /* send modem address digit */
100: for (p=ph; *p; p++) {
101: if (*p == '=' || (*p >= '0' && *p <= '9'))
102: write(va, p, 1);
103: }
104: write(va, &c_SI, 1); /* send buffer empty */
105: write(va, &c_ETX, 1); /* end of text, initiate call */
106:
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: DEBUG(5, "Call connected\n", 0);
115: break;
116: case 'B':
117: DEBUG(2, "Dialer Timeout or Abort\n", 0);
118: goto failret;
119: case 'D':
120: DEBUG(2, "Dialer format error\n", 0);
121: goto failret;
122: case 'E':
123: DEBUG(2, "Dialer parity error\n", 0);
124: goto failret;
125: case 'F':
126: DEBUG(2, "Phone number too long\n", 0);
127: goto failret;
128: case 'G':
129: DEBUG(2, "Busy signal\n", 0);
130: goto failret;
131: default:
132: DEBUG(2, "Unknown MACS return code '%c'\n", i);
133: goto failret;
134: }
135: /*
136: * open line - will return on carrier
137: */
138: if ((i = open(com, 2)) < 0) {
139: if (errno == EIO)
140: logent("carrier", "LOST");
141: else
142: logent("dialup open", _FAILED);
143: goto failret;
144: }
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: sleep(2);
155: return i;
156: }
157:
158: vmacscls(fd)
159: register int fd;
160: {
161: char c_SOH = SOH;
162:
163: DEBUG(2, "MACS close %d\n", fd);
164: write(fd, &c_SOH, 1);
165: /* ioctl(fd, TIOCCDTR, NULL);*/
166: close(fd);
167: }
168: #endif VMACS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.