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