xref: /csrg-svn/usr.bin/uucp/libacu/va811.c (revision 62384)
148651Sbostic /*-
2*62384Sbostic  * Copyright (c) 1985, 1993
3*62384Sbostic  *	The Regents of the University of California.  All rights reserved.
448651Sbostic  *
548651Sbostic  * %sccs.include.proprietary.c%
648651Sbostic  */
748651Sbostic 
817783Sralph #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)va811.c	8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1117783Sralph 
1246875Sbostic #include "condevs.h"
1317783Sralph 
1417783Sralph /*
1517783Sralph  * Racal-Vadic VA811 dialer with 831 adaptor.
1617783Sralph  * A typical 300 baud L-devices entry is
1717783Sralph  *	ACU /dev/tty10 unused 300 va811s
1817783Sralph  * where tty10 is the communication line (D_Line),
1917783Sralph  * and 300 is the line speed.
2017783Sralph  * This is almost identical to RVMACS except that we don't need to
2117783Sralph  * send addresses and modem types, and don't need the fork.
2217783Sralph  *	Joe Kelsey, fluke!joe, vax4.1526, Apr 11 1984.
2317783Sralph  */
2417783Sralph 
2517783Sralph #define	STX	02	/* Access Adaptor */
2617783Sralph #define	ETX	03	/* Transfer to Dialer */
2717783Sralph #define	SI	017	/* Buffer Empty (end of phone number) */
2817783Sralph #define	SOH	01	/* Abort */
2917783Sralph 
va811opn(ph,flds,dev)3017783Sralph va811opn(ph, flds, dev)
3117783Sralph char *ph, *flds[];
3217783Sralph struct Devices *dev;
3317783Sralph {
3417783Sralph 	int va;
3517783Sralph 	register int i, tries;
3617783Sralph 	char c, dcname[20];
3717783Sralph 	char vabuf[35];		/* STX, 31 phone digits, SI, ETX, NUL */
3817783Sralph 
3917783Sralph 	va = 0;
4017783Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
4117783Sralph 	if (setjmp(Sjbuf)) {
4217783Sralph 		DEBUG(1, "timeout va811 open\n", 0);
4317783Sralph 		logent("va811opn", "TIMEOUT");
4417783Sralph 		if (va >= 0)
4517783Sralph 			close(va);
4617783Sralph 		delock(dev->D_line);
4717783Sralph 		return CF_NODEV;
4817783Sralph 	}
4917783Sralph 	DEBUG(4, "va811: STARTING CALL\n", 0);
5017783Sralph 	getnextfd();
5117783Sralph 	signal(SIGALRM, alarmtr);
5217783Sralph 	alarm(10);
5317783Sralph 	va = open(dcname, 2);
5417783Sralph 	alarm(0);
5517783Sralph 
5617783Sralph 	/* line is open */
5717783Sralph 	next_fd = -1;
5817783Sralph 	if (va < 0) {
5917783Sralph 		DEBUG(4, errno == 4 ? "%s: no carrier\n" : "%s: can't open\n",
6017783Sralph 			dcname);
6117783Sralph 		delock(dev->D_line);
6217783Sralph 		logent(dcname, "CAN'T OPEN");
6317783Sralph 		return(errno == 4 ? CF_DIAL : CF_NODEV);
6417783Sralph 	}
6517783Sralph 	fixline(va, dev->D_speed);
6617783Sralph 
6717783Sralph 	/* first, reset everything */
6817783Sralph 	sendthem("\\01\\c", va);
6917783Sralph 	DEBUG(4, "wanted %c ", 'B');
7017783Sralph 	i = expect("B", va);
7117783Sralph 	DEBUG(4, "got %s\n", i ? "?" : "that");
7217783Sralph 	if (i != 0) {
7317783Sralph 	    DEBUG(4, "va811: NO RESPONSE\n", 0);
7417783Sralph 	    logent("va811 reset", "TIMEOUT");
7517783Sralph 	    close(va);
7617783Sralph 	    delock(dev->D_line);
7717783Sralph 	    return CF_DIAL;
7817783Sralph 	}
7917783Sralph 
8017783Sralph 	sprintf(vabuf, "%c%.31s%c%c\\c", STX, ph, SI, SOH);
8117783Sralph 	sendthem(vabuf, va);
8217783Sralph 	DEBUG(4, "wanted %c ", 'B');
8317783Sralph 	i = expect("B", va);
8417783Sralph 	DEBUG(4, "got %s\n", i ? "?" : "that");
8517783Sralph 
8617783Sralph 	if (i != 0) {
8717783Sralph 	    DEBUG(4, "va811: STORE NUMBER\n", 0);
8817783Sralph 	    logent("va811 STORE", _FAILED);
8917783Sralph 	    close(va);
9017783Sralph 	    delock(dev->D_line);
9117783Sralph 	    return CF_DIAL;
9217783Sralph 	}
9317783Sralph 
9417783Sralph 	for (tries = 0; tries < TRYCALLS; tries++) {
9517783Sralph 	    sprintf(vabuf, "%c%c\\c", STX, ETX);
9617783Sralph 	    sendthem(vabuf, va);
9717783Sralph 	    DEBUG(4, "DIALING...", CNULL);
9817783Sralph 	    i = expect("A", va);
9917783Sralph 	    DEBUG(4, " %s\n", i ? _FAILED : "SUCCEEDED");
10017783Sralph 	    if (i != 0) {
10117783Sralph 		DEBUG(4, "va811: RESETTING\n", CNULL);
10217783Sralph 		logent("va811 DIAL", _FAILED);
10317783Sralph 	        sendthem("\\01\\c", va);
10417783Sralph 	        expect("B", va);
10517783Sralph 	    }
10617783Sralph 	    else
10717783Sralph 	        break;
10817783Sralph 	}
10917783Sralph 
11017783Sralph 	if (tries >= TRYCALLS) {
11117783Sralph 	    close(va);
11217783Sralph 	    delock(dev->D_line);
11317783Sralph 	    return CF_DIAL;
11417783Sralph 	}
11517783Sralph 
11617783Sralph 	DEBUG(4, "va811 ok\n", CNULL);
11717783Sralph 	return va;
11817783Sralph }
11917783Sralph 
va811cls(fd)12017783Sralph va811cls(fd)
12117783Sralph register int fd;
12217783Sralph {
12317783Sralph 	DEBUG(2, "va811 close %d\n", fd);
12417783Sralph 	p_chwrite(fd, SOH);
12517783Sralph /*	ioctl(fd, TIOCCDTR, NULL);*/
12617783Sralph 	close(fd);
12717783Sralph 	delock(devSel);
12817783Sralph }
129