xref: /freebsd/usr.bin/tip/libacu/t3000.c (revision 18cc36fb1529054315fcf332ccbec997f43fc507)
118cc36fbSJordan K. Hubbard /*
218cc36fbSJordan K. Hubbard  * Copyright (c) 1992, 1993
318cc36fbSJordan K. Hubbard  *	The Regents of the University of California.  All rights reserved.
418cc36fbSJordan K. Hubbard  *
518cc36fbSJordan K. Hubbard  * Redistribution and use in source and binary forms, with or without
618cc36fbSJordan K. Hubbard  * modification, are permitted provided that the following conditions
718cc36fbSJordan K. Hubbard  * are met:
818cc36fbSJordan K. Hubbard  * 1. Redistributions of source code must retain the above copyright
918cc36fbSJordan K. Hubbard  *    notice, this list of conditions and the following disclaimer.
1018cc36fbSJordan K. Hubbard  * 2. Redistributions in binary form must reproduce the above copyright
1118cc36fbSJordan K. Hubbard  *    notice, this list of conditions and the following disclaimer in the
1218cc36fbSJordan K. Hubbard  *    documentation and/or other materials provided with the distribution.
1318cc36fbSJordan K. Hubbard  * 3. All advertising materials mentioning features or use of this software
1418cc36fbSJordan K. Hubbard  *    must display the following acknowledgement:
1518cc36fbSJordan K. Hubbard  *	This product includes software developed by the University of
1618cc36fbSJordan K. Hubbard  *	California, Berkeley and its contributors.
1718cc36fbSJordan K. Hubbard  * 4. Neither the name of the University nor the names of its contributors
1818cc36fbSJordan K. Hubbard  *    may be used to endorse or promote products derived from this software
1918cc36fbSJordan K. Hubbard  *    without specific prior written permission.
2018cc36fbSJordan K. Hubbard  *
2118cc36fbSJordan K. Hubbard  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2218cc36fbSJordan K. Hubbard  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2318cc36fbSJordan K. Hubbard  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2418cc36fbSJordan K. Hubbard  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2518cc36fbSJordan K. Hubbard  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2618cc36fbSJordan K. Hubbard  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2718cc36fbSJordan K. Hubbard  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2818cc36fbSJordan K. Hubbard  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2918cc36fbSJordan K. Hubbard  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3018cc36fbSJordan K. Hubbard  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3118cc36fbSJordan K. Hubbard  * SUCH DAMAGE.
3218cc36fbSJordan K. Hubbard  */
3318cc36fbSJordan K. Hubbard 
3418cc36fbSJordan K. Hubbard #ifndef lint
3518cc36fbSJordan K. Hubbard static char sccsid[] = "@(#)t3000.c	8.1 (Berkeley) 6/6/93";
3618cc36fbSJordan K. Hubbard #endif /* not lint */
3718cc36fbSJordan K. Hubbard 
3818cc36fbSJordan K. Hubbard /*
3918cc36fbSJordan K. Hubbard  * Routines for calling up on a Telebit T3000 modem.
4018cc36fbSJordan K. Hubbard  * Derived from Courier driver.
4118cc36fbSJordan K. Hubbard  */
4218cc36fbSJordan K. Hubbard #include "tipconf.h"
4318cc36fbSJordan K. Hubbard #include "tip.h"
4418cc36fbSJordan K. Hubbard #include "acucommon.h"
4518cc36fbSJordan K. Hubbard #include <stdio.h>
4618cc36fbSJordan K. Hubbard 
4718cc36fbSJordan K. Hubbard #define	MAXRETRY	5
4818cc36fbSJordan K. Hubbard 
4918cc36fbSJordan K. Hubbard static	void sigALRM();
5018cc36fbSJordan K. Hubbard static	int timeout = 0;
5118cc36fbSJordan K. Hubbard static	int connected = 0;
5218cc36fbSJordan K. Hubbard static	jmp_buf timeoutbuf, intbuf;
5318cc36fbSJordan K. Hubbard static	int t3000_sync();
5418cc36fbSJordan K. Hubbard 
5518cc36fbSJordan K. Hubbard t3000_dialer(num, acu)
5618cc36fbSJordan K. Hubbard 	register char *num;
5718cc36fbSJordan K. Hubbard 	char *acu;
5818cc36fbSJordan K. Hubbard {
5918cc36fbSJordan K. Hubbard 	register char *cp;
6018cc36fbSJordan K. Hubbard #if ACULOG
6118cc36fbSJordan K. Hubbard 	char line[80];
6218cc36fbSJordan K. Hubbard #endif
6318cc36fbSJordan K. Hubbard 	static int t3000_connect(), t3000_swallow();
6418cc36fbSJordan K. Hubbard 
6518cc36fbSJordan K. Hubbard 	if (boolean(value(VERBOSE)))
6618cc36fbSJordan K. Hubbard 		printf("Using \"%s\"\n", acu);
6718cc36fbSJordan K. Hubbard 
6818cc36fbSJordan K. Hubbard 	acu_hupcl ();
6918cc36fbSJordan K. Hubbard 	/*
7018cc36fbSJordan K. Hubbard 	 * Get in synch.
7118cc36fbSJordan K. Hubbard 	 */
7218cc36fbSJordan K. Hubbard 	if (!t3000_sync()) {
7318cc36fbSJordan K. Hubbard badsynch:
7418cc36fbSJordan K. Hubbard 		printf("can't synchronize with t3000\n");
7518cc36fbSJordan K. Hubbard #if ACULOG
7618cc36fbSJordan K. Hubbard 		logent(value(HOST), num, "t3000", "can't synch up");
7718cc36fbSJordan K. Hubbard #endif
7818cc36fbSJordan K. Hubbard 		return (0);
7918cc36fbSJordan K. Hubbard 	}
8018cc36fbSJordan K. Hubbard 	t3000_write(FD, "AT E0\r", 6);	/* turn off echoing */
8118cc36fbSJordan K. Hubbard 	sleep(1);
8218cc36fbSJordan K. Hubbard #ifdef DEBUG
8318cc36fbSJordan K. Hubbard 	if (boolean(value(VERBOSE)))
8418cc36fbSJordan K. Hubbard 		t3000_verbose_read();
8518cc36fbSJordan K. Hubbard #endif
8618cc36fbSJordan K. Hubbard 	ioctl(FD, TIOCFLUSH, 0);	/* flush any clutter */
8718cc36fbSJordan K. Hubbard 	t3000_write(FD, "AT E0 H0 Q0 X4 V1\r", 18);
8818cc36fbSJordan K. Hubbard 	if (!t3000_swallow("\r\nOK\r\n"))
8918cc36fbSJordan K. Hubbard 		goto badsynch;
9018cc36fbSJordan K. Hubbard 	fflush(stdout);
9118cc36fbSJordan K. Hubbard 	t3000_write(FD, "AT D", 4);
9218cc36fbSJordan K. Hubbard 	for (cp = num; *cp; cp++)
9318cc36fbSJordan K. Hubbard 		if (*cp == '=')
9418cc36fbSJordan K. Hubbard 			*cp = ',';
9518cc36fbSJordan K. Hubbard 	t3000_write(FD, num, strlen(num));
9618cc36fbSJordan K. Hubbard 	t3000_write(FD, "\r", 1);
9718cc36fbSJordan K. Hubbard 	connected = t3000_connect();
9818cc36fbSJordan K. Hubbard #if ACULOG
9918cc36fbSJordan K. Hubbard 	if (timeout) {
10018cc36fbSJordan K. Hubbard 		sprintf(line, "%d second dial timeout",
10118cc36fbSJordan K. Hubbard 			number(value(DIALTIMEOUT)));
10218cc36fbSJordan K. Hubbard 		logent(value(HOST), num, "t3000", line);
10318cc36fbSJordan K. Hubbard 	}
10418cc36fbSJordan K. Hubbard #endif
10518cc36fbSJordan K. Hubbard 	if (timeout)
10618cc36fbSJordan K. Hubbard 		t3000_disconnect();
10718cc36fbSJordan K. Hubbard 	return (connected);
10818cc36fbSJordan K. Hubbard }
10918cc36fbSJordan K. Hubbard 
11018cc36fbSJordan K. Hubbard t3000_disconnect()
11118cc36fbSJordan K. Hubbard {
11218cc36fbSJordan K. Hubbard 	 /* first hang up the modem*/
11318cc36fbSJordan K. Hubbard 	ioctl(FD, TIOCCDTR, 0);
11418cc36fbSJordan K. Hubbard 	sleep(1);
11518cc36fbSJordan K. Hubbard 	ioctl(FD, TIOCSDTR, 0);
11618cc36fbSJordan K. Hubbard 	t3000_sync();				/* reset */
11718cc36fbSJordan K. Hubbard 	close(FD);
11818cc36fbSJordan K. Hubbard }
11918cc36fbSJordan K. Hubbard 
12018cc36fbSJordan K. Hubbard t3000_abort()
12118cc36fbSJordan K. Hubbard {
12218cc36fbSJordan K. Hubbard 	t3000_write(FD, "\r", 1);	/* send anything to abort the call */
12318cc36fbSJordan K. Hubbard 	t3000_disconnect();
12418cc36fbSJordan K. Hubbard }
12518cc36fbSJordan K. Hubbard 
12618cc36fbSJordan K. Hubbard static void
12718cc36fbSJordan K. Hubbard sigALRM()
12818cc36fbSJordan K. Hubbard {
12918cc36fbSJordan K. Hubbard 	printf("\07timeout waiting for reply\n");
13018cc36fbSJordan K. Hubbard 	timeout = 1;
13118cc36fbSJordan K. Hubbard 	longjmp(timeoutbuf, 1);
13218cc36fbSJordan K. Hubbard }
13318cc36fbSJordan K. Hubbard 
13418cc36fbSJordan K. Hubbard static int
13518cc36fbSJordan K. Hubbard t3000_swallow(match)
13618cc36fbSJordan K. Hubbard   register char *match;
13718cc36fbSJordan K. Hubbard   {
13818cc36fbSJordan K. Hubbard 	sig_t f;
13918cc36fbSJordan K. Hubbard 	char c;
14018cc36fbSJordan K. Hubbard 
14118cc36fbSJordan K. Hubbard 	f = signal(SIGALRM, sigALRM);
14218cc36fbSJordan K. Hubbard 	timeout = 0;
14318cc36fbSJordan K. Hubbard 	do {
14418cc36fbSJordan K. Hubbard 		if (*match =='\0') {
14518cc36fbSJordan K. Hubbard 			signal(SIGALRM, f);
14618cc36fbSJordan K. Hubbard 			return (1);
14718cc36fbSJordan K. Hubbard 		}
14818cc36fbSJordan K. Hubbard 		if (setjmp(timeoutbuf)) {
14918cc36fbSJordan K. Hubbard 			signal(SIGALRM, f);
15018cc36fbSJordan K. Hubbard 			return (0);
15118cc36fbSJordan K. Hubbard 		}
15218cc36fbSJordan K. Hubbard 		alarm(number(value(DIALTIMEOUT)));
15318cc36fbSJordan K. Hubbard 		read(FD, &c, 1);
15418cc36fbSJordan K. Hubbard 		alarm(0);
15518cc36fbSJordan K. Hubbard 		c &= 0177;
15618cc36fbSJordan K. Hubbard #ifdef DEBUG
15718cc36fbSJordan K. Hubbard 		if (boolean(value(VERBOSE)))
15818cc36fbSJordan K. Hubbard 			putchar(c);
15918cc36fbSJordan K. Hubbard #endif
16018cc36fbSJordan K. Hubbard 	} while (c == *match++);
16118cc36fbSJordan K. Hubbard #ifdef DEBUG
16218cc36fbSJordan K. Hubbard 	if (boolean(value(VERBOSE)))
16318cc36fbSJordan K. Hubbard 		fflush(stdout);
16418cc36fbSJordan K. Hubbard #endif
16518cc36fbSJordan K. Hubbard 	signal(SIGALRM, SIG_DFL);
16618cc36fbSJordan K. Hubbard 	return (0);
16718cc36fbSJordan K. Hubbard }
16818cc36fbSJordan K. Hubbard 
16918cc36fbSJordan K. Hubbard #ifndef B19200		/* XXX */
17018cc36fbSJordan K. Hubbard #define	B19200	EXTA
17118cc36fbSJordan K. Hubbard #define	B38400	EXTB
17218cc36fbSJordan K. Hubbard #endif
17318cc36fbSJordan K. Hubbard 
17418cc36fbSJordan K. Hubbard struct tbaud_msg {
17518cc36fbSJordan K. Hubbard 	char *msg;
17618cc36fbSJordan K. Hubbard 	int baud;
17718cc36fbSJordan K. Hubbard 	int baud2;
17818cc36fbSJordan K. Hubbard } tbaud_msg[] = {
17918cc36fbSJordan K. Hubbard 	"",		B300,	0,
18018cc36fbSJordan K. Hubbard 	" 1200",	B1200,	0,
18118cc36fbSJordan K. Hubbard 	" 2400",	B2400,	0,
18218cc36fbSJordan K. Hubbard 	" 4800",	B4800,	0,
18318cc36fbSJordan K. Hubbard 	" 9600",	B9600,	0,
18418cc36fbSJordan K. Hubbard 	" 14400",	B19200,	B9600,
18518cc36fbSJordan K. Hubbard 	" 19200",	B19200,	B9600,
18618cc36fbSJordan K. Hubbard 	" 38400",	B38400,	B9600,
18718cc36fbSJordan K. Hubbard 	" 57600",	B38400,	B9600,
18818cc36fbSJordan K. Hubbard 	" 7512",	B9600,	0,
18918cc36fbSJordan K. Hubbard 	" 1275",	B2400,	0,
19018cc36fbSJordan K. Hubbard 	" 7200",	B9600,	0,
19118cc36fbSJordan K. Hubbard 	" 12000",	B19200,	B9600,
19218cc36fbSJordan K. Hubbard 	0,		0,	0,
19318cc36fbSJordan K. Hubbard };
19418cc36fbSJordan K. Hubbard 
19518cc36fbSJordan K. Hubbard static int
19618cc36fbSJordan K. Hubbard t3000_connect()
19718cc36fbSJordan K. Hubbard {
19818cc36fbSJordan K. Hubbard 	char c;
19918cc36fbSJordan K. Hubbard 	int nc, nl, n;
20018cc36fbSJordan K. Hubbard 	char dialer_buf[64];
20118cc36fbSJordan K. Hubbard 	struct tbaud_msg *bm;
20218cc36fbSJordan K. Hubbard 	sig_t f;
20318cc36fbSJordan K. Hubbard 
20418cc36fbSJordan K. Hubbard 	if (t3000_swallow("\r\n") == 0)
20518cc36fbSJordan K. Hubbard 		return (0);
20618cc36fbSJordan K. Hubbard 	f = signal(SIGALRM, sigALRM);
20718cc36fbSJordan K. Hubbard again:
20818cc36fbSJordan K. Hubbard 	nc = 0; nl = sizeof(dialer_buf)-1;
20918cc36fbSJordan K. Hubbard 	bzero(dialer_buf, sizeof(dialer_buf));
21018cc36fbSJordan K. Hubbard 	timeout = 0;
21118cc36fbSJordan K. Hubbard 	for (nc = 0, nl = sizeof(dialer_buf)-1 ; nl > 0 ; nc++, nl--) {
21218cc36fbSJordan K. Hubbard 		if (setjmp(timeoutbuf))
21318cc36fbSJordan K. Hubbard 			break;
21418cc36fbSJordan K. Hubbard 		alarm(number(value(DIALTIMEOUT)));
21518cc36fbSJordan K. Hubbard 		n = read(FD, &c, 1);
21618cc36fbSJordan K. Hubbard 		alarm(0);
21718cc36fbSJordan K. Hubbard 		if (n <= 0)
21818cc36fbSJordan K. Hubbard 			break;
21918cc36fbSJordan K. Hubbard 		c &= 0x7f;
22018cc36fbSJordan K. Hubbard 		if (c == '\r') {
22118cc36fbSJordan K. Hubbard 			if (t3000_swallow("\n") == 0)
22218cc36fbSJordan K. Hubbard 				break;
22318cc36fbSJordan K. Hubbard 			if (!dialer_buf[0])
22418cc36fbSJordan K. Hubbard 				goto again;
22518cc36fbSJordan K. Hubbard 			if (strcmp(dialer_buf, "RINGING") == 0 &&
22618cc36fbSJordan K. Hubbard 			    boolean(value(VERBOSE))) {
22718cc36fbSJordan K. Hubbard #ifdef DEBUG
22818cc36fbSJordan K. Hubbard 				printf("%s\r\n", dialer_buf);
22918cc36fbSJordan K. Hubbard #endif
23018cc36fbSJordan K. Hubbard 				goto again;
23118cc36fbSJordan K. Hubbard 			}
23218cc36fbSJordan K. Hubbard 			if (strncmp(dialer_buf, "CONNECT",
23318cc36fbSJordan K. Hubbard 				    sizeof("CONNECT")-1) != 0)
23418cc36fbSJordan K. Hubbard 				break;
23518cc36fbSJordan K. Hubbard 			for (bm = tbaud_msg ; bm->msg ; bm++)
23618cc36fbSJordan K. Hubbard 				if (strcmp(bm->msg,
23718cc36fbSJordan K. Hubbard 				    dialer_buf+sizeof("CONNECT")-1) == 0) {
23818cc36fbSJordan K. Hubbard 					if (!(acu_setspeed (bm->baud) || (bm->baud2 && acu_setspeed (bm->baud2))))
23918cc36fbSJordan K. Hubbard 						goto error;
24018cc36fbSJordan K. Hubbard 					signal(SIGALRM, f);
24118cc36fbSJordan K. Hubbard #ifdef DEBUG
24218cc36fbSJordan K. Hubbard 					if (boolean(value(VERBOSE)))
24318cc36fbSJordan K. Hubbard 						printf("%s\r\n", dialer_buf);
24418cc36fbSJordan K. Hubbard #endif
24518cc36fbSJordan K. Hubbard 					return (1);
24618cc36fbSJordan K. Hubbard 				}
24718cc36fbSJordan K. Hubbard 			break;
24818cc36fbSJordan K. Hubbard 		}
24918cc36fbSJordan K. Hubbard 		dialer_buf[nc] = c;
25018cc36fbSJordan K. Hubbard #ifdef notdef
25118cc36fbSJordan K. Hubbard 		if (boolean(value(VERBOSE)))
25218cc36fbSJordan K. Hubbard 			putchar(c);
25318cc36fbSJordan K. Hubbard #endif
25418cc36fbSJordan K. Hubbard 	}
25518cc36fbSJordan K. Hubbard error1:
25618cc36fbSJordan K. Hubbard 	printf("%s\r\n", dialer_buf);
25718cc36fbSJordan K. Hubbard error:
25818cc36fbSJordan K. Hubbard 	signal(SIGALRM, f);
25918cc36fbSJordan K. Hubbard 	return (0);
26018cc36fbSJordan K. Hubbard }
26118cc36fbSJordan K. Hubbard 
26218cc36fbSJordan K. Hubbard /*
26318cc36fbSJordan K. Hubbard  * This convoluted piece of code attempts to get
26418cc36fbSJordan K. Hubbard  * the t3000 in sync.
26518cc36fbSJordan K. Hubbard  */
26618cc36fbSJordan K. Hubbard static int
26718cc36fbSJordan K. Hubbard t3000_sync()
26818cc36fbSJordan K. Hubbard {
26918cc36fbSJordan K. Hubbard 	int already = 0;
27018cc36fbSJordan K. Hubbard 	int len;
27118cc36fbSJordan K. Hubbard 	char buf[40];
27218cc36fbSJordan K. Hubbard 
27318cc36fbSJordan K. Hubbard 	while (already++ < MAXRETRY) {
27418cc36fbSJordan K. Hubbard 		ioctl(FD, TIOCFLUSH, 0);	/* flush any clutter */
27518cc36fbSJordan K. Hubbard 		t3000_write(FD, "\rAT Z\r", 6);	/* reset modem */
27618cc36fbSJordan K. Hubbard 		bzero(buf, sizeof(buf));
27718cc36fbSJordan K. Hubbard 		sleep(2);
27818cc36fbSJordan K. Hubbard 		ioctl(FD, FIONREAD, &len);
27918cc36fbSJordan K. Hubbard #if 1
28018cc36fbSJordan K. Hubbard if (len == 0) len = 1;
28118cc36fbSJordan K. Hubbard #endif
28218cc36fbSJordan K. Hubbard 		if (len) {
28318cc36fbSJordan K. Hubbard 			len = read(FD, buf, sizeof(buf));
28418cc36fbSJordan K. Hubbard #ifdef DEBUG
28518cc36fbSJordan K. Hubbard 			buf[len] = '\0';
28618cc36fbSJordan K. Hubbard 			printf("t3000_sync: (\"%s\")\n\r", buf);
28718cc36fbSJordan K. Hubbard #endif
28818cc36fbSJordan K. Hubbard 			if (index(buf, '0') ||
28918cc36fbSJordan K. Hubbard 		   	   (index(buf, 'O') && index(buf, 'K')))
29018cc36fbSJordan K. Hubbard 				return(1);
29118cc36fbSJordan K. Hubbard 		}
29218cc36fbSJordan K. Hubbard 		/*
29318cc36fbSJordan K. Hubbard 		 * If not strapped for DTR control,
29418cc36fbSJordan K. Hubbard 		 * try to get command mode.
29518cc36fbSJordan K. Hubbard 		 */
29618cc36fbSJordan K. Hubbard 		sleep(1);
29718cc36fbSJordan K. Hubbard 		t3000_write(FD, "+++", 3);
29818cc36fbSJordan K. Hubbard 		sleep(1);
29918cc36fbSJordan K. Hubbard 		/*
30018cc36fbSJordan K. Hubbard 		 * Toggle DTR to force anyone off that might have left
30118cc36fbSJordan K. Hubbard 		 * the modem connected.
30218cc36fbSJordan K. Hubbard 		 */
30318cc36fbSJordan K. Hubbard 		ioctl(FD, TIOCCDTR, 0);
30418cc36fbSJordan K. Hubbard 		sleep(1);
30518cc36fbSJordan K. Hubbard 		ioctl(FD, TIOCSDTR, 0);
30618cc36fbSJordan K. Hubbard 	}
30718cc36fbSJordan K. Hubbard 	t3000_write(FD, "\rAT Z\r", 6);
30818cc36fbSJordan K. Hubbard 	return (0);
30918cc36fbSJordan K. Hubbard }
31018cc36fbSJordan K. Hubbard 
31118cc36fbSJordan K. Hubbard t3000_write(fd, cp, n)
31218cc36fbSJordan K. Hubbard int fd;
31318cc36fbSJordan K. Hubbard char *cp;
31418cc36fbSJordan K. Hubbard int n;
31518cc36fbSJordan K. Hubbard {
31618cc36fbSJordan K. Hubbard #ifdef notdef
31718cc36fbSJordan K. Hubbard 	if (boolean(value(VERBOSE)))
31818cc36fbSJordan K. Hubbard 		write(1, cp, n);
31918cc36fbSJordan K. Hubbard #endif
32018cc36fbSJordan K. Hubbard 	acu_flush ();
32118cc36fbSJordan K. Hubbard 	t3000_nap();
32218cc36fbSJordan K. Hubbard 	for ( ; n-- ; cp++) {
32318cc36fbSJordan K. Hubbard 		write(fd, cp, 1);
32418cc36fbSJordan K. Hubbard 		acu_flush ();
32518cc36fbSJordan K. Hubbard 		t3000_nap();
32618cc36fbSJordan K. Hubbard 	}
32718cc36fbSJordan K. Hubbard }
32818cc36fbSJordan K. Hubbard 
32918cc36fbSJordan K. Hubbard #ifdef DEBUG
33018cc36fbSJordan K. Hubbard t3000_verbose_read()
33118cc36fbSJordan K. Hubbard {
33218cc36fbSJordan K. Hubbard 	int n = 0;
33318cc36fbSJordan K. Hubbard 	char buf[BUFSIZ];
33418cc36fbSJordan K. Hubbard 
33518cc36fbSJordan K. Hubbard 	if (ioctl(FD, FIONREAD, &n) < 0)
33618cc36fbSJordan K. Hubbard 		return;
33718cc36fbSJordan K. Hubbard 	if (n <= 0)
33818cc36fbSJordan K. Hubbard 		return;
33918cc36fbSJordan K. Hubbard 	if (read(FD, buf, n) != n)
34018cc36fbSJordan K. Hubbard 		return;
34118cc36fbSJordan K. Hubbard 	write(1, buf, n);
34218cc36fbSJordan K. Hubbard }
34318cc36fbSJordan K. Hubbard #endif
34418cc36fbSJordan K. Hubbard 
34518cc36fbSJordan K. Hubbard t3000_nap()
34618cc36fbSJordan K. Hubbard {
34718cc36fbSJordan K. Hubbard 	acu_nap (50);
34818cc36fbSJordan K. Hubbard }
34918cc36fbSJordan K. Hubbard 
35018cc36fbSJordan K. Hubbard /* end of t3000.c */
351