|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)dn.c 4.3 (Berkeley) 2/24/88";
3: #endif
4:
5: #include "../condevs.h"
6: #define ACULAST "-<"
7:
8: /***
9: * dnopn(ph, flds, dev) dial remote machine
10: *
11: * return codes:
12: * file descriptor - succeeded
13: * FAIL - failed
14: */
15: dnopn(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 dnf, dcf;
25: int nw, lt, pid, status;
26: unsigned timelim;
27: #ifdef TIOCFLUSH
28: int zero = 0;
29: #endif TIOCFLUSH
30:
31: sprintf(dnname, "/dev/%s", dev->D_calldev);
32: errno = 0;
33:
34: if (setjmp(Sjbuf)) {
35: logent(dnname, "CAN'T OPEN");
36: DEBUG(4, "%s Open timed out\n", dnname);
37: return(CF_NODEV);
38: }
39: signal(SIGALRM, alarmtr);
40: getnextfd();
41: alarm(10);
42: dnf = open(dnname, 1);
43: alarm(0);
44: next_fd = -1;
45: if (dnf < 0 && errno == EACCES) {
46: logent(dnname, "CAN'T OPEN");
47: logent("DEVICE", "NO");
48: return CF_NODEV;
49: }
50: fioclex(dnf);
51:
52: sprintf(dcname, "/dev/%s", dev->D_line);
53: sprintf(phone, "%s%s", ph, ACULAST);
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: nw = write(dnf, phone, lt = strlen(phone));
77: if (nw != lt) {
78: logent("DIALUP ACU write", _FAILED);
79: exit(1);
80: }
81: DEBUG(4, "ACU write ok\n", CNULL);
82: exit(0);
83: }
84: /* open line - will return on carrier */
85: /* RT needs a sleep here because it returns immediately from open */
86:
87: #if RT
88: sleep(15);
89: #endif
90:
91: getnextfd();
92: errno = 0;
93: dcf = open(dcname, 2);
94: next_fd = -1;
95: if (dcf < 0 && errno == EACCES)
96: logent(dcname, "CAN'T OPEN");
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: while ((nw = wait(<)) != pid && nw != -1)
107: ;
108: #ifdef USG
109: ioctl(dcf, TCGETA, &ttbuf);
110: if(!(ttbuf.c_cflag & HUPCL)) {
111: ttbuf.c_cflag |= HUPCL;
112: ioctl(dcf, TCSETA, &ttbuf);
113: }
114: #endif USG
115: alarm(0);
116: fflush(stdout);
117: fixline(dcf, dev->D_speed);
118: DEBUG(4, "Fork Stat %o\n", lt);
119: if (lt != 0) {
120: close(dcf);
121: if (dnf)
122: close(dnf);
123: delock(dev->D_line);
124: return CF_DIAL;
125: }
126: return dcf;
127: }
128:
129: /***
130: * dncls() close dn type call unit
131: *
132: * return codes: None
133: */
134: dncls(fd)
135: register int fd;
136: {
137: if (fd > 0) {
138: close(fd);
139: sleep(5);
140: delock(devSel);
141: }
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.