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