xref: /csrg-svn/usr.bin/uucp/libacu/hys.c (revision 25885)
117774Sralph #ifndef lint
2*25885Sbloom static char sccsid[] = "@(#)hys.c	4.5 (Berkeley) 01/13/86";
317774Sralph #endif
417774Sralph 
517774Sralph #include "../condevs.h"
617774Sralph 
717774Sralph #ifdef HAYES
825154Sbloom #define USR2400	/* U.S. Robotics Courier 2400 */
925154Sbloom #ifdef USR2400
1025154Sbloom #define DROPDTR
11*25885Sbloom /*
12*25885Sbloom  * The "correct" switch settings for a USR Courier 2400 are
13*25885Sbloom  * 	Dialin/out:	0 0 1 1 0 0 0 1 0 0
14*25885Sbloom  *	Dialout only:	0 0 1 1 1 1 0 1 0 0
15*25885Sbloom  * where 0 = off and 1 = on
16*25885Sbloom  */
1725154Sbloom #endif USR2400
1825154Sbloom 
1923698Sbloom /*
2017774Sralph  *	hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call)
2117774Sralph  *	hystopn(telno, flds, dev) connect to hayes smartmodem (tone call)
2217774Sralph  *	char *flds[], *dev[];
2317774Sralph  *
2417774Sralph  *	return codes:
2517774Sralph  *		>0  -  file number  -  ok
2617774Sralph  *		CF_DIAL,CF_DEVICE  -  failed
2717774Sralph  */
2817774Sralph 
2917774Sralph hyspopn(telno, flds, dev)
3017774Sralph char *telno, *flds[];
3117774Sralph struct Devices *dev;
3217774Sralph {
3317774Sralph 	return hysopn(telno, flds, dev, 0);
3417774Sralph }
3517774Sralph 
3617774Sralph hystopn(telno, flds, dev)
3717774Sralph char *telno, *flds[];
3817774Sralph struct Devices *dev;
3917774Sralph {
4017774Sralph 	return hysopn(telno, flds, dev, 1);
4117774Sralph }
4217774Sralph 
4317774Sralph /* ARGSUSED */
4417774Sralph hysopn(telno, flds, dev, toneflag)
4517774Sralph char *telno;
4617774Sralph char *flds[];
4717774Sralph struct Devices *dev;
4817774Sralph int toneflag;
4917774Sralph {
5017774Sralph 	extern errno;
5117774Sralph 	char dcname[20];
5223731Sbloom 	char cbuf[MAXPH];
5323731Sbloom 	register char *cp;
5423731Sbloom 	register int i;
55*25885Sbloom 	int dh = -1, nrings = 0;
5617774Sralph 
5717774Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
5817774Sralph 	DEBUG(4, "dc - %s\n", dcname);
5917774Sralph 	if (setjmp(Sjbuf)) {
6017774Sralph 		logent(dcname, "TIMEOUT");
6117774Sralph 		if (dh >= 0)
62*25885Sbloom 			hyscls(dh);
6317774Sralph 		return CF_DIAL;
6417774Sralph 	}
6517774Sralph 	signal(SIGALRM, alarmtr);
6617774Sralph 	getnextfd();
6717774Sralph 	alarm(10);
6817774Sralph 	dh = open(dcname, 2); /* read/write */
6917774Sralph 	alarm(0);
7017774Sralph 
7117774Sralph 	/* modem is open */
7217774Sralph 	next_fd = -1;
7317774Sralph 	if (dh >= 0) {
7417774Sralph 		fixline(dh, dev->D_speed);
7517774Sralph 		if (dochat(dev, flds, dh)) {
7617774Sralph 			logent(dcname, "CHAT FAILED");
77*25885Sbloom 			hyscls(dh);
7817774Sralph 			return CF_DIAL;
7917774Sralph 		}
8025154Sbloom 		write(dh, "ATV1E0H\r", 8);
8117774Sralph 		if (expect("OK\r\n", dh) != 0) {
8217774Sralph 			logent(dcname, "HSM seems dead");
8325154Sbloom 			hyscls(dh);
8417774Sralph 			return CF_DIAL;
8517774Sralph 		}
8625154Sbloom #ifdef USR2400
87*25885Sbloom 		write(dh, "ATX6S7=44\r", 10);
8825154Sbloom 		if (expect("OK\r\n", dh) != 0) {
8925154Sbloom 			logent(dcname, "HSM seems dead");
9025154Sbloom 			hyscls(dh);
9125154Sbloom 			return CF_DIAL;
9225154Sbloom 		}
9325154Sbloom #endif USR2400
9417774Sralph 		if (toneflag)
9517774Sralph 			write(dh, "\rATDT", 5);
9617774Sralph 		else
97*25885Sbloom #ifdef USR2400
98*25885Sbloom 			write(dh, "\rATD", 4);
99*25885Sbloom #else HAYES
10017774Sralph 			write(dh, "\rATDP", 5);
101*25885Sbloom #endif HAYES
10217774Sralph 		write(dh, telno, strlen(telno));
10317774Sralph 		write(dh, "\r", 1);
10417774Sralph 
10523731Sbloom 		if (setjmp(Sjbuf)) {
10623731Sbloom 			logent(dcname, "TIMEOUT");
10723731Sbloom 			strcpy(devSel, dev->D_line);
10823731Sbloom 			hyscls(dh);
10923731Sbloom 			return CF_DIAL;
11023731Sbloom 		}
11123731Sbloom 		signal(SIGALRM, alarmtr);
112*25885Sbloom 		alarm(2*MAXMSGTIME);
11325154Sbloom 		do {
11425154Sbloom 			cp = cbuf;
11525154Sbloom 			while (read(dh, cp ,1) == 1)
11625154Sbloom 				if (*cp >= ' ')
11725154Sbloom 					break;
11825154Sbloom 			while (++cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp != '\n')
11925154Sbloom 				;
12025154Sbloom 			alarm(0);
12125154Sbloom 			*cp-- = '\0';
12225154Sbloom 			if (*cp == '\r')
12325154Sbloom 				*cp = '\0';
12425154Sbloom 			DEBUG(4,"\nGOT: %s", cbuf);
125*25885Sbloom 			alarm(MAXMSGTIME);
126*25885Sbloom 		} while (strncmp(cbuf, "RING", 4) == 0 && nrings++ < 5);
12723731Sbloom 		if (strncmp(cbuf, "CONNECT", 7) != 0) {
12825154Sbloom 			logent(cbuf, _FAILED);
12917774Sralph 			strcpy(devSel, dev->D_line);
13017774Sralph 			hyscls(dh);
13117774Sralph 			return CF_DIAL;
13217774Sralph 		}
13323731Sbloom 		i = atoi(&cbuf[8]);
13423731Sbloom 		if (i > 0 && i != dev->D_speed) {
13523731Sbloom 			DEBUG(4,"Baudrate reset to %d\n", i);
13623731Sbloom 			fixline(dh, i);
13723731Sbloom 		}
13817774Sralph 
13917774Sralph 	}
14017774Sralph 	if (dh < 0) {
14117774Sralph 		logent(dcname, "CAN'T OPEN");
14217774Sralph 		return dh;
14317774Sralph 	}
14417774Sralph 	DEBUG(4, "hayes ok\n", CNULL);
14517774Sralph 	return dh;
14617774Sralph }
14717774Sralph 
14817774Sralph hyscls(fd)
14917774Sralph int fd;
15017774Sralph {
15117774Sralph 	char dcname[20];
15217774Sralph #ifdef DROPDTR
15317774Sralph 	struct sgttyb hup, sav;
15417774Sralph #endif
15517774Sralph 
15617774Sralph 	if (fd > 0) {
15717774Sralph 		sprintf(dcname, "/dev/%s", devSel);
15817774Sralph 		DEBUG(4, "Hanging up fd = %d\n", fd);
15917774Sralph #ifdef DROPDTR
16017774Sralph 		/*
16117774Sralph 		 * code to drop DTR -- change to 0 baud then back to default.
16217774Sralph 		 */
16317774Sralph 		gtty(fd, &hup);
16417774Sralph 		gtty(fd, &sav);
16517774Sralph 		hup.sg_ispeed = B0;
16617774Sralph 		hup.sg_ospeed = B0;
16717774Sralph 		stty(fd, &hup);
16817774Sralph 		sleep(2);
16917774Sralph 		stty(fd, &sav);
17017774Sralph 		/*
17117774Sralph 		 * now raise DTR -- close the device & open it again.
17217774Sralph 		 */
17317774Sralph 		sleep(2);
17417774Sralph 		close(fd);
17517774Sralph 		sleep(2);
17617774Sralph 		fd = open(dcname, 2);
17725154Sbloom 		stty(fd, &sav);
17817774Sralph #else
17917774Sralph 		sleep(3);
18017774Sralph 		write(fd, "+++", 3);
18117774Sralph #endif
18217774Sralph 		sleep(3);
18317774Sralph 		write(fd, "ATZ\r", 4);
18423698Sbloom 		if (expect("OK",fd) != 0)
18517774Sralph 			logent(devSel, "HSM did not respond to ATZ");
186*25885Sbloom 		write(fd, "ATH\r", 4);
18717774Sralph 		sleep(1);
18817774Sralph 		close(fd);
18917774Sralph 		delock(devSel);
19017774Sralph 	}
19117774Sralph }
19217774Sralph #endif HAYES
193