Ultrix-3.1/src/cmd/uucp/dialout.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

static char Sccsid[] = "@(#)dialout.c	3.0	4/22/86";

/* Warning: this dialout() routine has a non-standard argument list */
/* rti!trt: this needs the "getnextfd" trick used in conn.c */
/* decvax!larry - we dont use this routine */

#ifdef	DIALOUT
#include "uucp.h"
#include <sgtty.h>
#include <signal.h>
#include <ctype.h>
#include <errno.h>
#include <ascii.h>

struct listp {
	char	*acu;
	char	*line;
};

static struct listp dial300[] = {
	{ "/dev/ttyjb", "/dev/ttyjc" },
	0
};
static struct listp dial1200[] = {
	{ "/dev/ttyjb", "/dev/ttyjc" },
	0
};
static struct listp test1200[] = {
	{ "/tmp/dn9", "/dev/ttyjc" },
	0
};
static struct listp cunc[] = {
	{ "/dev/null", "/dev/ttyi8" },
	0
};
static struct listp cduke[] = {
	{ "/dev/null", "/dev/ttyh4" },
	0
};
static struct listp cweb40[] = {
	{ "/dev/null", "/dev/ttyj1" },
	0
};
static struct listp csimon[] = {
	{ "/dev/null", "/dev/tty04" },
	0
};
static struct listp crti[] = {
	{ "/dev/null", "/dev/tty00" },
	0
};

static struct modlist {
	char	*type;
	struct	listp *list;
	char speed;
} modlist[] = {
	{ "1200", dial1200, B1200},
	{ "T1200", test1200, B1200},
	{ "300", dial300, B300},
	{ "U4800", cunc, B4800},
	{ "D4800", cduke, B4800},
	{ "W4800", cweb40, B4800},
	{ "S4800", csimon, B4800},
	{ "R1200", crti, B1200},
	0
};

static int acu = -1;
static int dh = -1;

dialout(telno, flds)
char *telno, *flds[];
{
	extern errno;
	register char *p;
	char digits[30];
	char *dev;
	char *type;
	register int d, m;
	int r, pid, retval;
	int sigalrm(), (*sal)();
	struct sgttyb vec;
	char rvc;

	type = flds[F_CLASS];
	DEBUG(6, "telno=%s ", telno);
	DEBUG(6, " type=%s\n", type);
	digits[0] = STX;
	for (p = digits+1; *telno; telno++)
		if (isdigit(*telno) || *telno == ';') *p++ = *telno;
		else if (*telno == '-') *p++ = ':';
		else if (*telno == '<' || *telno == '#') break;
		else if (*telno == '*') ;
		else return(-9);
	*p++ = '?';
	*p++ = ETX;
	*p++ = '\0';
	sal = signal(SIGALRM, sigalrm);
	for (m=0; modlist[m].type; m++) {
		if (strcmp(modlist[m].type, type)==0)
			goto linefound;
	}
	retval = -3;		/* unknown type */
	goto ret;

linefound:
	retval = -1;		/* All lines busy */
	for(d=1; d<7; d++, sleep(6)) {
		dev = modlist[m].list[d-1].line;
		if (dev==0)
			break;
		/*
			if (access(modlist[m].list[d-1].acu, 2)) {
				retval = -5;
				continue;
			}
			if (access(dev, 6)) {
				retval = -6;
				continue;
			}
		*/
		DEBUG(6, "ACU=%s ", modlist[m].list[d-1].acu);
		DEBUG(6, "line=%s\n", dev);
		acu = open(modlist[m].list[d-1].acu, 2);
		if (acu < 0) acu = open(modlist[m].list[d-1].acu, 1);
		if (acu < 0) {
			if (errno != EBUSY) retval = -5;
			continue;
		}

		retval = -2;	/* Hmm, found a line */
		ioctl(acu, TIOCHPCL, 0);
		ioctl(acu, TIOCEXCL, 0);
		vec.sg_ispeed = B1200;
		vec.sg_ospeed = B1200;
		vec.sg_flags = RAW;
		ioctl(acu, TIOCSETP, &vec);
		if ((pid=fork())==0) {
			close(acu);
			dh = open(dev, 2);
			if (dh >= 0) ioctl(dh, TIOCHPCL, 0);
			for(;;)
				pause();
		}
		else if (pid < 0) {
			close(acu);
			retval = -4;
			continue;
		}
		alarm(45 > 2*strlen(digits) ? 45 : 2*strlen(digits));
		DEBUG(6, "len=%d\n", strlen(digits));
		r = write(acu, digits, strlen(digits));
		alarm(0);
		if (r != strlen(digits)) {
			close(acu);
			kill(pid, 9);
			wait(0);
			continue;
		}
		DEBUG(6, "write done\n",0);
		alarm(65);
		r = read(acu, &rvc, 1);
		alarm(0);
		if (r == 1) {
			DEBUG(6, "r=%d ", r);
			DEBUG(6, "char='%c'\n",rvc);
			if (rvc != 'C') {
				close(acu);
				kill(pid, 9);
				wait(0);
				switch(rvc) {
					case 'A': retval = -2; break;
					case 'B': retval = -8; break;
					case 'D': retval = -7; break;
					case 'E': retval = -9; break;
					default: retval = -9;
				}
				continue;
			}
		}
		else 
		{
			DEBUG(6, "r=%d\n", r);
		}
		alarm(10);
		dh = open(dev, 2);
		alarm(0);
		kill(pid, 9);
		wait(0);
		if (dh>=0) {
			ioctl(dh, TIOCGETP, &vec);
			vec.sg_ispeed = vec.sg_ospeed = modlist[m].speed;
			vec.sg_flags &= ~ECHO;
			vec.sg_flags |= RAW|EVENP|ODDP;
			ioctl(dh, TIOCSETP, &vec);
			ioctl(dh, TIOCHPCL, 0);
			ioctl(dh, TIOCEXCL, 0);
			retval = dh;
			goto ret;
		}
		if (errno != EBUSY) retval = -6;
		close(acu);
	}
ret:
	signal(SIGALRM, sal);
	DEBUG(6, "retval=%d\n", retval);
	if (retval < 0) acu = -1;
	return(retval);
}

dialend()
{
	if (acu >= 0) {
		close(acu);
		acu = -1;
	}
	if (dh >= 0) {
		close(dh);
		dh = -1;
	}
}

sigalrm()
{
	signal(SIGALRM, sigalrm);
	return;
}
#endif