Commit | Line | Data |
---|---|---|
f76694db RC |
1 | #ifndef lint |
2 | static char sccsid[] = "@(#)dn.c 4.1 (Berkeley) %G%"; | |
3 | #endif | |
4 | ||
5 | #include "../condevs.h" | |
6 | #ifdef DN11 | |
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 SYSIII | |
22 | struct termio ttbuf; | |
23 | #endif SYSIII | |
24 | int dnf, dcf; | |
25 | int nw, lt, pid, status; | |
26 | unsigned timelim; | |
27 | ||
28 | sprintf(dnname, "/dev/%s", dev->D_calldev); | |
29 | errno = 0; | |
30 | ||
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 | alarm(10); | |
39 | dnf = open(dnname, 1); | |
40 | alarm(0); | |
41 | next_fd = -1; | |
42 | if (dnf < 0 && errno == EACCES) { | |
43 | logent(dnname, "CAN'T OPEN"); | |
44 | logent("DEVICE", "NO"); | |
45 | return CF_NODEV; | |
46 | } | |
47 | fioclex(dnf); | |
48 | ||
49 | sprintf(dcname, "/dev/%s", dev->D_line); | |
50 | sprintf(phone, "%s%s", ph, ACULAST); | |
51 | DEBUG(4, "dc - %s, ", dcname); | |
52 | DEBUG(4, "acu - %s\n", dnname); | |
53 | pid = 0; | |
54 | if (setjmp(Sjbuf)) { | |
55 | logent("DIALUP DN write", "TIMEOUT"); | |
56 | if (pid) | |
57 | kill(pid, 9); | |
58 | delock(dev->D_line); | |
59 | if (dnf) | |
60 | close(dnf); | |
61 | return CF_DIAL; | |
62 | } | |
63 | signal(SIGALRM, alarmtr); | |
64 | timelim = 5 * strlen(phone); | |
65 | alarm(timelim < 30 ? 30 : timelim); | |
66 | if ((pid = fork()) == 0) { | |
67 | sleep(2); | |
68 | fclose(stdin); | |
69 | fclose(stdout); | |
70 | #ifdef TIOCFLUSH | |
71 | ioctl(dnf, TIOCFLUSH, STBNULL); | |
72 | #endif | |
73 | nw = write(dnf, phone, lt = strlen(phone)); | |
74 | if (nw != lt) { | |
75 | logent("DIALUP ACU write", _FAILED); | |
76 | exit(1); | |
77 | } | |
78 | DEBUG(4, "ACU write ok\n", CNULL); | |
79 | exit(0); | |
80 | } | |
81 | /* open line - will return on carrier */ | |
82 | /* RT needs a sleep here because it returns immediately from open */ | |
83 | ||
84 | #if RT | |
85 | sleep(15); | |
86 | #endif | |
87 | ||
88 | getnextfd(); | |
89 | errno = 0; | |
90 | dcf = open(dcname, 2); | |
91 | next_fd = -1; | |
92 | if (dcf < 0 && errno == EACCES) | |
93 | logent(dcname, "CAN'T OPEN"); | |
94 | DEBUG(4, "dcf is %d\n", dcf); | |
95 | if (dcf < 0) { | |
96 | logent("DIALUP LINE open", _FAILED); | |
97 | alarm(0); | |
98 | kill(pid, 9); | |
99 | close(dnf); | |
100 | delock(dev->D_line); | |
101 | return CF_DIAL; | |
102 | } | |
103 | while ((nw = wait(<)) != pid && nw != -1) | |
104 | ; | |
105 | #ifdef SYSIII | |
106 | ioctl(dcf, TCGETA, &ttbuf); | |
107 | if(!(ttbuf.c_cflag & HUPCL)) { | |
108 | ttbuf.c_cflag |= HUPCL; | |
109 | ioctl(dcf, TCSETA, &ttbuf); | |
110 | } | |
111 | #endif SYSIII | |
112 | alarm(0); | |
113 | fflush(stdout); | |
114 | fixline(dcf, dev->D_speed); | |
115 | DEBUG(4, "Fork Stat %o\n", lt); | |
116 | if (lt != 0) { | |
117 | close(dcf); | |
118 | if (dnf) | |
119 | close(dnf); | |
120 | delock(dev->D_line); | |
121 | return CF_DIAL; | |
122 | } | |
123 | return dcf; | |
124 | } | |
125 | ||
126 | /*** | |
127 | * dncls() close dn type call unit | |
128 | * | |
129 | * return codes: None | |
130 | */ | |
131 | dncls(fd) | |
132 | register int fd; | |
133 | { | |
134 | if (fd > 0) { | |
135 | close(fd); | |
136 | sleep(5); | |
137 | delock(devSel); | |
138 | } | |
139 | } | |
140 | #endif DN11 |