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