xref: /original-bsd/usr.bin/uucp/libacu/va811.c (revision 648cab2a)
1 #ifndef lint
2 static char sccsid[] = "@(#)va811.c	4.2 (Berkeley) 02/24/88";
3 #endif
4 
5 #include "../condevs.h"
6 
7 /*
8  * Racal-Vadic VA811 dialer with 831 adaptor.
9  * A typical 300 baud L-devices entry is
10  *	ACU /dev/tty10 unused 300 va811s
11  * where tty10 is the communication line (D_Line),
12  * and 300 is the line speed.
13  * This is almost identical to RVMACS except that we don't need to
14  * send addresses and modem types, and don't need the fork.
15  *	Joe Kelsey, fluke!joe, vax4.1526, Apr 11 1984.
16  */
17 
18 #define	STX	02	/* Access Adaptor */
19 #define	ETX	03	/* Transfer to Dialer */
20 #define	SI	017	/* Buffer Empty (end of phone number) */
21 #define	SOH	01	/* Abort */
22 
23 va811opn(ph, flds, dev)
24 char *ph, *flds[];
25 struct Devices *dev;
26 {
27 	int va;
28 	register int i, tries;
29 	char c, dcname[20];
30 	char vabuf[35];		/* STX, 31 phone digits, SI, ETX, NUL */
31 
32 	va = 0;
33 	sprintf(dcname, "/dev/%s", dev->D_line);
34 	if (setjmp(Sjbuf)) {
35 		DEBUG(1, "timeout va811 open\n", 0);
36 		logent("va811opn", "TIMEOUT");
37 		if (va >= 0)
38 			close(va);
39 		delock(dev->D_line);
40 		return CF_NODEV;
41 	}
42 	DEBUG(4, "va811: STARTING CALL\n", 0);
43 	getnextfd();
44 	signal(SIGALRM, alarmtr);
45 	alarm(10);
46 	va = open(dcname, 2);
47 	alarm(0);
48 
49 	/* line is open */
50 	next_fd = -1;
51 	if (va < 0) {
52 		DEBUG(4, errno == 4 ? "%s: no carrier\n" : "%s: can't open\n",
53 			dcname);
54 		delock(dev->D_line);
55 		logent(dcname, "CAN'T OPEN");
56 		return(errno == 4 ? CF_DIAL : CF_NODEV);
57 	}
58 	fixline(va, dev->D_speed);
59 
60 	/* first, reset everything */
61 	sendthem("\\01\\c", va);
62 	DEBUG(4, "wanted %c ", 'B');
63 	i = expect("B", va);
64 	DEBUG(4, "got %s\n", i ? "?" : "that");
65 	if (i != 0) {
66 	    DEBUG(4, "va811: NO RESPONSE\n", 0);
67 	    logent("va811 reset", "TIMEOUT");
68 	    close(va);
69 	    delock(dev->D_line);
70 	    return CF_DIAL;
71 	}
72 
73 	sprintf(vabuf, "%c%.31s%c%c\\c", STX, ph, SI, SOH);
74 	sendthem(vabuf, va);
75 	DEBUG(4, "wanted %c ", 'B');
76 	i = expect("B", va);
77 	DEBUG(4, "got %s\n", i ? "?" : "that");
78 
79 	if (i != 0) {
80 	    DEBUG(4, "va811: STORE NUMBER\n", 0);
81 	    logent("va811 STORE", _FAILED);
82 	    close(va);
83 	    delock(dev->D_line);
84 	    return CF_DIAL;
85 	}
86 
87 	for (tries = 0; tries < TRYCALLS; tries++) {
88 	    sprintf(vabuf, "%c%c\\c", STX, ETX);
89 	    sendthem(vabuf, va);
90 	    DEBUG(4, "DIALING...", CNULL);
91 	    i = expect("A", va);
92 	    DEBUG(4, " %s\n", i ? _FAILED : "SUCCEEDED");
93 	    if (i != 0) {
94 		DEBUG(4, "va811: RESETTING\n", CNULL);
95 		logent("va811 DIAL", _FAILED);
96 	        sendthem("\\01\\c", va);
97 	        expect("B", va);
98 	    }
99 	    else
100 	        break;
101 	}
102 
103 	if (tries >= TRYCALLS) {
104 	    close(va);
105 	    delock(dev->D_line);
106 	    return CF_DIAL;
107 	}
108 
109 	DEBUG(4, "va811 ok\n", CNULL);
110 	return va;
111 }
112 
113 va811cls(fd)
114 register int fd;
115 {
116 	DEBUG(2, "va811 close %d\n", fd);
117 	p_chwrite(fd, SOH);
118 /*	ioctl(fd, TIOCCDTR, NULL);*/
119 	close(fd);
120 	delock(devSel);
121 }
122