xref: /csrg-svn/usr.bin/uucp/libacu/hys24.c (revision 46875)
125882Sbloom #ifndef lint
2*46875Sbostic static char sccsid[] = "@(#)hys24.c	1.7	(Berkeley) 03/02/91";
325882Sbloom #endif !lint
425882Sbloom 
5*46875Sbostic #include "condevs.h"
625882Sbloom 
725882Sbloom /*
834193Srick  * hyspopn24(telno, flds, dev) connect to hayes smartmodem (pulse call)
934193Srick  * hystopn24(telno, flds, dev) connect to hayes smartmodem (tone call)
1025882Sbloom  *
1134193Srick  * return codes: >0  -  file number  -  ok CF_DIAL,CF_DEVICE  -  failed
1225882Sbloom  */
1325882Sbloom 
1434193Srick #include <sys/file.h>
1534193Srick #include <sys/ioctl.h>
1634193Srick 
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 {
3834193Srick 	int dh = -1;
3934193Srick 	int result, ix, speed;
4025882Sbloom 	char *ii;
4125882Sbloom 	extern errno;
4225882Sbloom 	char dcname[20];
4334193Srick 	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)
5034193Srick 			hyscls24(dh, 0);
5125882Sbloom 		return CF_DIAL;
5225882Sbloom 	}
5325882Sbloom 	signal(SIGALRM, alarmtr);
5425882Sbloom 	getnextfd();
5525882Sbloom 	alarm(10);
5634193Srick 	dh = open(dcname, 2);	/* read/write */
5725882Sbloom 	alarm(0);
5825882Sbloom 
5925882Sbloom 	for (ii = telno; *ii; ii++)
6025882Sbloom 		if (*ii == '=')
6134193Srick 			*ii = ',';
6225882Sbloom 
6325882Sbloom 	/* modem is open */
6425882Sbloom 	next_fd = -1;
6525882Sbloom 	if (dh >= 0) {
6634193Srick 		ioctl(dh, TIOCHPCL, 0);
6725882Sbloom 		fixline(dh, dev->D_speed);
6825882Sbloom 		if (dochat(dev, flds, dh)) {
6925882Sbloom 			logent(dcname, "CHAT FAILED");
7034193Srick 			hyscls24(dh, 0);
7125882Sbloom 			return CF_DIAL;
7225882Sbloom 		}
7334193Srick 		hyscls24(dh, 1);/* make sure the line is reset */
7434193Srick 		write(dh, "AT&F&D3&C1E0M0X3QV0Y\r", 21);
7534193Srick 		if (expect("0\r", dh) != 0) {
7625882Sbloom 			logent(dcname, "HSM not responding OK");
7734193Srick 			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 
8734193Srick 		if (setjmp(Sjbuf)) {
8834193Srick 			logent(dcname, "Modem Hung");
8934193Srick 			if (dh >= 0)
9034193Srick 				hyscls24(dh, 0);
9134193Srick 			return CF_DIAL;
9234193Srick 		}
9334193Srick 		signal(SIGALRM, alarmtr);
9434193Srick 		alarm(120);
9534193Srick 		do {
9634193Srick 			for (ix = 0; ix < 16; ix++) {
9734193Srick 				read(dh, resultbuf + ix, 1);
9834193Srick 				DEBUG(6, "character read = 0x%X \n", resultbuf[ix]);
9934193Srick 				if ((0x7f & resultbuf[ix]) == 0xd)
10034193Srick 					break;
10134193Srick 			}
10234193Srick 
10334193Srick 			result = atol(resultbuf);
10434193Srick 			switch (result) {
10534193Srick 			case 0:
10634193Srick 				logent("HSM Spurious OK response", _FAILED);
10734193Srick 				speed = 0;
10834193Srick 				break;
10934193Srick 			case 1:
11034193Srick 				logent("HSM connected at 300 baud!", _FAILED);
11134193Srick 				speed = -1;
11234193Srick 				break;
11334193Srick 			case 2:
11434193Srick 				speed = 0;
11534193Srick 				DEBUG(4, "Ringing", 0);
11634193Srick 				break;
11734193Srick 			case 3:
11834193Srick 				logent("HSM No Carrier", _FAILED);
11934193Srick 				speed = -1;
12034193Srick 				break;
12134193Srick 			case 4:
12234193Srick 				logent("HSM Error", _FAILED);
12334193Srick 				speed = -1;
12434193Srick 				break;
12534193Srick 			case 5:
12634193Srick 				speed = 1200;
12734193Srick 				break;
12834193Srick 			case 6:
12934193Srick 				logent("HSM No dialtone", _FAILED);
13034193Srick 				speed = -1;
13134193Srick 				break;
13234193Srick 			case 7:
13334193Srick 				logent("HSM detected BUSY", _FAILED);
13434193Srick 				speed = -1;
13534193Srick 				break;
13634193Srick 			case 8:
13734193Srick 				logent("HSM No quiet answer", _FAILED);
13834193Srick 				speed = -1;
13934193Srick 				break;
14034193Srick 			case 10:
14134193Srick 				speed = 2400;
14234193Srick 				break;
14334193Srick 			default:
14434193Srick 				logent("HSM Unknown response", _FAILED);
14534193Srick 				speed = -1;
14634193Srick 				break;
14734193Srick 			}
14834193Srick 
14934193Srick 		} while (speed == 0);
15034193Srick 
15134193Srick 		alarm(0);
15234193Srick 
15334193Srick 		if (speed < 0) {
15425882Sbloom 			strcpy(devSel, dev->D_line);
15534193Srick 			hyscls24(dh, 0);
15625882Sbloom 			return CF_DIAL;
15734193Srick 		} else if (speed != dev->D_speed) {
15834193Srick 			DEBUG(4, "changing line speed to %d baud\n", speed);
15934193Srick 			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 
17034193Srick hyscls24(fd, flag)
17134193Srick int fd, flag;
17225882Sbloom {
17325882Sbloom 	char dcname[20];
17444321Sbostic 	int fff = 1;
17525882Sbloom 
17625882Sbloom 	if (fd > 0) {
17725882Sbloom 		sprintf(dcname, "/dev/%s", devSel);
17834193Srick 		if (flag)
17934193Srick 			DEBUG(4, "Resetting fd = %d\n", fd);
18034193Srick 		else
18134193Srick 			DEBUG(4, "Hanging up fd = %d\n", fd);
18234193Srick 		/*
18334193Srick 		 * Since we have a getty sleeping on this line, when it wakes
18434193Srick 		 * up it sends all kinds of garbage to the modem.
18534193Srick 		 * Unfortunatly, the modem likes to execute the previous
18634193Srick 		 * command when it sees the garbage.  The previous command
18734193Srick 		 * was to dial the phone, so let's make the last command
18834193Srick 		 * reset the modem.
18934193Srick 		 */
19034193Srick 		if (!flag)
19134193Srick 			fixline(fd, 2400);
19234193Srick 		write(fd, "\r", 1);
19325882Sbloom 		sleep(2);
19434193Srick 		write(fd, "+++", 3);
19534193Srick 		sleep(3);
19625882Sbloom 		write(fd, "\rATH\rATZ\r", 9);
19725882Sbloom 		sleep(2);
19834193Srick 		ioctl(fd, TIOCFLUSH, &fff);
19934193Srick 
20034193Srick 		if (!flag) {
20134193Srick 			close(fd);
20234193Srick 			delock(devSel);
20334193Srick 		}
20425882Sbloom 	}
20525882Sbloom }
206