typo
[unix-history] / usr / src / usr.bin / uucp / libacu / vad.c
CommitLineData
1429dd8a 1#ifndef lint
74040d36 2static 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
14vadopn(telno, flds, dev)
15char *telno;
16char *flds[];
17struct 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
123vadcls(fd)
124{
1429dd8a
RC
125 if (fd > 0) {
126 close(fd);
127 sleep(5);
128 delock(devSel);
129 }
130}