xref: /csrg-svn/usr.bin/uucp/libacu/df2.c (revision 17771)
1*17771Sralph #ifndef lint
2*17771Sralph static char sccsid[] = "@(#)df2.c	4.1 (Berkeley) 01/22/85";
3*17771Sralph #endif
4*17771Sralph 
5*17771Sralph #include "../condevs.h"
6*17771Sralph #ifdef DF02
7*17771Sralph 
8*17771Sralph /*
9*17771Sralph  *	df2opn(ph, flds, dev)	dial remote machine
10*17771Sralph  *
11*17771Sralph  *	return codes:
12*17771Sralph  *		file descriptor  -  succeeded
13*17771Sralph  *		FAIL  -  failed
14*17771Sralph  */
15*17771Sralph df2opn(ph, flds, dev)
16*17771Sralph char *ph;
17*17771Sralph char *flds[];
18*17771Sralph struct Devices *dev;
19*17771Sralph {
20*17771Sralph 	char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
21*17771Sralph #ifdef	SYSIII
22*17771Sralph 	struct termio ttbuf;
23*17771Sralph #endif
24*17771Sralph 	int dcf, dnf;
25*17771Sralph 	int nw, lt, pid, st, status;
26*17771Sralph 	unsigned timelim;
27*17771Sralph 
28*17771Sralph 	sprintf(dnname, "/dev/%s", dev->D_calldev);
29*17771Sralph 	if (setjmp(Sjbuf)) {
30*17771Sralph 		logent(dnname, "CAN'T OPEN");
31*17771Sralph 		DEBUG(4, "%s Open timed out\n", dnname);
32*17771Sralph 		return CF_NODEV;
33*17771Sralph 	}
34*17771Sralph 	signal(SIGALRM, alarmtr);
35*17771Sralph 	getnextfd();
36*17771Sralph 	errno = 0;
37*17771Sralph 	alarm(10);
38*17771Sralph 	dnf = open(dnname, 2 );
39*17771Sralph 	alarm(0);
40*17771Sralph 	next_fd = -1;
41*17771Sralph 	if (dnf < 0 && errno == EACCES) {
42*17771Sralph 		logent(dnname, "CAN'T OPEN");
43*17771Sralph 		delock(dev->D_line);
44*17771Sralph 		logent("DEVICE", "NO");
45*17771Sralph 		return CF_NODEV;
46*17771Sralph 	}
47*17771Sralph 	fioclex(dnf);
48*17771Sralph 
49*17771Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
50*17771Sralph 	fixline(dnf, dev->D_speed);
51*17771Sralph 	sprintf(phone, "\02%s", ph);
52*17771Sralph 	DEBUG(4, "dc - %s, ", dcname);
53*17771Sralph 	DEBUG(4, "acu - %s\n", dnname);
54*17771Sralph 	pid = 0;
55*17771Sralph 	if (setjmp(Sjbuf)) {
56*17771Sralph 		logent("DIALUP DN write", "TIMEOUT");
57*17771Sralph 		if (pid)
58*17771Sralph 			kill(pid, 9);
59*17771Sralph 		delock(dev->D_line);
60*17771Sralph 		if (dnf)
61*17771Sralph 			close(dnf);
62*17771Sralph 		return CF_DIAL;
63*17771Sralph 	}
64*17771Sralph 	signal(SIGALRM, alarmtr);
65*17771Sralph 	timelim = 5 * strlen(phone);
66*17771Sralph 	alarm(timelim < 30 ? 30 : timelim);
67*17771Sralph 	if ((pid = fork()) == 0) {
68*17771Sralph 		sleep(2);
69*17771Sralph 		fclose(stdin);
70*17771Sralph 		fclose(stdout);
71*17771Sralph #ifdef TIOCFLUSH
72*17771Sralph 		ioctl(dnf, TIOCFLUSH, STBNULL);
73*17771Sralph #endif TIOCFLUSH
74*17771Sralph 		write(dnf, "\01", 1);
75*17771Sralph 		sleep(1);
76*17771Sralph 		nw = write(dnf, phone, lt = strlen(phone));
77*17771Sralph 		if (nw != lt) {
78*17771Sralph 			logent("DIALUP ACU write", _FAILED);
79*17771Sralph 			exit(1);
80*17771Sralph 		}
81*17771Sralph 		DEBUG(4, "ACU write ok%s\n", CNULL);
82*17771Sralph 		exit(0);
83*17771Sralph 	}
84*17771Sralph 	/*  open line - will return on carrier */
85*17771Sralph 	/* RT needs a sleep here because it returns immediately from open */
86*17771Sralph 
87*17771Sralph #if RT
88*17771Sralph 	sleep(15);
89*17771Sralph #endif
90*17771Sralph 
91*17771Sralph 	if (read(dnf, &c, 1) != 1 || c != 'A')
92*17771Sralph 		dcf = -1;
93*17771Sralph 	else
94*17771Sralph 		dcf = 0;
95*17771Sralph 	DEBUG(4, "dcf is %d\n", dcf);
96*17771Sralph 	if (dcf < 0) {
97*17771Sralph 		logent("DIALUP LINE open", _FAILED);
98*17771Sralph 		alarm(0);
99*17771Sralph 		kill(pid, 9);
100*17771Sralph 		close(dnf);
101*17771Sralph 		delock(dev->D_line);
102*17771Sralph 		return CF_DIAL;
103*17771Sralph 	}
104*17771Sralph 	dcf = dnf;
105*17771Sralph 	dnf = 0;
106*17771Sralph 	while ((nw = wait(&lt)) != pid && nw != -1)
107*17771Sralph 		;
108*17771Sralph #ifdef	SYSIII
109*17771Sralph 	ioctl(dcf, TCGETA, &ttbuf);
110*17771Sralph 	if(!(ttbuf.c_cflag & HUPCL)) {
111*17771Sralph 		ttbuf.c_cflag |= HUPCL;
112*17771Sralph 		ioctl(dcf, TCSETA, &ttbuf);
113*17771Sralph 	}
114*17771Sralph #endif SYSIII
115*17771Sralph 	alarm(0);
116*17771Sralph 	fflush(stdout);
117*17771Sralph 	fixline(dcf, dev->D_speed);
118*17771Sralph 	DEBUG(4, "Fork Stat %o\n", lt);
119*17771Sralph 	if (lt != 0) {
120*17771Sralph 		close(dcf);
121*17771Sralph 		if (dnf)
122*17771Sralph 			close(dnf);
123*17771Sralph 		delock(dev->D_line);
124*17771Sralph 		return CF_DIAL;
125*17771Sralph 	}
126*17771Sralph 	return dcf;
127*17771Sralph }
128*17771Sralph 
129*17771Sralph /*
130*17771Sralph  * df2cls()	close the DF02/DF03 call unit
131*17771Sralph  *
132*17771Sralph  *	return codes: none
133*17771Sralph  */
134*17771Sralph df2cls(fd)
135*17771Sralph register int fd;
136*17771Sralph {
137*17771Sralph 	if (fd > 0) {
138*17771Sralph 		close(fd);
139*17771Sralph 		sleep(5);
140*17771Sralph 		delock(devSel);
141*17771Sralph 	}
142*17771Sralph }
143*17771Sralph #endif DF02
144