xref: /csrg-svn/usr.bin/uucp/libacu/hys24.c (revision 34193)
125882Sbloom #ifndef lint
2*34193Srick static char sccsid[] = "@(#)hys24.c	1.5	(Berkeley) 05/05/88";
325882Sbloom #endif !lint
425882Sbloom 
525882Sbloom #include "../condevs.h"
625882Sbloom 
725882Sbloom /*
8*34193Srick  * hyspopn24(telno, flds, dev) connect to hayes smartmodem (pulse call)
9*34193Srick  * hystopn24(telno, flds, dev) connect to hayes smartmodem (tone call)
1025882Sbloom  *
11*34193Srick  * return codes: >0  -  file number  -  ok CF_DIAL,CF_DEVICE  -  failed
1225882Sbloom  */
1325882Sbloom 
14*34193Srick #include <sys/file.h>
15*34193Srick #include <sys/ioctl.h>
16*34193Srick 
1725882Sbloom hyspopn24(telno, flds, dev)
1825882Sbloom char *telno, *flds[];
1925882Sbloom struct Devices *dev;
2025882Sbloom {
2125882Sbloom 	return hysopn24(telno, flds, dev, 0);
2225882Sbloom }
2325882Sbloom 
2425882Sbloom hystopn24(telno, flds, dev)
2525882Sbloom char *telno, *flds[];
2625882Sbloom struct Devices *dev;
2725882Sbloom {
2825882Sbloom 	return hysopn24(telno, flds, dev, 1);
2925882Sbloom }
3025882Sbloom 
3125882Sbloom /* ARGSUSED */
3225882Sbloom hysopn24(telno, flds, dev, toneflag)
3325882Sbloom char *telno;
3425882Sbloom char *flds[];
3525882Sbloom struct Devices *dev;
3625882Sbloom int toneflag;
3725882Sbloom {
38*34193Srick 	int dh = -1;
39*34193Srick 	int result, ix, speed;
4025882Sbloom 	char *ii;
4125882Sbloom 	extern errno;
4225882Sbloom 	char dcname[20];
43*34193Srick 	char resultbuf[16];
4425882Sbloom 
4525882Sbloom 	sprintf(dcname, "/dev/%s", dev->D_line);
4625882Sbloom 	DEBUG(4, "dc - %s\n", dcname);
4725882Sbloom 	if (setjmp(Sjbuf)) {
4825882Sbloom 		logent(dcname, "TIMEOUT");
4925882Sbloom 		if (dh >= 0)
50*34193Srick 			hyscls24(dh, 0);
5125882Sbloom 		return CF_DIAL;
5225882Sbloom 	}
5325882Sbloom 	signal(SIGALRM, alarmtr);
5425882Sbloom 	getnextfd();
5525882Sbloom 	alarm(10);
56*34193Srick 	dh = open(dcname, 2);	/* read/write */
5725882Sbloom 	alarm(0);
5825882Sbloom 
5925882Sbloom 	for (ii = telno; *ii; ii++)
6025882Sbloom 		if (*ii == '=')
61*34193Srick 			*ii = ',';
6225882Sbloom 
6325882Sbloom 	/* modem is open */
6425882Sbloom 	next_fd = -1;
6525882Sbloom 	if (dh >= 0) {
66*34193Srick 		ioctl(dh, TIOCHPCL, 0);
6725882Sbloom 		fixline(dh, dev->D_speed);
6825882Sbloom 		if (dochat(dev, flds, dh)) {
6925882Sbloom 			logent(dcname, "CHAT FAILED");
70*34193Srick 			hyscls24(dh, 0);
7125882Sbloom 			return CF_DIAL;
7225882Sbloom 		}
73*34193Srick 		hyscls24(dh, 1);/* make sure the line is reset */
74*34193Srick 		write(dh, "AT&F&D3&C1E0M0X3QV0Y\r", 21);
75*34193Srick 		if (expect("0\r", dh) != 0) {
7625882Sbloom 			logent(dcname, "HSM not responding OK");
77*34193Srick 			hyscls24(dh, 0);
7825882Sbloom 			return CF_DIAL;
7925882Sbloom 		}
8025882Sbloom 		if (toneflag)
8125882Sbloom 			write(dh, "\rATDT", 5);
8225882Sbloom 		else
8325882Sbloom 			write(dh, "\rATDP", 5);
8425882Sbloom 		write(dh, telno, strlen(telno));
8525882Sbloom 		write(dh, "\r", 1);
8625882Sbloom 
87*34193Srick 		if (setjmp(Sjbuf)) {
88*34193Srick 			logent(dcname, "Modem Hung");
89*34193Srick 			if (dh >= 0)
90*34193Srick 				hyscls24(dh, 0);
91*34193Srick 			return CF_DIAL;
92*34193Srick 		}
93*34193Srick 		signal(SIGALRM, alarmtr);
94*34193Srick 		alarm(120);
95*34193Srick 		do {
96*34193Srick 			for (ix = 0; ix < 16; ix++) {
97*34193Srick 				read(dh, resultbuf + ix, 1);
98*34193Srick 				DEBUG(6, "character read = 0x%X \n", resultbuf[ix]);
99*34193Srick 				if ((0x7f & resultbuf[ix]) == 0xd)
100*34193Srick 					break;
101*34193Srick 			}
102*34193Srick 
103*34193Srick 			result = atol(resultbuf);
104*34193Srick 			switch (result) {
105*34193Srick 			case 0:
106*34193Srick 				logent("HSM Spurious OK response", _FAILED);
107*34193Srick 				speed = 0;
108*34193Srick 				break;
109*34193Srick 			case 1:
110*34193Srick 				logent("HSM connected at 300 baud!", _FAILED);
111*34193Srick 				speed = -1;
112*34193Srick 				break;
113*34193Srick 			case 2:
114*34193Srick 				speed = 0;
115*34193Srick 				DEBUG(4, "Ringing", 0);
116*34193Srick 				break;
117*34193Srick 			case 3:
118*34193Srick 				logent("HSM No Carrier", _FAILED);
119*34193Srick 				speed = -1;
120*34193Srick 				break;
121*34193Srick 			case 4:
122*34193Srick 				logent("HSM Error", _FAILED);
123*34193Srick 				speed = -1;
124*34193Srick 				break;
125*34193Srick 			case 5:
126*34193Srick 				speed = 1200;
127*34193Srick 				break;
128*34193Srick 			case 6:
129*34193Srick 				logent("HSM No dialtone", _FAILED);
130*34193Srick 				speed = -1;
131*34193Srick 				break;
132*34193Srick 			case 7:
133*34193Srick 				logent("HSM detected BUSY", _FAILED);
134*34193Srick 				speed = -1;
135*34193Srick 				break;
136*34193Srick 			case 8:
137*34193Srick 				logent("HSM No quiet answer", _FAILED);
138*34193Srick 				speed = -1;
139*34193Srick 				break;
140*34193Srick 			case 10:
141*34193Srick 				speed = 2400;
142*34193Srick 				break;
143*34193Srick 			default:
144*34193Srick 				logent("HSM Unknown response", _FAILED);
145*34193Srick 				speed = -1;
146*34193Srick 				break;
147*34193Srick 			}
148*34193Srick 
149*34193Srick 		} while (speed == 0);
150*34193Srick 
151*34193Srick 		alarm(0);
152*34193Srick 
153*34193Srick 		if (speed < 0) {
15425882Sbloom 			strcpy(devSel, dev->D_line);
155*34193Srick 			hyscls24(dh, 0);
15625882Sbloom 			return CF_DIAL;
157*34193Srick 		} else if (speed != dev->D_speed) {
158*34193Srick 			DEBUG(4, "changing line speed to %d baud\n", speed);
159*34193Srick 			fixline(dh, speed);
16025882Sbloom 		}
16125882Sbloom 	}
16225882Sbloom 	if (dh < 0) {
16325882Sbloom 		logent(dcname, "CAN'T OPEN");
16425882Sbloom 		return dh;
16525882Sbloom 	}
16625882Sbloom 	DEBUG(4, "hayes ok\n", CNULL);
16725882Sbloom 	return dh;
16825882Sbloom }
16925882Sbloom 
170*34193Srick hyscls24(fd, flag)
171*34193Srick int fd, flag;
17225882Sbloom {
17325882Sbloom 	char dcname[20];
174*34193Srick 	int fff = FREAD;
17525882Sbloom 
17625882Sbloom 	if (fd > 0) {
17725882Sbloom 		sprintf(dcname, "/dev/%s", devSel);
178*34193Srick 		if (flag)
179*34193Srick 			DEBUG(4, "Resetting fd = %d\n", fd);
180*34193Srick 		else
181*34193Srick 			DEBUG(4, "Hanging up fd = %d\n", fd);
182*34193Srick 		/*
183*34193Srick 		 * Since we have a getty sleeping on this line, when it wakes
184*34193Srick 		 * up it sends all kinds of garbage to the modem.
185*34193Srick 		 * Unfortunatly, the modem likes to execute the previous
186*34193Srick 		 * command when it sees the garbage.  The previous command
187*34193Srick 		 * was to dial the phone, so let's make the last command
188*34193Srick 		 * reset the modem.
189*34193Srick 		 */
190*34193Srick 		if (!flag)
191*34193Srick 			fixline(fd, 2400);
192*34193Srick 		write(fd, "\r", 1);
19325882Sbloom 		sleep(2);
194*34193Srick 		write(fd, "+++", 3);
195*34193Srick 		sleep(3);
19625882Sbloom 		write(fd, "\rATH\rATZ\r", 9);
19725882Sbloom 		sleep(2);
198*34193Srick 		ioctl(fd, TIOCFLUSH, &fff);
199*34193Srick 
200*34193Srick 		if (!flag) {
201*34193Srick 			close(fd);
202*34193Srick 			delock(devSel);
203*34193Srick 		}
20425882Sbloom 	}
20525882Sbloom }
206