xref: /csrg-svn/usr.bin/uucp/libacu/df2.c (revision 46875)
117771Sralph #ifndef lint
2*46875Sbostic static char sccsid[] = "@(#)df2.c	4.4 (Berkeley) 03/02/91";
317771Sralph #endif
417771Sralph 
5*46875Sbostic #include "condevs.h"
617771Sralph 
717771Sralph /*
817771Sralph  *	df2opn(ph, flds, dev)	dial remote machine
917771Sralph  *
1017771Sralph  *	return codes:
1117771Sralph  *		file descriptor  -  succeeded
1217771Sralph  *		FAIL  -  failed
1317771Sralph  */
1417771Sralph df2opn(ph, flds, dev)
1517771Sralph char *ph;
1617771Sralph char *flds[];
1717771Sralph struct Devices *dev;
1817771Sralph {
1917771Sralph 	char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
2023696Sbloom #ifdef	USG
2117771Sralph 	struct termio ttbuf;
2223696Sbloom #endif  USG
2317771Sralph 	int dcf, dnf;
2417771Sralph 	int nw, lt, pid, st, status;
2517771Sralph 	unsigned timelim;
2623696Sbloom #ifdef	TIOCFLUSH
2723696Sbloom 	int zero = 0;
2823696Sbloom #endif	TIOCFLUSH
2917771Sralph 
3017771Sralph 	sprintf(dnname, "/dev/%s", dev->D_calldev);
3117771Sralph 	if (setjmp(Sjbuf)) {
3217771Sralph 		logent(dnname, "CAN'T OPEN");
3317771Sralph 		DEBUG(4, "%s Open timed out\n", dnname);
3417771Sralph 		return CF_NODEV;
3517771Sralph 	}
3617771Sralph 	signal(SIGALRM, alarmtr);
3717771Sralph 	getnextfd();
3817771Sralph 	errno = 0;
3917771Sralph 	alarm(10);
4017771Sralph 	dnf = open(dnname, 2 );
4117771Sralph 	alarm(0);
4217771Sralph 	next_fd = -1;
4317771Sralph 	if (dnf < 0 && errno == EACCES) {
4417771Sralph 		logent(dnname, "CAN'T OPEN");
4517771Sralph 		delock(dev->D_line);
4617771Sralph 		logent("DEVICE", "NO");
4717771Sralph 		return CF_NODEV;
4817771Sralph 	}
4917771Sralph 	fioclex(dnf);
5017771Sralph 
5117771Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
5217771Sralph 	fixline(dnf, dev->D_speed);
5317771Sralph 	sprintf(phone, "\02%s", ph);
5417771Sralph 	DEBUG(4, "dc - %s, ", dcname);
5517771Sralph 	DEBUG(4, "acu - %s\n", dnname);
5617771Sralph 	pid = 0;
5717771Sralph 	if (setjmp(Sjbuf)) {
5817771Sralph 		logent("DIALUP DN write", "TIMEOUT");
5917771Sralph 		if (pid)
6017771Sralph 			kill(pid, 9);
6117771Sralph 		delock(dev->D_line);
6217771Sralph 		if (dnf)
6317771Sralph 			close(dnf);
6417771Sralph 		return CF_DIAL;
6517771Sralph 	}
6617771Sralph 	signal(SIGALRM, alarmtr);
6717771Sralph 	timelim = 5 * strlen(phone);
6817771Sralph 	alarm(timelim < 30 ? 30 : timelim);
6917771Sralph 	if ((pid = fork()) == 0) {
7017771Sralph 		sleep(2);
7117771Sralph 		fclose(stdin);
7217771Sralph 		fclose(stdout);
7317771Sralph #ifdef TIOCFLUSH
7423696Sbloom 		ioctl(dnf, TIOCFLUSH, &zero);
7517771Sralph #endif TIOCFLUSH
7617771Sralph 		write(dnf, "\01", 1);
7717771Sralph 		sleep(1);
7817771Sralph 		nw = write(dnf, phone, lt = strlen(phone));
7917771Sralph 		if (nw != lt) {
8017771Sralph 			logent("DIALUP ACU write", _FAILED);
8117771Sralph 			exit(1);
8217771Sralph 		}
8317771Sralph 		DEBUG(4, "ACU write ok%s\n", CNULL);
8417771Sralph 		exit(0);
8517771Sralph 	}
8617771Sralph 	/*  open line - will return on carrier */
8717771Sralph 	/* RT needs a sleep here because it returns immediately from open */
8817771Sralph 
8917771Sralph #if RT
9017771Sralph 	sleep(15);
9117771Sralph #endif
9217771Sralph 
9317771Sralph 	if (read(dnf, &c, 1) != 1 || c != 'A')
9417771Sralph 		dcf = -1;
9517771Sralph 	else
9617771Sralph 		dcf = 0;
9717771Sralph 	DEBUG(4, "dcf is %d\n", dcf);
9817771Sralph 	if (dcf < 0) {
9917771Sralph 		logent("DIALUP LINE open", _FAILED);
10017771Sralph 		alarm(0);
10117771Sralph 		kill(pid, 9);
10217771Sralph 		close(dnf);
10317771Sralph 		delock(dev->D_line);
10417771Sralph 		return CF_DIAL;
10517771Sralph 	}
10617771Sralph 	dcf = dnf;
10717771Sralph 	dnf = 0;
10817771Sralph 	while ((nw = wait(&lt)) != pid && nw != -1)
10917771Sralph 		;
11023696Sbloom #ifdef	USG
11117771Sralph 	ioctl(dcf, TCGETA, &ttbuf);
11217771Sralph 	if(!(ttbuf.c_cflag & HUPCL)) {
11317771Sralph 		ttbuf.c_cflag |= HUPCL;
11417771Sralph 		ioctl(dcf, TCSETA, &ttbuf);
11517771Sralph 	}
11623696Sbloom #endif USG
11717771Sralph 	alarm(0);
11817771Sralph 	fflush(stdout);
11917771Sralph 	fixline(dcf, dev->D_speed);
12017771Sralph 	DEBUG(4, "Fork Stat %o\n", lt);
12117771Sralph 	if (lt != 0) {
12217771Sralph 		close(dcf);
12317771Sralph 		if (dnf)
12417771Sralph 			close(dnf);
12517771Sralph 		delock(dev->D_line);
12617771Sralph 		return CF_DIAL;
12717771Sralph 	}
12817771Sralph 	return dcf;
12917771Sralph }
13017771Sralph 
13117771Sralph /*
13217771Sralph  * df2cls()	close the DF02/DF03 call unit
13317771Sralph  *
13417771Sralph  *	return codes: none
13517771Sralph  */
13617771Sralph df2cls(fd)
13717771Sralph register int fd;
13817771Sralph {
13917771Sralph 	if (fd > 0) {
14017771Sralph 		close(fd);
14117771Sralph 		sleep(5);
14217771Sralph 		delock(devSel);
14317771Sralph 	}
14417771Sralph }
145