xref: /original-bsd/usr.bin/uucp/libacu/va820.c (revision aba77441)
1 #ifndef lint
2 static char sccsid[] = "@(#)va820.c	4.2 (Berkeley) 06/23/85";
3 #endif
4 
5 #include "../condevs.h"
6 #ifdef	VA820
7 
8 /*
9  * Racal-Vadic 'RV820' with 831 adaptor.
10  * BUGS:
11  * dialer baud rate is hardcoded
12  */
13 #define	MAXDIG 30	/* set by switches inside adapter */
14 char	c_abort	= '\001';
15 char	c_start	= '\002';
16 char	c_empty	= '\017';
17 char	c_end	= '\003';
18 
19 va820opn(ph, flds, dev)
20 char *ph, *flds[];
21 struct Devices *dev;
22 {
23 	register int va, i, child;
24 	char c, acu[20], com[20];
25 	char vadbuf[MAXDIG+2];
26 	int nw, lt;
27 	unsigned timelim;
28 	struct sgttyb sg;
29 
30 	child = -1;
31 	if (strlen(ph) > MAXDIG) {
32 		DEBUG(4, "BAD PHONE NUMBER %s\n", ph);
33 		logent("rvadopn", "BAD PHONE NUMBER");
34 		i = CF_DIAL;
35 		goto ret;
36 	}
37 
38 	if (setjmp(Sjbuf)) {
39 		logent("rvadopn", "TIMEOUT");
40 		i = CF_DIAL;
41 		goto ret;
42 	}
43 	DEBUG(4, "ACU %s\n", dev->D_calldev);
44 	DEBUG(4, "LINE %s\n", dev->D_line);
45 	sprintf(acu, "/dev/%s", dev->D_calldev);
46 	getnextfd();
47 	signal(SIGALRM, alarmtr);
48 	alarm(10);
49 	if ((va = open(acu, 2)) < 0) {
50 		DEBUG(4, "ACU OPEN FAIL %d\n", errno);
51 		logent(acu, "CAN'T OPEN");
52 		i = CF_NODEV;
53 		goto ret;
54 	}
55 	alarm(0);
56 	next_fd = -1;
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 #endif VA820
167