xref: /csrg-svn/usr.bin/uucp/libacu/hys24.c (revision 25882)
1*25882Sbloom #ifndef lint
2*25882Sbloom static char sccsid[] = "@(#)hys24.c	1.1 (Berkeley) 01/13/86";
3*25882Sbloom #endif !lint
4*25882Sbloom 
5*25882Sbloom #include "../condevs.h"
6*25882Sbloom 
7*25882Sbloom #ifdef HAYES2400
8*25882Sbloom /*
9*25882Sbloom  *	hyspopn24(telno, flds, dev) connect to hayes smartmodem (pulse call)
10*25882Sbloom  *	hystopn24(telno, flds, dev) connect to hayes smartmodem (tone call)
11*25882Sbloom  *	char *flds[], *dev[];
12*25882Sbloom  *
13*25882Sbloom  *	return codes:
14*25882Sbloom  *		>0  -  file number  -  ok
15*25882Sbloom  *		CF_DIAL,CF_DEVICE  -  failed
16*25882Sbloom  */
17*25882Sbloom 
18*25882Sbloom hyspopn24(telno, flds, dev)
19*25882Sbloom char *telno, *flds[];
20*25882Sbloom struct Devices *dev;
21*25882Sbloom {
22*25882Sbloom 	return hysopn24(telno, flds, dev, 0);
23*25882Sbloom }
24*25882Sbloom 
25*25882Sbloom hystopn24(telno, flds, dev)
26*25882Sbloom char *telno, *flds[];
27*25882Sbloom struct Devices *dev;
28*25882Sbloom {
29*25882Sbloom 	return hysopn24(telno, flds, dev, 1);
30*25882Sbloom }
31*25882Sbloom 
32*25882Sbloom /* ARGSUSED */
33*25882Sbloom hysopn24(telno, flds, dev, toneflag)
34*25882Sbloom char *telno;
35*25882Sbloom char *flds[];
36*25882Sbloom struct Devices *dev;
37*25882Sbloom int toneflag;
38*25882Sbloom {
39*25882Sbloom 	int	dh = -1;
40*25882Sbloom 	char *ii;
41*25882Sbloom 	extern errno;
42*25882Sbloom 	char dcname[20];
43*25882Sbloom 
44*25882Sbloom 	sprintf(dcname, "/dev/%s", dev->D_line);
45*25882Sbloom 	DEBUG(4, "dc - %s\n", dcname);
46*25882Sbloom 	if (setjmp(Sjbuf)) {
47*25882Sbloom 		logent(dcname, "TIMEOUT");
48*25882Sbloom 		if (dh >= 0)
49*25882Sbloom 			hyscls24(dh);
50*25882Sbloom 		return CF_DIAL;
51*25882Sbloom 	}
52*25882Sbloom 	signal(SIGALRM, alarmtr);
53*25882Sbloom 	getnextfd();
54*25882Sbloom 	alarm(10);
55*25882Sbloom 	dh = open(dcname, 2); /* read/write */
56*25882Sbloom 	alarm(0);
57*25882Sbloom 
58*25882Sbloom 	for (ii = telno; *ii; ii++)
59*25882Sbloom 		if (*ii == '=')
60*25882Sbloom 		    *ii = ',';
61*25882Sbloom 
62*25882Sbloom 	/* modem is open */
63*25882Sbloom 	next_fd = -1;
64*25882Sbloom 	if (dh >= 0) {
65*25882Sbloom 		fixline(dh, dev->D_speed);
66*25882Sbloom 		write(dh, "\rATZH\r", 6);
67*25882Sbloom 		sleep(2);
68*25882Sbloom 		if (dochat(dev, flds, dh)) {
69*25882Sbloom 			logent(dcname, "CHAT FAILED");
70*25882Sbloom 			hyscls24(dh);
71*25882Sbloom 			return CF_DIAL;
72*25882Sbloom 		}
73*25882Sbloom 		write(dh, "AT&F&D3&C1E0X1\r", 15);
74*25882Sbloom 		if (expect("OK\r\n", dh) != 0) {
75*25882Sbloom 			logent(dcname, "HSM not responding OK");
76*25882Sbloom 			hyscls24(dh);
77*25882Sbloom 			return CF_DIAL;
78*25882Sbloom 		}
79*25882Sbloom 		if (toneflag)
80*25882Sbloom 			write(dh, "\rATDT", 5);
81*25882Sbloom 		else
82*25882Sbloom 			write(dh, "\rATDP", 5);
83*25882Sbloom 		write(dh, telno, strlen(telno));
84*25882Sbloom 		write(dh, "\r", 1);
85*25882Sbloom 
86*25882Sbloom 		if (expect("CONNECT", dh) != 0) {
87*25882Sbloom 			logent("HSM no carrier", _FAILED);
88*25882Sbloom 			strcpy(devSel, dev->D_line);
89*25882Sbloom 			hyscls24(dh);
90*25882Sbloom 			return CF_DIAL;
91*25882Sbloom 		}
92*25882Sbloom 
93*25882Sbloom 	}
94*25882Sbloom 	if (dh < 0) {
95*25882Sbloom 		logent(dcname, "CAN'T OPEN");
96*25882Sbloom 		return dh;
97*25882Sbloom 	}
98*25882Sbloom 	DEBUG(4, "hayes ok\n", CNULL);
99*25882Sbloom 	return dh;
100*25882Sbloom }
101*25882Sbloom 
102*25882Sbloom hyscls24(fd)
103*25882Sbloom int fd;
104*25882Sbloom {
105*25882Sbloom 	char dcname[20];
106*25882Sbloom 
107*25882Sbloom 	if (fd > 0) {
108*25882Sbloom 		sprintf(dcname, "/dev/%s", devSel);
109*25882Sbloom 		DEBUG(4, "Hanging up fd = %d\n", fd);
110*25882Sbloom 		sleep(1);
111*25882Sbloom /*
112*25882Sbloom  * Since we have a getty sleeping on this line, when it wakes up it sends
113*25882Sbloom  * all kinds of garbage to the modem.  Unfortunatly, the modem likes to
114*25882Sbloom  * execute the previous command when it sees the garbage.  The previous
115*25882Sbloom  * command was to dial the phone, so let's make the last command reset
116*25882Sbloom  * the modem.
117*25882Sbloom  */
118*25882Sbloom 		write(fd, "\r+++", 4);
119*25882Sbloom 		sleep(2);
120*25882Sbloom 		write(fd, "\rATH\rATZ\r", 9);
121*25882Sbloom 		sleep(2);
122*25882Sbloom 		close(fd);
123*25882Sbloom 		delock(devSel);
124*25882Sbloom 	}
125*25882Sbloom }
126*25882Sbloom #endif HAYES2400
127