BSD 4_3 release
[unix-history] / usr / src / usr.bin / uucp / aculib / vmacs.c
CommitLineData
0819c7c7 1#ifndef lint
95f51977 2static char sccsid[] = "@(#)vmacs.c 4.3 (Berkeley) 10/10/85";
0819c7c7
RC
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);
e4fd84a1 78 alarm(60);
0819c7c7
RC
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);
7f63b897 85 next_fd = -1;
0819c7c7
RC
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 */
e4fd84a1
JB
100 for (p=ph; *p; p++) {
101 if (*p == '=' || (*p >= '0' && *p <= '9'))
102 write(va, p, 1);
103 }
0819c7c7
RC
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':
e4fd84a1 117 DEBUG(2, "Dialer Timeout or Abort\n", 0);
0819c7c7
RC
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;
147failret:
148 i = CF_DIAL;
149ret:
150 alarm(0);
151 if (child > 1)
152 kill(child, SIGKILL);
153 close(va);
e4fd84a1 154 sleep(2);
0819c7c7
RC
155 return i;
156}
157
158vmacscls(fd)
159register 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