xref: /csrg-svn/usr.bin/uucp/libacu/va820.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 
817784Sralph #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)va820.c	8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1117784Sralph 
1246875Sbostic #include "condevs.h"
1317784Sralph 
1417784Sralph /*
1517784Sralph  * Racal-Vadic 'RV820' with 831 adaptor.
1617784Sralph  * BUGS:
1717784Sralph  * dialer baud rate is hardcoded
1817784Sralph  */
1917784Sralph #define	MAXDIG 30	/* set by switches inside adapter */
2017784Sralph char	c_abort	= '\001';
2117784Sralph char	c_start	= '\002';
2217784Sralph char	c_empty	= '\017';
2317784Sralph char	c_end	= '\003';
2417784Sralph 
va820opn(ph,flds,dev)2517784Sralph va820opn(ph, flds, dev)
2617784Sralph char *ph, *flds[];
2717784Sralph struct Devices *dev;
2817784Sralph {
2917784Sralph 	register int va, i, child;
3017784Sralph 	char c, acu[20], com[20];
3117784Sralph 	char vadbuf[MAXDIG+2];
3217784Sralph 	int nw, lt;
3317784Sralph 	unsigned timelim;
3417784Sralph 	struct sgttyb sg;
3517784Sralph 
3617784Sralph 	child = -1;
3717784Sralph 	if (strlen(ph) > MAXDIG) {
3817784Sralph 		DEBUG(4, "BAD PHONE NUMBER %s\n", ph);
3917784Sralph 		logent("rvadopn", "BAD PHONE NUMBER");
4017784Sralph 		i = CF_DIAL;
4117784Sralph 		goto ret;
4217784Sralph 	}
4317784Sralph 
4417784Sralph 	if (setjmp(Sjbuf)) {
4517784Sralph 		logent("rvadopn", "TIMEOUT");
4617784Sralph 		i = CF_DIAL;
4717784Sralph 		goto ret;
4817784Sralph 	}
4917784Sralph 	DEBUG(4, "ACU %s\n", dev->D_calldev);
5017784Sralph 	DEBUG(4, "LINE %s\n", dev->D_line);
5117784Sralph 	sprintf(acu, "/dev/%s", dev->D_calldev);
5217784Sralph 	getnextfd();
5317784Sralph 	signal(SIGALRM, alarmtr);
5417784Sralph 	alarm(10);
5525160Sbloom 	va = open(acu, 2);
5625160Sbloom 	alarm(0);
5725160Sbloom 	next_fd = -1;
5825160Sbloom 	if (va < 0) {
5917784Sralph 		DEBUG(4, "ACU OPEN FAIL %d\n", errno);
6017784Sralph 		logent(acu, "CAN'T OPEN");
6117784Sralph 		i = CF_NODEV;
6217784Sralph 		goto ret;
6317784Sralph 	}
6417784Sralph 	/*
6517784Sralph 	 * Set speed and modes on dialer and clear any
6617784Sralph 	 * previous requests
6717784Sralph 	 */
6817784Sralph 	DEBUG(4, "SETTING UP VA831 (%d)\n", va);
6917784Sralph 	ioctl(va, TIOCGETP, &sg);
7017784Sralph 	sg.sg_ispeed = sg.sg_ospeed = B1200;
7117784Sralph 	sg.sg_flags |= RAW;
7217784Sralph 	sg.sg_flags &= ~ECHO;
7317784Sralph 	ioctl(va, TIOCSETP, &sg);
7417784Sralph 	DEBUG(4, "CLEARING VA831\n", 0);
7517784Sralph 	if ( write(va, &c_abort, 1) != 1) {
7617784Sralph 		DEBUG(4,"BAD VA831 WRITE %d\n", errno);
7717784Sralph 		logent(acu, "CAN'T CLEAR");
7817784Sralph 		i = CF_DIAL;
7917784Sralph 		goto ret;
8017784Sralph 	}
8117784Sralph 	sleep(1);			/* XXX */
8217784Sralph 	read(va, &c, 1);
8317784Sralph 	if (c != 'B') {
8417784Sralph 		DEBUG(4,"BAD VA831 RESPONSE %c\n", c);
8517784Sralph 		logent(acu, "CAN'T CLEAR");
8617784Sralph 		i = CF_DIAL;
8717784Sralph 		goto ret;
8817784Sralph 	}
8917784Sralph 	/*
9017784Sralph 	 * Build the dialing sequence for the adapter
9117784Sralph 	 */
9217784Sralph 	DEBUG(4, "DIALING %s\n", ph);
9323704Sbloom 	sprintf(vadbuf, "%c%s<%c%c", c_start, ph, c_empty, c_end);
9417784Sralph 	timelim = 5 * strlen(ph);
9517784Sralph 	alarm(timelim < 30 ? 30 : timelim);
9617784Sralph 	nw = write(va, vadbuf, strlen(vadbuf));	/* Send Phone Number */
9717784Sralph 	if (nw != strlen(vadbuf)) {
9817784Sralph 		DEBUG(4,"BAD VA831 WRITE %d\n", nw);
9917784Sralph 		logent(acu, "BAD WRITE");
10017784Sralph 		goto failret;
10117784Sralph 	}
10217784Sralph 
10317784Sralph 	sprintf(com, "/dev/%s", dev->D_line);
10417784Sralph 
10517784Sralph 	/* create child to open comm line */
10617784Sralph 	if ((child = fork()) == 0) {
10717784Sralph 		signal(SIGINT, SIG_DFL);
10817784Sralph 		open(com, 0);
10917784Sralph 		sleep(5);
11017784Sralph 		_exit(1);
11117784Sralph 	}
11217784Sralph 
11317784Sralph 	DEBUG(4, "WAITING FOR ANSWER\n", 0);
11417784Sralph 	if (read(va, &c, 1) != 1) {
11517784Sralph 		logent("ACU READ", _FAILED);
11617784Sralph 		goto failret;
11717784Sralph 	}
11817784Sralph 	switch(c) {
11917784Sralph 	case 'A':
12017784Sralph 		/* Fine! */
12117784Sralph 		break;
12217784Sralph 	case 'B':
12317784Sralph 		DEBUG(2, "Line Busy / No Answer\n", 0);
12417784Sralph 		goto failret;
12517784Sralph 	case 'D':
12617784Sralph 		DEBUG(2, "Dialer format error\n", 0);
12717784Sralph 		goto failret;
12817784Sralph 	case 'E':
12917784Sralph 		DEBUG(2, "Dialer parity error\n", 0);
13017784Sralph 		goto failret;
13117784Sralph 	case 'F':
13217784Sralph 		DEBUG(2, "Phone number too long\n", 0);
13317784Sralph 		goto failret;
13417784Sralph 	case 'G':
13517784Sralph 		DEBUG(2, "Modem Busy\n", 0);
13617784Sralph 		goto failret;
13717784Sralph 	default:
13817784Sralph 		DEBUG(2, "Unknown MACS return code '%c'\n", c&0177);
13917784Sralph 		goto failret;
14017784Sralph 	}
14117784Sralph 	/*
14217784Sralph 	 * open line - will return on carrier
14317784Sralph 	 */
14417784Sralph 	if ((i = open(com, 2)) < 0) {
14517784Sralph 		if (errno == EIO)
14617784Sralph 			logent("carrier", "LOST");
14717784Sralph 		else
14817784Sralph 			logent("dialup open", _FAILED);
14917784Sralph 		goto failret;
15017784Sralph 	}
15117784Sralph 	DEBUG(2, "RVADIC opened %d\n", i);
15217784Sralph 	fixline(i, dev->D_speed);
15317784Sralph 	goto ret;
15417784Sralph failret:
15517784Sralph 	i = CF_DIAL;
15617784Sralph ret:
15717784Sralph 	alarm(0);
15817784Sralph 	if (child != -1)
15917784Sralph 		kill(child, SIGKILL);
16017784Sralph 	close(va);
16117784Sralph 	while ((nw = wait(&lt)) != child && nw != -1)
16217784Sralph 		;
16317784Sralph 	return i;
16417784Sralph }
16517784Sralph 
va820cls(fd)16617784Sralph va820cls(fd)
16717784Sralph register int fd;
16817784Sralph {
16917784Sralph 
17017784Sralph 	DEBUG(2, "RVADIC close %d\n", fd);
17117784Sralph 	close(fd);
17217784Sralph }
173