Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Mar 1995 00:39:27 -0800
From:      Tom Gray - DCA <dcasba@rain.org>
To:        freebsd-hackers@FreeBSD.org
Subject:   Patches for tip - part 3
Message-ID:  <199503270839.AAA12832@coyote.rain.org>

next in thread | raw e-mail | index | archive | help
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 3 (of 3)."
# Contents:  patches.tip.2
# Wrapped by john@grudunza on Mon Mar 27 00:09:39 1995
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patches.tip.2' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patches.tip.2'\"
else
echo shar: Extracting \"'patches.tip.2'\" \(51555 characters\)
sed "s/^X//" >'patches.tip.2' <<'END_OF_FILE'
Xdiff -r -c ./libacu/multitech.c libacu/multitech.c
X*** ./libacu/multitech.c	Sun Mar 26 18:47:09 1995
X--- libacu/multitech.c	Fri Mar 24 00:25:15 1995
X***************
X*** 0 ****
X--- 1,402 ----
X+ /*
X+  * Copyright (c) 1986, 1993
X+  *	The Regents of the University of California.  All rights reserved.
X+  *
X+  * Redistribution and use in source and binary forms, with or without
X+  * modification, are permitted provided that the following conditions
X+  * are met:
X+  * 1. Redistributions of source code must retain the above copyright
X+  *    notice, this list of conditions and the following disclaimer.
X+  * 2. Redistributions in binary form must reproduce the above copyright
X+  *    notice, this list of conditions and the following disclaimer in the
X+  *    documentation and/or other materials provided with the distribution.
X+  * 3. All advertising materials mentioning features or use of this software
X+  *    must display the following acknowledgement:
X+  *	This product includes software developed by the University of
X+  *	California, Berkeley and its contributors.
X+  * 4. Neither the name of the University nor the names of its contributors
X+  *    may be used to endorse or promote products derived from this software
X+  *    without specific prior written permission.
X+  *
X+  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X+  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X+  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X+  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X+  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X+  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X+  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X+  * SUCH DAMAGE.
X+  */
X+ 
X+ #ifndef lint
X+ static char sccsid[] = "@(#)multitech.c	8.1 (Berkeley) 6/6/93";
X+ #endif /* not lint */
X+ 
X+ /*
X+  * Routines for calling up on a Courier modem.
X+  * Derived from Hayes driver.
X+  */
X+ #include "tipconf.h"
X+ #include "tip.h"
X+ #include "acucommon.h"
X+ 
X+ #include <stdio.h>
X+ 
X+ /* #define DEBUG /**/
X+ #define	MAXRETRY	5
X+ /*
X+ 	Configuration
X+ */
X+ static CONST char *dial_command = "ATDT";
X+ static CONST char *hangup_command = "ATH\r";
X+ static CONST char *echo_off_command = "ATE0\r";
X+ static CONST char *reset_command = "\rATZ\r";
X+ static CONST char *init_string = "AT$BA0$SB38400&E1&E4&E13&E15Q0V1X4E0S0=0\r";
X+ static CONST char *escape_sequence = "+++"; /* return to command escape sequence */
X+ static CONST int lock_baud = 1;
X+ static CONST unsigned int intercharacter_delay = 20; 
X+ static CONST unsigned int intercommand_delay = 250; 
X+ static CONST unsigned int escape_guard_time = 250;
X+ static CONST unsigned int reset_delay = 2000;
X+ 
X+ /*
X+ 	Forward declarations
X+ */
X+ void multitech_write (int fd, CONST char *cp, int n);
X+ void multitech_write_str (int fd, CONST char *cp);
X+ void multitech_disconnect ();
X+ void acu_nap (unsigned int how_long);
X+ static void sigALRM ();
X+ static int multitechsync ();
X+ static int multitech_swallow (register char *match);
X+ 
X+ /*
X+ 	Global vars
X+ */
X+ static int timeout = 0;
X+ static int connected = 0;
X+ static jmp_buf timeoutbuf, intbuf;
X+ 
X+ int multitech_dialer (register char *num, char *acu)
X+ {
X+ 	register char *cp;
X+ #if ACULOG
X+ 	char line [80];
X+ #endif
X+ 	static int multitech_connect(), multitech_swallow();
X+ 
X+ 	if (lock_baud)
X+ 	{
X+ 		int i;
X+ 		if ((i = speed(number(value(BAUDRATE)))) == NULL) 
X+ 			return 0;
X+ 		ttysetup (i);
X+ 	}
X+ 
X+ 	if (boolean(value(VERBOSE)))
X+ 		printf("Using \"%s\"\n", acu);
X+ 
X+ 	acu_hupcl ();
X+ 
X+ 	/*
X+ 	 * Get in synch.
X+ 	 */
X+ 	if (!multitechsync()) {
X+ badsynch:
X+ 		printf("can't synchronize with multitech\n");
X+ #if ACULOG
X+ 		logent(value(HOST), num, "multitech", "can't synch up");
X+ #endif
X+ 		return (0);
X+ 	}
X+ 	acu_nap (intercommand_delay); 
X+ 
X+ 	multitech_write_str (FD, echo_off_command);	/* turn off echoing */
X+ 
X+ 	sleep(1);
X+ 
X+ #ifdef DEBUG
X+ 	if (boolean(value(VERBOSE)))
X+ 		multitech_verbose_read();
X+ #endif
X+ 
X+ 	acu_flush ();
X+ 
X+ 	acu_nap (intercommand_delay); 
X+ 	multitech_write_str (FD, init_string);
X+ 
X+ 	if (!multitech_swallow ("\r\nOK\r\n"))
X+ 		goto badsynch;
X+ 
X+ 	fflush (stdout);
X+ 
X+ 	acu_nap (intercommand_delay); 
X+ 	multitech_write_str (FD, dial_command);
X+ 
X+ 	for (cp = num; *cp; cp++)
X+ 		if (*cp == '=')
X+ 			*cp = ',';
X+ 
X+ 	multitech_write_str (FD, num);
X+ 
X+ 	multitech_write_str (FD, "\r");
X+ 
X+ 	connected = multitech_connect();
X+ 
X+ #if ACULOG
X+ 	if (timeout) {
X+ 		sprintf(line, "%d second dial timeout",
X+ 			number(value(DIALTIMEOUT)));
X+ 		logent(value(HOST), num, "multitech", line);
X+ 	}
X+ #endif
X+ 	if (timeout)
X+ 		multitech_disconnect ();
X+ 	return (connected);
X+ }
X+ 
X+ void multitech_disconnect ()
X+ {
X+ 	int okay, retries;
X+ 	for (retries = okay = 0; retries < 3 && !okay; retries++)
X+ 	{
X+ 		 /* first hang up the modem*/
X+ 		ioctl (FD, TIOCCDTR, 0);
X+ 		acu_nap (escape_guard_time); 
X+ 		ioctl (FD, TIOCSDTR, 0);
X+ 		acu_nap (escape_guard_time); 
X+ 		/*
X+ 		 * If not strapped for DTR control, try to get command mode.
X+ 		 */
X+ 		acu_nap (escape_guard_time);
X+ 		multitech_write_str (FD, escape_sequence);
X+ 		acu_nap (escape_guard_time);
X+ 		multitech_write_str (FD, hangup_command);
X+ 		okay = multitech_swallow ("\r\nOK\r\n");
X+ 	}
X+ 	if (!okay)
X+ 	{
X+ 		#if ACULOG
X+ 		logent(value(HOST), "", "multitech", "can't hang up modem");
X+ 		#endif
X+ 		if (boolean(value(VERBOSE)))
X+ 			printf("hang up failed\n");
X+ 	}
X+ 	close (FD);
X+ }
X+ 
X+ void multitech_abort ()
X+ {
X+ 	multitech_write_str (FD, "\r");	/* send anything to abort the call */
X+ 	multitech_disconnect ();
X+ }
X+ 
X+ static void sigALRM ()
X+ {
X+ 	(void) printf("\07timeout waiting for reply\n");
X+ 	timeout = 1;
X+ 	longjmp(timeoutbuf, 1);
X+ }
X+ 
X+ static int multitech_swallow (register char *match)
X+   {
X+ 	sig_t f;
X+ 	char c;
X+ 
X+ 	f = signal(SIGALRM, sigALRM);
X+ 	timeout = 0;
X+ 	do {
X+ 		if (*match =='\0') {
X+ 			signal(SIGALRM, f);
X+ 			return (1);
X+ 		}
X+ 		if (setjmp(timeoutbuf)) {
X+ 			signal(SIGALRM, f);
X+ 			return (0);
X+ 		}
X+ 		alarm(number(value(DIALTIMEOUT)));
X+ 		read(FD, &c, 1);
X+ 		alarm(0);
X+ 		c &= 0177;
X+ #ifdef DEBUG
X+ 		if (boolean(value(VERBOSE)))
X+ 			putchar(c);
X+ #endif
X+ 	} while (c == *match++);
X+ #ifdef DEBUG
X+ 	if (boolean(value(VERBOSE)))
X+ 		fflush (stdout);
X+ #endif
X+ 	signal(SIGALRM, SIG_DFL);
X+ 	return (0);
X+ }
X+ 
X+ static struct baud_msg {
X+ 	char *msg;
X+ 	int baud;
X+ } baud_msg[] = {
X+ 	"",		B300,
X+ 	" 1200",	B1200,
X+ 	" 2400",	B2400,
X+ 	" 9600",	B9600,
X+ 	" 9600/ARQ",	B9600,
X+ 	0,		0,
X+ };
X+ 
X+ static int multitech_connect ()
X+ {
X+ 	char c;
X+ 	int nc, nl, n;
X+ 	char dialer_buf[64];
X+ 	struct baud_msg *bm;
X+ 	sig_t f;
X+ 
X+ 	if (multitech_swallow("\r\n") == 0)
X+ 		return (0);
X+ 	f = signal(SIGALRM, sigALRM);
X+ again:
X+ 	nc = 0; nl = sizeof(dialer_buf)-1;
X+ 	bzero(dialer_buf, sizeof(dialer_buf));
X+ 	timeout = 0;
X+ 	for (nc = 0, nl = sizeof(dialer_buf)-1 ; nl > 0 ; nc++, nl--) {
X+ 		if (setjmp(timeoutbuf))
X+ 			break;
X+ 		alarm(number(value(DIALTIMEOUT)));
X+ 		n = read(FD, &c, 1);
X+ 		alarm(0);
X+ 		if (n <= 0)
X+ 			break;
X+ 		c &= 0x7f;
X+ 		if (c == '\r') {
X+ 			if (multitech_swallow("\n") == 0)
X+ 				break;
X+ 			if (!dialer_buf[0])
X+ 				goto again;
X+ 			if (strcmp(dialer_buf, "RINGING") == 0 &&
X+ 			    boolean(value(VERBOSE))) {
X+ #ifdef DEBUG
X+ 				printf("%s\r\n", dialer_buf);
X+ #endif
X+ 				goto again;
X+ 			}
X+ 			if (strncmp(dialer_buf, "CONNECT",
X+ 				    sizeof("CONNECT")-1) != 0)
X+ 				break;
X+ 			if (lock_baud) {
X+ 				signal(SIGALRM, f);
X+ #ifdef DEBUG
X+ 				if (boolean(value(VERBOSE)))
X+ 					printf("%s\r\n", dialer_buf);
X+ #endif
X+ 				return (1);
X+ 			}
X+ 			for (bm = baud_msg ; bm->msg ; bm++)
X+ 				if (strcmp(bm->msg, dialer_buf+sizeof("CONNECT")-1) == 0) {
X+ 					if (!acu_setspeed (bm->baud))
X+ 						goto error;
X+ 					signal(SIGALRM, f);
X+ #ifdef DEBUG
X+ 					if (boolean(value(VERBOSE)))
X+ 						printf("%s\r\n", dialer_buf);
X+ #endif
X+ 					return (1);
X+ 				}
X+ 			break;
X+ 		}
X+ 		dialer_buf[nc] = c;
X+ 	}
X+ error1:
X+ 	printf("%s\r\n", dialer_buf);
X+ error:
X+ 	signal(SIGALRM, f);
X+ 	return (0);
X+ }
X+ 
X+ /*
X+  * This convoluted piece of code attempts to get
X+  * the multitech in sync.
X+  */
X+ static int multitechsync ()
X+ {
X+ 	int already = 0;
X+ 	int len;
X+ 	char buf[40];
X+ 
X+ 	while (already++ < MAXRETRY) {
X+ 		acu_nap (intercommand_delay); 
X+ 		ioctl (FD, TIOCFLUSH, 0);	/* flush any clutter */
X+ 		multitech_write_str (FD, reset_command); /* reset modem */
X+ 		bzero(buf, sizeof(buf));
X+ 		acu_nap (reset_delay); 
X+ 		ioctl (FD, FIONREAD, &len);
X+ 		if (len) {
X+ 			len = read(FD, buf, sizeof(buf));
X+ #ifdef DEBUG 
X+ 			buf [len] = '\0';
X+ 			printf("multitechsync: (\"%s\")\n\r", buf);
X+ #endif
X+ 			if (index(buf, '0') || 
X+ 		   	   (index(buf, 'O') && index(buf, 'K')))
X+ 				return(1);
X+ 		}
X+ 		/*
X+ 		 * If not strapped for DTR control,
X+ 		 * try to get command mode.
X+ 		 */
X+ 		acu_nap (escape_guard_time);
X+ 		multitech_write_str (FD, escape_sequence);
X+ 		acu_nap (escape_guard_time);
X+ 		multitech_write_str (FD, hangup_command);
X+ 		/*
X+ 		 * Toggle DTR to force anyone off that might have left
X+ 		 * the modem connected.
X+ 		 */
X+ 		acu_nap (escape_guard_time); 
X+ 		ioctl (FD, TIOCCDTR, 0);
X+ 		acu_nap (escape_guard_time); 
X+ 		ioctl (FD, TIOCSDTR, 0);
X+ 	}
X+ 	acu_nap (intercommand_delay); 
X+ 	multitech_write_str (FD, reset_command);
X+ 	return (0);
X+ }
X+ 
X+ void multitech_write_str (int fd, const char *cp)
X+ {
X+ #ifdef DEBUG
X+ 	printf ("multitech: sending %s\n", cp);
X+ #endif
X+ 	multitech_write (fd, cp, strlen (cp));
X+ }
X+ 
X+ void multitech_write (int fd, const char *cp, int n)
X+ {
X+ 	acu_flush ();
X+ 	acu_nap (intercharacter_delay);
X+ 	for ( ; n-- ; cp++) {
X+ 		write (fd, cp, 1);
X+ 		acu_flush ();
X+ 		acu_nap (intercharacter_delay);
X+ 	}
X+ }
X+ 
X+ #ifdef DEBUG
X+ multitech_verbose_read()
X+ {
X+ 	int n = 0;
X+ 	char buf[BUFSIZ];
X+ 
X+ 	if (ioctl(FD, FIONREAD, &n) < 0)
X+ 		return;
X+ 	if (n <= 0)
X+ 		return;
X+ 	if (read(FD, buf, n) != n)
X+ 		return;
X+ 	write(1, buf, n);
X+ }
X+ #endif
X+ 
X+ /* end of multitech.c */
Xdiff -r -c ./libacu/t3000.c libacu/t3000.c
X*** ./libacu/t3000.c	Sun Mar 26 18:47:00 1995
X--- libacu/t3000.c	Fri Mar 24 00:25:34 1995
X***************
X*** 39,45 ****
X--- 39,47 ----
X   * Routines for calling up on a Telebit T3000 modem.
X   * Derived from Courier driver.
X   */
X+ #include "tipconf.h"
X  #include "tip.h"
X+ #include "acucommon.h"
X  #include <stdio.h>
X  
X  #define	MAXRETRY	5
X***************
X*** 55,61 ****
X  	char *acu;
X  {
X  	register char *cp;
X! #ifdef ACULOG
X  	char line[80];
X  #endif
X  	static int t3000_connect(), t3000_swallow();
X--- 57,63 ----
X  	char *acu;
X  {
X  	register char *cp;
X! #if ACULOG
X  	char line[80];
X  #endif
X  	static int t3000_connect(), t3000_swallow();
X***************
X*** 63,76 ****
X  	if (boolean(value(VERBOSE)))
X  		printf("Using \"%s\"\n", acu);
X  
X! 	ioctl(FD, TIOCHPCL, 0);
X  	/*
X  	 * Get in synch.
X  	 */
X  	if (!t3000_sync()) {
X  badsynch:
X  		printf("can't synchronize with t3000\n");
X! #ifdef ACULOG
X  		logent(value(HOST), num, "t3000", "can't synch up");
X  #endif
X  		return (0);
X--- 65,78 ----
X  	if (boolean(value(VERBOSE)))
X  		printf("Using \"%s\"\n", acu);
X  
X! 	acu_hupcl ();
X  	/*
X  	 * Get in synch.
X  	 */
X  	if (!t3000_sync()) {
X  badsynch:
X  		printf("can't synchronize with t3000\n");
X! #if ACULOG
X  		logent(value(HOST), num, "t3000", "can't synch up");
X  #endif
X  		return (0);
X***************
X*** 93,99 ****
X  	t3000_write(FD, num, strlen(num));
X  	t3000_write(FD, "\r", 1);
X  	connected = t3000_connect();
X! #ifdef ACULOG
X  	if (timeout) {
X  		sprintf(line, "%d second dial timeout",
X  			number(value(DIALTIMEOUT)));
X--- 95,101 ----
X  	t3000_write(FD, num, strlen(num));
X  	t3000_write(FD, "\r", 1);
X  	connected = t3000_connect();
X! #if ACULOG
X  	if (timeout) {
X  		sprintf(line, "%d second dial timeout",
X  			number(value(DIALTIMEOUT)));
X***************
X*** 195,201 ****
X  {
X  	char c;
X  	int nc, nl, n;
X- 	struct sgttyb sb;
X  	char dialer_buf[64];
X  	struct tbaud_msg *bm;
X  	sig_t f;
X--- 197,202 ----
X***************
X*** 234,258 ****
X  			for (bm = tbaud_msg ; bm->msg ; bm++)
X  				if (strcmp(bm->msg,
X  				    dialer_buf+sizeof("CONNECT")-1) == 0) {
X! 					if (ioctl(FD, TIOCGETP, &sb) < 0) {
X! 						perror("TIOCGETP");
X  						goto error;
X- 					}
X- 					sb.sg_ispeed = sb.sg_ospeed = bm->baud;
X- 					if (ioctl(FD, TIOCSETP, &sb) < 0) {
X- 						if (bm->baud2) {
X- 							sb.sg_ispeed =
X- 							sb.sg_ospeed =
X- 								bm->baud2;
X- 							if (ioctl(FD,
X- 								  TIOCSETP,
X- 								  &sb) >= 0)
X- 								goto isok;
X- 						}
X- 						perror("TIOCSETP");
X- 						goto error;
X- 					}
X- isok:
X  					signal(SIGALRM, f);
X  #ifdef DEBUG
X  					if (boolean(value(VERBOSE)))
X--- 235,242 ----
X  			for (bm = tbaud_msg ; bm->msg ; bm++)
X  				if (strcmp(bm->msg,
X  				    dialer_buf+sizeof("CONNECT")-1) == 0) {
X! 					if (!(acu_setspeed (bm->baud) || (bm->baud2 && acu_setspeed (bm->baud2))))
X  						goto error;
X  					signal(SIGALRM, f);
X  #ifdef DEBUG
X  					if (boolean(value(VERBOSE)))
X***************
X*** 329,347 ****
X  char *cp;
X  int n;
X  {
X- 	struct sgttyb sb;
X- 
X  #ifdef notdef
X  	if (boolean(value(VERBOSE)))
X  		write(1, cp, n);
X  #endif
X! 	ioctl(fd, TIOCGETP, &sb);
X! 	ioctl(fd, TIOCSETP, &sb);
X  	t3000_nap();
X  	for ( ; n-- ; cp++) {
X  		write(fd, cp, 1);
X! 		ioctl(fd, TIOCGETP, &sb);
X! 		ioctl(fd, TIOCSETP, &sb);
X  		t3000_nap();
X  	}
X  }
X--- 313,327 ----
X  char *cp;
X  int n;
X  {
X  #ifdef notdef
X  	if (boolean(value(VERBOSE)))
X  		write(1, cp, n);
X  #endif
X! 	acu_flush ();
X  	t3000_nap();
X  	for ( ; n-- ; cp++) {
X  		write(fd, cp, 1);
X! 		acu_flush ();
X  		t3000_nap();
X  	}
X  }
X***************
X*** 362,408 ****
X  }
X  #endif
X  
X- /*
X-  * Code stolen from /usr/src/lib/libc/gen/sleep.c
X-  */
X- #define mask(s) (1<<((s)-1))
X- #define setvec(vec, a) \
X-         vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0
X- 
X- static napms = 50; /* Give the t3000 50 milliseconds between characters */
X- 
X- static int ringring;
X- 
X  t3000_nap()
X  {
X! 
X!         static void t3000_napx();
X! 	int omask;
X!         struct itimerval itv, oitv;
X!         register struct itimerval *itp = &itv;
X!         struct sigvec vec, ovec;
X! 
X!         timerclear(&itp->it_interval);
X!         timerclear(&itp->it_value);
X!         if (setitimer(ITIMER_REAL, itp, &oitv) < 0)
X!                 return;
X!         setvec(ovec, SIG_DFL);
X!         omask = sigblock(mask(SIGALRM));
X!         itp->it_value.tv_sec = napms/1000;
X! 	itp->it_value.tv_usec = ((napms%1000)*1000);
X!         setvec(vec, t3000_napx);
X!         ringring = 0;
X!         (void) sigvec(SIGALRM, &vec, &ovec);
X!         (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0);
X!         while (!ringring)
X!                 sigpause(omask &~ mask(SIGALRM));
X!         (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0);
X!         (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0);
X! 	(void) sigsetmask(omask);
X  }
X  
X! static void
X! t3000_napx()
X! {
X!         ringring = 1;
X! }
X--- 342,350 ----
X  }
X  #endif
X  
X  t3000_nap()
X  {
X! 	acu_nap (50);
X  }
X  
X! /* end of t3000.c */
Xdiff -r -c ./libacu/tod.c libacu/tod.c
X*** ./libacu/tod.c	Sun Mar 26 18:47:08 1995
X--- libacu/tod.c	Sat Mar 25 18:06:00 1995
X***************
X*** 0 ****
X--- 1,107 ----
X+ /*
X+  * tod.c -- time of day pseudo-class implementation
X+  *
X+  * Copyright (c) 1995 John H. Poplett
X+  * All rights reserved.
X+  *
X+  * Redistribution and use in source and binary forms, with or without
X+  * modification, are permitted provided that the following conditions
X+  * are met:
X+  * 1. Redistributions of source code must retain the above copyright
X+  *    notice immediately at the beginning of the file, without modification,
X+  *    this list of conditions, and the following disclaimer.
X+  * 2. Redistributions in binary form must reproduce the above copyright
X+  *    notice, this list of conditions and the following disclaimer in the
X+  *    documentation and/or other materials provided with the distribution.
X+  * 3. Absolutely no warranty of function or purpose is made by the author
X+  *    John H. Poplett.
X+  * 4. This work was done expressly for inclusion into FreeBSD.  Other use
X+  *    is allowed if this notation is included.
X+  * 5. Modifications may be freely made to this file if the above conditions
X+  *    are met.
X+  *
X+  */
X+ 
X+ #include <sys/types.h>
X+ #include <sys/time.h>
X+ 
X+ #include <assert.h>
X+ #include <stdio.h>
X+ 
X+ #include "tod.h"
X+ 
X+ #define USP 1000000
X+ 
X+ int tod_cmp (const struct timeval *a, const struct timeval *b)
X+ {
X+ 	int rc;
X+ 	assert (a->tv_usec <= USP);
X+ 	assert (b->tv_usec <= USP);
X+ 	rc = a->tv_sec - b->tv_sec;
X+ 	if (rc == 0)
X+ 		rc = a->tv_usec - b->tv_usec;
X+ 	return rc;
X+ }
X+ 
X+ /*
X+ 	TOD < command
X+ */
X+ int tod_lt (const struct timeval *a, const struct timeval *b) 
X+ {
X+ 	return tod_cmp (a, b) < 0;
X+ }
X+ 
X+ int tod_gt (const struct timeval *a, const struct timeval *b) 
X+ {
X+ 	return tod_cmp (a, b) > 0;
X+ }
X+ 
X+ int tod_lte (const struct timeval *a, const struct timeval *b) 
X+ {
X+ 	return tod_cmp (a, b) <= 0;
X+ }
X+ 
X+ int tod_gte (const struct timeval *a, const struct timeval *b) 
X+ {
X+ 	return tod_cmp (a, b) >= 0;
X+ }
X+ 
X+ int tod_eq (const struct timeval *a, const struct timeval *b) 
X+ {
X+ 	return tod_cmp (a, b) == 0;
X+ }
X+ 
X+ /*
X+ 	TOD += command
X+ */
X+ void tod_addto (struct timeval *a, const struct timeval *b)
X+ {
X+ 	a->tv_usec += b->tv_usec;
X+ 	a->tv_sec += b->tv_sec + a->tv_usec / USP;
X+ 	a->tv_usec %= USP;
X+ }
X+ 
X+ /*
X+ 	TOD -= command
X+ */
X+ void tod_subfrom (struct timeval *a, struct timeval b)
X+ {
X+ 	assert (a->tv_usec <= USP);
X+ 	assert (b.tv_usec <= USP);
X+ 	if (b.tv_usec > a->tv_usec)
X+ 	{
X+ 		a->tv_usec += USP;
X+ 		a->tv_sec -= 1;
X+ 	}
X+ 	a->tv_usec -= b.tv_usec;
X+ 	a->tv_sec -= b.tv_sec;
X+ }
X+ 
X+ void tod_gettime (struct timeval *tp)
X+ {
X+ 	gettimeofday (tp, NULL);
X+ 	tp->tv_sec += tp->tv_usec / USP;
X+ 	tp->tv_usec %= USP;
X+ }
X+ 
X+ /* end of tod.c */
Xdiff -r -c ./libacu/tod.h libacu/tod.h
X*** ./libacu/tod.h	Sun Mar 26 18:47:09 1995
X--- libacu/tod.h	Tue Mar 14 23:13:42 1995
X***************
X*** 0 ****
X--- 1,9 ----
X+ int tod_cmp (const struct timeval *a, const struct timeval *b);
X+ int tod_lt (const struct timeval *a, const struct timeval *b) ;
X+ int tod_gt (const struct timeval *a, const struct timeval *b);
X+ int tod_lte (const struct timeval *a, const struct timeval *b);
X+ int tod_gte (const struct timeval *a, const struct timeval *b);
X+ int tod_eq (const struct timeval *a, const struct timeval *b);
X+ void tod_addto (struct timeval *a, const struct timeval *b);
X+ void tod_subfrom (struct timeval *a, struct timeval b);
X+ void tod_gettime (struct timeval *tp);
Xdiff -r -c ./libacu/unidialer.c libacu/unidialer.c
X*** ./libacu/unidialer.c	Sun Mar 26 18:47:09 1995
X--- libacu/unidialer.c	Sun Mar 26 12:30:04 1995
X***************
X*** 0 ****
X--- 1,800 ----
X+ /*
X+  * Copyright (c) 1986, 1993
X+  *	The Regents of the University of California.  All rights reserved.
X+  *
X+  * Redistribution and use in source and binary forms, with or without
X+  * modification, are permitted provided that the following conditions
X+  * are met:
X+  * 1. Redistributions of source code must retain the above copyright
X+  *    notice, this list of conditions and the following disclaimer.
X+  * 2. Redistributions in binary form must reproduce the above copyright
X+  *    notice, this list of conditions and the following disclaimer in the
X+  *    documentation and/or other materials provided with the distribution.
X+  * 3. All advertising materials mentioning features or use of this software
X+  *    must display the following acknowledgement:
X+  *	This product includes software developed by the University of
X+  *	California, Berkeley and its contributors.
X+  * 4. Neither the name of the University nor the names of its contributors
X+  *    may be used to endorse or promote products derived from this software
X+  *    without specific prior written permission.
X+  *
X+  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X+  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X+  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X+  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X+  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X+  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X+  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X+  * SUCH DAMAGE.
X+  */
X+ 
X+ #ifndef lint
X+ static char sccsid[] = "@(#)unidialer.c	8.1 (Berkeley) 6/6/93";
X+ #endif /* not lint */
X+ 
X+ /*
X+  * Generalized routines for calling up on a Hayes AT command set based modem.
X+  * Control variables are pulled out of a modem caps-style database to
X+  * configure the driver for a particular modem.
X+  */
X+ #include "tipconf.h"
X+ #include "tip.h"
X+ #include "pathnames.h"
X+ 
X+ #include <sys/times.h>
X+ #include <assert.h>
X+ #include <stdio.h>
X+ #include <stdlib.h>
X+ 
X+ #include "acucommon.h"
X+ #include "tod.h"
X+ 
X+ /* #define DEBUG /**/
X+ #define	MAXRETRY	5
X+ 
X+ typedef enum
X+ {
X+ 	mpt_notype, mpt_string, mpt_number, mpt_boolean
X+ } modem_parm_type_t;
X+ 
X+ typedef struct {
X+ 	modem_parm_type_t modem_parm_type;
X+ 	const char *name;
X+ 	union {
X+ 		char **string;
X+ 		unsigned int *number;
X+ 	} value;
X+ 	union {
X+ 		char *string;
X+ 		unsigned int number;
X+ 	} default_value;
X+ } modem_parm_t;
X+ 
X+ /*
X+ 	Configuration
X+ */
X+ static char modem_name [80];
X+ static char *dial_command;
X+ static char *hangup_command;
X+ static char *echo_off_command;
X+ static char *reset_command;
X+ static char *init_string;
X+ static char *escape_sequence;
X+ static int hw_flow_control;
X+ static int lock_baud;
X+ static unsigned int intercharacter_delay; 
X+ static unsigned int intercommand_delay; 
X+ static unsigned int escape_guard_time;
X+ static unsigned int reset_delay;
X+ 
X+ static int unidialer_dialer (register char *num, char *acu);
X+ static void unidialer_disconnect ();
X+ static void unidialer_abort ();
X+ 
X+ static acu_t unidialer =
X+ {
X+ 	modem_name,
X+ 	unidialer_dialer,
X+ 	unidialer_disconnect,
X+ 	unidialer_abort
X+ };
X+ 
X+ /*
X+ 	Table of parameters kept in modem database
X+ */
X+ modem_parm_t modem_parms [] = {
X+ 	{ mpt_string, "dial_command", &dial_command, "ATDT%s\r" },
X+ 	{ mpt_string, "hangup_command", &hangup_command, "ATH\r", },
X+ 	{ mpt_string, "echo_off_command", &echo_off_command, "ATE0\r" },
X+ 	{ mpt_string, "reset_command", &reset_command, "ATZ\r" },
X+ 	{ mpt_string, "init_string", &init_string, "AT&F\r", },
X+ 	{ mpt_string, "escape_sequence", &escape_sequence, "+++" },
X+ 	{ mpt_boolean, "hw_flow_control", (char **)&hw_flow_control, NULL },
X+ 	{ mpt_boolean, "lock_baud", (char **)&lock_baud, NULL },
X+ 	{ mpt_number, "intercharacter_delay", (char **)&intercharacter_delay, (char *)50 },
X+ 	{ mpt_number, "intercommand_delay", (char **)&intercommand_delay, (char *)300 },
X+ 	{ mpt_number, "escape_guard_time", (char **)&escape_guard_time, (char *)300 },
X+ 	{ mpt_number, "reset_delay", (char **)&reset_delay, (char *)3000 },
X+ 	{ mpt_notype, NULL, NULL, NULL }
X+ };
X+ 
X+ /*
X+ 	Forward declarations
X+ */
X+ static void unidialer_verbose_read ();
X+ static void unidialer_modem_cmd (int fd, CONST char *cmd);
X+ static void unidialer_write (int fd, CONST char *cp, int n);
X+ static void unidialer_write_str (int fd, CONST char *cp);
X+ static void unidialer_disconnect ();
X+ static void sigALRM ();
X+ static int unidialersync ();
X+ static int unidialer_swallow (register char *match);
X+ 
X+ /*
X+ 	Global vars
X+ */
X+ static int timeout = 0;
X+ static int connected = 0;
X+ static jmp_buf timeoutbuf, intbuf;
X+ 
X+ #define cgetflag(f)	(cgetcap(bp, f, ':') != NULL)
X+ 
X+ #ifdef DEBUG
X+ 
X+ #define print_str(x) printf (#x " = %s\n", x)
X+ #define print_num(x) printf (#x " = %d\n", x)
X+ 
X+ void dumpmodemparms (char *modem)
X+ {
X+ 		printf ("modem parms for %s\n", modem);
X+ 		print_str (dial_command);
X+ 		print_str (hangup_command);
X+ 		print_str (echo_off_command);
X+ 		print_str (reset_command);
X+ 		print_str (init_string);
X+ 		print_str (escape_sequence);
X+ 		print_num (lock_baud);
X+ 		print_num (intercharacter_delay); 
X+ 		print_num (intercommand_delay); 
X+ 		print_num (escape_guard_time);
X+ 		print_num (reset_delay);
X+ 		printf ("\n");
X+ }
X+ #endif
X+ 
X+ static int getmodemparms (const char *modem)
X+ {
X+ 	char *bp, *db_array [3], *modempath;
X+ 	int ndx, stat;
X+ 	modem_parm_t *mpp;
X+ 
X+ 	modempath = getenv ("MODEMS");
X+ 
X+ 	ndx = 0;
X+ 
X+ 	if (modempath != NULL) 
X+ 		db_array [ndx++] = modempath;
X+ 
X+ 	db_array [ndx++] = _PATH_MODEMS;
X+ 	db_array [ndx] = NULL;
X+ 
X+ 	if ((stat = cgetent (&bp, db_array, (char *)modem)) < 0) {
X+ 		switch (stat) {
X+ 		case -1:
X+ 			fprintf (stderr, "tip: unknown modem %s\n", modem);
X+ 			break;
X+ 		case -2:
X+ 			fprintf (stderr, "tip: can't open modem description file\n");
X+ 			break;
X+ 		case -3:
X+ 			fprintf (stderr, "tip: possible reference loop in modem description file\n");
X+ 			break;
X+ 		}
X+ 		return 0;
X+ 	}
X+ 	for (mpp = modem_parms; mpp->name; mpp++)
X+ 	{
X+ 		switch (mpp->modem_parm_type)
X+ 		{
X+ 			case mpt_string:
X+ 				if (cgetstr (bp, (char *)mpp->name, mpp->value.string) == -1)
X+ 					*mpp->value.string = mpp->default_value.string;
X+ 				break;
X+ 
X+ 			case mpt_number:
X+ 			{
X+ 				long l;
X+ 				if (cgetnum (bp, (char *)mpp->name, &l) == -1)
X+ 					*mpp->value.number = mpp->default_value.number;
X+ 				else
X+ 					*mpp->value.number = (unsigned int)l;
X+ 			}
X+ 				break;
X+ 
X+ 			case mpt_boolean:
X+ 				*mpp->value.number = cgetflag ((char *)mpp->name);
X+ 				break;
X+ 		}
X+ 	}
X+ 	strncpy (modem_name, modem, sizeof (modem_name) - 1);
X+ 	modem_name [sizeof (modem_name) - 1] = '\0';
X+ 	return 1;
X+ }
X+ 
X+ /*
X+ */
X+ acu_t* unidialer_getmodem (const char *modem_name)
X+ {
X+ 	acu_t* rc = NOACU;
X+ 	if (getmodemparms (modem_name))
X+ 		rc = &unidialer;
X+ 	return rc;
X+ }
X+ 
X+ static int unidialer_modem_ready ()
X+ {
X+ #ifdef TIOCMGET
X+ 	int state;
X+ 	ioctl (FD, TIOCMGET, &state);
X+ 	return (state & TIOCM_DSR) ? 1 : 0;
X+ #else
X+ 	return (1);
X+ #endif
X+ }
X+ 
X+ static int unidialer_waitfor_modem_ready (int ms)
X+ {
X+ #ifdef TIOCMGET
X+ 	int count;
X+ 	for (count = 0; count < ms; count += 100)
X+ 	{
X+ 		if (unidialer_modem_ready ())
X+ 		{
X+ #ifdef DEBUG
X+ 			printf ("unidialer_waitfor_modem_ready: modem ready.\n");
X+ #endif
X+ 			break;
X+ 		}
X+ 		acu_nap (100);
X+ 	}
X+ 	return (count < ms);
X+ #else
X+ 	acu_nap (250);
X+ 	return (1);
X+ #endif
X+ }
X+ 
X+ int unidialer_tty_clocal (int flag)
X+ {
X+ #if HAVE_TERMIOS
X+ 	struct termios t;
X+ 	tcgetattr (FD, &t);
X+ 	if (flag)
X+ 		t.c_cflag |= CLOCAL;
X+ 	else
X+ 		t.c_cflag &= ~CLOCAL;
X+ 	tcsetattr (FD, TCSANOW, &t);
X+ #elif defined(TIOCMSET)
X+ 	int state;
X+ 	/*
X+ 		Don't have CLOCAL so raise CD in software to
X+ 		get the same effect.
X+ 	*/
X+ 	ioctl (FD, TIOCMGET, &state);
X+ 	if (flag)
X+ 		state |= TIOCM_CD;
X+ 	else
X+ 		state &= ~TIOCM_CD;
X+ 	ioctl (FD, TIOCMSET, &state);
X+ #endif
X+ }
X+ 
X+ int unidialer_get_modem_response (char *buf, int bufsz, int response_timeout)
X+ {
X+ 	sig_t f;
X+ 	char c, *p = buf, *lid = buf + bufsz - 1;
X+ 	int state;
X+ 
X+ 	assert (bufsz > 0);
X+ 
X+ 	f = signal (SIGALRM, sigALRM);
X+ 
X+ 	timeout = 0;
X+ 
X+ 	if (setjmp (timeoutbuf)) {
X+ 		signal (SIGALRM, f);
X+ 		*p = '\0';
X+ #ifdef DEBUG
X+ 		printf ("get_response: timeout buf=%s, state=%d\n", buf, state);
X+ #endif
X+ 		return (0);
X+ 	}
X+ 
X+ 	ualarm (response_timeout * 1000, 0);
X+ 
X+ 	state = 0;
X+ 
X+ 	while (1)
X+ 	{
X+ 		switch (state)
X+ 		{
X+ 			case 0:
X+ 				if (read (FD, &c, 1) == 1)
X+ 				{
X+ 					if (c == '\r')
X+ 					{
X+ 						++state;
X+ 					}
X+ 					else
X+ 					{
X+ #ifdef DEBUG
X+ 						printf ("get_response: unexpected char %s.\n", ctrl (c));
X+ #endif
X+ 					}
X+ 				}
X+ 				break;
X+ 	
X+ 			case 1:
X+ 				if (read (FD, &c, 1) == 1) 
X+ 				{
X+ 					if (c == '\n')
X+ 					{
X+ #ifdef DEBUG
X+ 						printf ("get_response: <CRLF> encountered.\n", buf);
X+ #endif
X+ 						++state;
X+ 					}
X+ 					else
X+ 					{
X+ 							state = 0;
X+ #ifdef DEBUG
X+ 							printf ("get_response: unexpected char %s.\n", ctrl (c));
X+ #endif
X+ 					}
X+ 				}
X+ 				break;
X+ 	
X+ 			case 2:
X+ 				if (read (FD, &c, 1) == 1) 
X+ 				{
X+ 					if (c == '\r')
X+ 						++state;
X+ 					else if (c >= ' ' && p < lid)
X+ 						*p++ = c;
X+ 				}
X+ 				break;
X+ 	
X+ 			case 3:
X+ 				if (read (FD, &c, 1) == 1) 
X+ 				{
X+ 					if (c == '\n')
X+ 					{
X+ 						signal (SIGALRM, f);
X+ 						/* ualarm (0, 0); */
X+ 						alarm (0);
X+ 						*p = '\0';
X+ #ifdef DEBUG
X+ 						printf ("get_response: %s\n", buf);
X+ #endif
X+ 						return (1);
X+ 					}
X+ 					else
X+ 					{
X+ 						state = 0;
X+ 						p = buf;
X+ 					}
X+ 				}
X+ 				break;
X+ 		}
X+ 	}
X+ }
X+ 
X+ int unidialer_get_okay (int ms)
X+ {
X+ 	int okay;
X+ 	char buf [BUFSIZ];
X+ 	okay = unidialer_get_modem_response (buf, sizeof (buf), ms) &&
X+ 		strcmp (buf, "OK") == 0;
X+ 	return okay;
X+ }
X+ 
X+ static int unidialer_dialer (register char *num, char *acu)
X+ {
X+ 	register char *cp;
X+ 	char dial_string [80];
X+ #if ACULOG
X+ 	char line [80];
X+ #endif
X+ 	static int unidialer_connect(), unidialer_swallow();
X+ 
X+ 	#ifdef DEBUG
X+ 	dumpmodemparms (modem_name);
X+ 	#endif
X+ 
X+ 	if (lock_baud) {
X+ 		int i;
X+ 		if ((i = speed(number(value(BAUDRATE)))) == NULL) 
X+ 			return 0;
X+ 		ttysetup (i);
X+ 	}
X+ 
X+ 	if (boolean(value(VERBOSE)))
X+ 		printf("Using \"%s\"\n", acu);
X+ 
X+ 	acu_hupcl ();
X+ 
X+ 	/*
X+ 	 * Get in synch.
X+ 	 */
X+ 	if (!unidialersync()) {
X+ badsynch:
X+ 		printf("tip: can't synchronize with %s\n", modem_name);
X+ #if ACULOG
X+ 		logent(value(HOST), num, modem_name, "can't synch up");
X+ #endif
X+ 		return (0);
X+ 	}
X+ 
X+ 	unidialer_modem_cmd (FD, echo_off_command);	/* turn off echoing */
X+ 
X+ 	sleep(1);
X+ 
X+ #ifdef DEBUG
X+ 	if (boolean(value(VERBOSE)))
X+ 		unidialer_verbose_read();
X+ #endif
X+ 
X+ 	acu_flush (); /* flush any clutter */
X+ 
X+ 	unidialer_modem_cmd (FD, init_string);
X+ 
X+ 	if (!unidialer_get_okay (250))
X+ 		goto badsynch;
X+ 
X+ 	fflush (stdout);
X+ 
X+ 	for (cp = num; *cp; cp++)
X+ 		if (*cp == '=')
X+ 			*cp = ',';
X+ 
X+ 	(void) sprintf (dial_string, dial_command, num);
X+ 
X+ 	unidialer_modem_cmd (FD, dial_string);
X+ 
X+ 	connected = unidialer_connect ();
X+ 
X+ 	if (connected && hw_flow_control) {
X+ 		acu_hw_flow_control (hw_flow_control);
X+ 	}
X+ 
X+ #if ACULOG
X+ 	if (timeout) {
X+ 		sprintf(line, "%d second dial timeout",
X+ 			number(value(DIALTIMEOUT)));
X+ 		logent(value(HOST), num, modem_name, line);
X+ 	}
X+ #endif
X+ 
X+ 	if (timeout)
X+ 		unidialer_disconnect ();
X+ 
X+ 	return (connected);
X+ }
X+ 
X+ static void unidialer_disconnect ()
X+ {
X+ 	int okay, retries;
X+ 
X+ 	acu_flush (); /* flush any clutter */
X+ 
X+ 	unidialer_tty_clocal (TRUE);
X+ 
X+  	/* first hang up the modem*/
X+ 	ioctl (FD, TIOCCDTR, 0);
X+ 	acu_nap (250);
X+ 	ioctl (FD, TIOCSDTR, 0);
X+ 
X+ 	/*
X+ 	 * If AT&D2, then dropping DTR *should* just hangup the modem. But
X+ 	 * some modems reset anyway; also, the modem may be programmed to reset
X+ 	 * anyway with AT&D3. Play it safe and wait for the full reset time before
X+ 	 * proceeding.
X+ 	 */
X+ 	acu_nap (reset_delay);
X+ 
X+ 	if (!unidialer_waitfor_modem_ready (reset_delay))
X+ 	{
X+ #ifdef DEBUG
X+ 			printf ("unidialer_disconnect: warning CTS low.\r\n");
X+ #endif
X+ 	}
X+ 
X+ 	/*
X+ 	 * If not strapped for DTR control, try to get command mode.
X+ 	 */
X+ 	for (retries = okay = 0; retries < MAXRETRY && !okay; retries++)
X+ 	{
X+ 		int timeout_value;
X+ 		/* flush any clutter */
X+ 		if (!acu_flush ())
X+ 		{
X+ #ifdef DEBUG
X+ 			printf ("unidialer_disconnect: warning flush failed.\r\n");
X+ #endif
X+ 		}
X+ 		timeout_value = escape_guard_time;
X+ 		timeout_value += (timeout_value * retries / MAXRETRY);
X+ 		acu_nap (timeout_value);
X+ 		acu_flush (); /* flush any clutter */
X+ 		unidialer_modem_cmd (FD, escape_sequence);
X+ 		acu_nap (timeout_value);
X+ 		unidialer_modem_cmd (FD, hangup_command);
X+ 		okay = unidialer_get_okay (250);
X+ 	}
X+ 	if (!okay)
X+ 	{
X+ 		#if ACULOG
X+ 		logent(value(HOST), "", modem_name, "can't hang up modem");
X+ 		#endif
X+ 		if (boolean(value(VERBOSE)))
X+ 			printf("hang up failed\n");
X+ 	}
X+ 	(void) acu_flush ();
X+ 	close (FD);
X+ }
X+ 
X+ static void unidialer_abort ()
X+ {
X+ 	unidialer_write_str (FD, "\r");	/* send anything to abort the call */
X+ 	unidialer_disconnect ();
X+ }
X+ 
X+ static void sigALRM ()
X+ {
X+ 	(void) printf("\07timeout waiting for reply\n");
X+ 	timeout = 1;
X+ 	longjmp(timeoutbuf, 1);
X+ }
X+ 
X+ static int unidialer_swallow (register char *match)
X+ {
X+ 	sig_t f;
X+ 	char c;
X+ 
X+ 	f = signal(SIGALRM, sigALRM);
X+ 
X+ 	timeout = 0;
X+ 
X+ 	if (setjmp(timeoutbuf)) {
X+ 		signal(SIGALRM, f);
X+ 		return (0);
X+ 	}
X+ 
X+ 	alarm(number(value(DIALTIMEOUT)));
X+ 
X+ 	do {
X+ 		if (*match =='\0') {
X+ 			signal(SIGALRM, f);
X+ 			alarm (0);
X+ 			return (1);
X+ 		}
X+ 		do {
X+ 			read (FD, &c, 1);
X+ 		} while (c == '\0');
X+ 		c &= 0177;
X+ #ifdef DEBUG
X+ 		if (boolean(value(VERBOSE)))
X+ 		{
X+ 			/* putchar(c); */
X+ 			printf (ctrl (c));
X+ 		}
X+ #endif
X+ 	} while (c == *match++);
X+ 	signal(SIGALRM, SIG_DFL);
X+ 	alarm(0);
X+ #ifdef DEBUG
X+ 	if (boolean(value(VERBOSE)))
X+ 		fflush (stdout);
X+ #endif
X+ 	return (0);
X+ }
X+ 
X+ static struct baud_msg {
X+ 	char *msg;
X+ 	int baud;
X+ } baud_msg[] = {
X+ 	"",		B300,
X+ 	" 1200",	B1200,
X+ 	" 2400",	B2400,
X+ 	" 9600",	B9600,
X+ 	" 9600/ARQ",	B9600,
X+ 	0,		0,
X+ };
X+ 
X+ static int unidialer_connect ()
X+ {
X+ 	char c;
X+ 	int nc, nl, n;
X+ 	char dialer_buf[64];
X+ 	struct baud_msg *bm;
X+ 	sig_t f;
X+ 
X+ 	if (unidialer_swallow("\r\n") == 0)
X+ 		return (0);
X+ 	f = signal(SIGALRM, sigALRM);
X+ again:
X+ 	nc = 0; nl = sizeof(dialer_buf)-1;
X+ 	bzero(dialer_buf, sizeof(dialer_buf));
X+ 	timeout = 0;
X+ 	for (nc = 0, nl = sizeof(dialer_buf)-1 ; nl > 0 ; nc++, nl--) {
X+ 		if (setjmp(timeoutbuf))
X+ 			break;
X+ 		alarm(number(value(DIALTIMEOUT)));
X+ 		n = read(FD, &c, 1);
X+ 		alarm(0);
X+ 		if (n <= 0)
X+ 			break;
X+ 		c &= 0x7f;
X+ 		if (c == '\r') {
X+ 			if (unidialer_swallow("\n") == 0)
X+ 				break;
X+ 			if (!dialer_buf[0])
X+ 				goto again;
X+ 			if (strcmp(dialer_buf, "RINGING") == 0 &&
X+ 			    boolean(value(VERBOSE))) {
X+ #ifdef DEBUG
X+ 				printf("%s\r\n", dialer_buf);
X+ #endif
X+ 				goto again;
X+ 			}
X+ 			if (strncmp(dialer_buf, "CONNECT",
X+ 				    sizeof("CONNECT")-1) != 0)
X+ 				break;
X+ 			if (lock_baud) {
X+ 				signal(SIGALRM, f);
X+ #ifdef DEBUG
X+ 				if (boolean(value(VERBOSE)))
X+ 					printf("%s\r\n", dialer_buf);
X+ #endif
X+ 				return (1);
X+ 			}
X+ 			for (bm = baud_msg ; bm->msg ; bm++)
X+ 				if (strcmp(bm->msg, dialer_buf+sizeof("CONNECT")-1) == 0) {
X+ 					if (!acu_setspeed (bm->baud))
X+ 						goto error;
X+ 					signal(SIGALRM, f);
X+ #ifdef DEBUG
X+ 					if (boolean(value(VERBOSE)))
X+ 						printf("%s\r\n", dialer_buf);
X+ #endif
X+ 					return (1);
X+ 				}
X+ 			break;
X+ 		}
X+ 		dialer_buf[nc] = c;
X+ 	}
X+ error1:
X+ 	printf("%s\r\n", dialer_buf);
X+ error:
X+ 	signal(SIGALRM, f);
X+ 	return (0);
X+ }
X+ 
X+ /*
X+  * This convoluted piece of code attempts to get
X+  * the unidialer in sync.
X+  */
X+ static int unidialersync ()
X+ {
X+ 	int already = 0;
X+ 	int len;
X+ 	char buf[40];
X+ 
X+ 	while (already++ < MAXRETRY) {
X+ 		acu_nap (intercommand_delay); 
X+ 		acu_flush (); /* flush any clutter */
X+ 		unidialer_write_str (FD, reset_command); /* reset modem */
X+ 		bzero(buf, sizeof(buf));
X+ 		acu_nap (reset_delay); 
X+ 		ioctl (FD, FIONREAD, &len);
X+ 		if (len) {
X+ 			len = read(FD, buf, sizeof(buf));
X+ #ifdef DEBUG 
X+ 			buf [len] = '\0';
X+ 			printf("unidialersync (%s): (\"%s\")\n\r", modem_name, buf);
X+ #endif
X+ 			if (index(buf, '0') || 
X+ 		   	   (index(buf, 'O') && index(buf, 'K')))
X+ 				return(1);
X+ 		}
X+ 		/*
X+ 		 * If not strapped for DTR control,
X+ 		 * try to get command mode.
X+ 		 */
X+ 		acu_nap (escape_guard_time);
X+ 		unidialer_write_str (FD, escape_sequence);
X+ 		acu_nap (escape_guard_time);
X+ 		unidialer_write_str (FD, hangup_command);
X+ 		/*
X+ 		 * Toggle DTR to force anyone off that might have left
X+ 		 * the modem connected.
X+ 		 */
X+ 		acu_nap (escape_guard_time); 
X+ 		ioctl (FD, TIOCCDTR, 0);
X+ 		acu_nap (1000); 
X+ 		ioctl (FD, TIOCSDTR, 0);
X+ 	}
X+ 	acu_nap (intercommand_delay); 
X+ 	unidialer_write_str (FD, reset_command);
X+ 	return (0);
X+ }
X+ 
X+ /*
X+ 	Send commands to modem; impose delay between commands.
X+ */
X+ static void unidialer_modem_cmd (int fd, const char *cmd)
X+ {
X+ 	static struct timeval oldt = { 0, 0 };
X+ 	struct timeval newt;
X+ 	tod_gettime (&newt);
X+ 	if (tod_lt (&newt, &oldt))
X+ 	{
X+ 		unsigned int naptime;
X+ 		tod_subfrom (&oldt, newt);
X+ 		naptime = oldt.tv_sec * 1000 + oldt.tv_usec / 1000;
X+ 		if (naptime > intercommand_delay)
X+ 		{
X+ #ifdef DEBUG 
X+ 		printf ("unidialer_modem_cmd: suspicious naptime (%u ms)\r\n", naptime);
X+ #endif
X+ 			naptime = intercommand_delay;
X+ 		}
X+ #ifdef DEBUG 
X+ 		printf ("unidialer_modem_cmd: delaying %u ms\r\n", naptime);
X+ #endif
X+ 		acu_nap (naptime);
X+ 	}
X+ 	unidialer_write_str (fd, cmd);
X+ 	tod_gettime (&oldt);
X+ 	newt.tv_sec = 0;
X+ 	newt.tv_usec = intercommand_delay; 
X+ 	tod_addto (&oldt, &newt);
X+ }
X+ 
X+ static void unidialer_write_str (int fd, const char *cp)
X+ {
X+ #ifdef DEBUG
X+ 	printf ("unidialer (%s): sending %s\n", modem_name, cp);
X+ #endif
X+ 	unidialer_write (fd, cp, strlen (cp));
X+ }
X+ 
X+ static void unidialer_write (int fd, const char *cp, int n)
X+ {
X+ 	acu_nap (intercharacter_delay);
X+ 	for ( ; n-- ; cp++) {
X+ 		write (fd, cp, 1);
X+ 		acu_nap (intercharacter_delay);
X+ 	}
X+ }
X+ 
X+ #ifdef DEBUG
X+ static void unidialer_verbose_read()
X+ {
X+ 	int n = 0;
X+ 	char buf[BUFSIZ];
X+ 
X+ 	if (ioctl(FD, FIONREAD, &n) < 0)
X+ 		return;
X+ 	if (n <= 0)
X+ 		return;
X+ 	if (read(FD, buf, n) != n)
X+ 		return;
X+ 	write(1, buf, n);
X+ }
X+ #endif
X+ 
X+ /* end of unidialer.c */
Xdiff -r -c ./libacu/v3451.c libacu/v3451.c
X*** ./libacu/v3451.c	Sun Mar 26 18:47:00 1995
X--- libacu/v3451.c	Fri Mar 24 00:26:34 1995
X***************
X*** 38,43 ****
X--- 38,44 ----
X  /*
X   * Routines for calling up on a Vadic 3451 Modem
X   */
X+ #include "tipconf.h"
X  #include "tip.h"
X  
X  static	jmp_buf Sjbuf;
X***************
X*** 50,56 ****
X  	int ok;
X  	int slow = number(value(BAUDRATE)) < 1200, rw = 2;
X  	char phone[50];
X! #ifdef ACULOG
X  	char line[80];
X  #endif
X  	static int expect();
X--- 51,57 ----
X  	int ok;
X  	int slow = number(value(BAUDRATE)) < 1200, rw = 2;
X  	char phone[50];
X! #if ACULOG
X  	char line[80];
X  #endif
X  	static int expect();
X***************
X*** 65,81 ****
X  	vawrite("\005\r", 2 + slow);
X  	if (!expect("READY")) {
X  		printf("can't synchronize with vadic 3451\n");
X! #ifdef ACULOG
X  		logent(value(HOST), num, "vadic", "can't synch up");
X  #endif
X  		return (0);
X  	}
X! 	ioctl(FD, TIOCHPCL, 0);
X  	sleep(1);
X  	vawrite("D\r", 2 + slow);
X  	if (!expect("NUMBER?")) {
X  		printf("Vadic will not accept dial command\n");
X! #ifdef ACULOG
X  		logent(value(HOST), num, "vadic", "will not accept dial");
X  #endif
X  		return (0);
X--- 66,82 ----
X  	vawrite("\005\r", 2 + slow);
X  	if (!expect("READY")) {
X  		printf("can't synchronize with vadic 3451\n");
X! #if ACULOG
X  		logent(value(HOST), num, "vadic", "can't synch up");
X  #endif
X  		return (0);
X  	}
X! 	acu_hupcl ();
X  	sleep(1);
X  	vawrite("D\r", 2 + slow);
X  	if (!expect("NUMBER?")) {
X  		printf("Vadic will not accept dial command\n");
X! #if ACULOG
X  		logent(value(HOST), num, "vadic", "will not accept dial");
X  #endif
X  		return (0);
X***************
X*** 85,91 ****
X  	vawrite(phone, 1 + slow);
X  	if (!expect(phone)) {
X  		printf("Vadic will not accept phone number\n");
X! #ifdef ACULOG
X  		logent(value(HOST), num, "vadic", "will not accept number");
X  #endif
X  		return (0);
X--- 86,92 ----
X  	vawrite(phone, 1 + slow);
X  	if (!expect(phone)) {
X  		printf("Vadic will not accept phone number\n");
X! #if ACULOG
X  		logent(value(HOST), num, "vadic", "will not accept number");
X  #endif
X  		return (0);
X***************
X*** 100,106 ****
X  	vawrite("\r", 1 + slow);
X  	if (!expect("DIALING:")) {
X  		printf("Vadic failed to dial\n");
X! #ifdef ACULOG
X  		logent(value(HOST), num, "vadic", "failed to dial");
X  #endif
X  		return (0);
X--- 101,107 ----
X  	vawrite("\r", 1 + slow);
X  	if (!expect("DIALING:")) {
X  		printf("Vadic failed to dial\n");
X! #if ACULOG
X  		logent(value(HOST), num, "vadic", "failed to dial");
X  #endif
X  		return (0);
X***************
X*** 111,117 ****
X  	signal(SIGINT, func);
X  	if (!ok) {
X  		printf("call failed\n");
X! #ifdef ACULOG
X  		logent(value(HOST), num, "vadic", "call failed");
X  #endif
X  		return (0);
X--- 112,118 ----
X  	signal(SIGINT, func);
X  	if (!ok) {
X  		printf("call failed\n");
X! #if ACULOG
X  		logent(value(HOST), num, "vadic", "call failed");
X  #endif
X  		return (0);
Xdiff -r -c ./libacu/v831.c libacu/v831.c
X*** ./libacu/v831.c	Sun Mar 26 18:47:00 1995
X--- libacu/v831.c	Thu Mar 16 08:02:03 1995
X***************
X*** 38,43 ****
X--- 38,44 ----
X  /*
X   * Routines for dialing up on Vadic 831
X   */
X+ #include "tipconf.h"
X  #include "tip.h"
X  
X  int	v831_abort();
X***************
X*** 127,144 ****
X   */
X  v831_disconnect()
X  {
X-         struct sgttyb cntrl;
X- 
X          sleep(2);
X  #ifdef DEBUG
X          printf("[disconnect: FD=%d]\n", FD);
X  #endif
X          if (FD > 0) {
X                  ioctl(FD, TIOCCDTR, 0);
X!                 ioctl(FD, TIOCGETP, &cntrl);
X!                 cntrl.sg_ispeed = cntrl.sg_ospeed = 0;
X!                 ioctl(FD, TIOCSETP, &cntrl);
X!                 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL);
X          }
X          close(FD);
X  }
X--- 128,141 ----
X   */
X  v831_disconnect()
X  {
X          sleep(2);
X  #ifdef DEBUG
X          printf("[disconnect: FD=%d]\n", FD);
X  #endif
X          if (FD > 0) {
X                  ioctl(FD, TIOCCDTR, 0);
X! 								acu_setspeec (0);
X!                 ioctl(FD, TIOCNXCL, 0);
X          }
X          close(FD);
X  }
X***************
X*** 153,159 ****
X          if (child > 0)
X                  kill(child, SIGKILL);
X          if (AC > 0)
X!                 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL);
X                  close(AC);
X          if (FD > 0)
X                  ioctl(FD, TIOCCDTR, 0);
X--- 150,156 ----
X          if (child > 0)
X                  kill(child, SIGKILL);
X          if (AC > 0)
X!                 ioctl(FD, TIOCNXCL, 0);
X                  close(AC);
X          if (FD > 0)
X                  ioctl(FD, TIOCCDTR, 0);
X***************
X*** 185,191 ****
X  	char *acu;
X  {
X          register struct vaconfig *vp;
X- 	struct sgttyb cntrl;
X          char c;
X          int i, two = 2;
X  	static char *sanitize();
X--- 182,187 ----
X***************
X*** 203,212 ****
X--- 199,225 ----
X  		printf("Unable to locate dialer (%s)\n", acu);
X  		return ('K');
X  	}
X+ 	{
X+ #if HAVE_TERMIOS
X+ 				struct termios termios;
X+ 				tcgetattr (AC, &termios);
X+ 				termios.c_iflag = 0;
X+ #ifndef _POSIX_SOURCE
X+ 				termios.c_lflag = (PENDIN|ECHOKE|ECHOE);
X+ #else
X+ 				termios.c_lflag = (PENDIN|ECHOE);
X+ #endif
X+ 				termios.c_cflag = (CLOCAL|HUPCL|CREAD|CS8);
X+ 				termios.c_ispeed = termios.c_ospeed = B2400;
X+ 				tcsetattr (AC, TCSANOW, &termios);
X+ #else /* HAVE_TERMIOS */
X+ 				struct sgttyb cntrl;
X          ioctl(AC, TIOCGETP, &cntrl);
X          cntrl.sg_ispeed = cntrl.sg_ospeed = B2400;
X          cntrl.sg_flags = RAW | EVENP | ODDP;
X          ioctl(AC, TIOCSETP, &cntrl);
X+  #endif
X+ 	}
X  	ioctl(AC, TIOCFLUSH, &two);
X          pc(STX);
X  	pc(vp->vc_rack);
Xdiff -r -c ./libacu/ventel.c libacu/ventel.c
X*** ./libacu/ventel.c	Sun Mar 26 18:47:00 1995
X--- libacu/ventel.c	Fri Mar 24 00:26:49 1995
X***************
X*** 39,44 ****
X--- 39,45 ----
X   * Routines for calling up on a Ventel Modem
X   * The Ventel is expected to be strapped for local echo (just like uucp)
X   */
X+ #include "tipconf.h"
X  #include "tip.h"
X  
X  #define	MAXRETRY	5
X***************
X*** 72,78 ****
X  	 */
X  	if (!vensync(FD)) {
X  		printf("can't synchronize with ventel\n");
X! #ifdef ACULOG
X  		logent(value(HOST), num, "ventel", "can't synch up");
X  #endif
X  		return (0);
X--- 73,79 ----
X  	 */
X  	if (!vensync(FD)) {
X  		printf("can't synchronize with ventel\n");
X! #if ACULOG
X  		logent(value(HOST), num, "ventel", "can't synch up");
X  #endif
X  		return (0);
X***************
X*** 80,86 ****
X  	if (boolean(value(VERBOSE)))
X  		printf("\ndialing...");
X  	fflush(stdout);
X! 	ioctl(FD, TIOCHPCL, 0);
X  	echo("#k$\r$\n$D$I$A$L$:$ ");
X  	for (cp = num; *cp; cp++) {
X  		delay(1, 10);
X--- 81,87 ----
X  	if (boolean(value(VERBOSE)))
X  		printf("\ndialing...");
X  	fflush(stdout);
X! 	acu_hupcl ();
X  	echo("#k$\r$\n$D$I$A$L$:$ ");
X  	for (cp = num; *cp; cp++) {
X  		delay(1, 10);
X***************
X*** 91,98 ****
X  	gobble('\n', line);
X  	if (gobble('\n', line))
X  		connected = gobble('!', line);
X! 	ioctl(FD, TIOCFLUSH);
X! #ifdef ACULOG
X  	if (timeout) {
X  		sprintf(line, "%d second dial timeout",
X  			number(value(DIALTIMEOUT)));
X--- 92,99 ----
X  	gobble('\n', line);
X  	if (gobble('\n', line))
X  		connected = gobble('!', line);
X! 	acu_flush ();
X! #if ACULOG
X  	if (timeout) {
X  		sprintf(line, "%d second dial timeout",
X  			number(value(DIALTIMEOUT)));
XOnly in .: patches
Xdiff -r -c ./tip/Makefile tip/Makefile
X*** ./tip/Makefile	Sun Mar 26 18:47:03 1995
X--- tip/Makefile	Sat Mar 25 21:03:39 1995
X***************
X*** 6,50 ****
X  #				mode 6??
X  #	/var/log/aculog		ACU accounting file, owned by ${OWNER} and
X  #				mode 6?? {if ACULOG defined}
X- # Presently supports:
X- #	BIZCOMP
X- #	DEC DF02-AC, DF03-AC
X- #	DEC DN-11/Able Quadracall
X- #	HAYES and Hayes emulators
X- #	USR COURIER (2400 baud)
X- #	VENTEL 212+
X- #	VADIC 831 RS232 adaptor
X- #	VADIC 3451
X- #	TELEBIT T3000
X- #
X- # Configuration defines:
X- #	DF02, DF03, DN11	ACU's supported
X- #	  BIZ1031, BIZ1022, VENTEL, V831, V3451, HAYES, COURIER, T3000
X- #	ACULOG			turn on tip logging of ACU use
X- #	PRISTINE		no phone #'s put in ACU log file
X- #	CONNECT			worthless command
X- #	DEFBR			default baud rate to make connection at
X- #	DEFFS			default frame size for FTP buffering of
X- #				writes on local side
X- #	BUFSIZ			buffer sizing from stdio, must be fed
X- #				explicitly to remcap.c if not 1024
X- #	CONNECT			enable ~C command (connect pgm to remote)
X  
X! PROG=	tip
X! CFLAGS+=-I${.CURDIR} \
X! 	-DDEFBR=1200 -DDEFFS=BUFSIZ -DACULOG -DPRISTINE -DCONNECT \
X! 	-DV831 -DVENTEL -DHAYES -DCOURIER -DT3000
X! .PATH:	${.CURDIR}/aculib
X! BINOWN=	uucp
X! BINGRP=	dialer
X  BINMODE=4510
X! SRCS=	acu.c acutab.c cmds.c cmdtab.c cu.c hunt.c log.c partab.c \
X! 	remote.c tip.c tipout.c uucplock.c value.c vars.c \
X! 	biz22.c courier.c df.c dn11.c hayes.c t3000.c v3451.c v831.c ventel.c
X! 
X! # -- acutab is configuration dependent, and so depends on the Makefile
X! # -- remote.o depends on the Makefile because of DEFBR and DEFFS
X! # -- log.o depends on the Makefile because of ACULOG
X! acutab.o log.o remote.o: Makefile
X! 
X  .include <bsd.prog.mk>
X--- 6,24 ----
X  #				mode 6??
X  #	/var/log/aculog		ACU accounting file, owned by ${OWNER} and
X  #				mode 6?? {if ACULOG defined}
X  
X! CFLAGS+=-g
X! LIBACU=../libacu/libacu.a
X! BINDIR=/usr/bin
X! BINOWN=uucp
X! BINGRP=dialer
X  BINMODE=4510
X! LDADD+=$(LIBACU)
X! LINKS=${BINDIR}/tip
X! MAN1=tip.1
X! MAN5=modems.5
X! SRCS=acu.c acutab.c cmds.c cmdtab.c cu.c hunt.c log.c partab.c \
X! 	remote.c tip.c tipout.c uucplock.c value.c vars.c 
X! PROG=tip
X! $(OBJS): tipconf.h
X  .include <bsd.prog.mk>
Xdiff -r -c ./tip/acu.c tip/acu.c
X*** ./tip/acu.c	Sun Mar 26 18:47:02 1995
X--- tip/acu.c	Thu Mar 23 07:44:51 1995
X***************
X*** 35,42 ****
X--- 35,47 ----
X  static char sccsid[] = "@(#)acu.c	8.1 (Berkeley) 6/6/93";
X  #endif /* not lint */
X  
X+ #include "tipconf.h"
X  #include "tip.h"
X  
X+ #if UNIDIALER
X+ acu_t* unidialer_getmodem (const char *modem_name);
X+ #endif
X+ 
X  static acu_t *acu = NOACU;
X  static int conflag;
X  static void acuabort();
X***************
X*** 192,196 ****
X--- 197,206 ----
X  	for (p = acutable; p->acu_name != '\0'; p++)
X  		if (!strcmp(s, p->acu_name))
X  			return (p);
X+ 
X+ 	#if UNIDIALER
X+ 	return unidialer_getmodem (s);
X+ 	#else
X  	return (NOACU);
X+ 	#endif
X  }
Xdiff -r -c ./tip/acutab.c tip/acutab.c
X*** ./tip/acutab.c	Sun Mar 26 18:47:02 1995
X--- tip/acutab.c	Sat Mar 25 16:13:37 1995
X***************
X*** 35,54 ****
X  static char sccsid[] = "@(#)acutab.c	8.1 (Berkeley) 6/6/93";
X  #endif /* not lint */
X  
X  #include "tip.h"
X  
X! extern int df02_dialer(), df03_dialer(), df_disconnect(), df_abort(),
X! 	   biz31f_dialer(), biz31_disconnect(), biz31_abort(),
X  	   biz31w_dialer(),
X! 	   biz22f_dialer(), biz22_disconnect(), biz22_abort(),
X  	   biz22w_dialer(),
X! 	   ven_dialer(), ven_disconnect(), ven_abort(),
X! 	   hay_dialer(), hay_disconnect(), hay_abort(),
X! 	   cour_dialer(), cour_disconnect(), cour_abort(),
X! 	   t3000_dialer(), t3000_disconnect(), t3000_abort(),
X! 	   v3451_dialer(), v3451_disconnect(), v3451_abort(),
X! 	   v831_dialer(), v831_disconnect(), v831_abort(),
X! 	   dn_dialer(), dn_disconnect(), dn_abort();
X  
X  acu_t acutable[] = {
X  #if BIZ1031
X--- 35,68 ----
X  static char sccsid[] = "@(#)acutab.c	8.1 (Berkeley) 6/6/93";
X  #endif /* not lint */
X  
X+ #include "tipconf.h"
X  #include "tip.h"
X  
X! extern int df02_dialer(), df03_dialer(), 
X! 	   biz31f_dialer(), 
X  	   biz31w_dialer(),
X! 	   biz22f_dialer(), 
X  	   biz22w_dialer(),
X! 	   ven_dialer(), 
X! 	   hay_dialer(), 
X! 	   cour_dialer(), 
X! 	   multitech_dialer(), 
X! 	   t3000_dialer(), 
X! 	   v3451_dialer(), 
X! 	   v831_dialer(),
X! 	   dn_dialer();
X! 
X! extern void df_disconnect(), df_abort(),
X! 	   biz31_disconnect(), biz31_abort(),
X! 	   biz22_disconnect(), biz22_abort(),
X! 	   ven_disconnect(), ven_abort(),
X! 	   hay_disconnect(), hay_abort(),
X! 	   cour_disconnect(), cour_abort(),
X! 	   multitech_disconnect(), multitech_abort(),
X! 	   t3000_disconnect(), t3000_abort(),
X! 	   v3451_disconnect(), v3451_abort(),
X! 	   v831_disconnect(), v831_abort(),
X! 	   dn_disconnect(), dn_abort();
X  
X  acu_t acutable[] = {
X  #if BIZ1031
X***************
X*** 68,93 ****
X  #if DN11
X  	"dn11",	dn_dialer,	dn_disconnect,		dn_abort,
X  #endif
X! #ifdef VENTEL
X  	"ventel",ven_dialer,	ven_disconnect,		ven_abort,
X  #endif
X! #ifdef HAYES
X  	"hayes",hay_dialer,	hay_disconnect,		hay_abort,
X  #endif
X! #ifdef COURIER
X  	"courier",cour_dialer,	cour_disconnect,	cour_abort,
X  #endif
X! #ifdef T3000
X  	"t3000",t3000_dialer,	t3000_disconnect,	t3000_abort,
X  #endif
X! #ifdef V3451
X! #ifndef V831
X  	"vadic",v3451_dialer,	v3451_disconnect,	v3451_abort,
X  #endif
X  	"v3451",v3451_dialer,	v3451_disconnect,	v3451_abort,
X  #endif
X! #ifdef V831
X! #ifndef V3451
X  	"vadic",v831_dialer,	v831_disconnect,	v831_abort,
X  #endif
X  	"v831",v831_dialer,	v831_disconnect,	v831_abort,
X--- 82,110 ----
X  #if DN11
X  	"dn11",	dn_dialer,	dn_disconnect,		dn_abort,
X  #endif
X! #if VENTEL
X  	"ventel",ven_dialer,	ven_disconnect,		ven_abort,
X  #endif
X! #if HAYES
X  	"hayes",hay_dialer,	hay_disconnect,		hay_abort,
X  #endif
X! #if COURIER
X  	"courier",cour_dialer,	cour_disconnect,	cour_abort,
X  #endif
X! #if MULTITECH
X! 	"multitech",multitech_dialer,	multitech_disconnect,	multitech_abort,
X! #endif
X! #if T3000
X  	"t3000",t3000_dialer,	t3000_disconnect,	t3000_abort,
X  #endif
X! #if V3451
X! #if !V831
X  	"vadic",v3451_dialer,	v3451_disconnect,	v3451_abort,
X  #endif
X  	"v3451",v3451_dialer,	v3451_disconnect,	v3451_abort,
X  #endif
X! #if V831
X! #if !V3451
X  	"vadic",v831_dialer,	v831_disconnect,	v831_abort,
X  #endif
X  	"v831",v831_dialer,	v831_disconnect,	v831_abort,
END_OF_FILE
if test 51555 -ne `wc -c <'patches.tip.2'`; then
    echo shar: \"'patches.tip.2'\" unpacked with wrong size!
fi
# end of 'patches.tip.2'
fi
echo shar: End of archive 3 \(of 3\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 3 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199503270839.AAA12832>