Commit | Line | Data |
---|---|---|
4788e774 | 1 | #ifndef lint |
ca67e7b4 | 2 | static char sccsid[] = "@(#)df2.c 4.3 (Berkeley) 2/24/88"; |
4788e774 RC |
3 | #endif |
4 | ||
5 | #include "../condevs.h" | |
4788e774 RC |
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; | |
de465ec0 | 20 | #ifdef USG |
4788e774 | 21 | struct termio ttbuf; |
de465ec0 | 22 | #endif USG |
4788e774 RC |
23 | int dcf, dnf; |
24 | int nw, lt, pid, st, status; | |
25 | unsigned timelim; | |
de465ec0 JB |
26 | #ifdef TIOCFLUSH |
27 | int zero = 0; | |
28 | #endif TIOCFLUSH | |
4788e774 RC |
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 | |
de465ec0 | 74 | ioctl(dnf, TIOCFLUSH, &zero); |
4788e774 RC |
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(<)) != pid && nw != -1) | |
109 | ; | |
de465ec0 | 110 | #ifdef USG |
4788e774 RC |
111 | ioctl(dcf, TCGETA, &ttbuf); |
112 | if(!(ttbuf.c_cflag & HUPCL)) { | |
113 | ttbuf.c_cflag |= HUPCL; | |
114 | ioctl(dcf, TCSETA, &ttbuf); | |
115 | } | |
de465ec0 | 116 | #endif USG |
4788e774 RC |
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 | } |