xref: /csrg-svn/usr.bin/uucp/libacu/dn.c (revision 62384)
148651Sbostic /*-
2*62384Sbostic  * Copyright (c) 1985, 1993
3*62384Sbostic  *	The Regents of the University of California.  All rights reserved.
448651Sbostic  *
548651Sbostic  * %sccs.include.proprietary.c%
648651Sbostic  */
748651Sbostic 
817773Sralph #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)dn.c	8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1117773Sralph 
1246875Sbostic #include "condevs.h"
1323697Sbloom #define ACULAST "-<"
1417773Sralph 
1517773Sralph /***
1617773Sralph  *	dnopn(ph, flds, dev)	dial remote machine
1717773Sralph  *
1817773Sralph  *	return codes:
1917773Sralph  *		file descriptor  -  succeeded
2017773Sralph  *		FAIL  -  failed
2117773Sralph  */
dnopn(ph,flds,dev)2217773Sralph dnopn(ph, flds, dev)
2317773Sralph char *ph;
2417773Sralph char *flds[];
2517773Sralph struct Devices *dev;
2617773Sralph {
2717773Sralph 	char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
2823697Sbloom #ifdef	USG
2917773Sralph 	struct termio ttbuf;
3023697Sbloom #endif 	USG
3117773Sralph 	int dnf, dcf;
3217773Sralph 	int nw, lt, pid, status;
3317773Sralph 	unsigned timelim;
3423697Sbloom #ifdef TIOCFLUSH
3523697Sbloom 	int zero = 0;
3623697Sbloom #endif TIOCFLUSH
3717773Sralph 
3817773Sralph 	sprintf(dnname, "/dev/%s", dev->D_calldev);
3917773Sralph 	errno = 0;
4017773Sralph 
4117773Sralph 	if (setjmp(Sjbuf)) {
4217773Sralph 		logent(dnname, "CAN'T OPEN");
4317773Sralph 		DEBUG(4, "%s Open timed out\n", dnname);
4417773Sralph 		return(CF_NODEV);
4517773Sralph 	}
4617773Sralph 	signal(SIGALRM, alarmtr);
4717773Sralph 	getnextfd();
4817773Sralph 	alarm(10);
4917773Sralph 	dnf = open(dnname, 1);
5017773Sralph 	alarm(0);
5117773Sralph 	next_fd = -1;
5217773Sralph 	if (dnf < 0 && errno == EACCES) {
5317773Sralph 		logent(dnname, "CAN'T OPEN");
5417773Sralph 		logent("DEVICE", "NO");
5517773Sralph 		return CF_NODEV;
5617773Sralph 	}
5717773Sralph 	fioclex(dnf);
5817773Sralph 
5917773Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
6017773Sralph 	sprintf(phone, "%s%s", ph, ACULAST);
6117773Sralph 	DEBUG(4, "dc - %s, ", dcname);
6217773Sralph 	DEBUG(4, "acu - %s\n", dnname);
6317773Sralph 	pid = 0;
6417773Sralph 	if (setjmp(Sjbuf)) {
6517773Sralph 		logent("DIALUP DN write", "TIMEOUT");
6617773Sralph 		if (pid)
6717773Sralph 			kill(pid, 9);
6817773Sralph 		delock(dev->D_line);
6917773Sralph 		if (dnf)
7017773Sralph 			close(dnf);
7117773Sralph 		return CF_DIAL;
7217773Sralph 	}
7317773Sralph 	signal(SIGALRM, alarmtr);
7417773Sralph 	timelim = 5 * strlen(phone);
7517773Sralph 	alarm(timelim < 30 ? 30 : timelim);
7617773Sralph 	if ((pid = fork()) == 0) {
7717773Sralph 		sleep(2);
7817773Sralph 		fclose(stdin);
7917773Sralph 		fclose(stdout);
8017773Sralph #ifdef	TIOCFLUSH
8123697Sbloom 		ioctl(dnf, TIOCFLUSH, &zero);
8223697Sbloom #endif	TIOCFLUSH
8317773Sralph 		nw = write(dnf, phone, lt = strlen(phone));
8417773Sralph 		if (nw != lt) {
8517773Sralph 			logent("DIALUP ACU write", _FAILED);
8617773Sralph 			exit(1);
8717773Sralph 		}
8817773Sralph 		DEBUG(4, "ACU write ok\n", CNULL);
8917773Sralph 		exit(0);
9017773Sralph 	}
9117773Sralph 	/*  open line - will return on carrier */
9217773Sralph 	/* RT needs a sleep here because it returns immediately from open */
9317773Sralph 
9417773Sralph #if RT
9517773Sralph 	sleep(15);
9617773Sralph #endif
9717773Sralph 
9817773Sralph 	getnextfd();
9917773Sralph 	errno = 0;
10017773Sralph 	dcf = open(dcname, 2);
10117773Sralph 	next_fd = -1;
10217773Sralph 	if (dcf < 0 && errno == EACCES)
10317773Sralph 		logent(dcname, "CAN'T OPEN");
10417773Sralph 	DEBUG(4, "dcf is %d\n", dcf);
10517773Sralph 	if (dcf < 0) {
10617773Sralph 		logent("DIALUP LINE open", _FAILED);
10717773Sralph 		alarm(0);
10817773Sralph 		kill(pid, 9);
10917773Sralph 		close(dnf);
11017773Sralph 		delock(dev->D_line);
11117773Sralph 		return CF_DIAL;
11217773Sralph 	}
11317773Sralph 	while ((nw = wait(&lt)) != pid && nw != -1)
11417773Sralph 		;
11523697Sbloom #ifdef	USG
11617773Sralph 	ioctl(dcf, TCGETA, &ttbuf);
11717773Sralph 	if(!(ttbuf.c_cflag & HUPCL)) {
11817773Sralph 		ttbuf.c_cflag |= HUPCL;
11917773Sralph 		ioctl(dcf, TCSETA, &ttbuf);
12017773Sralph 	}
12123697Sbloom #endif USG
12217773Sralph 	alarm(0);
12317773Sralph 	fflush(stdout);
12417773Sralph 	fixline(dcf, dev->D_speed);
12517773Sralph 	DEBUG(4, "Fork Stat %o\n", lt);
12617773Sralph 	if (lt != 0) {
12717773Sralph 		close(dcf);
12817773Sralph 		if (dnf)
12917773Sralph 			close(dnf);
13017773Sralph 		delock(dev->D_line);
13117773Sralph 		return CF_DIAL;
13217773Sralph 	}
13317773Sralph 	return dcf;
13417773Sralph }
13517773Sralph 
13617773Sralph /***
13717773Sralph  *	dncls()		close dn type call unit
13817773Sralph  *
13917773Sralph  *	return codes:	None
14017773Sralph  */
dncls(fd)14117773Sralph dncls(fd)
14217773Sralph register int fd;
14317773Sralph {
14417773Sralph 	if (fd > 0) {
14517773Sralph 		close(fd);
14617773Sralph 		sleep(5);
14717773Sralph 		delock(devSel);
14817773Sralph 	}
14917773Sralph }
150