xref: /csrg-svn/usr.bin/uucp/libacu/hys.c (revision 23698)
117774Sralph #ifndef lint
2*23698Sbloom static char sccsid[] = "@(#)hys.c	4.2 (Berkeley) 06/23/85";
317774Sralph #endif
417774Sralph 
517774Sralph #include "../condevs.h"
617774Sralph 
717774Sralph #ifdef HAYES
8*23698Sbloom /*
917774Sralph  *	hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call)
1017774Sralph  *	hystopn(telno, flds, dev) connect to hayes smartmodem (tone call)
1117774Sralph  *	char *flds[], *dev[];
1217774Sralph  *
1317774Sralph  *	return codes:
1417774Sralph  *		>0  -  file number  -  ok
1517774Sralph  *		CF_DIAL,CF_DEVICE  -  failed
1617774Sralph  */
1717774Sralph 
1817774Sralph hyspopn(telno, flds, dev)
1917774Sralph char *telno, *flds[];
2017774Sralph struct Devices *dev;
2117774Sralph {
2217774Sralph 	return hysopn(telno, flds, dev, 0);
2317774Sralph }
2417774Sralph 
2517774Sralph hystopn(telno, flds, dev)
2617774Sralph char *telno, *flds[];
2717774Sralph struct Devices *dev;
2817774Sralph {
2917774Sralph 	return hysopn(telno, flds, dev, 1);
3017774Sralph }
3117774Sralph 
3217774Sralph /* ARGSUSED */
3317774Sralph hysopn(telno, flds, dev, toneflag)
3417774Sralph char *telno;
3517774Sralph char *flds[];
3617774Sralph struct Devices *dev;
3717774Sralph int toneflag;
3817774Sralph {
3917774Sralph 	int	dh = -1;
4017774Sralph 	extern errno;
4117774Sralph 	char dcname[20];
4217774Sralph 
4317774Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
4417774Sralph 	DEBUG(4, "dc - %s\n", dcname);
4517774Sralph 	if (setjmp(Sjbuf)) {
4617774Sralph 		logent(dcname, "TIMEOUT");
4717774Sralph 		if (dh >= 0)
4817774Sralph 			close(dh);
4917774Sralph 		return CF_DIAL;
5017774Sralph 	}
5117774Sralph 	signal(SIGALRM, alarmtr);
5217774Sralph 	getnextfd();
5317774Sralph 	alarm(10);
5417774Sralph 	dh = open(dcname, 2); /* read/write */
5517774Sralph 	alarm(0);
5617774Sralph 
5717774Sralph 	/* modem is open */
5817774Sralph 	next_fd = -1;
5917774Sralph 	if (dh >= 0) {
6017774Sralph 		fixline(dh, dev->D_speed);
6117774Sralph 		if (dochat(dev, flds, dh)) {
6217774Sralph 			logent(dcname, "CHAT FAILED");
6317774Sralph 			close(dh);
6417774Sralph 			return CF_DIAL;
6517774Sralph 		}
66*23698Sbloom 		write(dh, "ATV1H\r", 6);
6717774Sralph 		if (expect("OK\r\n", dh) != 0) {
6817774Sralph 			logent(dcname, "HSM seems dead");
6917774Sralph 			close(dh);
7017774Sralph 			return CF_DIAL;
7117774Sralph 		}
7217774Sralph 		if (toneflag)
7317774Sralph 			write(dh, "\rATDT", 5);
7417774Sralph 		else
7517774Sralph 			write(dh, "\rATDP", 5);
7617774Sralph 		write(dh, telno, strlen(telno));
7717774Sralph 		write(dh, "\r", 1);
7817774Sralph 
7917774Sralph 		if (expect("CONNECT", dh) != 0) {
8017774Sralph 			logent("HSM no carrier", _FAILED);
8117774Sralph 			strcpy(devSel, dev->D_line);
8217774Sralph 			hyscls(dh);
8317774Sralph 			return CF_DIAL;
8417774Sralph 		}
8517774Sralph 
8617774Sralph 	}
8717774Sralph 	if (dh < 0) {
8817774Sralph 		logent(dcname, "CAN'T OPEN");
8917774Sralph 		return dh;
9017774Sralph 	}
9117774Sralph 	DEBUG(4, "hayes ok\n", CNULL);
9217774Sralph 	return dh;
9317774Sralph }
9417774Sralph 
9517774Sralph hyscls(fd)
9617774Sralph int fd;
9717774Sralph {
9817774Sralph 	char dcname[20];
9917774Sralph #ifdef DROPDTR
10017774Sralph 	struct sgttyb hup, sav;
10117774Sralph #endif
10217774Sralph 
10317774Sralph 	if (fd > 0) {
10417774Sralph 		sprintf(dcname, "/dev/%s", devSel);
10517774Sralph 		DEBUG(4, "Hanging up fd = %d\n", fd);
10617774Sralph #ifdef DROPDTR
10717774Sralph 		/*
10817774Sralph 		 * code to drop DTR -- change to 0 baud then back to default.
10917774Sralph 		 */
11017774Sralph 		gtty(fd, &hup);
11117774Sralph 		gtty(fd, &sav);
11217774Sralph 		hup.sg_ispeed = B0;
11317774Sralph 		hup.sg_ospeed = B0;
11417774Sralph 		stty(fd, &hup);
11517774Sralph 		sleep(2);
11617774Sralph 		stty(fd, &sav);
11717774Sralph 		/*
11817774Sralph 		 * now raise DTR -- close the device & open it again.
11917774Sralph 		 */
12017774Sralph 		sleep(2);
12117774Sralph 		close(fd);
12217774Sralph 		sleep(2);
12317774Sralph 		fd = open(dcname, 2);
12417774Sralph 		/*
12517774Sralph 		 * Since we have a getty sleeping on this line, when it wakes up it sends
12617774Sralph 		 * all kinds of garbage to the modem.  Unfortunatly, the modem likes to
12717774Sralph 		 * execute the previous command when it sees the garbage.  The previous
12817774Sralph 		 * command was to dial the phone, so let's make the last command reset
12917774Sralph 		 * the modem.
13017774Sralph 		 */
13117774Sralph #else
13217774Sralph 		sleep(3);
13317774Sralph 		write(fd, "+++", 3);
13417774Sralph #endif
13517774Sralph 		sleep(3);
13617774Sralph 		write(fd, "ATZ\r", 4);
137*23698Sbloom 		if (expect("OK",fd) != 0)
13817774Sralph 			logent(devSel, "HSM did not respond to ATZ");
13917774Sralph 		sleep(1);
14017774Sralph 		close(fd);
14117774Sralph 		delock(devSel);
14217774Sralph 	}
14317774Sralph }
14417774Sralph 
14517774Sralph #endif HAYES
146*23698Sbloom 
147