xref: /csrg-svn/usr.bin/tip/aculib/ventel.c (revision 7592)
1*7592Sshannon /*	ventel.c	1.2	82/07/29	*/
26562Sshannon 
36562Sshannon #if VENTEL
46562Sshannon /*
56562Sshannon  * Routines for calling up on a Ventel Modem
66562Sshannon  */
76562Sshannon #include "tip.h"
86562Sshannon #include <setjmp.h>
96562Sshannon #include <errno.h>
106562Sshannon 
116562Sshannon #define	MAXRETRY	5
126562Sshannon #define	DISCONNECT	"\03"		/* ^C */
136562Sshannon 
146562Sshannon static int sigALRM();
156562Sshannon static int timeout = 0;
166562Sshannon 
176562Sshannon ven_dialer(num, acu)
186562Sshannon 	register char *num;
196562Sshannon 	char *acu;
206562Sshannon {
216562Sshannon 	register char *cp;
226562Sshannon 	register int connected = 0;
23*7592Sshannon 	char c;
246562Sshannon #ifdef ACULOG
256562Sshannon 	char line[80];
266562Sshannon #endif
276562Sshannon 	/*
286562Sshannon 	 * Get in synch with a couple of carriage returns
296562Sshannon 	 */
306562Sshannon 	if (!vensync(FD)) {
316562Sshannon 		printf("can't synchronize with ventel\n");
326562Sshannon #ifdef ACULOG
336562Sshannon 		logent(value(HOST), num, "ventel", "can't synch up");
346562Sshannon #endif
356562Sshannon 		return (0);
366562Sshannon 	}
37*7592Sshannon 	if (boolean(value(VERBOSE)))
38*7592Sshannon 		printf("\ndialing...");
39*7592Sshannon 	fflush(stdout);
406562Sshannon 	ioctl(FD, TIOCHPCL, 0);
41*7592Sshannon 	echo("k$\r$\n$D$I$A$L$:$ <");
426562Sshannon 	for (cp = num; *cp; cp++) {
436562Sshannon 		sleep(1);
446562Sshannon 		write(FD, cp, 1);
45*7592Sshannon 		read(FD, &c, 1);
466562Sshannon 	}
476562Sshannon 	echo(">\r$\n");
486562Sshannon 	if (gobble('\n'))
496562Sshannon 		connected = gobble('!');
506562Sshannon 	ioctl(FD, TIOCFLUSH);
516562Sshannon #ifdef ACULOG
526562Sshannon 	if (timeout) {
536562Sshannon 		sprintf(line, "%d second dial timeout",
546562Sshannon 			number(value(DIALTIMEOUT)));
556562Sshannon 		logent(value(HOST), num, "ventel", line);
566562Sshannon 	}
576562Sshannon #endif
586562Sshannon 	if (timeout)
596562Sshannon 		ven_disconnect();	/* insurance */
606562Sshannon 	return (connected);
616562Sshannon }
626562Sshannon 
636562Sshannon ven_disconnect()
646562Sshannon {
656562Sshannon 	close(FD);
666562Sshannon }
676562Sshannon 
686562Sshannon ven_abort()
696562Sshannon {
706562Sshannon 	write(FD, "\03", 1);
716562Sshannon 	close(FD);
726562Sshannon }
736562Sshannon 
746562Sshannon static int
756562Sshannon echo(s)
766562Sshannon 	register char *s;
776562Sshannon {
786562Sshannon 	char c;
796562Sshannon 
806562Sshannon 	while (c = *s++) switch (c) {
816562Sshannon 
826562Sshannon 	case '$':
836562Sshannon 		read(FD, &c, 1);
846562Sshannon 		s++;
856562Sshannon 		break;
866562Sshannon 
876562Sshannon 	case '#':
886562Sshannon 		c = *s++;
896562Sshannon 		write(FD, &c, 1);
906562Sshannon 		break;
916562Sshannon 
926562Sshannon 	default:
936562Sshannon 		write(FD, &c, 1);
946562Sshannon 		read(FD, &c, 1);
956562Sshannon 	}
966562Sshannon }
976562Sshannon 
986562Sshannon static int
996562Sshannon sigALRM()
1006562Sshannon {
1016562Sshannon 	signal(SIGALRM, SIG_IGN);
1026562Sshannon 	printf("\07timeout waiting for reply\n");
1036562Sshannon 	timeout = 1;
1046562Sshannon }
1056562Sshannon 
1066562Sshannon static int
1076562Sshannon gobble(s)
1086562Sshannon 	register char s;
1096562Sshannon {
1106562Sshannon 	char c;
1116562Sshannon 
1126562Sshannon 	signal(SIGALRM, sigALRM);
1136562Sshannon 	timeout = 0;
1146562Sshannon 	do {
1156562Sshannon 		alarm(number(value(DIALTIMEOUT)));
1166562Sshannon 		read(FD, &c, 1);
1176562Sshannon 		c &= 0177;
118*7592Sshannon 		alarm(0);
1196562Sshannon #ifdef notdef
1206562Sshannon 		if (boolean(value(VERBOSE)))
121*7592Sshannon 			putchar(c);
1226562Sshannon #endif
1236562Sshannon 		if (timeout)
1246562Sshannon 			return (0);
1256562Sshannon 	} while (c != '\n' && c != s);
1266562Sshannon 	signal(SIGALRM, SIG_DFL);
1276562Sshannon 	return (c == s);
1286562Sshannon }
1296562Sshannon 
1306562Sshannon #define min(a,b)	((a)>(b)?(b):(a))
1316562Sshannon /*
1326562Sshannon  * This convoluted piece of code attempts to get
1336562Sshannon  * the ventel in sync.  If you don't have the capacity or nread
1346562Sshannon  * call there are gory ways to simulate this.
1356562Sshannon  */
1366562Sshannon static int
1376562Sshannon vensync(fd)
1386562Sshannon {
1396562Sshannon 	long nread;
1406562Sshannon 	register int already = 0, nbytes;
1416562Sshannon 	char buf[60];
1426562Sshannon 
1436562Sshannon 	/*
1446562Sshannon 	 * Toggle DTR to force anyone off that might have left
1456562Sshannon 	 * the modem connected, and insure a consistent state
1466562Sshannon 	 * to start from.
1476562Sshannon 	 *
1486562Sshannon 	 * If you don't have the ioctl calls to diddle directly
1496562Sshannon 	 * with DTR, you can always try setting the baud rate to 0.
1506562Sshannon 	 */
1516562Sshannon 	ioctl(FD, TIOCCDTR, 0);
1526562Sshannon 	sleep(2);
1536562Sshannon 	ioctl(FD, TIOCSDTR, 0);
1546562Sshannon 	while (already < MAXRETRY) {
1556562Sshannon 		/*
1566562Sshannon 		 * After reseting the modem, send it two \r's to
1576562Sshannon 		 * autobaud on. Make sure to delay between them
1586562Sshannon 		 * so the modem can frame the incoming characters.
1596562Sshannon 		 */
1606562Sshannon 		write(fd, "\r", 1);
1616562Sshannon 		sleep(1);
1626562Sshannon 		write(fd, "\r", 1);
1636562Sshannon 		sleep(3);
1646562Sshannon 		if (ioctl(fd, FIONREAD, (caddr_t)&nread) >= 0) {
1656562Sshannon 			nbytes = nread;
1666562Sshannon 			while (nbytes > 0) {
1676562Sshannon 				read(fd, buf, min(nbytes, 60));
1686562Sshannon 				if ((buf[nbytes-1]&0177) == '$')
1696562Sshannon 					return (1);
1706562Sshannon 				nbytes -= min(nbytes, 60);
1716562Sshannon 			}
1726562Sshannon 			sleep(1);
1736562Sshannon 			already++;
1746562Sshannon 		}
1756562Sshannon 	}
1766562Sshannon 	return (0);
1776562Sshannon }
1786562Sshannon #endif
179