BSD 4_3 release
[unix-history] / usr / src / usr.bin / uucp / aculib / vmacs.c
#ifndef lint
static char sccsid[] = "@(#)vmacs.c 4.3 (Berkeley) 10/10/85";
#endif
#include "../condevs.h"
#ifdef VMACS
/*
* Racal-Vadic 'RV811' MACS system with 831 adaptor.
*
* A typical 300 baud L-devices entry is
* ACU /dev/tty10 /dev/tty11,48,1200 300 vmacs
* where tty10 is the communication line (D_Line),
* tty11 is the dialer line (D_calldev),
* the '4' is the dialer address + modem type (viz. dialer 0, Bell 103),
* and the '8' is the communication port
* (Note: Based on RVMACS version for 820 dialer. This version
* developed by Doug Kingston @ BRL, 13 December 83.)
*/
#define SOH 01 /* Abort */
#define STX 02 /* Access Adaptor */
#define ETX 03 /* Transfer to Dialer */
#define SI 017 /* Buffer Empty (end of phone number) */
vmacsopn(ph, flds, dev)
char *ph, *flds[];
struct Devices *dev;
{
register int va, i, child;
register char *p;
char c, acu[20], com[20];
char modem, dialer;
int dialspeed;
char c_STX = STX;
char c_ETX = ETX;
char c_SI = SI;
char c_SOH = SOH;
/* create child to open comm line */
child = -1;
sprintf(com, "/dev/%s", dev->D_line);
if ((child = fork()) == 0) {
signal(SIGINT, SIG_DFL);
open(com, 0);
DEBUG(5, "%s Opened.", com);
sleep(5);
exit(1);
}
if ((p = index(dev->D_calldev, ',')) == NULL) {
DEBUG(2, "No dialer/modem specification\n", 0);
goto failret;
}
*p++ = '\0';
if (*p < '0' || *p > '7') {
logent(p, "Bad dialer address/modem type");
goto failret;
}
dialer = *p++;
if (*p < '0' || *p > '>') {
logent(p, "Bad modem address");
goto failret;
}
modem = *p++;
if (*p++ == ',')
dialspeed = atoi (p);
else
dialspeed = dev->D_speed;
if (setjmp(Sjbuf)) {
logent("vmacsopn", "TIMEOUT");
i = CF_DIAL;
goto ret;
}
DEBUG(4, "STARTING CALL\n", 0);
sprintf(acu, "/dev/%s", dev->D_calldev);
getnextfd();
signal(SIGALRM, alarmtr);
alarm(60);
if ((va = open(acu, 2)) < 0) {
logent(acu, "CAN'T OPEN");
i = CF_NODEV;
goto ret;
}
DEBUG(5, "ACU %s opened.\n", acu);
next_fd = -1;
fixline(va, dialspeed);
write(va, &c_SOH, 1); /* abort, reset the dialer */
do {
if (read (va, &c, 1) != 1) {
logent ("MACS initialization", _FAILED);
goto failret;
}
} while ((c&0177) != 'B');
DEBUG(5, "ACU initialized\n", 0);
write(va, &c_STX, 1); /* start text, access adaptor */
write(va, &dialer, 1); /* send dialer address digit */
write(va, &modem, 1); /* send modem address digit */
for (p=ph; *p; p++) {
if (*p == '=' || (*p >= '0' && *p <= '9'))
write(va, p, 1);
}
write(va, &c_SI, 1); /* send buffer empty */
write(va, &c_ETX, 1); /* end of text, initiate call */
if (read(va, &c, 1) != 1) {
logent("ACU READ", _FAILED);
goto failret;
}
switch(c) {
case 'A':
/* Fine! */
DEBUG(5, "Call connected\n", 0);
break;
case 'B':
DEBUG(2, "Dialer Timeout or Abort\n", 0);
goto failret;
case 'D':
DEBUG(2, "Dialer format error\n", 0);
goto failret;
case 'E':
DEBUG(2, "Dialer parity error\n", 0);
goto failret;
case 'F':
DEBUG(2, "Phone number too long\n", 0);
goto failret;
case 'G':
DEBUG(2, "Busy signal\n", 0);
goto failret;
default:
DEBUG(2, "Unknown MACS return code '%c'\n", i);
goto failret;
}
/*
* open line - will return on carrier
*/
if ((i = open(com, 2)) < 0) {
if (errno == EIO)
logent("carrier", "LOST");
else
logent("dialup open", _FAILED);
goto failret;
}
fixline(i, dev->D_speed);
goto ret;
failret:
i = CF_DIAL;
ret:
alarm(0);
if (child > 1)
kill(child, SIGKILL);
close(va);
sleep(2);
return i;
}
vmacscls(fd)
register int fd;
{
char c_SOH = SOH;
DEBUG(2, "MACS close %d\n", fd);
write(fd, &c_SOH, 1);
/* ioctl(fd, TIOCCDTR, NULL);*/
close(fd);
}
#endif VMACS