|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)df2.c 4.2 (Berkeley) 6/23/85";
3: #endif
4:
5: #include "../condevs.h"
6: #ifdef DF02
7:
8: /*
9: * df2opn(ph, flds, dev) dial remote machine
10: *
11: * return codes:
12: * file descriptor - succeeded
13: * FAIL - failed
14: */
15: df2opn(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 dcf, dnf;
25: int nw, lt, pid, st, status;
26: unsigned timelim;
27: #ifdef TIOCFLUSH
28: int zero = 0;
29: #endif TIOCFLUSH
30:
31: sprintf(dnname, "/dev/%s", dev->D_calldev);
32: if (setjmp(Sjbuf)) {
33: logent(dnname, "CAN'T OPEN");
34: DEBUG(4, "%s Open timed out\n", dnname);
35: return CF_NODEV;
36: }
37: signal(SIGALRM, alarmtr);
38: getnextfd();
39: errno = 0;
40: alarm(10);
41: dnf = open(dnname, 2 );
42: alarm(0);
43: next_fd = -1;
44: if (dnf < 0 && errno == EACCES) {
45: logent(dnname, "CAN'T OPEN");
46: delock(dev->D_line);
47: logent("DEVICE", "NO");
48: return CF_NODEV;
49: }
50: fioclex(dnf);
51:
52: sprintf(dcname, "/dev/%s", dev->D_line);
53: fixline(dnf, dev->D_speed);
54: sprintf(phone, "\02%s", ph);
55: DEBUG(4, "dc - %s, ", dcname);
56: DEBUG(4, "acu - %s\n", dnname);
57: pid = 0;
58: if (setjmp(Sjbuf)) {
59: logent("DIALUP DN write", "TIMEOUT");
60: if (pid)
61: kill(pid, 9);
62: delock(dev->D_line);
63: if (dnf)
64: close(dnf);
65: return CF_DIAL;
66: }
67: signal(SIGALRM, alarmtr);
68: timelim = 5 * strlen(phone);
69: alarm(timelim < 30 ? 30 : timelim);
70: if ((pid = fork()) == 0) {
71: sleep(2);
72: fclose(stdin);
73: fclose(stdout);
74: #ifdef TIOCFLUSH
75: ioctl(dnf, TIOCFLUSH, &zero);
76: #endif TIOCFLUSH
77: write(dnf, "\01", 1);
78: sleep(1);
79: nw = write(dnf, phone, lt = strlen(phone));
80: if (nw != lt) {
81: logent("DIALUP ACU write", _FAILED);
82: exit(1);
83: }
84: DEBUG(4, "ACU write ok%s\n", CNULL);
85: exit(0);
86: }
87: /* open line - will return on carrier */
88: /* RT needs a sleep here because it returns immediately from open */
89:
90: #if RT
91: sleep(15);
92: #endif
93:
94: if (read(dnf, &c, 1) != 1 || c != 'A')
95: dcf = -1;
96: else
97: dcf = 0;
98: DEBUG(4, "dcf is %d\n", dcf);
99: if (dcf < 0) {
100: logent("DIALUP LINE open", _FAILED);
101: alarm(0);
102: kill(pid, 9);
103: close(dnf);
104: delock(dev->D_line);
105: return CF_DIAL;
106: }
107: dcf = dnf;
108: dnf = 0;
109: while ((nw = wait(<)) != pid && nw != -1)
110: ;
111: #ifdef USG
112: ioctl(dcf, TCGETA, &ttbuf);
113: if(!(ttbuf.c_cflag & HUPCL)) {
114: ttbuf.c_cflag |= HUPCL;
115: ioctl(dcf, TCSETA, &ttbuf);
116: }
117: #endif USG
118: alarm(0);
119: fflush(stdout);
120: fixline(dcf, dev->D_speed);
121: DEBUG(4, "Fork Stat %o\n", lt);
122: if (lt != 0) {
123: close(dcf);
124: if (dnf)
125: close(dnf);
126: delock(dev->D_line);
127: return CF_DIAL;
128: }
129: return dcf;
130: }
131:
132: /*
133: * df2cls() close the DF02/DF03 call unit
134: *
135: * return codes: none
136: */
137: df2cls(fd)
138: register int fd;
139: {
140: if (fd > 0) {
141: close(fd);
142: sleep(5);
143: delock(devSel);
144: }
145: }
146: #endif DF02
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.