xref: /original-bsd/usr.bin/uucp/libacu/va820.c (revision c3e32dec)
1 /*-
2  * Copyright (c) 1985, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.proprietary.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)va820.c	8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11 
12 #include "condevs.h"
13 
14 /*
15  * Racal-Vadic 'RV820' with 831 adaptor.
16  * BUGS:
17  * dialer baud rate is hardcoded
18  */
19 #define	MAXDIG 30	/* set by switches inside adapter */
20 char	c_abort	= '\001';
21 char	c_start	= '\002';
22 char	c_empty	= '\017';
23 char	c_end	= '\003';
24 
25 va820opn(ph, flds, dev)
26 char *ph, *flds[];
27 struct Devices *dev;
28 {
29 	register int va, i, child;
30 	char c, acu[20], com[20];
31 	char vadbuf[MAXDIG+2];
32 	int nw, lt;
33 	unsigned timelim;
34 	struct sgttyb sg;
35 
36 	child = -1;
37 	if (strlen(ph) > MAXDIG) {
38 		DEBUG(4, "BAD PHONE NUMBER %s\n", ph);
39 		logent("rvadopn", "BAD PHONE NUMBER");
40 		i = CF_DIAL;
41 		goto ret;
42 	}
43 
44 	if (setjmp(Sjbuf)) {
45 		logent("rvadopn", "TIMEOUT");
46 		i = CF_DIAL;
47 		goto ret;
48 	}
49 	DEBUG(4, "ACU %s\n", dev->D_calldev);
50 	DEBUG(4, "LINE %s\n", dev->D_line);
51 	sprintf(acu, "/dev/%s", dev->D_calldev);
52 	getnextfd();
53 	signal(SIGALRM, alarmtr);
54 	alarm(10);
55 	va = open(acu, 2);
56 	alarm(0);
57 	next_fd = -1;
58 	if (va < 0) {
59 		DEBUG(4, "ACU OPEN FAIL %d\n", errno);
60 		logent(acu, "CAN'T OPEN");
61 		i = CF_NODEV;
62 		goto ret;
63 	}
64 	/*
65 	 * Set speed and modes on dialer and clear any
66 	 * previous requests
67 	 */
68 	DEBUG(4, "SETTING UP VA831 (%d)\n", va);
69 	ioctl(va, TIOCGETP, &sg);
70 	sg.sg_ispeed = sg.sg_ospeed = B1200;
71 	sg.sg_flags |= RAW;
72 	sg.sg_flags &= ~ECHO;
73 	ioctl(va, TIOCSETP, &sg);
74 	DEBUG(4, "CLEARING VA831\n", 0);
75 	if ( write(va, &c_abort, 1) != 1) {
76 		DEBUG(4,"BAD VA831 WRITE %d\n", errno);
77 		logent(acu, "CAN'T CLEAR");
78 		i = CF_DIAL;
79 		goto ret;
80 	}
81 	sleep(1);			/* XXX */
82 	read(va, &c, 1);
83 	if (c != 'B') {
84 		DEBUG(4,"BAD VA831 RESPONSE %c\n", c);
85 		logent(acu, "CAN'T CLEAR");
86 		i = CF_DIAL;
87 		goto ret;
88 	}
89 	/*
90 	 * Build the dialing sequence for the adapter
91 	 */
92 	DEBUG(4, "DIALING %s\n", ph);
93 	sprintf(vadbuf, "%c%s<%c%c", c_start, ph, c_empty, c_end);
94 	timelim = 5 * strlen(ph);
95 	alarm(timelim < 30 ? 30 : timelim);
96 	nw = write(va, vadbuf, strlen(vadbuf));	/* Send Phone Number */
97 	if (nw != strlen(vadbuf)) {
98 		DEBUG(4,"BAD VA831 WRITE %d\n", nw);
99 		logent(acu, "BAD WRITE");
100 		goto failret;
101 	}
102 
103 	sprintf(com, "/dev/%s", dev->D_line);
104 
105 	/* create child to open comm line */
106 	if ((child = fork()) == 0) {
107 		signal(SIGINT, SIG_DFL);
108 		open(com, 0);
109 		sleep(5);
110 		_exit(1);
111 	}
112 
113 	DEBUG(4, "WAITING FOR ANSWER\n", 0);
114 	if (read(va, &c, 1) != 1) {
115 		logent("ACU READ", _FAILED);
116 		goto failret;
117 	}
118 	switch(c) {
119 	case 'A':
120 		/* Fine! */
121 		break;
122 	case 'B':
123 		DEBUG(2, "Line Busy / No Answer\n", 0);
124 		goto failret;
125 	case 'D':
126 		DEBUG(2, "Dialer format error\n", 0);
127 		goto failret;
128 	case 'E':
129 		DEBUG(2, "Dialer parity error\n", 0);
130 		goto failret;
131 	case 'F':
132 		DEBUG(2, "Phone number too long\n", 0);
133 		goto failret;
134 	case 'G':
135 		DEBUG(2, "Modem Busy\n", 0);
136 		goto failret;
137 	default:
138 		DEBUG(2, "Unknown MACS return code '%c'\n", c&0177);
139 		goto failret;
140 	}
141 	/*
142 	 * open line - will return on carrier
143 	 */
144 	if ((i = open(com, 2)) < 0) {
145 		if (errno == EIO)
146 			logent("carrier", "LOST");
147 		else
148 			logent("dialup open", _FAILED);
149 		goto failret;
150 	}
151 	DEBUG(2, "RVADIC opened %d\n", i);
152 	fixline(i, dev->D_speed);
153 	goto ret;
154 failret:
155 	i = CF_DIAL;
156 ret:
157 	alarm(0);
158 	if (child != -1)
159 		kill(child, SIGKILL);
160 	close(va);
161 	while ((nw = wait(&lt)) != child && nw != -1)
162 		;
163 	return i;
164 }
165 
166 va820cls(fd)
167 register int fd;
168 {
169 
170 	DEBUG(2, "RVADIC close %d\n", fd);
171 	close(fd);
172 }
173