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