xref: /original-bsd/usr.bin/uucp/libacu/vad.c (revision 179d6f6f)
1 #ifndef lint
2 static char sccsid[] = "@(#)vad.c	4.4 (Berkeley) 03/02/91";
3 #endif
4 
5 #include "condevs.h"
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 */
69 		write(dh, "\005", 1);
70 		sleep(1);
71 		write(dh, "\r", 1);
72 		DEBUG(4, "wanted * ", CNULL);
73 		ok = expect("*~5", dh);
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);
80 		ok = expect("NUMBER?\r\n~5", dh);
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 
123 vadcls(fd)
124 {
125 	if (fd > 0) {
126 		close(fd);
127 		sleep(5);
128 		delock(devSel);
129 	}
130 }
131