xref: /original-bsd/usr.bin/uucp/libacu/vmacs.c (revision c374ae69)
1 #ifndef lint
2 static char sccsid[] = "@(#)vmacs.c	4.1 (Berkeley) 01/22/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(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;
143 failret:
144 	i = CF_DIAL;
145 ret:
146 	alarm(0);
147 	if (child > 1)
148 		kill(child, SIGKILL);
149 	close(va);
150 	return i;
151 }
152 
153 vmacscls(fd)
154 register 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
164