added DEC DF112 and PENRIL dialers
[unix-history] / usr / src / usr.bin / uucp / libacu / vmacs.c
CommitLineData
0819c7c7
RC
1#ifndef lint
2static char sccsid[] = "@(#)vmacs.c 4.1 (Berkeley) %G%";
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
25vmacsopn(ph, flds, dev)
26char *ph, *flds[];
27struct 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(45);
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 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 write(va, ph, strlen(ph)); /* Send Phone Number */
100 write(va, &c_SI, 1); /* send buffer empty */
101 write(va, &c_ETX, 1); /* end of text, initiate call */
102
103 if (read(va, &c, 1) != 1) {
104 logent("ACU READ", _FAILED);
105 goto failret;
106 }
107 switch(c) {
108 case 'A':
109 /* Fine! */
110 DEBUG(5, "Call connected\n", 0);
111 break;
112 case 'B':
113 DEBUG(2, "CALL ABORTED\n", 0);
114 goto failret;
115 case 'D':
116 DEBUG(2, "Dialer format error\n", 0);
117 goto failret;
118 case 'E':
119 DEBUG(2, "Dialer parity error\n", 0);
120 goto failret;
121 case 'F':
122 DEBUG(2, "Phone number too long\n", 0);
123 goto failret;
124 case 'G':
125 DEBUG(2, "Busy signal\n", 0);
126 goto failret;
127 default:
128 DEBUG(2, "Unknown MACS return code '%c'\n", i);
129 goto failret;
130 }
131 /*
132 * open line - will return on carrier
133 */
134 if ((i = open(com, 2)) < 0) {
135 if (errno == EIO)
136 logent("carrier", "LOST");
137 else
138 logent("dialup open", _FAILED);
139 goto failret;
140 }
141 fixline(i, dev->D_speed);
142 goto ret;
143failret:
144 i = CF_DIAL;
145ret:
146 alarm(0);
147 if (child > 1)
148 kill(child, SIGKILL);
149 close(va);
150 return i;
151}
152
153vmacscls(fd)
154register int fd;
155{
156 char c_SOH = SOH;
157
158 DEBUG(2, "MACS close %d\n", fd);
159 write(fd, &c_SOH, 1);
160/* ioctl(fd, TIOCCDTR, NULL);*/
161 close(fd);
162}
163#endif VMACS