xref: /csrg-svn/usr.bin/uucp/libacu/hys.c (revision 25154)
117774Sralph #ifndef lint
2*25154Sbloom static char sccsid[] = "@(#)hys.c	4.4 (Berkeley) 10/10/85";
317774Sralph #endif
417774Sralph 
517774Sralph #include "../condevs.h"
617774Sralph 
717774Sralph #ifdef HAYES
8*25154Sbloom #define USR2400	/* U.S. Robotics Courier 2400 */
9*25154Sbloom #ifdef USR2400
10*25154Sbloom #define DROPDTR
11*25154Sbloom #endif USR2400
12*25154Sbloom 
1323698Sbloom /*
1417774Sralph  *	hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call)
1517774Sralph  *	hystopn(telno, flds, dev) connect to hayes smartmodem (tone call)
1617774Sralph  *	char *flds[], *dev[];
1717774Sralph  *
1817774Sralph  *	return codes:
1917774Sralph  *		>0  -  file number  -  ok
2017774Sralph  *		CF_DIAL,CF_DEVICE  -  failed
2117774Sralph  */
2217774Sralph 
2317774Sralph hyspopn(telno, flds, dev)
2417774Sralph char *telno, *flds[];
2517774Sralph struct Devices *dev;
2617774Sralph {
2717774Sralph 	return hysopn(telno, flds, dev, 0);
2817774Sralph }
2917774Sralph 
3017774Sralph hystopn(telno, flds, dev)
3117774Sralph char *telno, *flds[];
3217774Sralph struct Devices *dev;
3317774Sralph {
3417774Sralph 	return hysopn(telno, flds, dev, 1);
3517774Sralph }
3617774Sralph 
3717774Sralph /* ARGSUSED */
3817774Sralph hysopn(telno, flds, dev, toneflag)
3917774Sralph char *telno;
4017774Sralph char *flds[];
4117774Sralph struct Devices *dev;
4217774Sralph int toneflag;
4317774Sralph {
4417774Sralph 	int	dh = -1;
4517774Sralph 	extern errno;
4617774Sralph 	char dcname[20];
4723731Sbloom 	char cbuf[MAXPH];
4823731Sbloom 	register char *cp;
4923731Sbloom 	register int i;
5017774Sralph 
5117774Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
5217774Sralph 	DEBUG(4, "dc - %s\n", dcname);
5317774Sralph 	if (setjmp(Sjbuf)) {
5417774Sralph 		logent(dcname, "TIMEOUT");
5517774Sralph 		if (dh >= 0)
5617774Sralph 			close(dh);
5717774Sralph 		return CF_DIAL;
5817774Sralph 	}
5917774Sralph 	signal(SIGALRM, alarmtr);
6017774Sralph 	getnextfd();
6117774Sralph 	alarm(10);
6217774Sralph 	dh = open(dcname, 2); /* read/write */
6317774Sralph 	alarm(0);
6417774Sralph 
6517774Sralph 	/* modem is open */
6617774Sralph 	next_fd = -1;
6717774Sralph 	if (dh >= 0) {
6817774Sralph 		fixline(dh, dev->D_speed);
6917774Sralph 		if (dochat(dev, flds, dh)) {
7017774Sralph 			logent(dcname, "CHAT FAILED");
7117774Sralph 			close(dh);
7217774Sralph 			return CF_DIAL;
7317774Sralph 		}
74*25154Sbloom 		write(dh, "ATV1E0H\r", 8);
7517774Sralph 		if (expect("OK\r\n", dh) != 0) {
7617774Sralph 			logent(dcname, "HSM seems dead");
77*25154Sbloom 			hyscls(dh);
7817774Sralph 			return CF_DIAL;
7917774Sralph 		}
80*25154Sbloom #ifdef USR2400
81*25154Sbloom 		write(dh, "ATX6\r", 5);
82*25154Sbloom 		if (expect("OK\r\n", dh) != 0) {
83*25154Sbloom 			logent(dcname, "HSM seems dead");
84*25154Sbloom 			hyscls(dh);
85*25154Sbloom 			return CF_DIAL;
86*25154Sbloom 		}
87*25154Sbloom #endif USR2400
8817774Sralph 		if (toneflag)
8917774Sralph 			write(dh, "\rATDT", 5);
9017774Sralph 		else
9117774Sralph 			write(dh, "\rATDP", 5);
9217774Sralph 		write(dh, telno, strlen(telno));
9317774Sralph 		write(dh, "\r", 1);
9417774Sralph 
9523731Sbloom 		if (setjmp(Sjbuf)) {
9623731Sbloom 			logent(dcname, "TIMEOUT");
9723731Sbloom 			strcpy(devSel, dev->D_line);
9823731Sbloom 			hyscls(dh);
9923731Sbloom 			return CF_DIAL;
10023731Sbloom 		}
10123731Sbloom 		signal(SIGALRM, alarmtr);
102*25154Sbloom 		do {
103*25154Sbloom 			alarm(MAXMSGTIME);
104*25154Sbloom 			cp = cbuf;
105*25154Sbloom 			while (read(dh, cp ,1) == 1)
106*25154Sbloom 				if (*cp >= ' ')
107*25154Sbloom 					break;
108*25154Sbloom 			while (++cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp != '\n')
109*25154Sbloom 				;
110*25154Sbloom 			alarm(0);
111*25154Sbloom 			*cp-- = '\0';
112*25154Sbloom 			if (*cp == '\r')
113*25154Sbloom 				*cp = '\0';
114*25154Sbloom 			DEBUG(4,"\nGOT: %s", cbuf);
115*25154Sbloom 		} while (strncmp(cbuf, "RING", 4) == 0);
11623731Sbloom 		if (strncmp(cbuf, "CONNECT", 7) != 0) {
117*25154Sbloom 			logent(cbuf, _FAILED);
11817774Sralph 			strcpy(devSel, dev->D_line);
11917774Sralph 			hyscls(dh);
12017774Sralph 			return CF_DIAL;
12117774Sralph 		}
12223731Sbloom 		i = atoi(&cbuf[8]);
12323731Sbloom 		if (i > 0 && i != dev->D_speed) {
12423731Sbloom 			DEBUG(4,"Baudrate reset to %d\n", i);
12523731Sbloom 			fixline(dh, i);
12623731Sbloom 		}
12717774Sralph 
12817774Sralph 	}
12917774Sralph 	if (dh < 0) {
13017774Sralph 		logent(dcname, "CAN'T OPEN");
13117774Sralph 		return dh;
13217774Sralph 	}
13317774Sralph 	DEBUG(4, "hayes ok\n", CNULL);
13417774Sralph 	return dh;
13517774Sralph }
13617774Sralph 
13717774Sralph hyscls(fd)
13817774Sralph int fd;
13917774Sralph {
14017774Sralph 	char dcname[20];
14117774Sralph #ifdef DROPDTR
14217774Sralph 	struct sgttyb hup, sav;
14317774Sralph #endif
14417774Sralph 
14517774Sralph 	if (fd > 0) {
14617774Sralph 		sprintf(dcname, "/dev/%s", devSel);
14717774Sralph 		DEBUG(4, "Hanging up fd = %d\n", fd);
14817774Sralph #ifdef DROPDTR
14917774Sralph 		/*
15017774Sralph 		 * code to drop DTR -- change to 0 baud then back to default.
15117774Sralph 		 */
15217774Sralph 		gtty(fd, &hup);
15317774Sralph 		gtty(fd, &sav);
15417774Sralph 		hup.sg_ispeed = B0;
15517774Sralph 		hup.sg_ospeed = B0;
15617774Sralph 		stty(fd, &hup);
15717774Sralph 		sleep(2);
15817774Sralph 		stty(fd, &sav);
15917774Sralph 		/*
16017774Sralph 		 * now raise DTR -- close the device & open it again.
16117774Sralph 		 */
16217774Sralph 		sleep(2);
16317774Sralph 		close(fd);
16417774Sralph 		sleep(2);
16517774Sralph 		fd = open(dcname, 2);
166*25154Sbloom 		stty(fd, &sav);
16717774Sralph #else
16817774Sralph 		sleep(3);
16917774Sralph 		write(fd, "+++", 3);
17017774Sralph #endif
17117774Sralph 		sleep(3);
17217774Sralph 		write(fd, "ATZ\r", 4);
17323698Sbloom 		if (expect("OK",fd) != 0)
17417774Sralph 			logent(devSel, "HSM did not respond to ATZ");
17517774Sralph 		sleep(1);
17617774Sralph 		close(fd);
17717774Sralph 		delock(devSel);
17817774Sralph 	}
17917774Sralph }
18017774Sralph 
18117774Sralph #endif HAYES
18223698Sbloom 
183