xref: /csrg-svn/usr.bin/uucp/libacu/hys.c (revision 33585)
117774Sralph #ifndef lint
2*33585Srick static char sccsid[] = "@(#)hys.c	4.7 (Berkeley) 02/24/88";
317774Sralph #endif
417774Sralph 
517774Sralph #include "../condevs.h"
617774Sralph 
725154Sbloom #ifdef USR2400
825154Sbloom #define DROPDTR
925885Sbloom /*
1025885Sbloom  * The "correct" switch settings for a USR Courier 2400 are
1125885Sbloom  * 	Dialin/out:	0 0 1 1 0 0 0 1 0 0
1225885Sbloom  *	Dialout only:	0 0 1 1 1 1 0 1 0 0
1325885Sbloom  * where 0 = off and 1 = on
1425885Sbloom  */
1525154Sbloom #endif USR2400
1625154Sbloom 
1723698Sbloom /*
1817774Sralph  *	hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call)
1917774Sralph  *	hystopn(telno, flds, dev) connect to hayes smartmodem (tone call)
2017774Sralph  *	char *flds[], *dev[];
2117774Sralph  *
2217774Sralph  *	return codes:
2317774Sralph  *		>0  -  file number  -  ok
2417774Sralph  *		CF_DIAL,CF_DEVICE  -  failed
2517774Sralph  */
2617774Sralph 
2717774Sralph hyspopn(telno, flds, dev)
2817774Sralph char *telno, *flds[];
2917774Sralph struct Devices *dev;
3017774Sralph {
3117774Sralph 	return hysopn(telno, flds, dev, 0);
3217774Sralph }
3317774Sralph 
3417774Sralph hystopn(telno, flds, dev)
3517774Sralph char *telno, *flds[];
3617774Sralph struct Devices *dev;
3717774Sralph {
3817774Sralph 	return hysopn(telno, flds, dev, 1);
3917774Sralph }
4017774Sralph 
4117774Sralph /* ARGSUSED */
4217774Sralph hysopn(telno, flds, dev, toneflag)
4317774Sralph char *telno;
4417774Sralph char *flds[];
4517774Sralph struct Devices *dev;
4617774Sralph int toneflag;
4717774Sralph {
4817774Sralph 	extern errno;
4917774Sralph 	char dcname[20];
5023731Sbloom 	char cbuf[MAXPH];
5123731Sbloom 	register char *cp;
5223731Sbloom 	register int i;
5325885Sbloom 	int dh = -1, nrings = 0;
5417774Sralph 
5517774Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
5617774Sralph 	DEBUG(4, "dc - %s\n", dcname);
5717774Sralph 	if (setjmp(Sjbuf)) {
5817774Sralph 		logent(dcname, "TIMEOUT");
5917774Sralph 		if (dh >= 0)
6025885Sbloom 			hyscls(dh);
6117774Sralph 		return CF_DIAL;
6217774Sralph 	}
6317774Sralph 	signal(SIGALRM, alarmtr);
6417774Sralph 	getnextfd();
6517774Sralph 	alarm(10);
6617774Sralph 	dh = open(dcname, 2); /* read/write */
6717774Sralph 	alarm(0);
6817774Sralph 
6917774Sralph 	/* modem is open */
7017774Sralph 	next_fd = -1;
7117774Sralph 	if (dh >= 0) {
7217774Sralph 		fixline(dh, dev->D_speed);
7317774Sralph 		if (dochat(dev, flds, dh)) {
7417774Sralph 			logent(dcname, "CHAT FAILED");
7525885Sbloom 			hyscls(dh);
7617774Sralph 			return CF_DIAL;
7717774Sralph 		}
7825154Sbloom 		write(dh, "ATV1E0H\r", 8);
7917774Sralph 		if (expect("OK\r\n", dh) != 0) {
8017774Sralph 			logent(dcname, "HSM seems dead");
8125154Sbloom 			hyscls(dh);
8217774Sralph 			return CF_DIAL;
8317774Sralph 		}
8425154Sbloom #ifdef USR2400
8525885Sbloom 		write(dh, "ATX6S7=44\r", 10);
8625154Sbloom 		if (expect("OK\r\n", dh) != 0) {
8725154Sbloom 			logent(dcname, "HSM seems dead");
8825154Sbloom 			hyscls(dh);
8925154Sbloom 			return CF_DIAL;
9025154Sbloom 		}
9125154Sbloom #endif USR2400
9217774Sralph 		if (toneflag)
9317774Sralph 			write(dh, "\rATDT", 5);
9417774Sralph 		else
9525885Sbloom #ifdef USR2400
9625885Sbloom 			write(dh, "\rATD", 4);
9725885Sbloom #else HAYES
9817774Sralph 			write(dh, "\rATDP", 5);
9925885Sbloom #endif HAYES
10017774Sralph 		write(dh, telno, strlen(telno));
10117774Sralph 		write(dh, "\r", 1);
10217774Sralph 
10323731Sbloom 		if (setjmp(Sjbuf)) {
10423731Sbloom 			logent(dcname, "TIMEOUT");
10523731Sbloom 			strcpy(devSel, dev->D_line);
10623731Sbloom 			hyscls(dh);
10723731Sbloom 			return CF_DIAL;
10823731Sbloom 		}
10923731Sbloom 		signal(SIGALRM, alarmtr);
11025885Sbloom 		alarm(2*MAXMSGTIME);
11125154Sbloom 		do {
11225154Sbloom 			cp = cbuf;
11325154Sbloom 			while (read(dh, cp ,1) == 1)
11425154Sbloom 				if (*cp >= ' ')
11525154Sbloom 					break;
11625154Sbloom 			while (++cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp != '\n')
11725154Sbloom 				;
11825154Sbloom 			alarm(0);
11925154Sbloom 			*cp-- = '\0';
12025154Sbloom 			if (*cp == '\r')
12125154Sbloom 				*cp = '\0';
12225154Sbloom 			DEBUG(4,"\nGOT: %s", cbuf);
12325885Sbloom 			alarm(MAXMSGTIME);
124*33585Srick 		} while ((strncmp(cbuf, "RING", 4) == 0 ||
125*33585Srick 			 strncmp(cbuf, "RRING", 5) == 0) && nrings++ < 5);
12623731Sbloom 		if (strncmp(cbuf, "CONNECT", 7) != 0) {
12725154Sbloom 			logent(cbuf, _FAILED);
12817774Sralph 			strcpy(devSel, dev->D_line);
12917774Sralph 			hyscls(dh);
13017774Sralph 			return CF_DIAL;
13117774Sralph 		}
132*33585Srick #undef DONTRESETBAUDRATE
133*33585Srick #ifndef DONTRESETBAUDRATE
13423731Sbloom 		i = atoi(&cbuf[8]);
13523731Sbloom 		if (i > 0 && i != dev->D_speed) {
13623731Sbloom 			DEBUG(4,"Baudrate reset to %d\n", i);
13723731Sbloom 			fixline(dh, i);
13823731Sbloom 		}
139*33585Srick #endif /* DONTRESETBAUDRATE */
14017774Sralph 
14117774Sralph 	}
14217774Sralph 	if (dh < 0) {
14317774Sralph 		logent(dcname, "CAN'T OPEN");
14417774Sralph 		return dh;
14517774Sralph 	}
14617774Sralph 	DEBUG(4, "hayes ok\n", CNULL);
14717774Sralph 	return dh;
14817774Sralph }
14917774Sralph 
15017774Sralph hyscls(fd)
15117774Sralph int fd;
15217774Sralph {
15317774Sralph 	char dcname[20];
15417774Sralph #ifdef DROPDTR
15517774Sralph 	struct sgttyb hup, sav;
15617774Sralph #endif
15717774Sralph 
15817774Sralph 	if (fd > 0) {
15917774Sralph 		sprintf(dcname, "/dev/%s", devSel);
16017774Sralph 		DEBUG(4, "Hanging up fd = %d\n", fd);
16117774Sralph #ifdef DROPDTR
16217774Sralph 		/*
16317774Sralph 		 * code to drop DTR -- change to 0 baud then back to default.
16417774Sralph 		 */
16517774Sralph 		gtty(fd, &hup);
16617774Sralph 		gtty(fd, &sav);
16717774Sralph 		hup.sg_ispeed = B0;
16817774Sralph 		hup.sg_ospeed = B0;
16917774Sralph 		stty(fd, &hup);
17017774Sralph 		sleep(2);
17117774Sralph 		stty(fd, &sav);
17217774Sralph 		/*
17317774Sralph 		 * now raise DTR -- close the device & open it again.
17417774Sralph 		 */
17517774Sralph 		sleep(2);
17617774Sralph 		close(fd);
17717774Sralph 		sleep(2);
17817774Sralph 		fd = open(dcname, 2);
17925154Sbloom 		stty(fd, &sav);
18017774Sralph #else
18117774Sralph 		sleep(3);
18217774Sralph 		write(fd, "+++", 3);
18317774Sralph #endif
18417774Sralph 		sleep(3);
185*33585Srick 		write(fd, "ATH\r", 4);
186*33585Srick /*
18723698Sbloom 		if (expect("OK",fd) != 0)
18817774Sralph 			logent(devSel, "HSM did not respond to ATZ");
189*33585Srick */
19017774Sralph 		sleep(1);
191*33585Srick 		write(fd, "ATZ\r", 4);
192*33585Srick 		sleep(1);
19317774Sralph 		close(fd);
19417774Sralph 		delock(devSel);
19517774Sralph 	}
19617774Sralph }
197