|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)df2.c 4.3 (Berkeley) 2/24/88";
3: #endif
4:
5: #include "../condevs.h"
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;
20: #ifdef USG
21: struct termio ttbuf;
22: #endif USG
23: int dcf, dnf;
24: int nw, lt, pid, st, status;
25: unsigned timelim;
26: #ifdef TIOCFLUSH
27: int zero = 0;
28: #endif TIOCFLUSH
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
74: ioctl(dnf, TIOCFLUSH, &zero);
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: ;
110: #ifdef USG
111: ioctl(dcf, TCGETA, &ttbuf);
112: if(!(ttbuf.c_cflag & HUPCL)) {
113: ttbuf.c_cflag |= HUPCL;
114: ioctl(dcf, TCSETA, &ttbuf);
115: }
116: #endif USG
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.