xref: /csrg-svn/usr.bin/tip/aculib/ventel.c (revision 6562)
1*6562Sshannon /*	ventel.c	1.1	82/04/19	*/
2*6562Sshannon 
3*6562Sshannon #if VENTEL
4*6562Sshannon /*
5*6562Sshannon  * Routines for calling up on a Ventel Modem
6*6562Sshannon  */
7*6562Sshannon #include "tip.h"
8*6562Sshannon #include <setjmp.h>
9*6562Sshannon #include <errno.h>
10*6562Sshannon 
11*6562Sshannon #define	MAXRETRY	5
12*6562Sshannon #define	DISCONNECT	"\03"		/* ^C */
13*6562Sshannon 
14*6562Sshannon static int sigALRM();
15*6562Sshannon static int timeout = 0;
16*6562Sshannon 
17*6562Sshannon ven_dialer(num, acu)
18*6562Sshannon 	register char *num;
19*6562Sshannon 	char *acu;
20*6562Sshannon {
21*6562Sshannon 	register char *cp;
22*6562Sshannon 	register int connected = 0;
23*6562Sshannon #ifdef ACULOG
24*6562Sshannon 	char line[80];
25*6562Sshannon #endif
26*6562Sshannon 	/*
27*6562Sshannon 	 * Get in synch with a couple of carriage returns
28*6562Sshannon 	 */
29*6562Sshannon 	if (!vensync(FD)) {
30*6562Sshannon 		printf("can't synchronize with ventel\n");
31*6562Sshannon #ifdef ACULOG
32*6562Sshannon 		logent(value(HOST), num, "ventel", "can't synch up");
33*6562Sshannon #endif
34*6562Sshannon 		return (0);
35*6562Sshannon 	}
36*6562Sshannon 	ioctl(FD, TIOCHPCL, 0);
37*6562Sshannon 	echo("k$\n$D$I$A$L$:$ <");
38*6562Sshannon 	for (cp = num; *cp; cp++) {
39*6562Sshannon 		sleep(1);
40*6562Sshannon 		write(FD, cp, 1);
41*6562Sshannon 		read(FD, cp, 1);
42*6562Sshannon 	}
43*6562Sshannon 	echo(">\r$\n");
44*6562Sshannon 	if (gobble('\n'))
45*6562Sshannon 		connected = gobble('!');
46*6562Sshannon 	ioctl(FD, TIOCFLUSH);
47*6562Sshannon #ifdef ACULOG
48*6562Sshannon 	if (timeout) {
49*6562Sshannon 		sprintf(line, "%d second dial timeout",
50*6562Sshannon 			number(value(DIALTIMEOUT)));
51*6562Sshannon 		logent(value(HOST), num, "ventel", line);
52*6562Sshannon 	}
53*6562Sshannon #endif
54*6562Sshannon 	if (timeout)
55*6562Sshannon 		ven_disconnect();	/* insurance */
56*6562Sshannon 	return (connected);
57*6562Sshannon }
58*6562Sshannon 
59*6562Sshannon ven_disconnect()
60*6562Sshannon {
61*6562Sshannon 	close(FD);
62*6562Sshannon }
63*6562Sshannon 
64*6562Sshannon ven_abort()
65*6562Sshannon {
66*6562Sshannon 	write(FD, "\03", 1);
67*6562Sshannon 	close(FD);
68*6562Sshannon }
69*6562Sshannon 
70*6562Sshannon static int
71*6562Sshannon echo(s)
72*6562Sshannon 	register char *s;
73*6562Sshannon {
74*6562Sshannon 	char c;
75*6562Sshannon 
76*6562Sshannon 	while (c = *s++) switch (c) {
77*6562Sshannon 
78*6562Sshannon 	case '$':
79*6562Sshannon 		read(FD, &c, 1);
80*6562Sshannon 		s++;
81*6562Sshannon 		break;
82*6562Sshannon 
83*6562Sshannon 	case '#':
84*6562Sshannon 		c = *s++;
85*6562Sshannon 		write(FD, &c, 1);
86*6562Sshannon 		break;
87*6562Sshannon 
88*6562Sshannon 	default:
89*6562Sshannon 		write(FD, &c, 1);
90*6562Sshannon 		read(FD, &c, 1);
91*6562Sshannon 	}
92*6562Sshannon }
93*6562Sshannon 
94*6562Sshannon static int
95*6562Sshannon sigALRM()
96*6562Sshannon {
97*6562Sshannon 	signal(SIGALRM, SIG_IGN);
98*6562Sshannon 	printf("\07timeout waiting for reply\n");
99*6562Sshannon 	timeout = 1;
100*6562Sshannon }
101*6562Sshannon 
102*6562Sshannon static int
103*6562Sshannon gobble(s)
104*6562Sshannon 	register char s;
105*6562Sshannon {
106*6562Sshannon 	char c;
107*6562Sshannon 
108*6562Sshannon 	signal(SIGALRM, sigALRM);
109*6562Sshannon 	timeout = 0;
110*6562Sshannon 	do {
111*6562Sshannon 		alarm(number(value(DIALTIMEOUT)));
112*6562Sshannon 		read(FD, &c, 1);
113*6562Sshannon 		c &= 0177;
114*6562Sshannon #ifdef notdef
115*6562Sshannon 		if (boolean(value(VERBOSE)))
116*6562Sshannon #endif
117*6562Sshannon 			putchar(c);
118*6562Sshannon 		alarm(0);
119*6562Sshannon 		if (timeout)
120*6562Sshannon 			return (0);
121*6562Sshannon 	} while (c != '\n' && c != s);
122*6562Sshannon 	signal(SIGALRM, SIG_DFL);
123*6562Sshannon 	return (c == s);
124*6562Sshannon }
125*6562Sshannon 
126*6562Sshannon #define min(a,b)	((a)>(b)?(b):(a))
127*6562Sshannon /*
128*6562Sshannon  * This convoluted piece of code attempts to get
129*6562Sshannon  * the ventel in sync.  If you don't have the capacity or nread
130*6562Sshannon  * call there are gory ways to simulate this.
131*6562Sshannon  */
132*6562Sshannon static int
133*6562Sshannon vensync(fd)
134*6562Sshannon {
135*6562Sshannon 	long nread;
136*6562Sshannon 	register int already = 0, nbytes;
137*6562Sshannon 	char buf[60];
138*6562Sshannon 
139*6562Sshannon 	/*
140*6562Sshannon 	 * Toggle DTR to force anyone off that might have left
141*6562Sshannon 	 * the modem connected, and insure a consistent state
142*6562Sshannon 	 * to start from.
143*6562Sshannon 	 *
144*6562Sshannon 	 * If you don't have the ioctl calls to diddle directly
145*6562Sshannon 	 * with DTR, you can always try setting the baud rate to 0.
146*6562Sshannon 	 */
147*6562Sshannon 	ioctl(FD, TIOCCDTR, 0);
148*6562Sshannon 	sleep(2);
149*6562Sshannon 	ioctl(FD, TIOCSDTR, 0);
150*6562Sshannon 	while (already < MAXRETRY) {
151*6562Sshannon 		/*
152*6562Sshannon 		 * After reseting the modem, send it two \r's to
153*6562Sshannon 		 * autobaud on. Make sure to delay between them
154*6562Sshannon 		 * so the modem can frame the incoming characters.
155*6562Sshannon 		 */
156*6562Sshannon 		write(fd, "\r", 1);
157*6562Sshannon 		sleep(1);
158*6562Sshannon 		write(fd, "\r", 1);
159*6562Sshannon 		sleep(3);
160*6562Sshannon 		if (ioctl(fd, FIONREAD, (caddr_t)&nread) >= 0) {
161*6562Sshannon 			nbytes = nread;
162*6562Sshannon 			while (nbytes > 0) {
163*6562Sshannon 				read(fd, buf, min(nbytes, 60));
164*6562Sshannon 				if ((buf[nbytes-1]&0177) == '$')
165*6562Sshannon 					return (1);
166*6562Sshannon 				nbytes -= min(nbytes, 60);
167*6562Sshannon 			}
168*6562Sshannon 			sleep(1);
169*6562Sshannon 			already++;
170*6562Sshannon 		}
171*6562Sshannon 	}
172*6562Sshannon 	return (0);
173*6562Sshannon }
174*6562Sshannon #endif
175