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