xref: /onnv-gate/usr/src/cmd/tip/aculib/hayes.c (revision 549:9e644232f978)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
30Sstevel@tonic-gate  * Use is subject to license terms.
40Sstevel@tonic-gate  */
5*549Smuffin 
60Sstevel@tonic-gate /*
70Sstevel@tonic-gate  * Copyright (c) 1983 Regents of the University of California.
80Sstevel@tonic-gate  * All rights reserved. The Berkeley software License Agreement
90Sstevel@tonic-gate  * specifies the terms and conditions for redistribution.
100Sstevel@tonic-gate  */
11*549Smuffin 
12*549Smuffin #pragma ident	"%Z%%M%	%I%	%E% SMI"
130Sstevel@tonic-gate 
140Sstevel@tonic-gate #include "tip.h"
150Sstevel@tonic-gate 
16*549Smuffin static int	hayes_sync(int);
17*549Smuffin static void	sigALRM(void);
18*549Smuffin static sigjmp_buf	timeoutbuf;
19*549Smuffin 
20*549Smuffin void	hayes_disconnect(void);
210Sstevel@tonic-gate 
220Sstevel@tonic-gate /*
230Sstevel@tonic-gate  * Dial up on a Hayes Smart Modem 1200 or 2400
240Sstevel@tonic-gate  */
25*549Smuffin /* ARGSUSED */
260Sstevel@tonic-gate int
hayes_dialer(char * num,char * acu)27*549Smuffin hayes_dialer(char *num, char *acu)
280Sstevel@tonic-gate {
290Sstevel@tonic-gate 	char code = 0, cr = 0;
30*549Smuffin 	sig_handler_t	f;
310Sstevel@tonic-gate 	struct termios buf;
320Sstevel@tonic-gate 
33*549Smuffin 	f = signal(SIGALRM, (sig_handler_t)sigALRM);
340Sstevel@tonic-gate 
350Sstevel@tonic-gate 	if (!hayes_sync(FD)) {
36*549Smuffin 		(void) printf("can't synchronize with hayes\n");
370Sstevel@tonic-gate #ifdef ACULOG
380Sstevel@tonic-gate 		logent(value(HOST), num, "hayes", "can't synch up");
390Sstevel@tonic-gate #endif
40*549Smuffin 		(void) signal(SIGALRM, f);
410Sstevel@tonic-gate 		return (0);
420Sstevel@tonic-gate 	}
430Sstevel@tonic-gate 	if (boolean(value(VERBOSE)))
44*549Smuffin 		(void) printf("\ndialing...");
45*549Smuffin 	(void) fflush(stdout);
46*549Smuffin 	(void) ioctl(FD, TCGETS, &buf);
470Sstevel@tonic-gate 	buf.c_cflag |= HUPCL;
48*549Smuffin 	(void) ioctl(FD, TCSETS, &buf);
49*549Smuffin 	(void) ioctl(FD, TCFLSH, TCIOFLUSH);
500Sstevel@tonic-gate 
510Sstevel@tonic-gate 	if (sigsetjmp(timeoutbuf, 1)) {
520Sstevel@tonic-gate #ifdef ACULOG
530Sstevel@tonic-gate 		char line[80];
540Sstevel@tonic-gate 
55*549Smuffin 		(void) sprintf(line, "%d second dial timeout",
56*549Smuffin 		    number(value(DIALTIMEOUT)));
570Sstevel@tonic-gate 		logent(value(HOST), num, "hayes", line);
580Sstevel@tonic-gate #endif
590Sstevel@tonic-gate 		hayes_disconnect();
60*549Smuffin 		(void) signal(SIGALRM, f);
610Sstevel@tonic-gate 		return (0);
620Sstevel@tonic-gate 	}
63*549Smuffin 	(void) alarm(number(value(DIALTIMEOUT)));
64*549Smuffin 	(void) ioctl(FD, TCFLSH, TCIOFLUSH);
650Sstevel@tonic-gate 	if (*num == 'S')
66*549Smuffin 		(void) write(FD, "AT", 2);
670Sstevel@tonic-gate 	else
68*549Smuffin 		(void) write(FD, "ATDT", 4);	/* use tone dialing */
69*549Smuffin 	(void) write(FD, num, strlen(num));
70*549Smuffin 	(void) write(FD, "\r", 1);
71*549Smuffin 	(void) read(FD, &code, 1);
72*549Smuffin 	(void) read(FD, &cr, 1);
730Sstevel@tonic-gate 	if (code == '1' && cr == '0')
74*549Smuffin 		(void) read(FD, &cr, 1);
75*549Smuffin 	(void) alarm(0);
76*549Smuffin 	(void) signal(SIGALRM, f);
770Sstevel@tonic-gate 	if ((code == '1' || code == '5') && cr == '\r')
780Sstevel@tonic-gate 		return (1);
790Sstevel@tonic-gate 	return (0);
800Sstevel@tonic-gate }
810Sstevel@tonic-gate 
82*549Smuffin void
hayes_disconnect(void)83*549Smuffin hayes_disconnect(void)
840Sstevel@tonic-gate {
85*549Smuffin 	(void) close(FD);
860Sstevel@tonic-gate }
870Sstevel@tonic-gate 
88*549Smuffin void
hayes_abort(void)89*549Smuffin hayes_abort(void)
900Sstevel@tonic-gate {
910Sstevel@tonic-gate 	int dtr = TIOCM_DTR;
920Sstevel@tonic-gate 
93*549Smuffin 	(void) alarm(0);
94*549Smuffin 	(void) ioctl(FD, TIOCMBIC, &dtr);
95*549Smuffin 	(void) sleep(2);
96*549Smuffin 	(void) ioctl(FD, TCFLSH, TCIOFLUSH);
97*549Smuffin 	(void) close(FD);
980Sstevel@tonic-gate }
990Sstevel@tonic-gate 
1000Sstevel@tonic-gate static void
sigALRM(void)101*549Smuffin sigALRM(void)
1020Sstevel@tonic-gate {
1030Sstevel@tonic-gate 	siglongjmp(timeoutbuf, 1);
1040Sstevel@tonic-gate }
1050Sstevel@tonic-gate 
1060Sstevel@tonic-gate /*
1070Sstevel@tonic-gate  * This piece of code attempts to get the hayes in sync.
1080Sstevel@tonic-gate  */
1090Sstevel@tonic-gate static int
hayes_sync(int fd)110*549Smuffin hayes_sync(int fd)
1110Sstevel@tonic-gate {
112*549Smuffin 	int tries;
1130Sstevel@tonic-gate 	char code = 0, cr = 0;
1140Sstevel@tonic-gate 	int dtr = TIOCM_DTR;
1150Sstevel@tonic-gate 
1160Sstevel@tonic-gate 	/*
1170Sstevel@tonic-gate 	 * Toggle DTR to force anyone off that might have left
1180Sstevel@tonic-gate 	 * the modem connected, and insure a consistent state
1190Sstevel@tonic-gate 	 * to start from.
1200Sstevel@tonic-gate 	 */
121*549Smuffin 	(void) ioctl(fd, TIOCMBIC, &dtr);
122*549Smuffin 	(void) sleep(1);
123*549Smuffin 	(void) ioctl(fd, TIOCMBIS, &dtr);
1240Sstevel@tonic-gate 	for (tries = 0; tries < 3; tries++) {
1250Sstevel@tonic-gate 		/*
1260Sstevel@tonic-gate 		 * After reseting the modem, initialize all
1270Sstevel@tonic-gate 		 * parameters to required vaules:
1280Sstevel@tonic-gate 		 *
1290Sstevel@tonic-gate 		 *	V0	- result codes are single digits
1300Sstevel@tonic-gate 		 *	Q0	- result codes ARE sent
1310Sstevel@tonic-gate 		 *	E0	- do not echo
1320Sstevel@tonic-gate 		 *	S0=1	- automatically answer phone
1330Sstevel@tonic-gate 		 *	S2=255	- disable escape character
1340Sstevel@tonic-gate 		 *	S12=255	- longest possible escape guard time
1350Sstevel@tonic-gate 		 */
136*549Smuffin 		(void) write(fd, "ATV0Q0E0S0=1S2=255S12=255\r", 26);
137*549Smuffin 		(void) sleep(1);
1380Sstevel@tonic-gate 		/* flush any echoes or return codes */
139*549Smuffin 		(void) ioctl(fd, TCFLSH, TCIOFLUSH);
1400Sstevel@tonic-gate 		/* now see if the modem is talking to us properly */
141*549Smuffin 		(void) write(fd, "AT\r", 3);
1420Sstevel@tonic-gate 		if (sigsetjmp(timeoutbuf, 1) == 0) {
143*549Smuffin 			(void) alarm(2);
144*549Smuffin 			(void) read(FD, &code, 1);
145*549Smuffin 			(void) read(FD, &cr, 1);
1460Sstevel@tonic-gate 			if (code == '0' && cr == '\r')
1470Sstevel@tonic-gate 				return (1);
1480Sstevel@tonic-gate 		}
1490Sstevel@tonic-gate 	}
1500Sstevel@tonic-gate 	return (0);
1510Sstevel@tonic-gate }
152