Commit | Line | Data |
---|---|---|
1429dd8a | 1 | #ifndef lint |
74040d36 | 2 | static char sccsid[] = "@(#)vad.c 4.3 (Berkeley) %G%"; |
1429dd8a RC |
3 | #endif |
4 | ||
5 | #include "../condevs.h" | |
1429dd8a RC |
6 | |
7 | /* | |
8 | * vadopn: establish dial-out connection through a Racal-Vadic 3450. | |
9 | * Returns descriptor open to tty for reading and writing. | |
10 | * Negative values (-1...-7) denote errors in connmsg. | |
11 | * Be sure to disconnect tty when done, via HUPCL or stty 0. | |
12 | */ | |
13 | ||
14 | vadopn(telno, flds, dev) | |
15 | char *telno; | |
16 | char *flds[]; | |
17 | struct Devices *dev; | |
18 | { | |
19 | int dh = -1; | |
20 | int i, ok, er = 0, delay; | |
21 | extern errno; | |
22 | char dcname[20]; | |
23 | ||
24 | sprintf(dcname, "/dev/%s", dev->D_line); | |
25 | if (setjmp(Sjbuf)) { | |
26 | DEBUG(1, "timeout vadic open\n", ""); | |
27 | logent("vadic open", "TIMEOUT"); | |
28 | if (dh >= 0) | |
29 | close(dh); | |
30 | delock(dev->D_line); | |
31 | return CF_NODEV; | |
32 | } | |
33 | signal(SIGALRM, alarmtr); | |
34 | getnextfd(); | |
35 | alarm(10); | |
36 | dh = open(dcname, 2); | |
37 | alarm(0); | |
38 | ||
39 | /* modem is open */ | |
40 | next_fd = -1; | |
41 | if (dh < 0) { | |
42 | delock(dev->D_line); | |
43 | return CF_NODEV; | |
44 | } | |
45 | fixline(dh, dev->D_speed); | |
46 | ||
47 | DEBUG(4, "calling %s -> ", telno); | |
48 | if (dochat(dev, flds, dh)) { | |
49 | logent(dcname, "CHAT FAILED"); | |
50 | close(dh); | |
51 | return CF_DIAL; | |
52 | } | |
53 | delay = 0; | |
54 | for (i = 0; i < strlen(telno); ++i) { | |
55 | switch(telno[i]) { | |
56 | case '=': /* await dial tone */ | |
57 | case '-': | |
58 | case ',': | |
59 | case '<': | |
60 | case 'K': | |
61 | telno[i] = 'K'; | |
62 | delay += 5; | |
63 | break; | |
64 | } | |
65 | } | |
66 | DEBUG(4, "%s\n", telno); | |
67 | for(i = 0; i < 5; ++i) { /* make 5 tries */ | |
68 | /* wake up Vadic */ | |
1070b5bc JB |
69 | write(dh, "\005", 1); |
70 | sleep(1); | |
71 | write(dh, "\r", 1); | |
1429dd8a | 72 | DEBUG(4, "wanted * ", CNULL); |
1070b5bc | 73 | ok = expect("*~5", dh); |
1429dd8a RC |
74 | DEBUG(4, "got %s\n", ok ? "?" : "that"); |
75 | if (ok != 0) | |
76 | continue; | |
77 | ||
78 | write(dh, "D\r", 2); /* "D" (enter number) command */ | |
79 | DEBUG(4, "wanted NUMBER?\\r\\n ", CNULL); | |
1070b5bc | 80 | ok = expect("NUMBER?\r\n~5", dh); |
1429dd8a RC |
81 | DEBUG(4, "got %s\n", ok ? "?" : "that"); |
82 | if (ok != 0) | |
83 | continue; | |
84 | ||
85 | /* send telno, send \r */ | |
86 | write(dh, telno, strlen(telno)); | |
87 | sleep(1); | |
88 | write(dh, "\r", 1); | |
89 | DEBUG(4, "wanted %s ", telno); | |
90 | ok = expect(telno, dh); | |
91 | if (ok == 0) | |
92 | ok = expect("\r\n", dh); | |
93 | DEBUG(4, "got %s\n", ok ? "?" : "that"); | |
94 | if (ok != 0) | |
95 | continue; | |
96 | ||
97 | write(dh, "\r", 1); /* confirm number */ | |
98 | DEBUG(4, "wanted DIALING: ", CNULL); | |
99 | ok = expect("DIALING: ", dh); | |
100 | DEBUG(4, "got %s\n", ok ? "?" : "that"); | |
101 | if (ok == 0) | |
102 | break; | |
103 | } | |
104 | ||
105 | if (ok == 0) { | |
106 | sleep(10 + delay); /* give vadic some time */ | |
107 | DEBUG(4, "wanted ON LINE\\r\\n ", CNULL); | |
108 | ok = expect("ON LINE\r\n", dh); | |
109 | DEBUG(4, "got %s\n", ok ? "?" : "that"); | |
110 | } | |
111 | ||
112 | if (ok != 0) { | |
113 | if (dh > 2) | |
114 | close(dh); | |
115 | DEBUG(4, "vadDial failed\n", CNULL); | |
116 | delock(dev->D_line); | |
117 | return CF_DIAL; | |
118 | } | |
119 | DEBUG(4, "vadic ok\n", CNULL); | |
120 | return dh; | |
121 | } | |
122 | ||
1070b5bc JB |
123 | vadcls(fd) |
124 | { | |
1429dd8a RC |
125 | if (fd > 0) { |
126 | close(fd); | |
127 | sleep(5); | |
128 | delock(devSel); | |
129 | } | |
130 | } |