xref: /original-bsd/usr.bin/uucp/libacu/dn.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[] = "@(#)dn.c	8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11 
12 #include "condevs.h"
13 #define ACULAST "-<"
14 
15 /***
16  *	dnopn(ph, flds, dev)	dial remote machine
17  *
18  *	return codes:
19  *		file descriptor  -  succeeded
20  *		FAIL  -  failed
21  */
22 dnopn(ph, flds, dev)
23 char *ph;
24 char *flds[];
25 struct Devices *dev;
26 {
27 	char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
28 #ifdef	USG
29 	struct termio ttbuf;
30 #endif 	USG
31 	int dnf, dcf;
32 	int nw, lt, pid, status;
33 	unsigned timelim;
34 #ifdef TIOCFLUSH
35 	int zero = 0;
36 #endif TIOCFLUSH
37 
38 	sprintf(dnname, "/dev/%s", dev->D_calldev);
39 	errno = 0;
40 
41 	if (setjmp(Sjbuf)) {
42 		logent(dnname, "CAN'T OPEN");
43 		DEBUG(4, "%s Open timed out\n", dnname);
44 		return(CF_NODEV);
45 	}
46 	signal(SIGALRM, alarmtr);
47 	getnextfd();
48 	alarm(10);
49 	dnf = open(dnname, 1);
50 	alarm(0);
51 	next_fd = -1;
52 	if (dnf < 0 && errno == EACCES) {
53 		logent(dnname, "CAN'T OPEN");
54 		logent("DEVICE", "NO");
55 		return CF_NODEV;
56 	}
57 	fioclex(dnf);
58 
59 	sprintf(dcname, "/dev/%s", dev->D_line);
60 	sprintf(phone, "%s%s", ph, ACULAST);
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 		nw = write(dnf, phone, lt = strlen(phone));
84 		if (nw != lt) {
85 			logent("DIALUP ACU write", _FAILED);
86 			exit(1);
87 		}
88 		DEBUG(4, "ACU write ok\n", CNULL);
89 		exit(0);
90 	}
91 	/*  open line - will return on carrier */
92 	/* RT needs a sleep here because it returns immediately from open */
93 
94 #if RT
95 	sleep(15);
96 #endif
97 
98 	getnextfd();
99 	errno = 0;
100 	dcf = open(dcname, 2);
101 	next_fd = -1;
102 	if (dcf < 0 && errno == EACCES)
103 		logent(dcname, "CAN'T OPEN");
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 	while ((nw = wait(&lt)) != pid && nw != -1)
114 		;
115 #ifdef	USG
116 	ioctl(dcf, TCGETA, &ttbuf);
117 	if(!(ttbuf.c_cflag & HUPCL)) {
118 		ttbuf.c_cflag |= HUPCL;
119 		ioctl(dcf, TCSETA, &ttbuf);
120 	}
121 #endif USG
122 	alarm(0);
123 	fflush(stdout);
124 	fixline(dcf, dev->D_speed);
125 	DEBUG(4, "Fork Stat %o\n", lt);
126 	if (lt != 0) {
127 		close(dcf);
128 		if (dnf)
129 			close(dnf);
130 		delock(dev->D_line);
131 		return CF_DIAL;
132 	}
133 	return dcf;
134 }
135 
136 /***
137  *	dncls()		close dn type call unit
138  *
139  *	return codes:	None
140  */
141 dncls(fd)
142 register int fd;
143 {
144 	if (fd > 0) {
145 		close(fd);
146 		sleep(5);
147 		delock(devSel);
148 	}
149 }
150