xref: /original-bsd/usr.bin/uucp/libacu/cds224.c (revision f91c1509)
1 #ifndef lint
2 static char sccsid[] = "@(#)cds224.c	1.3 (Berkeley) 03/02/91";
3 #endif !lint
4 
5 #include "condevs.h"
6 
7 /*
8  *	conopn: establish dial-out connection through a Concord CDS 224.
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 #define TRYS 5	/* number of trys */
14 
15 cdsopn224(telno, flds, dev)
16 char *telno;
17 char *flds[];
18 struct Devices *dev;
19 {
20 	int	dh = -1;
21 	int	i, ok, er = 0, delay;
22 	extern errno;
23 	char dcname[20];
24 	char tempbuf[20];
25 
26 	sprintf(dcname, "/dev/%s", dev->D_line);
27 	if (setjmp(Sjbuf)) {
28 		DEBUG(1, "timeout concord open\n", "");
29 		logent("concord open", "TIMEOUT");
30 		if (dh >= 0)
31 			cdscls224(dh);
32 		delock(dev->D_line);
33 		return CF_NODEV;
34 	}
35 	signal(SIGALRM, alarmtr);
36 	getnextfd();
37 	alarm(10);
38 	dh = open(dcname, 2);
39 	alarm(0);
40 
41 	/* modem is open */
42 	next_fd = -1;
43 	if (dh < 0) {
44 		delock(dev->D_line);
45 		return CF_NODEV;
46 	}
47 	fixline(dh, dev->D_speed);
48 
49 	DEBUG(4, "calling %s -> ", telno);
50 	if (dochat(dev, flds, dh)) {
51 		logent(dcname, "CHAT FAILED");
52 		cdscls224(dh);
53 		return CF_DIAL;
54 	}
55 	for(i = 0; i < TRYS; ++i) {
56 		/* wake up Concord */
57 		write(dh, "\r\r", 2);
58 		DEBUG(4, "wanted CDS >", CNULL);
59 		ok = expect("CDS >", dh);
60 		DEBUG(4, "got %s\n", ok ? "?" : "that");
61 		if (ok != 0)
62 			continue;
63 
64 		write(dh, "\r", 2);
65 		DEBUG(4, "wanted CDS >", CNULL);
66 		ok = expect("CDS >", dh);
67 		DEBUG(4, "got %s\n", ok ? "?" : "that");
68 		if (ok != 0)
69 			continue;
70 
71 		/* send telno \r */
72 		sprintf(tempbuf,"D%s\r",telno);
73 		write(dh, tempbuf, strlen(tempbuf));
74 
75 		DEBUG(4, "wanted DIALING ", CNULL);
76 		ok = expect("DIALING ", dh);
77 		DEBUG(4, "got %s\n", ok ? "?" : "that");
78 		if (ok == 0)
79 			break;
80 	}
81 
82 	if (ok == 0) {
83 		sleep(10);	/* give concord some time */
84 		DEBUG(4, "wanted INITIATING " , CNULL);
85 		ok = expect("INITIATING", dh);
86 		DEBUG(4, "got %s\n", ok ? "?" : "that");
87 	}
88 
89 	if (ok != 0) {
90 		if (dh > 2)
91 			close(dh);
92 		DEBUG(4, "conDial failed\n", CNULL);
93 		delock(dev->D_line);
94 		return CF_DIAL;
95 	}
96 	DEBUG(4, "concord ok\n", CNULL);
97 	return dh;
98 }
99 
100 cdscls224(fd)
101 {
102 
103 	if (fd > 0) {
104 		close(fd);
105 		sleep(5);
106 		delock(devSel);
107 	}
108 }
109