xref: /csrg-svn/usr.bin/uucp/libacu/dn.c (revision 46875)
117773Sralph #ifndef lint
2*46875Sbostic static char sccsid[] = "@(#)dn.c	4.4 (Berkeley) 03/02/91";
317773Sralph #endif
417773Sralph 
5*46875Sbostic #include "condevs.h"
623697Sbloom #define ACULAST "-<"
717773Sralph 
817773Sralph /***
917773Sralph  *	dnopn(ph, flds, dev)	dial remote machine
1017773Sralph  *
1117773Sralph  *	return codes:
1217773Sralph  *		file descriptor  -  succeeded
1317773Sralph  *		FAIL  -  failed
1417773Sralph  */
1517773Sralph dnopn(ph, flds, dev)
1617773Sralph char *ph;
1717773Sralph char *flds[];
1817773Sralph struct Devices *dev;
1917773Sralph {
2017773Sralph 	char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
2123697Sbloom #ifdef	USG
2217773Sralph 	struct termio ttbuf;
2323697Sbloom #endif 	USG
2417773Sralph 	int dnf, dcf;
2517773Sralph 	int nw, lt, pid, status;
2617773Sralph 	unsigned timelim;
2723697Sbloom #ifdef TIOCFLUSH
2823697Sbloom 	int zero = 0;
2923697Sbloom #endif TIOCFLUSH
3017773Sralph 
3117773Sralph 	sprintf(dnname, "/dev/%s", dev->D_calldev);
3217773Sralph 	errno = 0;
3317773Sralph 
3417773Sralph 	if (setjmp(Sjbuf)) {
3517773Sralph 		logent(dnname, "CAN'T OPEN");
3617773Sralph 		DEBUG(4, "%s Open timed out\n", dnname);
3717773Sralph 		return(CF_NODEV);
3817773Sralph 	}
3917773Sralph 	signal(SIGALRM, alarmtr);
4017773Sralph 	getnextfd();
4117773Sralph 	alarm(10);
4217773Sralph 	dnf = open(dnname, 1);
4317773Sralph 	alarm(0);
4417773Sralph 	next_fd = -1;
4517773Sralph 	if (dnf < 0 && errno == EACCES) {
4617773Sralph 		logent(dnname, "CAN'T OPEN");
4717773Sralph 		logent("DEVICE", "NO");
4817773Sralph 		return CF_NODEV;
4917773Sralph 	}
5017773Sralph 	fioclex(dnf);
5117773Sralph 
5217773Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
5317773Sralph 	sprintf(phone, "%s%s", ph, ACULAST);
5417773Sralph 	DEBUG(4, "dc - %s, ", dcname);
5517773Sralph 	DEBUG(4, "acu - %s\n", dnname);
5617773Sralph 	pid = 0;
5717773Sralph 	if (setjmp(Sjbuf)) {
5817773Sralph 		logent("DIALUP DN write", "TIMEOUT");
5917773Sralph 		if (pid)
6017773Sralph 			kill(pid, 9);
6117773Sralph 		delock(dev->D_line);
6217773Sralph 		if (dnf)
6317773Sralph 			close(dnf);
6417773Sralph 		return CF_DIAL;
6517773Sralph 	}
6617773Sralph 	signal(SIGALRM, alarmtr);
6717773Sralph 	timelim = 5 * strlen(phone);
6817773Sralph 	alarm(timelim < 30 ? 30 : timelim);
6917773Sralph 	if ((pid = fork()) == 0) {
7017773Sralph 		sleep(2);
7117773Sralph 		fclose(stdin);
7217773Sralph 		fclose(stdout);
7317773Sralph #ifdef	TIOCFLUSH
7423697Sbloom 		ioctl(dnf, TIOCFLUSH, &zero);
7523697Sbloom #endif	TIOCFLUSH
7617773Sralph 		nw = write(dnf, phone, lt = strlen(phone));
7717773Sralph 		if (nw != lt) {
7817773Sralph 			logent("DIALUP ACU write", _FAILED);
7917773Sralph 			exit(1);
8017773Sralph 		}
8117773Sralph 		DEBUG(4, "ACU write ok\n", CNULL);
8217773Sralph 		exit(0);
8317773Sralph 	}
8417773Sralph 	/*  open line - will return on carrier */
8517773Sralph 	/* RT needs a sleep here because it returns immediately from open */
8617773Sralph 
8717773Sralph #if RT
8817773Sralph 	sleep(15);
8917773Sralph #endif
9017773Sralph 
9117773Sralph 	getnextfd();
9217773Sralph 	errno = 0;
9317773Sralph 	dcf = open(dcname, 2);
9417773Sralph 	next_fd = -1;
9517773Sralph 	if (dcf < 0 && errno == EACCES)
9617773Sralph 		logent(dcname, "CAN'T OPEN");
9717773Sralph 	DEBUG(4, "dcf is %d\n", dcf);
9817773Sralph 	if (dcf < 0) {
9917773Sralph 		logent("DIALUP LINE open", _FAILED);
10017773Sralph 		alarm(0);
10117773Sralph 		kill(pid, 9);
10217773Sralph 		close(dnf);
10317773Sralph 		delock(dev->D_line);
10417773Sralph 		return CF_DIAL;
10517773Sralph 	}
10617773Sralph 	while ((nw = wait(&lt)) != pid && nw != -1)
10717773Sralph 		;
10823697Sbloom #ifdef	USG
10917773Sralph 	ioctl(dcf, TCGETA, &ttbuf);
11017773Sralph 	if(!(ttbuf.c_cflag & HUPCL)) {
11117773Sralph 		ttbuf.c_cflag |= HUPCL;
11217773Sralph 		ioctl(dcf, TCSETA, &ttbuf);
11317773Sralph 	}
11423697Sbloom #endif USG
11517773Sralph 	alarm(0);
11617773Sralph 	fflush(stdout);
11717773Sralph 	fixline(dcf, dev->D_speed);
11817773Sralph 	DEBUG(4, "Fork Stat %o\n", lt);
11917773Sralph 	if (lt != 0) {
12017773Sralph 		close(dcf);
12117773Sralph 		if (dnf)
12217773Sralph 			close(dnf);
12317773Sralph 		delock(dev->D_line);
12417773Sralph 		return CF_DIAL;
12517773Sralph 	}
12617773Sralph 	return dcf;
12717773Sralph }
12817773Sralph 
12917773Sralph /***
13017773Sralph  *	dncls()		close dn type call unit
13117773Sralph  *
13217773Sralph  *	return codes:	None
13317773Sralph  */
13417773Sralph dncls(fd)
13517773Sralph register int fd;
13617773Sralph {
13717773Sralph 	if (fd > 0) {
13817773Sralph 		close(fd);
13917773Sralph 		sleep(5);
14017773Sralph 		delock(devSel);
14117773Sralph 	}
14217773Sralph }
143