1 /*-
2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)dn.c 8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11
12 #include "condevs.h"
13 #define ACULAST "-<"
14
15 /***
16 * dnopn(ph, flds, dev) dial remote machine
17 *
18 * return codes:
19 * file descriptor - succeeded
20 * FAIL - failed
21 */
dnopn(ph,flds,dev)22 dnopn(ph, flds, dev)
23 char *ph;
24 char *flds[];
25 struct Devices *dev;
26 {
27 char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
28 #ifdef USG
29 struct termio ttbuf;
30 #endif USG
31 int dnf, dcf;
32 int nw, lt, pid, status;
33 unsigned timelim;
34 #ifdef TIOCFLUSH
35 int zero = 0;
36 #endif TIOCFLUSH
37
38 sprintf(dnname, "/dev/%s", dev->D_calldev);
39 errno = 0;
40
41 if (setjmp(Sjbuf)) {
42 logent(dnname, "CAN'T OPEN");
43 DEBUG(4, "%s Open timed out\n", dnname);
44 return(CF_NODEV);
45 }
46 signal(SIGALRM, alarmtr);
47 getnextfd();
48 alarm(10);
49 dnf = open(dnname, 1);
50 alarm(0);
51 next_fd = -1;
52 if (dnf < 0 && errno == EACCES) {
53 logent(dnname, "CAN'T OPEN");
54 logent("DEVICE", "NO");
55 return CF_NODEV;
56 }
57 fioclex(dnf);
58
59 sprintf(dcname, "/dev/%s", dev->D_line);
60 sprintf(phone, "%s%s", ph, ACULAST);
61 DEBUG(4, "dc - %s, ", dcname);
62 DEBUG(4, "acu - %s\n", dnname);
63 pid = 0;
64 if (setjmp(Sjbuf)) {
65 logent("DIALUP DN write", "TIMEOUT");
66 if (pid)
67 kill(pid, 9);
68 delock(dev->D_line);
69 if (dnf)
70 close(dnf);
71 return CF_DIAL;
72 }
73 signal(SIGALRM, alarmtr);
74 timelim = 5 * strlen(phone);
75 alarm(timelim < 30 ? 30 : timelim);
76 if ((pid = fork()) == 0) {
77 sleep(2);
78 fclose(stdin);
79 fclose(stdout);
80 #ifdef TIOCFLUSH
81 ioctl(dnf, TIOCFLUSH, &zero);
82 #endif TIOCFLUSH
83 nw = write(dnf, phone, lt = strlen(phone));
84 if (nw != lt) {
85 logent("DIALUP ACU write", _FAILED);
86 exit(1);
87 }
88 DEBUG(4, "ACU write ok\n", CNULL);
89 exit(0);
90 }
91 /* open line - will return on carrier */
92 /* RT needs a sleep here because it returns immediately from open */
93
94 #if RT
95 sleep(15);
96 #endif
97
98 getnextfd();
99 errno = 0;
100 dcf = open(dcname, 2);
101 next_fd = -1;
102 if (dcf < 0 && errno == EACCES)
103 logent(dcname, "CAN'T OPEN");
104 DEBUG(4, "dcf is %d\n", dcf);
105 if (dcf < 0) {
106 logent("DIALUP LINE open", _FAILED);
107 alarm(0);
108 kill(pid, 9);
109 close(dnf);
110 delock(dev->D_line);
111 return CF_DIAL;
112 }
113 while ((nw = wait(<)) != pid && nw != -1)
114 ;
115 #ifdef USG
116 ioctl(dcf, TCGETA, &ttbuf);
117 if(!(ttbuf.c_cflag & HUPCL)) {
118 ttbuf.c_cflag |= HUPCL;
119 ioctl(dcf, TCSETA, &ttbuf);
120 }
121 #endif USG
122 alarm(0);
123 fflush(stdout);
124 fixline(dcf, dev->D_speed);
125 DEBUG(4, "Fork Stat %o\n", lt);
126 if (lt != 0) {
127 close(dcf);
128 if (dnf)
129 close(dnf);
130 delock(dev->D_line);
131 return CF_DIAL;
132 }
133 return dcf;
134 }
135
136 /***
137 * dncls() close dn type call unit
138 *
139 * return codes: None
140 */
dncls(fd)141 dncls(fd)
142 register int fd;
143 {
144 if (fd > 0) {
145 close(fd);
146 sleep(5);
147 delock(devSel);
148 }
149 }
150