BSD 4_3_Tahoe release
[unix-history] / usr / src / usr.bin / uucp / aculib / df2.c
CommitLineData
4788e774 1#ifndef lint
ca67e7b4 2static 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 */
14df2opn(ph, flds, dev)
15char *ph;
16char *flds[];
17struct 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(&lt)) != 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 */
136df2cls(fd)
137register int fd;
138{
139 if (fd > 0) {
140 close(fd);
141 sleep(5);
142 delock(devSel);
143 }
144}