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