xref: /csrg-svn/usr.bin/uucp/libacu/hys.c (revision 23731)
117774Sralph #ifndef lint
2*23731Sbloom static char sccsid[] = "@(#)hys.c	4.3 (Berkeley) 06/24/85";
317774Sralph #endif
417774Sralph 
517774Sralph #include "../condevs.h"
617774Sralph 
717774Sralph #ifdef HAYES
823698Sbloom /*
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];
42*23731Sbloom 	char cbuf[MAXPH];
43*23731Sbloom 	register char *cp;
44*23731Sbloom 	register int i;
4517774Sralph 
4617774Sralph 	sprintf(dcname, "/dev/%s", dev->D_line);
4717774Sralph 	DEBUG(4, "dc - %s\n", dcname);
4817774Sralph 	if (setjmp(Sjbuf)) {
4917774Sralph 		logent(dcname, "TIMEOUT");
5017774Sralph 		if (dh >= 0)
5117774Sralph 			close(dh);
5217774Sralph 		return CF_DIAL;
5317774Sralph 	}
5417774Sralph 	signal(SIGALRM, alarmtr);
5517774Sralph 	getnextfd();
5617774Sralph 	alarm(10);
5717774Sralph 	dh = open(dcname, 2); /* read/write */
5817774Sralph 	alarm(0);
5917774Sralph 
6017774Sralph 	/* modem is open */
6117774Sralph 	next_fd = -1;
6217774Sralph 	if (dh >= 0) {
6317774Sralph 		fixline(dh, dev->D_speed);
6417774Sralph 		if (dochat(dev, flds, dh)) {
6517774Sralph 			logent(dcname, "CHAT FAILED");
6617774Sralph 			close(dh);
6717774Sralph 			return CF_DIAL;
6817774Sralph 		}
6923698Sbloom 		write(dh, "ATV1H\r", 6);
7017774Sralph 		if (expect("OK\r\n", dh) != 0) {
7117774Sralph 			logent(dcname, "HSM seems dead");
7217774Sralph 			close(dh);
7317774Sralph 			return CF_DIAL;
7417774Sralph 		}
7517774Sralph 		if (toneflag)
7617774Sralph 			write(dh, "\rATDT", 5);
7717774Sralph 		else
7817774Sralph 			write(dh, "\rATDP", 5);
7917774Sralph 		write(dh, telno, strlen(telno));
8017774Sralph 		write(dh, "\r", 1);
8117774Sralph 
82*23731Sbloom 		if (setjmp(Sjbuf)) {
83*23731Sbloom 			logent(dcname, "TIMEOUT");
84*23731Sbloom 			strcpy(devSel, dev->D_line);
85*23731Sbloom 			hyscls(dh);
86*23731Sbloom 			return CF_DIAL;
87*23731Sbloom 		}
88*23731Sbloom 		signal(SIGALRM, alarmtr);
89*23731Sbloom 		alarm(MAXMSGTIME);
90*23731Sbloom 		cp = cbuf;
91*23731Sbloom 		while (read(dh, cp ,1) == 1)
92*23731Sbloom 			if (*cp >= ' ')
93*23731Sbloom 				break;
94*23731Sbloom 		cp++;
95*23731Sbloom 		while (cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp++ != '\n')
96*23731Sbloom 			;
97*23731Sbloom 		alarm(0);
98*23731Sbloom 		*cp = '\0';
99*23731Sbloom 		if (strncmp(cbuf, "CONNECT", 7) != 0) {
10017774Sralph 			logent("HSM no carrier", _FAILED);
10117774Sralph 			strcpy(devSel, dev->D_line);
10217774Sralph 			hyscls(dh);
10317774Sralph 			return CF_DIAL;
10417774Sralph 		}
105*23731Sbloom 		DEBUG(4,"\nGOT: %s", cbuf);
106*23731Sbloom 		i = atoi(&cbuf[8]);
107*23731Sbloom 		if (i > 0 && i != dev->D_speed) {
108*23731Sbloom 			DEBUG(4,"Baudrate reset to %d\n", i);
109*23731Sbloom 			fixline(dh, i);
110*23731Sbloom 		}
11117774Sralph 
11217774Sralph 	}
11317774Sralph 	if (dh < 0) {
11417774Sralph 		logent(dcname, "CAN'T OPEN");
11517774Sralph 		return dh;
11617774Sralph 	}
11717774Sralph 	DEBUG(4, "hayes ok\n", CNULL);
11817774Sralph 	return dh;
11917774Sralph }
12017774Sralph 
12117774Sralph hyscls(fd)
12217774Sralph int fd;
12317774Sralph {
12417774Sralph 	char dcname[20];
12517774Sralph #ifdef DROPDTR
12617774Sralph 	struct sgttyb hup, sav;
12717774Sralph #endif
12817774Sralph 
12917774Sralph 	if (fd > 0) {
13017774Sralph 		sprintf(dcname, "/dev/%s", devSel);
13117774Sralph 		DEBUG(4, "Hanging up fd = %d\n", fd);
13217774Sralph #ifdef DROPDTR
13317774Sralph 		/*
13417774Sralph 		 * code to drop DTR -- change to 0 baud then back to default.
13517774Sralph 		 */
13617774Sralph 		gtty(fd, &hup);
13717774Sralph 		gtty(fd, &sav);
13817774Sralph 		hup.sg_ispeed = B0;
13917774Sralph 		hup.sg_ospeed = B0;
14017774Sralph 		stty(fd, &hup);
14117774Sralph 		sleep(2);
14217774Sralph 		stty(fd, &sav);
14317774Sralph 		/*
14417774Sralph 		 * now raise DTR -- close the device & open it again.
14517774Sralph 		 */
14617774Sralph 		sleep(2);
14717774Sralph 		close(fd);
14817774Sralph 		sleep(2);
14917774Sralph 		fd = open(dcname, 2);
15017774Sralph 		/*
15117774Sralph 		 * Since we have a getty sleeping on this line, when it wakes up it sends
15217774Sralph 		 * all kinds of garbage to the modem.  Unfortunatly, the modem likes to
15317774Sralph 		 * execute the previous command when it sees the garbage.  The previous
15417774Sralph 		 * command was to dial the phone, so let's make the last command reset
15517774Sralph 		 * the modem.
15617774Sralph 		 */
15717774Sralph #else
15817774Sralph 		sleep(3);
15917774Sralph 		write(fd, "+++", 3);
16017774Sralph #endif
16117774Sralph 		sleep(3);
16217774Sralph 		write(fd, "ATZ\r", 4);
16323698Sbloom 		if (expect("OK",fd) != 0)
16417774Sralph 			logent(devSel, "HSM did not respond to ATZ");
16517774Sralph 		sleep(1);
16617774Sralph 		close(fd);
16717774Sralph 		delock(devSel);
16817774Sralph 	}
16917774Sralph }
17017774Sralph 
17117774Sralph #endif HAYES
17223698Sbloom 
173