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