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