From 51f40ab44a98a632f33de9f63d7beb7ee423f0ad Mon Sep 17 00:00:00 2001
From: Mike Hibler <mike@flux.utah.edu>
Date: Wed, 27 Dec 2000 00:49:36 +0000
Subject: [PATCH] The Evisceration of Tip, Chapter 1.

Taken from the man page (ntip.1):
----
     Ntip differs from the traditional tip in a number of ways:

     1.   It does not support calling a remote system, all auto-dialing code
          has been removed.

     2.   All the cheezy file transfer support has been removed.

     3.   Most of the tilde escapes have been removed.  Mostly these were the
          file trasfer related ones.  See below for what remains.

     4.   Ntip ignores 90% of the remote(5) capabilities.  You can set the
          baud rate (br) and the device (dv).  Period.

     5.   All of tips variables are still present, but most don't do anything.
          It is left as an exercise to the interested user to differentiate.

     6.   By default, it operates in ``raw'' mode instead of the usual
          ``cbreak'' mode.  This means that all input processing (if any) is
          performed by the remote system.  Raw mode also disables
          ``raisechar'' and ``force'' variable interpretation.  Yes, you can
          actually run emacs on an ntip line (modulo the '~' thing).

     7.   Tip is the poster-child for fork-without-exec, creating separate
          reader and writer processes executing ``the same code.''  Ntip is a
          child of convenience and consists of a single process using
          select(2).

     8.   Ntip no longer uses uucp(1) style locking.  It relies on the TIOCEX-
          CL ioctl (see tty(4))  to provide ``reasonably mutually exclusive''
          access.  While it is still technically possible that two parties
          could open the same line and both get ``exclusive'' access to it, we
          consider this to be the source of amusing anecdotes rather than a
          bug.
----
---
 tip/GNUmakefile       |  27 +-
 tip/acu.c             | 211 -------------
 tip/acutab.c          | 118 -------
 tip/cmds.c            | 720 ++----------------------------------------
 tip/cmdtab.c          |  18 +-
 tip/cu.c              | 140 --------
 tip/getcap.c          |   2 +
 tip/hunt.c            |  25 +-
 tip/log.c             |  94 ------
 tip/modems.5          | 141 ---------
 tip/{tip.1 => ntip.1} | 240 ++++++--------
 tip/remote.c          |  11 +-
 tip/tip.c             | 374 +++++++++++++---------
 tip/tip.h             |  44 +--
 tip/tipconf.h         |  59 +---
 tip/tipout.c          | 175 ----------
 tip/value.c           |  31 +-
 17 files changed, 422 insertions(+), 2008 deletions(-)
 delete mode 100644 tip/acu.c
 delete mode 100644 tip/acutab.c
 delete mode 100644 tip/cu.c
 delete mode 100644 tip/log.c
 delete mode 100644 tip/modems.5
 rename tip/{tip.1 => ntip.1} (73%)
 delete mode 100644 tip/tipout.c

diff --git a/tip/GNUmakefile b/tip/GNUmakefile
index 55e40bf224..242dcb0a32 100644
--- a/tip/GNUmakefile
+++ b/tip/GNUmakefile
@@ -1,18 +1,16 @@
-CC = gcc -g
+CC = gcc -g -O2
 
-# for BSD
-#CFLAGS = -O
-#LIBS= -lutil
+OBJS = cmds.o cmdtab.o hunt.o partab.o \
+       remote.o tip.o value.o vars.o getcap.o
 
-# for Linux
-CFLAGS = -O -DLINUX
-LIBS= -ldb
+#
+# If HAVE_UUCPLOCK is defined you need -lutil for BSD
+#
+LIBS=
 
-OBJS = acu.o acutab.o cmds.o cmdtab.o cu.o hunt.o log.o partab.o \
-       remote.o tip.o tipout.o value.o vars.o getcap.o
-DESTDIR = /usr/site
+DESTDIR = /usr/testbed
 
-all: tip
+all: tip.static # tip
 
 tip: $(OBJS)
 	$(CC) -o tip $(OBJS) $(LIBS)
@@ -20,8 +18,11 @@ tip: $(OBJS)
 tip.static: $(OBJS)
 	$(CC) -static -o tip.static $(OBJS) $(LIBS)
 
-install:
-	install -s -c tip $(DESTDIR)/bin/tip
+$(OBJS): tipconf.h tip.h
+
+install: all
+#	install -s -c tip $(DESTDIR)/bin/tip
+	install -s -c tip.static $(DESTDIR)/bin/ntip
 
 clean:
 	rm -f $(OBJS) tip tip.static
diff --git a/tip/acu.c b/tip/acu.c
deleted file mode 100644
index 865b6fad84..0000000000
--- a/tip/acu.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)acu.c	8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
-	"$Id: acu.c,v 1.1 2000-12-22 18:48:46 mike Exp $";
-#endif /* not lint */
-
-#include "tipconf.h"
-#include "tip.h"
-
-#if UNIDIALER
-acu_t* unidialer_getmodem (const char *modem_name);
-#endif
-
-static acu_t *acu = NOACU;
-static int conflag;
-static void acuabort();
-static acu_t *acutype();
-static jmp_buf jmpbuf;
-/*
- * Establish connection for tip
- *
- * If DU is true, we should dial an ACU whose type is AT.
- * The phone numbers are in PN, and the call unit is in CU.
- *
- * If the PN is an '@', then we consult the PHONES file for
- *   the phone numbers.  This file is /etc/phones, unless overriden
- *   by an exported shell variable.
- *
- * The data base files must be in the format:
- *	host-name[ \t]*phone-number
- *   with the possibility of multiple phone numbers
- *   for a single host acting as a rotary (in the order
- *   found in the file).
- */
-char *
-connect()
-{
-	register char *cp = PN;
-	char *phnum, string[256];
-	FILE *fd;
-	int tried = 0;
-
-	if (!DU) {		/* regular connect message */
-		if (CM != NOSTR)
-			xpwrite(FD, CM, size(CM));
-		logent(value(HOST), "", DV, "call completed");
-		return (NOSTR);
-	}
-	/*
-	 * @ =>'s use data base in PHONES environment variable
-	 *        otherwise, use /etc/phones
-	 */
-	signal(SIGINT, acuabort);
-	signal(SIGQUIT, acuabort);
-	if (setjmp(jmpbuf)) {
-		signal(SIGINT, SIG_IGN);
-		signal(SIGQUIT, SIG_IGN);
-		printf("\ncall aborted\n");
-		logent(value(HOST), "", "", "call aborted");
-		if (acu != NOACU) {
-			boolean(value(VERBOSE)) = FALSE;
-			if (conflag)
-				disconnect(NOSTR);
-			else
-				(*acu->acu_abort)();
-		}
-		return ("interrupt");
-	}
-	if ((acu = acutype(AT)) == NOACU)
-		return ("unknown ACU type");
-	if (*cp != '@') {
-		while (*cp) {
-			for (phnum = cp; *cp && *cp != ','; cp++)
-				;
-			if (*cp)
-				*cp++ = '\0';
-
-			if ((conflag = (*acu->acu_dialer)(phnum, CU))) {
-				if (CM != NOSTR)
-					xpwrite(FD, CM, size(CM));
-				logent(value(HOST), phnum, acu->acu_name,
-					"call completed");
-				return (NOSTR);
-			} else
-				logent(value(HOST), phnum, acu->acu_name,
-					"call failed");
-			tried++;
-		}
-	} else {
-		if ((fd = fopen(PH, "r")) == NOFILE) {
-			printf("%s: ", PH);
-			return ("can't open phone number file");
-		}
-		while (fgets(string, sizeof(string), fd) != NOSTR) {
-			for (cp = string; !any(*cp, " \t\n"); cp++)
-				;
-			if (*cp == '\n') {
-				fclose(fd);
-				return ("unrecognizable host name");
-			}
-			*cp++ = '\0';
-			if (strcmp(string, value(HOST)))
-				continue;
-			while (any(*cp, " \t"))
-				cp++;
-			if (*cp == '\n') {
-				fclose(fd);
-				return ("missing phone number");
-			}
-			for (phnum = cp; *cp && *cp != ',' && *cp != '\n'; cp++)
-				;
-			if (*cp)
-				*cp++ = '\0';
-
-			if ((conflag = (*acu->acu_dialer)(phnum, CU))) {
-				fclose(fd);
-				if (CM != NOSTR)
-					xpwrite(FD, CM, size(CM));
-				logent(value(HOST), phnum, acu->acu_name,
-					"call completed");
-				return (NOSTR);
-			} else
-				logent(value(HOST), phnum, acu->acu_name,
-					"call failed");
-			tried++;
-		}
-		fclose(fd);
-	}
-	if (!tried)
-		logent(value(HOST), "", acu->acu_name, "missing phone number");
-	else
-		(*acu->acu_abort)();
-	return (tried ? "call failed" : "missing phone number");
-}
-
-void
-disconnect(reason)
-	char *reason;
-{
-	if (!conflag) {
-		logent(value(HOST), "", DV, "call terminated");
-		return;
-	}
-	if (reason == NOSTR) {
-		logent(value(HOST), "", acu->acu_name, "call terminated");
-		if (boolean(value(VERBOSE)))
-			printf("\r\ndisconnecting...");
-	} else
-		logent(value(HOST), "", acu->acu_name, reason);
-	(*acu->acu_disconnect)();
-}
-
-static void
-acuabort(s)
-{
-	signal(s, SIG_IGN);
-	longjmp(jmpbuf, 1);
-}
-
-static acu_t *
-acutype(s)
-	register char *s;
-{
-	register acu_t *p;
-	extern acu_t acutable[];
-
-	for (p = acutable; p->acu_name != '\0'; p++)
-		if (!strcmp(s, p->acu_name))
-			return (p);
-
-	#if UNIDIALER
-	return unidialer_getmodem (s);
-	#else
-	return (NOACU);
-	#endif
-}
diff --git a/tip/acutab.c b/tip/acutab.c
deleted file mode 100644
index 0c1c41af72..0000000000
--- a/tip/acutab.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)acutab.c	8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
-	"$Id: acutab.c,v 1.1 2000-12-22 18:48:46 mike Exp $";
-#endif /* not lint */
-
-#include "tipconf.h"
-#include "tip.h"
-
-extern int df02_dialer(), df03_dialer(),
-	   biz31f_dialer(),
-	   biz31w_dialer(),
-	   biz22f_dialer(),
-	   biz22w_dialer(),
-	   ven_dialer(),
-	   hay_dialer(),
-	   cour_dialer(),
-	   multitech_dialer(),
-	   t3000_dialer(),
-	   v3451_dialer(),
-	   v831_dialer(),
-	   dn_dialer();
-
-extern void df_disconnect(), df_abort(),
-	   biz31_disconnect(), biz31_abort(),
-	   biz22_disconnect(), biz22_abort(),
-	   ven_disconnect(), ven_abort(),
-	   hay_disconnect(), hay_abort(),
-	   cour_disconnect(), cour_abort(),
-	   multitech_disconnect(), multitech_abort(),
-	   t3000_disconnect(), t3000_abort(),
-	   v3451_disconnect(), v3451_abort(),
-	   v831_disconnect(), v831_abort(),
-	   dn_disconnect(), dn_abort();
-
-acu_t acutable[] = {
-#if BIZ1031
-	"biz31f", biz31f_dialer, biz31_disconnect,	biz31_abort,
-	"biz31w", biz31w_dialer, biz31_disconnect,	biz31_abort,
-#endif
-#if BIZ1022
-	"biz22f", biz22f_dialer, biz22_disconnect,	biz22_abort,
-	"biz22w", biz22w_dialer, biz22_disconnect,	biz22_abort,
-#endif
-#if DF02
-	"df02",	df02_dialer,	df_disconnect,		df_abort,
-#endif
-#if DF03
-	"df03",	df03_dialer,	df_disconnect,		df_abort,
-#endif
-#if DN11
-	"dn11",	dn_dialer,	dn_disconnect,		dn_abort,
-#endif
-#if VENTEL
-	"ventel",ven_dialer,	ven_disconnect,		ven_abort,
-#endif
-#if HAYES
-	"hayes",hay_dialer,	hay_disconnect,		hay_abort,
-#endif
-#if COURIER
-	"courier",cour_dialer,	cour_disconnect,	cour_abort,
-#endif
-#if MULTITECH
-	"multitech",multitech_dialer,	multitech_disconnect,	multitech_abort,
-#endif
-#if T3000
-	"t3000",t3000_dialer,	t3000_disconnect,	t3000_abort,
-#endif
-#if V3451
-#if !V831
-	"vadic",v3451_dialer,	v3451_disconnect,	v3451_abort,
-#endif
-	"v3451",v3451_dialer,	v3451_disconnect,	v3451_abort,
-#endif
-#if V831
-#if !V3451
-	"vadic",v831_dialer,	v831_disconnect,	v831_abort,
-#endif
-	"v831",v831_dialer,	v831_disconnect,	v831_abort,
-#endif
-	0,	0,		0,			0
-};
-
diff --git a/tip/cmds.c b/tip/cmds.c
index 2ad298b1ab..74573ed188 100644
--- a/tip/cmds.c
+++ b/tip/cmds.c
@@ -36,10 +36,9 @@
 static char sccsid[] = "@(#)cmds.c	8.1 (Berkeley) 6/6/93";
 #endif
 static const char rcsid[] =
-	"$Id: cmds.c,v 1.1 2000-12-22 18:48:46 mike Exp $";
+	"$Id: cmds.c,v 1.2 2000-12-27 00:49:33 mike Exp $";
 #endif /* not lint */
 
-#include "tipconf.h"
 #include "tip.h"
 #include "pathnames.h"
 
@@ -50,7 +49,6 @@ static const char rcsid[] =
 #include <libutil.h>
 #endif
 #include <stdio.h>
-#include <unistd.h>
 
 /*
  * tip
@@ -58,15 +56,9 @@ static const char rcsid[] =
  * miscellaneous commands
  */
 
-int	quant[] = { 60, 60, 24 };
-
-char	null = '\0';
-char	*sep[] = { "second", "minute", "hour" };
 static char *argv[10];		/* argument vector for take and put */
 
 void	timeout();		/* timeout function called on alarm */
-static void	stopsnd();		/* SIGINT handler during file transfers */
-static void	intcopy();		/* interrupt routine for file transfers */
 
 void suspend __P((char));
 void genbrk __P((void));
@@ -75,46 +67,11 @@ void finish __P((void));
 void tipabort __P((char *));
 void chdirectory __P((void));
 void shell __P((void));
-void cu_put __P((char));
-void sendfile __P((char));
-void pipefile __P((void));
-void cu_take __P((char));
-void getfl __P((char));
 
 static int anyof __P((char *, char *));
 static void tandem __P((char *));
-static void prtime __P((char *, time_t));
 static int args __P((char *, char **, int));
 static void execute __P((char *));
-static void send __P((char));
-static void transmit __P((FILE *, char *, char *));
-static void transfer __P((char *, int, char *));
-static void xfer __P((char *, int, char *));
-
-void
-usedefchars ()
-{
-#if HAVE_TERMIOS
-	int cnt;
-	struct termios ttermios;
-	ttermios = ctermios;
-	for (cnt = 0; cnt < NCCS; cnt++)
-		ttermios.c_cc [cnt] = otermios.c_cc [cnt];
-	tcsetattr (0, TCSANOW, &ttermios);
-#else
-	ioctl(0, TIOCSETC, &defchars);
-#endif
-}
-
-void
-usetchars ()
-{
-#if HAVE_TERMIOS
-	tcsetattr (0, TCSANOW, &ctermios);
-#else
-	ioctl(0, TIOCSETC, &tchars);
-#endif
-}
 
 void
 flush_remote ()
@@ -133,483 +90,6 @@ flush_remote ()
 #endif
 }
 
-/*
- * FTP - remote ==> local
- *  get a file from the remote host
- */
-void
-getfl(c)
-	char c;
-{
-	char buf[256], *cp, *expand();
-
-	putchar(c);
-	/*
-	 * get the UNIX receiving file's name
-	 */
-	if (prompt("Local file name? ", copyname, sizeof(copyname)))
-		return;
-	cp = expand(copyname);
-	if ((sfd = creat(cp, 0666)) < 0) {
-		printf("\r\n%s: cannot creat\r\n", copyname);
-		return;
-	}
-
-	/*
-	 * collect parameters
-	 */
-	if (prompt("List command for remote system? ", buf, sizeof(buf))) {
-		unlink(copyname);
-		return;
-	}
-	transfer(buf, sfd, value(EOFREAD));
-}
-
-/*
- * Cu-like take command
- */
-void
-cu_take(cc)
-	char cc;
-{
-	int fd, argc;
-	char line[BUFSIZ], *expand(), *cp;
-
-	if (prompt("[take] ", copyname, sizeof(copyname)))
-		return;
-	if ((argc = args(copyname, argv, sizeof(argv)/sizeof(argv[0]))) < 1 || argc > 2) {
-		printf("usage: <take> from [to]\r\n");
-		return;
-	}
-	if (argc == 1)
-		argv[1] = argv[0];
-	cp = expand(argv[1]);
-	if ((fd = creat(cp, 0666)) < 0) {
-		printf("\r\n%s: cannot create\r\n", argv[1]);
-		return;
-	}
-	(void)snprintf(line, sizeof(line), "cat %s ; echo \"\" ; echo ___tip_end_of_file_marker___", argv[0]);
-	xfer(line, fd, "\n___tip_end_of_file_marker___\n");
-}
-
-static jmp_buf intbuf;
-
-static void
-xfer(buf, fd, eofchars)
-	char *buf, *eofchars;
-{
-	int ct;
-	char c, *match;
-	int cnt, eof, v;
-	time_t start;
-	sig_t f;
-	char r;
-	FILE *ff;
-
-	v = boolean(value(VERBOSE));
-
-	if ((ff = fdopen (fd, "w")) == NULL) {
-		warn("file open");
-		return;
-	}
-	if ((cnt = number(value(FRAMESIZE))) != BUFSIZ)
-		if (setvbuf(ff, NULL, _IOFBF, cnt) != 0) {
-			warn("file allocation");
-			(void)fclose(ff);
-			return;
-		}
-
-	xpwrite(FD, buf, size(buf));
-	quit = 0;
-	kill(pid, SIGIOT);
-	read(repdes[0], (char *)&ccc, 1);  /* Wait until read process stops */
-
-	/*
-	 * finish command
-	 */
-	r = '\r';
-	xpwrite(FD, &r, 1);
-	do
-		read(FD, &c, 1);
-	while ((c&0177) != '\n');
-
-	usedefchars ();
-
-	(void) setjmp(intbuf);
-	f = signal(SIGINT, intcopy);
-	start = time(0);
-	match = eofchars;
-	for (ct = 0; !quit;) {
-		eof = read(FD, &c, 1) <= 0;
-		c &= 0177;
-		if (quit)
-			continue;
-		if (eof)
-			break;
-		if (c == 0)
-			continue;	/* ignore nulls */
-		if (c == '\r')
-			continue;
-		if (c != *match && match > eofchars) {
-			register char *p = eofchars;
-			while (p < match) {
-				if (*p == '\n'&& v)
-					(void)printf("\r%d", ++ct);
-				fputc(*p++, ff);
-			}
-			match = eofchars;
-		}
-		if (c == *match) {
-			if (*++match == '\0')
-				break;
-		} else {
-			if (c == '\n' && v)
-				(void)printf("\r%d", ++ct);
-			fputc(c, ff);
-		}
-	}
-	if (v)
-		prtime(" lines transferred in ", time(0)-start);
-	usetchars ();
-	write(fildes[1], (char *)&ccc, 1);
-	signal(SIGINT, f);
-	(void)fclose(ff);
-}
-
-/*
- * Bulk transfer routine --
- *  used by getfl(), cu_take(), and pipefile()
- */
-static void
-transfer(buf, fd, eofchars)
-	char *buf, *eofchars;
-{
-	register int ct;
-	char c;
-	register int cnt, eof, v;
-	time_t start;
-	sig_t f;
-	char r;
-	FILE *ff;
-
-	v = boolean(value(VERBOSE));
-
-	if ((ff = fdopen (fd, "w")) == NULL) {
-		warn("file open");
-		return;
-	}
-	if ((cnt = number(value(FRAMESIZE))) != BUFSIZ)
-		if (setvbuf(ff, NULL, _IOFBF, cnt) != 0) {
-			warn("file allocation");
-			(void)fclose(ff);
-			return;
-		}
-
-	xpwrite(FD, buf, size(buf));
-	quit = 0;
-	kill(pid, SIGIOT);
-	read(repdes[0], (char *)&ccc, 1);  /* Wait until read process stops */
-
-	/*
-	 * finish command
-	 */
-	r = '\r';
-	xpwrite(FD, &r, 1);
-	do
-		read(FD, &c, 1);
-	while ((c&0177) != '\n');
-	usedefchars ();
-	(void) setjmp(intbuf);
-	f = signal(SIGINT, intcopy);
-	start = time(0);
-	for (ct = 0; !quit;) {
-		eof = read(FD, &c, 1) <= 0;
-		c &= 0177;
-		if (quit)
-			continue;
-		if (eof || any(c, eofchars))
-			break;
-		if (c == 0)
-			continue;	/* ignore nulls */
-		if (c == '\r')
-			continue;
-		if (c == '\n' && v)
-			printf("\r%d", ++ct);
-		fputc(c, ff);
-	}
-	if (v)
-		prtime(" lines transferred in ", time(0)-start);
-	usetchars ();
-	write(fildes[1], (char *)&ccc, 1);
-	signal(SIGINT, f);
-	(void)fclose(ff);
-}
-
-/*
- * FTP - remote ==> local process
- *   send remote input to local process via pipe
- */
-void
-pipefile()
-{
-	int cpid, pdes[2];
-	char buf[256];
-	int status, p;
-
-	if (prompt("Local command? ", buf, sizeof(buf)))
-		return;
-
-	if (pipe(pdes)) {
-		printf("can't establish pipe\r\n");
-		return;
-	}
-
-	if ((cpid = fork()) < 0) {
-		printf("can't fork!\r\n");
-		return;
-	} else if (cpid) {
-		if (prompt("List command for remote system? ", buf, sizeof(buf))) {
-			close(pdes[0]), close(pdes[1]);
-			kill (cpid, SIGKILL);
-		} else {
-			close(pdes[0]);
-			signal(SIGPIPE, intcopy);
-			transfer(buf, pdes[1], value(EOFREAD));
-			signal(SIGPIPE, SIG_DFL);
-			while ((p = wait(&status)) > 0 && p != cpid)
-				;
-		}
-	} else {
-		register int f;
-
-		dup2(pdes[0], 0);
-		close(pdes[0]);
-		for (f = 3; f < 20; f++)
-			close(f);
-		execute(buf);
-		printf("can't execl!\r\n");
-		exit(0);
-	}
-}
-
-/*
- * Interrupt service routine for FTP
- */
-void
-stopsnd()
-{
-
-	stop = 1;
-	signal(SIGINT, SIG_IGN);
-}
-
-/*
- * FTP - local ==> remote
- *  send local file to remote host
- *  terminate transmission with pseudo EOF sequence
- */
-void
-sendfile(cc)
-	char cc;
-{
-	FILE *fd;
-	char *fnamex;
-	char *expand();
-
-	putchar(cc);
-	/*
-	 * get file name
-	 */
-	if (prompt("Local file name? ", fname, sizeof(fname)))
-		return;
-
-	/*
-	 * look up file
-	 */
-	fnamex = expand(fname);
-	if ((fd = fopen(fnamex, "r")) == NULL) {
-		printf("%s: cannot open\r\n", fname);
-		return;
-	}
-	transmit(fd, value(EOFWRITE), NULL);
-	if (!boolean(value(ECHOCHECK))) {
-		flush_remote ();
-	}
-}
-
-/*
- * Bulk transfer routine to remote host --
- *   used by sendfile() and cu_put()
- */
-static void
-transmit(fd, eofchars, command)
-	FILE *fd;
-	char *eofchars, *command;
-{
-	char *pc, lastc;
-	int c, ccount, lcount;
-	time_t start_t, stop_t;
-	sig_t f;
-
-	kill(pid, SIGIOT);	/* put TIPOUT into a wait state */
-	stop = 0;
-	f = signal(SIGINT, stopsnd);
-	usedefchars ();
-	read(repdes[0], (char *)&ccc, 1);
-	if (command != NULL) {
-		for (pc = command; *pc; pc++)
-			send(*pc);
-		if (boolean(value(ECHOCHECK)))
-			read(FD, (char *)&c, 1);	/* trailing \n */
-		else {
-			flush_remote ();
-			sleep(5); /* wait for remote stty to take effect */
-		}
-	}
-	lcount = 0;
-	lastc = '\0';
-	start_t = time(0);
-	while (1) {
-		ccount = 0;
-		do {
-			c = getc(fd);
-			if (stop)
-				goto out;
-			if (c == EOF)
-				goto out;
-			if (c == 0177 && !boolean(value(RAWFTP)))
-				continue;
-			lastc = c;
-			if (c < 040) {
-				if (c == '\n') {
-					if (!boolean(value(RAWFTP)))
-						c = '\r';
-				}
-				else if (c == '\t') {
-					if (!boolean(value(RAWFTP))) {
-						if (boolean(value(TABEXPAND))) {
-							send(' ');
-							while ((++ccount % 8) != 0)
-								send(' ');
-							continue;
-						}
-					}
-				} else
-					if (!boolean(value(RAWFTP)))
-						continue;
-			}
-			send(c);
-		} while (c != '\r' && !boolean(value(RAWFTP)));
-		if (boolean(value(VERBOSE)))
-			printf("\r%d", ++lcount);
-		if (boolean(value(ECHOCHECK))) {
-			timedout = 0;
-			alarm(number(value(ETIMEOUT)));
-			do {	/* wait for prompt */
-				read(FD, (char *)&c, 1);
-				if (timedout || stop) {
-					if (timedout)
-						printf("\r\ntimed out at eol\r\n");
-					alarm(0);
-					goto out;
-				}
-			} while ((c&0177) != character(value(PROMPT)));
-			alarm(0);
-		}
-	}
-out:
-	if (lastc != '\n' && !boolean(value(RAWFTP)))
-		send('\r');
-	for (pc = eofchars; pc && *pc; pc++)
-		send(*pc);
-	stop_t = time(0);
-	fclose(fd);
-	signal(SIGINT, f);
-	if (boolean(value(VERBOSE)))
-		if (boolean(value(RAWFTP)))
-			prtime(" chars transferred in ", stop_t-start_t);
-		else
-			prtime(" lines transferred in ", stop_t-start_t);
-	write(fildes[1], (char *)&ccc, 1);
-	usetchars ();
-}
-
-/*
- * Cu-like put command
- */
-void
-cu_put(cc)
-	char cc;
-{
-	FILE *fd;
-	char line[BUFSIZ];
-	int argc;
-	char *expand();
-	char *copynamex;
-
-	if (prompt("[put] ", copyname, sizeof(copyname)))
-		return;
-	if ((argc = args(copyname, argv, sizeof(argv)/sizeof(argv[0]))) < 1 || argc > 2) {
-		printf("usage: <put> from [to]\r\n");
-		return;
-	}
-	if (argc == 1)
-		argv[1] = argv[0];
-	copynamex = expand(argv[0]);
-	if ((fd = fopen(copynamex, "r")) == NULL) {
-		printf("%s: cannot open\r\n", copynamex);
-		return;
-	}
-	if (boolean(value(ECHOCHECK)))
-		snprintf(line, sizeof(line), "cat>%s\r", argv[1]);
-	else
-		snprintf(line, sizeof(line), "stty -echo;cat>%s;stty echo\r", argv[1]);
-	transmit(fd, "\04", line);
-}
-
-
-static void
-nap(msec)
-	int msec; /* milliseconds */
-{
-	usleep(msec*1000);
-}
-
-
-/*
- * FTP - send single character
- *  wait for echo & handle timeout
- */
-static void
-send(c)
-	char c;
-{
-	char cc;
-	int retry = 0;
-
-	cc = c;
-	xpwrite(FD, &cc, 1);
-	if (number(value(CDELAY)) > 0 && c != '\r')
-		nap(number(value(CDELAY)));
-	if (!boolean(value(ECHOCHECK))) {
-		if (number(value(LDELAY)) > 0 && c == '\r')
-			nap(number(value(LDELAY)));
-		return;
-	}
-tryagain:
-	timedout = 0;
-	alarm(number(value(ETIMEOUT)));
-	read(FD, &cc, 1);
-	alarm(0);
-	if (timedout) {
-		printf("\r\ntimeout error (%s)\r\n", ctrl(c));
-		if (retry++ > 3)
-			return;
-		xpwrite(FD, &null, 1); /* poke it */
-		goto tryagain;
-	}
-}
-
 void
 timeout()
 {
@@ -617,126 +97,6 @@ timeout()
 	timedout = 1;
 }
 
-/*
- * Stolen from consh() -- puts a remote file on the output of a local command.
- *	Identical to consh() except for where stdout goes.
- */
-void
-pipeout(c)
-{
-	char buf[256];
-	int cpid, status, p;
-	time_t start;
-
-	putchar(c);
-	if (prompt("Local command? ", buf, sizeof(buf)))
-		return;
-	kill(pid, SIGIOT);	/* put TIPOUT into a wait state */
-	signal(SIGINT, SIG_IGN);
-	signal(SIGQUIT, SIG_IGN);
-	usedefchars ();
-	read(repdes[0], (char *)&ccc, 1);
-	/*
-	 * Set up file descriptors in the child and
-	 *  let it go...
-	 */
-	if ((cpid = fork()) < 0)
-		printf("can't fork!\r\n");
-	else if (cpid) {
-		start = time(0);
-		while ((p = wait(&status)) > 0 && p != cpid)
-			;
-	} else {
-		register int i;
-
-		dup2(FD, 1);
-		for (i = 3; i < 20; i++)
-			close(i);
-		signal(SIGINT, SIG_DFL);
-		signal(SIGQUIT, SIG_DFL);
-		execute(buf);
-		printf("can't find `%s'\r\n", buf);
-		exit(0);
-	}
-	if (boolean(value(VERBOSE)))
-		prtime("away for ", time(0)-start);
-	write(fildes[1], (char *)&ccc, 1);
-	usetchars ();
-	signal(SIGINT, SIG_DFL);
-	signal(SIGQUIT, SIG_DFL);
-}
-
-#if CONNECT
-
-int
-tiplink (char *cmd, unsigned int flags)
-{
-	int cpid, status, p;
-	time_t start;
-
-	if (flags & TL_SIGNAL_TIPOUT) {
-		kill(pid, SIGIOT);	/* put TIPOUT into a wait state */
-		signal(SIGINT, SIG_IGN);
-		signal(SIGQUIT, SIG_IGN);
-		usedefchars ();
-		read(repdes[0], (char *)&ccc, 1);
-	}
-
-	/*
-	 * Set up file descriptors in the child and
-	 *  let it go...
-	 */
-	if ((cpid = fork()) < 0)
-		printf("can't fork!\r\n");
-	else if (cpid) {
-		start = time(0);
-		while ((p = wait(&status)) > 0 && p != cpid)
-			;
-	} else {
-		register int fd;
-
-		dup2(FD, 0);
-		dup2(3, 1);
-		for (fd = 3; fd < 20; fd++)
-			close (fd);
-		signal(SIGINT, SIG_DFL);
-		signal(SIGQUIT, SIG_DFL);
-		execute (cmd);
-		printf("can't find `%s'\r\n", cmd);
-		exit(0);
-	}
-
-	if (flags & TL_VERBOSE && boolean(value(VERBOSE)))
-		prtime("away for ", time(0)-start);
-
-	if (flags & TL_SIGNAL_TIPOUT) {
-		write(fildes[1], (char *)&ccc, 1);
-		usetchars ();
-		signal(SIGINT, SIG_DFL);
-		signal(SIGQUIT, SIG_DFL);
-	}
-
-	return 0;
-}
-
-/*
- * Fork a program with:
- *  0 <-> remote tty in
- *  1 <-> remote tty out
- *  2 <-> local tty out
- */
-int
-consh(c)
-{
-	char buf[256];
-	putchar(c);
-	if (prompt("Local command? ", buf, sizeof(buf)))
-		return;
-	tiplink (buf, TL_SIGNAL_TIPOUT | TL_VERBOSE);
-	return 0;
-}
-#endif
-
 /*
  * Escape to local shell
  */
@@ -772,26 +132,24 @@ shell()
 }
 
 /*
- * TIPIN portion of scripting
- *   initiate the conversation with TIPOUT
+ * Turn on/off scripting
  */
 void
 setscript()
 {
-	char c;
-	/*
-	 * enable TIPOUT side for dialogue
-	 */
-	kill(pid, SIGEMT);
-	if (boolean(value(SCRIPT)))
-		write(fildes[1], value(RECORD), size(value(RECORD)));
-	write(fildes[1], "\n", 1);
-	/*
-	 * wait for TIPOUT to finish
-	 */
-	read(repdes[0], &c, 1);
-	if (c == 'n')
-		printf("can't create %s\r\n", value(RECORD));
+	char *line = value(RECORD);
+
+	if (boolean(value(SCRIPT))) {
+		if ((fscript = fopen(line, "a")) == NULL) {
+			printf("can't create %s\r\n", value(RECORD));
+			boolean(value(SCRIPT)) = FALSE;
+		}
+	} else {
+		if (fscript != NULL) {
+			fclose(fscript);
+			fscript = NULL;
+		}
+	}
 }
 
 /*
@@ -819,13 +177,13 @@ tipabort(msg)
 	char *msg;
 {
 
-	kill(pid, SIGTERM);
-	disconnect(msg);
 	if (msg != NOSTR)
 		printf("\r\n%s", msg);
 	printf("\r\n[EOT]\r\n");
 	daemon_uid();
+#if HAVE_UUCPLOCK
 	(void)uu_unlock(uucplock);
+#endif
 	unraw();
 	exit(0);
 }
@@ -833,25 +191,7 @@ tipabort(msg)
 void
 finish()
 {
-	char *abortmsg = NOSTR, *dismsg;
-
-	if (LO != NOSTR && tiplink (LO, TL_SIGNAL_TIPOUT) != 0) {
-		abortmsg = "logout failed";
-	}
-
-	if ((dismsg = value(DISCONNECT)) != NOSTR) {
-		write(FD, dismsg, strlen(dismsg));
-		sleep (2);
-	}
-	tipabort(abortmsg);
-}
-
-void
-intcopy()
-{
-	raw();
-	quit = 1;
-	longjmp(intbuf, 1);
+	tipabort(NOSTR);
 }
 
 static void
@@ -893,26 +233,6 @@ args(buf, a, num)
 	return(n);
 }
 
-static void
-prtime(s, a)
-	char *s;
-	time_t a;
-{
-	register i;
-	int nums[3];
-
-	for (i = 0; i < 3; i++) {
-		nums[i] = (int)(a % quant[i]);
-		a /= quant[i];
-	}
-	printf("%s", s);
-	while (--i >= 0)
-		if (nums[i] || (i == 0 && nums[1] == 0 && nums[2] == 0))
-			printf("%d %s%c ", nums[i], sep[i],
-				nums[i] == 1 ? '\0' : 's');
-	printf("\r\n!\r\n");
-}
-
 void
 variable()
 {
@@ -921,10 +241,8 @@ variable()
 	if (prompt("[set] ", buf, sizeof(buf)))
 		return;
 	vlex(buf);
-	if (vtable[BEAUTIFY].v_access&CHANGED) {
+	if (vtable[BEAUTIFY].v_access&CHANGED)
 		vtable[BEAUTIFY].v_access &= ~CHANGED;
-		kill(pid, SIGSYS);
-	}
 	if (vtable[SCRIPT].v_access&CHANGED) {
 		vtable[SCRIPT].v_access &= ~CHANGED;
 		setscript();
diff --git a/tip/cmdtab.c b/tip/cmdtab.c
index 5997ffffd4..b7b974e338 100644
--- a/tip/cmdtab.c
+++ b/tip/cmdtab.c
@@ -36,27 +36,17 @@
 static char sccsid[] = "@(#)cmdtab.c	8.1 (Berkeley) 6/6/93";
 #endif
 static const char rcsid[] =
-	"$Id: cmdtab.c,v 1.1 2000-12-22 18:48:47 mike Exp $";
+	"$Id: cmdtab.c,v 1.2 2000-12-27 00:49:33 mike Exp $";
 #endif /* not lint */
 
-#include "tipconf.h"
 #include "tip.h"
 
-extern	int shell(), getfl(), sendfile(), chdirectory();
-extern	int finish(), help(), pipefile(), pipeout(), variable();
-extern	int cu_take(), cu_put(), dollar(), genbrk(), suspend();
+extern	int shell(), chdirectory();
+extern	int finish(), help(), variable();
+extern	dollar(), genbrk(), suspend();
 
 esctable_t etable[] = {
 	{ '!',	NORM,	"shell",			 shell },
-	{ '<',	NORM,	"receive file from remote host", getfl },
-	{ '>',	NORM,	"send file to remote host",	 sendfile },
-	{ 't',	NORM,	"take file from remote UNIX",	 cu_take },
-	{ 'p',	NORM,	"put file to remote UNIX",	 cu_put },
-	{ '|',	NORM,	"pipe remote file",		 pipefile },
-	{ '$',	NORM,	"pipe local command to remote host", pipeout },
-#if CONNECT
-	{ 'C',  NORM,	"connect program to remote host",consh },
-#endif
 	{ 'c',	NORM,	"change directory",		 chdirectory },
 	{ '.',	NORM,	"exit from tip",		 finish },
 	{CTRL('d'),NORM,"exit from tip",		 finish },
diff --git a/tip/cu.c b/tip/cu.c
deleted file mode 100644
index cc6c1637d9..0000000000
--- a/tip/cu.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)cu.c	8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
-	"$Id: cu.c,v 1.1 2000-12-22 18:48:47 mike Exp $";
-#endif /* not lint */
-
-#include "tipconf.h"
-#include "tip.h"
-
-void	cleanup();
-
-#if INCLUDE_CU_INTERFACE
-
-/*
- * Botch the interface to look like cu's
- */
-cumain(argc, argv)
-	char *argv[];
-{
-	register int i;
-	static char sbuf[12];
-
-	if (argc < 2) {
-		printf("usage: cu telno [-t] [-s speed] [-a acu] [-l line] [-#]\n");
-		exit(8);
-	}
-	CU = DV = NOSTR;
-	BR = DEFBR;
-	for (; argc > 1; argv++, argc--) {
-		if (argv[1][0] != '-')
-			PN = argv[1];
-		else switch (argv[1][1]) {
-
-		case 't':
-			HW = 1, DU = -1;
-			--argc;
-			continue;
-
-		case 'a':
-			CU = argv[2]; ++argv; --argc;
-			break;
-
-		case 's':
-			if (argc < 3 || speed(atoi(argv[2])) == 0) {
-				fprintf(stderr, "cu: unsupported speed %s\n",
-					argv[2]);
-				exit(3);
-			}
-			BR = atoi(argv[2]); ++argv; --argc;
-			break;
-
-		case 'l':
-			DV = argv[2]; ++argv; --argc;
-			break;
-
-		case '0': case '1': case '2': case '3': case '4':
-		case '5': case '6': case '7': case '8': case '9':
-			if (CU)
-				CU[strlen(CU)-1] = argv[1][1];
-			if (DV)
-				DV[strlen(DV)-1] = argv[1][1];
-			break;
-
-		default:
-			printf("Bad flag %s", argv[1]);
-			break;
-		}
-	}
-	signal(SIGINT, cleanup);
-	signal(SIGQUIT, cleanup);
-	signal(SIGHUP, cleanup);
-	signal(SIGTERM, cleanup);
-
-	/*
-	 * The "cu" host name is used to define the
-	 * attributes of the generic dialer.
-	 */
-	(void)snprintf(sbuf, sizeof(sbuf), "cu%d", BR);
-	if ((i = hunt(sbuf)) == 0) {
-		printf("all ports busy\n");
-		exit(3);
-	}
-	if (i == -1) {
-		printf("link down\n");
-		(void)uu_unlock(uucplock);
-		exit(3);
-	}
-	setbuf(stdout, NULL);
-	loginit();
-	user_uid();
-	vinit();
-	setparity("none");
-	boolean(value(VERBOSE)) = 0;
-	if (HW)
-		ttysetup(speed(BR));
-	if (connect()) {
-		printf("Connect failed\n");
-		daemon_uid();
-		(void)uu_unlock(uucplock);
-		exit(1);
-	}
-	if (!HW)
-		ttysetup(speed(BR));
-}
-#endif /* INCLUDE_CU_INTERFACE */
diff --git a/tip/getcap.c b/tip/getcap.c
index dda084fb2e..64d03c1898 100644
--- a/tip/getcap.c
+++ b/tip/getcap.c
@@ -38,6 +38,8 @@
 static char sccsid[] = "@(#)getcap.c	8.3 (Berkeley) 3/25/94";
 #endif /* LIBC_SCCS and not lint */
 
+#include "tipconf.h"
+
 #include <sys/types.h>
 
 #include <ctype.h>
diff --git a/tip/hunt.c b/tip/hunt.c
index df2a1c12fc..fd998dd255 100644
--- a/tip/hunt.c
+++ b/tip/hunt.c
@@ -36,16 +36,17 @@
 static char sccsid[] = "@(#)hunt.c	8.1 (Berkeley) 6/6/93";
 #endif
 static const char rcsid[] =
-	"$Id: hunt.c,v 1.1 2000-12-22 18:48:47 mike Exp $";
+	"$Id: hunt.c,v 1.2 2000-12-27 00:49:34 mike Exp $";
 #endif /* not lint */
 
+#include "tip.h"
+
 #include <sys/types.h>
 #include <err.h>
 #ifndef LINUX
 #include <libutil.h>
 #endif
-#include "tipconf.h"
-#include "tip.h"
+
 
 extern char *getremote();
 extern char *rindex();
@@ -71,12 +72,14 @@ hunt(name)
 	f = signal(SIGALRM, dead);
 	while ((cp = getremote(name))) {
 		deadfl = 0;
+#if HAVE_UUCPLOCK
 		uucplock = rindex(cp, '/')+1;
 		if ((res = uu_lock(uucplock)) != UU_LOCK_OK) {
 			if (res != UU_LOCK_INUSE)
 				fprintf(stderr, "uu_lock: %s\n", uu_lockerr(res));
 			continue;
 		}
+#endif
 		/*
 		 * Straight through call units, such as the BIZCOMP,
 		 * VADIC and the DF, must indicate they're hardwired in
@@ -89,6 +92,8 @@ hunt(name)
 		if (setjmp(deadline) == 0) {
 			alarm(10);
 			FD = open(cp, O_RDWR);
+			if (FD >= 0)
+				ioctl(FD, TIOCEXCL, 0);
 		}
 		alarm(0);
 		if (FD < 0) {
@@ -96,14 +101,12 @@ hunt(name)
 			deadfl = 1;
 		}
 		if (!deadfl) {
-			ioctl(FD, TIOCEXCL, 0);
 #if HAVE_TERMIOS
-			{
-				struct termios t;
-				if (tcgetattr(FD, &t) == 0) {
-					t.c_cflag |= HUPCL;
-					(void)tcsetattr(FD, TCSANOW, &t);
-				}
+			struct termios t;
+
+			if (tcgetattr(FD, &t) == 0) {
+				t.c_cflag |= HUPCL;
+				(void)tcsetattr(FD, TCSANOW, &t);
 			}
 #else /* HAVE_TERMIOS */
 #ifdef TIOCHPCL
@@ -113,7 +116,9 @@ hunt(name)
 			signal(SIGALRM, SIG_DFL);
 			return ((int)cp);
 		}
+#if HAVE_UUCPLOCK
 		(void)uu_unlock(uucplock);
+#endif
 	}
 	signal(SIGALRM, f);
 	return (deadfl ? -1 : (int)cp);
diff --git a/tip/log.c b/tip/log.c
deleted file mode 100644
index 65b25ceb33..0000000000
--- a/tip/log.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)log.c	8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
-	"$Id: log.c,v 1.1 2000-12-22 18:48:48 mike Exp $";
-#endif /* not lint */
-
-#include "tipconf.h"
-#include "tip.h"
-#include <err.h>
-
-#if ACULOG
-static	FILE *flog = NULL;
-
-/*
- * Log file maintenance routines
- */
-
-void
-logent(group, num, acu, message)
-	char *group, *num, *acu, *message;
-{
-	char *user, *timestamp;
-	struct passwd *pwd;
-	time_t t;
-
-	if (flog == NULL)
-		return;
-	if (flock(fileno(flog), LOCK_EX) < 0) {
-		warn("flock");
-		return;
-	}
-	if ((user = getlogin()) == NOSTR)
-		if ((pwd = getpwuid(getuid())) == NOPWD)
-			user = "???";
-		else
-			user = pwd->pw_name;
-	t = time(0);
-	timestamp = ctime(&t);
-	timestamp[24] = '\0';
-	fprintf(flog, "%s (%s) <%s, %s, %s> %s\n",
-		user, timestamp, group,
-#if PRISTINE
-		"",
-#else
-		num,
-#endif
-		acu, message);
-	(void) fflush(flog);
-	(void) flock(fileno(flog), LOCK_UN);
-}
-
-void
-loginit()
-{
-	flog = fopen(value(LOG), "a");
-	if (flog == NULL)
-		fprintf(stderr, "can't open log file %s.\r\n", value(LOG));
-}
-#endif
diff --git a/tip/modems.5 b/tip/modems.5
deleted file mode 100644
index 7fd347433c..0000000000
--- a/tip/modems.5
+++ /dev/null
@@ -1,141 +0,0 @@
-.\" Copyright (c) 1983, 1991, 1993
-.\"	The Regents of the University of California.  All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\"    must display the following acknowledgement:
-.\"	This product includes software developed by the University of
-.\"	California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"    without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\"     @(#)modems.5	3/24/95
-.\"
-.Dd March 24, 1995
-.Dt MODEMS 5
-.Os BSD 4.4
-.Sh NAME
-.Nm modems
-.Nd modem configuration data base
-.Sh DESCRIPTION
-The modems known by
-.Xr tip 1
-and their attributes are stored in an
-.Tn ASCII
-file which
-is structured somewhat like the
-.Xr termcap 5
-file.  Each line in the file provides a description for a single
-.Em modem .
-Fields are separated by a colon (``:'').
-Lines ending in a \e character with an immediately following newline are
-continued on the next line.
-.Pp
-The first entry is the name(s) of the modem.  If there is more
-than one name for a modem, the names are separated by vertical bars.
-After the name of the modem comes the fields of the description.  A
-field name followed by an `=' sign indicates a string value follows.  A field
-name followed by a `#' sign indicates a following numeric value.
-.Pp
-When
-.Xr tip 1
-is invoked, an entry for a remote system is looked up in the
-.Pa /etc/remote
-database. 
-If the entry includes an "ACU" type capability (abbreviated at), 
-.Xr tip 1
-looks up the specified modem in 
-.Pa /etc/modems.
-If a modem entry is found,
-the corresponding capabilities determine how 
-.Xr tip 1
-programs the modem when connecting to and disconnecting from the
-remote system.
-.Sh CAPABILITIES
-Capabilities are either strings (str), numbers (num), or boolean
-flags (bool).  A string capability is specified by 
-.Em capability Ns Ar = Ns Em value ;
-for example, ``reset_command=ATZ\\r''.  A numeric capability is specified by
-.Em capability Ns Ar # Ns Em value ;
-for example, ``intercharacter_delay#50''.  A boolean capability is specified 
-by simply listing the capability.
-.Bl -tag -width intercharacter_delay indent
-.It Cm \&dial_command
-(str)
-AT command used to dial remote system (typically, "ATDT")
-.It Cm \&echo_off_command
-(str)
-AT command to turn off command echo.
-.It Cm \&escape_guard_time
-(num)
-The delay, expressed in milliseconds, used to frame return-to-command
-escape sequences.
-.It Cm \&escape_sequence
-(str)
-The return-to-command escape sequence.
-.It Cm \&hangup_command
-(str)
-AT command used to hangup modem.
-.It Cm \&hw_flow_control
-(bool)
-Enable hardware (RTS/CTS) flow control between computer and modem (DTE/DCE).
-.It Cm \&init_string
-(str)
-AT command used to initialize modem before dialing.
-.It Cm \&intercharacter_delay
-(num)
-Delay value, expressed in milliseconds, between characters when sending commands
-to the modem.
-.It Cm \&intercommand_delay
-(num)
-Minimum delay value, expressed in milliseconds, to impose between commands
-issued to the modem.
-.It Cm \&lock_baud
-(bool)
-Use a fixed bit rate between the computer and the modem (DTE / DCE). The
-bit rate is specified in 
-.Pa /etc/remote.
-.It Cm \&reset_command
-(str)
-AT command to reset the modem.
-.It Cm \&reset_delay
-(num)
-The time, expressed in milliseconds, required by the modem to complete
-a reset and return to a ready condition.
-.Sh FILES
-.Bl -tag -width /etc/modems -compact
-.It Pa /etc/modems
-The
-.Nm modems
-configuration database file
-resides in
-.Pa /etc .
-.El
-.Sh SEE ALSO
-.Xr tip 1 ,
-.Xr remote 5
-.Sh HISTORY
-The
-.Nm
-file format appeared in
-.Bx 4.4 .
diff --git a/tip/tip.1 b/tip/ntip.1
similarity index 73%
rename from tip/tip.1
rename to tip/ntip.1
index 687fda9886..8735a1bfd6 100644
--- a/tip/tip.1
+++ b/tip/ntip.1
@@ -31,32 +31,94 @@
 .\"
 .\"	@(#)tip.1	8.4 (Berkeley) 4/18/94
 .\"
-.Dd April 18, 1994
-.Dt TIP 1
+.Dd December 26, 2000
+.Dt NTIP 1
 .Os BSD 4
 .Sh NAME
-.Nm tip
-.Nd connect to a remote system
+.Nm ntip
+.Nd connect to a directly-connected remote system
 .Sh SYNOPSIS
-.Nm tip
+.Nm ntip
+.Op Fl c
+.Op Fl r
 .Op Fl v
 .Fl Ns Ns Ar speed 
 .Ar system\-name
-.Nm tip
-.Op Fl v
-.Fl Ns Ns Ar speed 
-.Ar phone\-number
 .Sh DESCRIPTION
-.Nm Tip
-establish a full-duplex connection to another machine,
+.Nm Ntip
+establishes a full-duplex connection to another machine,
 giving the appearance of being logged in directly on the
 remote cpu.  It goes without saying that you must have a login
 on the machine (or equivalent) to which you wish to connect.
 .Pp
+.Nm Ntip
+differs from the traditional
+.Nm tip
+in a number of ways:
+.Bl -enum
+.It
+It does not support calling a remote system,
+all auto-dialing code has been removed.
+.It
+All the cheezy file transfer support has been removed.
+.It
+Most of the tilde escapes have been removed.  Mostly these were the file
+trasfer related ones.  See below for what remains.
+.It
+.Nm Ntip
+ignores 90% of the
+.Xr remote 5
+capabilities.  You can set the baud rate (br) and the device (dv).
+Period.
+.It
+All of
+.Nm tips
+variables are still present, but most don't do anything.
+It is left as an exercise to the interested user to differentiate.
+.It
+By default, it operates in ``raw'' mode instead of the usual ``cbreak'' mode.
+This means that all input processing (if any) is performed by the remote system.
+Raw mode also disables ``raisechar'' and ``force'' variable interpretation.
+Yes, you can actually run emacs on an
+.Nm ntip
+line (modulo the '~' thing).
+.It
+.Nm Tip
+is the poster-child for fork-without-exec,
+creating separate reader and writer processes executing ``the same code.''
+.Nm Ntip
+is a child of convenience and consists of a single process using
+.Xr select 2 .
+.It
+.Nm Ntip
+no longer uses
+.Xr uucp 1
+style locking.
+It relies on the TIOCEXCL ioctl (see
+.Xr tty 4 )
+to provide ``reasonably mutually exclusive'' access.
+While it is still technically possible that two parties could open the
+same line and both get ``exclusive'' access to it,
+we consider this to be the source of amusing anecdotes rather than a bug.
+.El
+.Pp
 Available Option:
 .Bl -tag -width indent
+.It Fl c
+Force
+.Nm ntip
+to use ``cbreak''
+(``(c)onventional'', ``(c)razy'', ``(c)an't run emacs'')
+mode.
+.It Fl r
+Force
+.Nm ntip
+to use ``raw''
+(``(r)ocks!'', ``(r)ulz!'', ``(r)ighteous'')
+mode.
 .It Fl v
 Set verbose mode.
+Whatever the hell that is.
 .El
 .Pp
 Typed characters are normally transmitted directly to the remote
@@ -76,63 +138,6 @@ implies change to your home directory).
 .It Ic \&~!
 Escape to a shell (exiting the shell will
 return you to tip).
-.It Ic \&~>
-Copy file from local to remote.
-.Nm Tip
-prompts for the name of a local file to transmit.
-.It Ic \&~<
-Copy file from remote to local.
-.Nm Tip
-prompts first for the name of the file to be sent, then for
-a command to be executed on the remote machine.
-.It Ic \&~p Ar from Op Ar to 
-Send a file to a remote
-.Ux
-host.  The put command causes the remote
-.Ux
-system to run the command string ``cat > 'to''', while
-.Nm tip
-sends it the ``from''
-file.  If the ``to'' file isn't specified the ``from'' file name is used.
-This command is actually a
-.Ux
-specific version of the ``~>'' command.
-.It Ic \&~t Ar from Op Ar to 
-Take a file from a remote
-.Ux
-host.
-As in the put command the ``to'' file
-defaults to the ``from'' file name if it isn't specified.
-The remote host
-executes the command string ``cat 'from';echo ^A'' to send the file to
-.Nm tip  .
-.It Ic \&~|
-Pipe the output from a remote command to a local
-.Ux
-process.
-The command string sent to the local
-.Ux
-system is processed by the shell.
-.It Ic \&~$
-Pipe the output from a local
-.Ux
-process to the remote host.
-The command string sent to the local
-.Ux
-system is processed by the shell.
-.It Ic \&~C
-Fork a child process on the local system to perform special protocols
-such as \s-1XMODEM\s+1.  The child program will be run with the following
-somewhat unusual arrangement of file descriptors:
-.nf
-.in +1i
-0 <-> local tty in
-1 <-> local tty out
-2 <-> local tty out
-3 <-> remote tty in
-4 <-> remote tty out
-.in -1i
-.fi
 .It Ic \&~#
 Send a
 .Dv BREAK
@@ -148,20 +153,20 @@ characters.
 Set a variable (see the discussion below).
 .It Ic \&~^Z
 Stop
-.Nm tip
+.Nm ntip
 (only available with job control).
 .It Ic \&~^Y
 Stop only the ``local side'' of
-.Nm tip
+.Nm ntip
 (only available with job control);
 the ``remote side'' of
-.Nm tip  ,
+.Nm ntip  ,
 the side that displays output from the remote host, is left running.
 .It Ic \&~?
 Get a summary of the tilde escapes
 .El
 .Pp
-.Nm Tip
+.Nm Ntip
 uses the file
 .Pa /etc/remote
 to find how to reach a particular
@@ -176,56 +181,18 @@ to be used may be specified on the command line, e.g.
 .Ql "tip -300 mds" .
 .Pp
 When
-.Nm tip
-establishes a connection it sends out a
-connection message to the remote system; the default value, if any,
-is defined in
-.Pa /etc/remote
-(see
-.Xr remote 5 ) .
-.Pp
-When
-.Nm tip
-prompts for an argument (e.g. during setup of
-a file transfer) the line typed may be edited with the standard
+.Nm ntip
+prompts for an argument (e.g. while setting a variable)
+the line typed may be edited with the standard
 erase and kill characters.  A null line in response to a prompt,
 or an interrupt, will abort the dialogue and return you to the
 remote machine.
 .Pp
-.Nm Tip
+.Nm Ntip
 guards against multiple users connecting to a remote system
-by opening modems and terminal lines with exclusive access,
-and by honoring the locking protocol used by
-.Xr uucico 8 .
-.Pp
-During file transfers
-.Nm tip
-provides a running count of the number of lines transferred.
-When using the ~> and ~< commands, the ``eofread'' and ``eofwrite''
-variables are used to recognize end-of-file when reading, and
-specify end-of-file when writing (see below).  File transfers
-normally depend on tandem mode for flow control.  If the remote
-system does not support tandem mode, ``echocheck'' may be set
-to indicate
-.Nm tip
-should synchronize with the remote system on the echo of each
-transmitted character.
-.Pp
-When
-.Nm tip
-must dial a phone number to connect to a system it will print
-various messages indicating its actions.
-.Nm Tip
-supports modems that use the AT command set. 
-.Nm Tip
-uses the file
-.Pa /etc/modems
-to find out how to operate with a particular
-modem; refer to
-.Xr modems  5
-for a full description.
+by opening terminal lines with exclusive access.
 .Ss VARIABLES
-.Nm Tip
+.Nm Ntip
 maintains a set of
 .Ar variables
 which control its operation.
@@ -254,7 +221,7 @@ Variables may be initialized at run time by placing set commands
 in one's home directory).  The
 .Fl v
 option causes
-.Nm tip
+.Nm ntip
 to display the sets as they are made.
 Certain common variables have abbreviations.
 The following is a list of common variables,
@@ -286,7 +253,7 @@ a ~> file transfer command; abbreviated
 .Ar eofw  .
 .It Ar eol
 (str) The set of characters which indicate an end-of-line.
-.Nm Tip
+.Nm Ntip
 will recognize escape characters only after an end-of-line.
 .It Ar escape
 (char) The command prefix (escape) character; abbreviated
@@ -333,7 +300,7 @@ default value is
 .Ar off  .
 When this mode is enabled, all lower case letters will be mapped to
 upper case by
-.Nm tip
+.Nm ntip
 for transmission to the remote machine.
 .It Ar raisechar
 (char) The input character used to toggle upper case mapping mode;
@@ -354,7 +321,7 @@ When
 .Ar script
 is
 .Li true  ,
-.Nm tip
+.Nm ntip
 will record everything transmitted by the remote machine in
 the script record file specified in
 .Ar record  .
@@ -380,13 +347,13 @@ Each tab is expanded to 8 spaces.
 default is
 .Ar true  .
 When verbose mode is enabled,
-.Nm tip
+.Nm ntip
 prints messages while dialing, shows the current number
 of lines transferred during a file transfer operations,
 and more.
 .El
 .Sh ENVIRONMENT
-.Nm Tip
+.Nm Ntip
 uses the following environment variables:
 .Bl -tag -width Fl
 .It Ev SHELL
@@ -399,44 +366,35 @@ value is taken from the environment.
 Check for a default host if none specified.
 .El
 .Pp
-The variables
+The variable
 .Ev ${REMOTE}
-and
-.Ev ${PHONES}
-are also exported.
+is also exported.
 .Sh FILES
-.Bl -tag -width /var/spool/lock/LCK..* -compact
-.It Pa /etc/modems
-Global modem configuration data base.
+.Bl -tag -width /etc/remote -compact
 .It Pa /etc/remote
 Global system descriptions.
-.It Pa /etc/phones
-Global phone number data base.
 .It ${REMOTE}
 Private system descriptions.
-.It ${PHONES}
-Private phone numbers.
 .It ~/.tiprc
 Initialization file.
 .It Pa tip.record
 Record file.
-.It /var/log/aculog
-Line access log.
-.It Pa /var/spool/lock/LCK..*
-Lock file to avoid conflicts with
-.Xr uucp .
 .El
 .Sh DIAGNOSTICS
 Diagnostics are, hopefully, self explanatory.
 .Sh SEE ALSO
-.Xr cu 1 ,
-.Xr phones 5 ,
+.Xr tip 1 ,
 .Xr remote 5
 .Sh HISTORY
 The
 .Nm tip
-appeared command in
+command appeared command in
 .Bx 4.2 .
+The
+.Nm ntip
+command was an act of desperation on the part of its author.
 .Sh BUGS
 The full set of variables is undocumented and should, probably, be
 pared down.
+.Nm Tip
+and all of its bastard spawn should be eliminated from the face of the earth.
diff --git a/tip/remote.c b/tip/remote.c
index 0eba854525..ee5911f461 100644
--- a/tip/remote.c
+++ b/tip/remote.c
@@ -43,9 +43,12 @@ static const char copyright[] =
 static char sccsid[] = "@(#)remote.c	8.1 (Berkeley) 6/6/93";
 #endif
 static const char rcsid[] =
-	"$Id: remote.c,v 1.1 2000-12-22 18:48:48 mike Exp $";
+	"$Id: remote.c,v 1.2 2000-12-27 00:49:35 mike Exp $";
 #endif /* not lint */
 
+#include "tip.h"
+#include "pathnames.h"
+
 #ifndef LINUX
 #include <sys/syslimits.h>
 #endif
@@ -53,10 +56,6 @@ static const char rcsid[] =
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "tipconf.h"
-#include "tip.h"
-#include "pathnames.h"
-
 /*
  * Attributes to be gleened from remote host description
  *   data base.
@@ -73,8 +72,6 @@ static char *capstrings[] = {
 
 static char	*db_array[3] = { _PATH_REMOTE, 0, 0 };
 
-char *cgetcap __P((char *, char *, int));
-
 #define cgetflag(f)	(cgetcap(bp, f, ':') != NULL)
 
 static void getremcap __P((char *));
diff --git a/tip/tip.c b/tip/tip.c
index 00bc079b7e..24afe2b22f 100644
--- a/tip/tip.c
+++ b/tip/tip.c
@@ -42,7 +42,7 @@ static const char copyright[] =
 static char sccsid[] = "@(#)tip.c	8.1 (Berkeley) 6/6/93";
 #endif
 static const char rcsid[] =
-	"$Id: tip.c,v 1.1 2000-12-22 18:48:49 mike Exp $";
+	"$Id: tip.c,v 1.2 2000-12-27 00:49:35 mike Exp $";
 #endif /* not lint */
 
 /*
@@ -57,15 +57,15 @@ void ttysetup (int speed);
  *  cu phone-number [-s speed] [-l line] [-a acu]
  */
 
+#include "tip.h"
+#include "pathnames.h"
+
 #include <err.h>
 #include <errno.h>
 #include <sys/types.h>
 #ifndef LINUX
 #include <libutil.h>
 #endif
-#include "tipconf.h"
-#include "tip.h"
-#include "pathnames.h"
 
 /*
  * Baud rate mapping table
@@ -110,16 +110,18 @@ int	disc = OTTYDISC;		/* tip normally runs this way */
 
 void	intprompt();
 void	timeout();
-void	cleanup();
 void	tipdone();
 char	*sname();
 char	PNbuf[256];			/* This limits the size of a number */
 
+int	rflag = 1;
+
 static void usage __P((void));
 void setparity __P((char *));
 void xpwrite __P((int, char *, int));
-char escape __P((void));
-void tipin __P((void));
+void tipio __P((void));
+void tipinfunc __P((char *, int));
+void tipoutfunc __P((char *, int));
 int prompt __P((char *, char *, size_t));
 void unraw __P((void));
 void shell_uid __P((void));
@@ -141,19 +143,13 @@ main(argc, argv)
 	uid = getuid();
 	euid = geteuid();
 
-#if INCLUDE_CU_INTERFACE
-	if (equal(sname(argv[0]), "cu")) {
-		cumode = 1;
-		cumain(argc, argv);
-		goto cucommon;
-	}
-#endif /* INCLUDE_CU_INTERFACE */
-
 	if (argc > 4)
 		usage();
 	if (!isatty(0))
 		errx(1, "must be interactive");
 
+	STDIN = 0;
+
 	for (; argc > 1; argv++, argc--) {
 		if (argv[1][0] != '-')
 			system = argv[1];
@@ -163,6 +159,13 @@ main(argc, argv)
 			vflag++;
 			break;
 
+		case 'c':
+			rflag = 0;
+			break;
+		case 'r':
+			rflag = 1;
+			break;
+
 		case '0': case '1': case '2': case '3': case '4':
 		case '5': case '6': case '7': case '8': case '9':
 			BR = atoi(&argv[1][1]);
@@ -174,38 +177,25 @@ main(argc, argv)
 		}
 	}
 
-	if (system == NOSTR)
-		goto notnumber;
-	if (isalpha(*system))
-		goto notnumber;
-	/*
-	 * System name is really a phone number...
-	 * Copy the number then stomp on the original (in case the number
-	 *	is private, we don't want 'ps' or 'w' to find it).
-	 */
-	if (strlen(system) > sizeof(PNbuf) - 1)
-		errx(1, "phone number too long (max = %d bytes)", sizeof PNbuf - 1);
-	strncpy(PNbuf, system, sizeof(PNbuf) - 1);
-	for (p = system; *p; p++)
-		*p = '\0';
-	PN = PNbuf;
-	(void)snprintf(sbuf, sizeof(sbuf), "tip%ld", BR);
-	system = sbuf;
-
-notnumber:
-	(void)signal(SIGINT, cleanup);
-	(void)signal(SIGQUIT, cleanup);
-	(void)signal(SIGHUP, cleanup);
-	(void)signal(SIGTERM, cleanup);
+	(void)signal(SIGINT, tipdone);
+	(void)signal(SIGQUIT, tipdone);
+	(void)signal(SIGHUP, tipdone);
+	(void)signal(SIGTERM, tipdone);
 	(void)signal(SIGUSR1, tipdone);
 
+	/* reset the tty on screw ups */
+	(void)signal(SIGBUS, tipdone);
+	(void)signal(SIGSEGV, tipdone);
+
 	if ((i = hunt(system)) == 0) {
 		printf("all ports busy\n");
 		exit(3);
 	}
 	if (i == -1) {
-		printf("link down\n");
+		printf("%s: busy\n", system);
+#if HAVE_UUCPLOCK
 		(void)uu_unlock(uucplock);
+#endif
 		exit(3);
 	}
 	setbuf(stdout, NULL);
@@ -221,7 +211,9 @@ notnumber:
 	setparity("even");			/* set the parity table */
 	if ((i = speed(number(value(BAUDRATE)))) == 0) {
 		printf("tip: bad baud rate %d\n", number(value(BAUDRATE)));
+#if HAVE_UUCPLOCK
 		(void)uu_unlock(uucplock);
+#endif
 		exit(3);
 	}
 
@@ -241,15 +233,7 @@ notnumber:
 	 */
 	if (HW)
 		ttysetup(i);
-	if ((p = connect())) {
-		printf("\07%s\n[EOT]\n", p);
-		daemon_uid();
-		(void)uu_unlock(uucplock);
-		exit(1);
-	}
-	if (!HW)
-		ttysetup(i);
-/* cucommon:*/
+
 	/*
 	 * From here down the code is shared with
 	 * the "cu" version of tip.
@@ -258,27 +242,40 @@ notnumber:
 #if HAVE_TERMIOS
 	tcgetattr (0, &otermios);
 	ctermios = otermios;
+	if (rflag) {
+		ctermios.c_iflag = (IGNBRK|IGNPAR);
+		ctermios.c_lflag = 0;
+		ctermios.c_cflag = (CLOCAL|CREAD|CS8);
+		ctermios.c_cc[VMIN] = 1;
+		ctermios.c_cc[VTIME] = 5;
+		ctermios.c_oflag = 0;
+	} else {
 #ifndef _POSIX_SOURCE
-	ctermios.c_iflag = (IMAXBEL|IXANY|ISTRIP|IXON|BRKINT);
-	ctermios.c_lflag = (PENDIN|IEXTEN|ISIG|ECHOCTL|ECHOE|ECHOKE);
+		ctermios.c_iflag = (IMAXBEL|IXANY|ISTRIP|IXON|BRKINT);
+		ctermios.c_lflag = (PENDIN|IEXTEN|ISIG|ECHOCTL|ECHOE|ECHOKE);
 #else
-	ctermios.c_iflag = (ISTRIP|IXON|BRKINT);
-	ctermios.c_lflag = (PENDIN|IEXTEN|ISIG|ECHOE);
+		ctermios.c_iflag = (ISTRIP|IXON|BRKINT);
+		ctermios.c_lflag = (PENDIN|IEXTEN|ISIG|ECHOE);
 #endif
-	ctermios.c_cflag = (CLOCAL|HUPCL|CREAD|CS8);
-	ctermios.c_cc[VINTR] = 	ctermios.c_cc[VQUIT] = -1;
-	ctermios.c_cc[VSUSP] = ctermios.c_cc[VDISCARD] =
-		ctermios.c_cc[VLNEXT] = -1;
+		ctermios.c_cflag = (CLOCAL|HUPCL|CREAD|CS8);
+		ctermios.c_cc[VINTR] = 	ctermios.c_cc[VQUIT] = _POSIX_VDISABLE;
+		ctermios.c_cc[VSUSP] = ctermios.c_cc[VDISCARD] =
+			ctermios.c_cc[VLNEXT] = _POSIX_VDISABLE;
 #ifdef VDSUSP
-	ctermios.c_cc[VDSUSP] = -1;
+		ctermios.c_cc[VDSUSP] = _POSIX_VDISABLE;
 #endif
+	}
 #else /* HAVE_TERMIOS */
 	ioctl(0, TIOCGETP, (char *)&defarg);
 	ioctl(0, TIOCGETC, (char *)&defchars);
 	ioctl(0, TIOCGLTC, (char *)&deflchars);
 	ioctl(0, TIOCGETD, (char *)&odisc);
 	arg = defarg;
-	arg.sg_flags = ANYP | CBREAK;
+	if (rflag)
+		arg.sg_flags = RAW;
+	else
+		arg.sg_flags = CBREAK;
+	arg.sg_flags |= PASS8 | ANYP;
 	tchars = defchars;
 	tchars.t_intrc = tchars.t_quitc = -1;
 	ltchars = deflchars;
@@ -287,7 +284,6 @@ notnumber:
 #endif /* HAVE_TERMIOS */
 	raw();
 
-	pipe(fildes); pipe(repdes);
 	(void)signal(SIGALRM, timeout);
 
 	/*
@@ -295,18 +291,14 @@ notnumber:
 	 *	connection established (hardwired or dialup)
 	 *	line conditioned (baud rate, mode, etc.)
 	 *	internal data structures (variables)
-	 * so, fork one process for local side and one for remote.
+	 * so, fire up!
 	 */
-	printf(cumode ? "Connected\r\n" : "\07connected\r\n");
-
-	if (LI != NOSTR && tiplink (LI, 0) != 0) {
-		tipabort ("login failed");
-	}
-
-	if ((pid = fork()))
-		tipin();
+	if (rflag)
+		printf("\07connected (raw mode)\r\n");
 	else
-		tipout();
+		printf("\07connected\r\n");
+
+	tipio();
 	/*NOTREACHED*/
 }
 
@@ -318,23 +310,22 @@ usage()
 }
 
 void
-cleanup()
+tipdone(sig)
+	int sig;
 {
-
-	daemon_uid();
-	(void)uu_unlock(uucplock);
-#if !HAVE_TERMIOS
-	if (odisc)
-		ioctl(0, TIOCSETD, (char *)&odisc);
-#endif
-	exit(0);
+	switch (sig) {
+	case SIGHUP:
+		tipabort("Hangup.");
+		break;
+	case SIGTERM:
+		tipabort("Killed.");
+		break;
+	default:
+		printf("\r\nSignal %d", sig);
+		tipabort(NOSTR);
+	}
 }
 
-void
-tipdone()
-{
-	tipabort("Hangup.");
-}
 /*
  * Muck with user ID's.  We are setuid to the owner of the lock
  * directory when we start.  user_uid() reverses real and effective
@@ -370,21 +361,27 @@ shell_uid()
 	seteuid(uid);
 }
 
+static int inrawmode;
+
 /*
  * put the controlling keyboard into raw mode
  */
 void
-raw ()
+raw()
 {
+	if (inrawmode)
+		return;
+
 #if HAVE_TERMIOS
 	tcsetattr (0, TCSANOW, &ctermios);
 #else /* HAVE_TERMIOS */
-
 	ioctl(0, TIOCSETP, &arg);
 	ioctl(0, TIOCSETC, &tchars);
 	ioctl(0, TIOCSLTC, &ltchars);
 	ioctl(0, TIOCSETD, (char *)&disc);
 #endif /* HAVE_TERMIOS */
+
+	inrawmode = 1;
 }
 
 
@@ -394,15 +391,19 @@ raw ()
 void
 unraw()
 {
+	if (!inrawmode)
+		return;
+
 #if HAVE_TERMIOS
 	tcsetattr (0, TCSANOW, &otermios);
 #else /* HAVE_TERMIOS */
-
 	ioctl(0, TIOCSETD, (char *)&odisc);
 	ioctl(0, TIOCSETP, (char *)&defarg);
 	ioctl(0, TIOCSETC, (char *)&defchars);
 	ioctl(0, TIOCSLTC, (char *)&deflchars);
 #endif /* HAVE_TERMIOS */
+
+	inrawmode = 0;
 }
 
 static	jmp_buf promptbuf;
@@ -427,7 +428,7 @@ prompt(s, p, sz)
 	unraw();
 	printf("%s", s);
 	if (setjmp(promptbuf) == 0)
-		while ((*p = getchar()) != EOF && *p != '\n' && --sz > 0)
+		while ((*p = tipgetchar()) != '\n' && --sz > 0)
 			p++;
 	*p = '\0';
 
@@ -451,35 +452,123 @@ intprompt()
 }
 
 /*
- * ****TIPIN   TIPIN****
+ * ****TIPIO   TIPIO****
+ *
+ * Replace two process reader/writer with select-based single process
+ * reader and writer.
  */
 void
-tipin()
+tipio()
 {
-	int i;
-	char gch, bol = 1;
+	fd_set sfds, fds;
+	int n, i, cc;
+	char buf[4096];
 
 	/*
-	 * Kinda klugey here...
-	 *   check for scripting being turned on from the .tiprc file,
-	 *   but be careful about just using setscript(), as we may
-	 *   send a SIGEMT before tipout has a chance to set up catching
-	 *   it; so wait a second, then setscript()
+	 * Check for scripting being turned on from the .tiprc file.
 	 */
-	if (boolean(value(SCRIPT))) {
-		sleep(1);
+	if (boolean(value(SCRIPT)))
 		setscript();
+
+	n = STDIN;
+	if (n < FD)
+		n = FD;
+	n++;
+	FD_ZERO(&sfds);
+	FD_SET(STDIN, &sfds);
+	FD_SET(FD, &sfds);
+	for (;;) {
+		fds = sfds;
+		i = select(n, &fds, NULL, NULL, NULL);
+		if (i <= 0)
+			tipabort("select failed");
+
+		/*
+		 * Check for user input first.
+		 * It is lower volume and possibly more important (^C)
+		 */
+		if (FD_ISSET(STDIN, &fds)) {
+			cc = read(STDIN, buf, sizeof(buf));
+			if (cc < 0)
+				tipabort("stdin read failed");
+			if (cc == 0)
+				finish();
+			tipinfunc(buf, cc);
+		}
+
+		if (FD_ISSET(FD, &fds)) {
+			cc = read(FD, buf, sizeof(buf));
+			if (cc < 0)
+				tipabort("device read failed");
+			if (cc == 0)
+				tipabort("device read EOF");
+
+			tipoutfunc(buf, cc);
+		}
 	}
+}
 
-	while (1) {
-		i = tipgetchar();
-		if (i == EOF)
-			break;
-		gch = i&0177;
-		if ((gch == character(value(ESCAPE))) && bol) {
-			if (!(gch = escape()))
+void
+tipinfunc(buf, nchar)
+	char *buf;
+	int nchar;
+{
+	int i;
+	char gch;
+	char escc = character(value(ESCAPE));
+	char forcec = character(value(FORCE));
+	static int bol = 1;
+	static int inescape = 0;
+	static int inforce = 0;
+
+	for (i = 0; i < nchar; i++) {
+		gch = buf[i] & 0177;
+		if (inescape || (gch == escc && bol)) {
+			esctable_t *p;
+
+			/*
+			 * Read the next char if not already in an escape.
+			 * If there is no next char note that we are in an
+			 * escape and exit.
+			 */
+			if (!inescape && ++i == nchar) {
+				inescape = 1;
+				break;
+			}
+			gch = buf[i] & 0177;
+			inescape = 0;
+
+			for (p = etable; p->e_char; p++)
+				if (p->e_char == gch)
+					break;
+
+			/*
+			 * If this is a legit escape command, process it.
+			 * Otherwise, for an unrecognized sequence (which
+			 * includes ESCAPE ESCAPE), we just send the escaped
+			 * char with no further interpretation.
+			 */
+			if (p->e_char) {
+				if ((p->e_flags&PRIV) && uid)
+					continue;
+				printf("%s", ctrl(escc));
+				(*p->e_func)(gch);
 				continue;
-		} else if (!cumode && gch == character(value(RAISECHAR))) {
+			}
+		} else if (inforce || gch == forcec) {
+			/*
+			 * Same story, different character...
+			 * Read the next char if not already in a force.
+			 * If there is no next char note that we are forcing
+			 * and exit.
+			 */
+			if (!inforce && ++i == nchar) {
+				inforce = 1;
+				break;
+			}
+			gch = buf[i] & 0177;
+			inforce = 0;
+		} else if (gch == character(value(RAISECHAR))) {
 			boolean(value(RAISE)) = !boolean(value(RAISE));
 			continue;
 		} else if (gch == '\r') {
@@ -488,11 +577,6 @@ tipin()
 			if (boolean(value(HALFDUPLEX)))
 				printf("\r\n");
 			continue;
-		} else if (!cumode && gch == character(value(FORCE))) {
-			i = tipgetchar();
-			if (i == EOF)
-				break;
-			gch = i & 0177;
 		}
 		bol = any(gch, value(EOL));
 		if (boolean(value(RAISE)) && islower(gch))
@@ -503,36 +587,28 @@ tipin()
 	}
 }
 
-extern esctable_t etable[];
-
-/*
- * Escape handler --
- *  called on recognition of ``escapec'' at the beginning of a line
- */
-char
-escape()
+void
+tipoutfunc(buf, nchar)
+	char *buf;
+	int nchar;
 {
-	register char gch;
-	register esctable_t *p;
-	char c = character(value(ESCAPE));
-	int i;
+	char *cp;
 
-	i = tipgetchar();
-	if (i == EOF)
-		return 0;
-	gch = (i&0177);
-	for (p = etable; p->e_char; p++)
-		if (p->e_char == gch) {
-			if ((p->e_flags&PRIV) && uid)
-				continue;
-			printf("%s", ctrl(c));
-			(*p->e_func)(gch);
-			return (0);
-		}
-	/* ESCAPE ESCAPE forces ESCAPE */
-	if (c != gch)
-		xpwrite(FD, &c, 1);
-	return (gch);
+	for (cp = buf; cp < buf + nchar; cp++)
+		*cp &= 0177;
+	write(1, buf, nchar);
+
+	if (boolean(value(SCRIPT)) && fscript != NULL) {
+		if (boolean(value(BEAUTIFY))) {
+			char *excepts = value(EXCEPTIONS);
+
+			for (cp = buf; cp < buf + nchar; cp++)
+				if ((*cp >= ' ' && *cp <= '~') ||
+				    any(*cp, excepts))
+					putc(*cp, fscript);
+		} else
+			fwrite(buf, 1, nchar, fscript);
+	}
 }
 
 int
@@ -652,16 +728,14 @@ ttysetup (int speed)
 #if HAVE_TERMIOS
 	struct termios termios;
 	tcgetattr (FD, &termios);
+	termios.c_iflag = (IGNBRK|IGNPAR);
 	if (boolean(value(TAND)))
-		termios.c_iflag = IXOFF;
-	else
-		termios.c_iflag = 0;
-#ifndef _POSIX_SOURCE
-	termios.c_lflag = (PENDIN|ECHOKE|ECHOE);
-#else
-	termios.c_lflag = (PENDIN|ECHOE);
-#endif
+		termios.c_iflag |= IXOFF;
+	termios.c_lflag = 0;
 	termios.c_cflag = (CLOCAL|HUPCL|CREAD|CS8);
+	termios.c_cc[VMIN] = 1;
+	termios.c_cc[VTIME] = 5;
+	termios.c_oflag = 0;
 	cfsetispeed(&termios, speed);
 	cfsetospeed(&termios, speed);
 	tcsetattr (FD, TCSANOW, &termios);
@@ -709,6 +783,7 @@ xpwrite(fd, buf, n)
 {
 	register int i;
 	register char *bp;
+	extern int errno;
 
 	bp = buf;
 	if (bits8 == 0)
@@ -769,9 +844,8 @@ tipgetchar()
 {
 	char gch;
 
-	gch = getchar();
-	if (gch == EOF && feof(stdin))
+	if (read(STDIN, &gch, 1) != 1)
 		finish();
+
 	return gch;
 }
-
diff --git a/tip/tip.h b/tip/tip.h
index 67f539426e..142633ceb1 100644
--- a/tip/tip.h
+++ b/tip/tip.h
@@ -38,18 +38,16 @@
  * tip - terminal interface program
  */
 
+#include "tipconf.h"
+
 #ifdef LINUX
 /* signals */
 #define	SIGEMT	SIGUSR1
 #define	SIGSYS	SIGUSR2
 
-/* uucp stuff */
-#define uu_lock(x)	(0)
-#define uu_unlock(x)	(0)
-#define UU_LOCK_OK	0
-#define UU_LOCK_INUSE	1
+#define HAVE_UUCPLOCK	0
+#define HAVE_TERMIOS	1
 
-#define HAVE_TERMIOS	1	/* XXX */
 #endif
 
 #include <sys/types.h>
@@ -153,18 +151,6 @@ typedef
 #define INIT	0100		/* static data space used for initialization */
 #define TMASK	017
 
-/*
- * Definition of ACU line description
- */
-typedef
-	struct {
-		char	*acu_name;
-		int	(*acu_dialer)();
-		void	(*acu_disconnect)();
-		void	(*acu_abort)();
-	}
-	acu_t;
-
 #define	equal(a, b)	(strcmp(a,b)==0)/* A nice function to string compare */
 
 /*
@@ -219,13 +205,10 @@ typedef
 
 extern int	vflag;		/* verbose during reading of .tiprc file */
 extern value_t	vtable[];	/* variable table */
+extern esctable_t etable[];
 
-#if !ACULOG
 #define logent(a, b, c, d)
 #define loginit()
-#else
-void logent __P((char *, char *, char *, char*));
-#endif
 
 /*
  * Definition of indices into variable table so
@@ -272,7 +255,6 @@ void logent __P((char *, char *, char *, char*));
 #define LECHO 33
 #define PARITY 34
 #define NOVAL	((value_t *)NULL)
-#define NOACU	((acu_t *)NULL)
 #define NOSTR	((char *)NULL)
 #ifdef NOFILE
 #undef NOFILE
@@ -294,13 +276,11 @@ struct ltchars	deflchars;	/* initial local characters of terminal */
 
 FILE	*fscript;		/* FILE for scripting */
 
-int	fildes[2];		/* file transfer synchronization channel */
-int	repdes[2];		/* read process sychronization channel */
 int	FD;			/* open file descriptor to remote host */
-int	AC;			/* open file descriptor to dialer (v831 only) */
+int	STDIN;			/* stdin file descriptor */
 int	vflag;			/* print .tiprc initialization sequence */
+int	rflag;			/* use raw mode instead of cbreak */
 int	sfd;			/* for ~< operation */
-int	pid;			/* pid of tipout */
 uid_t	uid, euid;		/* real and effective user id's */
 gid_t	gid, egid;		/* real and effective group id's */
 int	stop;			/* stop transfer session flag */
@@ -308,20 +288,20 @@ int	quit;			/* same; but on other end */
 int	intflag;		/* recognized interrupt */
 int	stoprompt;		/* for interrupting a prompt session */
 int	timedout;		/* ~> transfer timedout */
-int	cumode;			/* simulating the "cu" program */
 
 char	fname[PATH_MAX];	/* file name buffer for ~< */
 char	copyname[PATH_MAX];	/* file name buffer for ~> */
 char	ccc;			/* synchronization character */
 char	ch;			/* for tipout */
+#if HAVE_UUCPLOCK
 char	*uucplock;		/* name of lock file for uucp's */
+#endif
 
 int	odisc;				/* initial tty line discipline */
 extern	int disc;			/* current tty discpline */
 
 extern	char *ctrl();
 extern	char *vinterp();
-extern	char *connect();
 extern	int   size __P((char *));
 extern	int   any __P((char, char *));
 extern	void  setscript __P((void));
@@ -333,18 +313,12 @@ extern	int vstring __P((char *, char *));
 extern	void setparity __P((char *));
 extern	void vlex __P((char *));
 extern	void daemon_uid __P((void));
-extern	void disconnect __P((char *));
 extern	void shell_uid __P((void));
 extern	void unraw __P((void));
 extern	void xpwrite __P((int, char *, int));
 extern	int prompt __P((char *, char *, size_t));
-extern	int consh __P((int));
 extern	void tipabort __P((char *));
 
-#define TL_VERBOSE       0x00000001
-#define TL_SIGNAL_TIPOUT 0x00000002
-
-int tiplink (char *cmd, unsigned int flags);
 void raw ();
 
 /* end of tip.h */
diff --git a/tip/tipconf.h b/tip/tipconf.h
index a0890b8f71..52c264100b 100644
--- a/tip/tipconf.h
+++ b/tip/tipconf.h
@@ -44,7 +44,7 @@
 /*
 	Specify default bit rate for connections
 */
-#define DEFBR 1200
+#define DEFBR 9600
 
 /*
 	Default frame size for file transfer buffering of writes
@@ -57,68 +57,29 @@
 #endif
 
 /*
-	Enable logging of ACU use
+	Enable use of UUCP lockfiles.
+	Otherwise relies on using the exclusive use ioctl.  This opens up
+	a minor race since setting exclusive use is not atomic with opening
+	the device, but we live with it.
 */
-#define ACULOG             1
-
-/*
-	Strip phone #s from ACU log file
-*/
-#define PRISTINE           1
-
-/*
-	Enable command to "connect" remote with local process
-*/
-#define CONNECT            1
+#define	HAVE_UUCPLOCK	   0
 
 /*
 	Specify style of UUCP lock files
+	(only matters if UUCPLOCK is defined non-zero)
 */
 #define HAVE_V2_LOCKFILES  0
 #define HAVE_HDB_LOCKFILES 1
 
-/*
-	System has a millisecond based sleep function
-*/
-#define HAVE_USLEEP        0
-
-/*
-	System has select
-*/
-#define HAVE_SELECT        1
-
 /*
 	System has termios tty interface
 */
 #define HAVE_TERMIOS       1
 
-/*
-	Include configurable modem driver
-*/
-#define UNIDIALER          0
-
-/*
-	Specify builtin modem drivers to include
-*/
-#define BIZ1031            0
-#define BIZ1022            0
-#define COURIER            0
-#define DF02               0
-#define DF03               0
-#define DN11               0
-#define HAYES              0
-#define MULTITECH          0
-#define T3000              0
-#define V3451              0
-#define V831               0
-#define VENTEL             0
-
-/*
-	Include cu interface so that, when tip is linked to cu and then
-	invoked as cu, it behaves like cu.
-*/
-#define INCLUDE_CU_INTERFACE 0
+#endif
 
+#ifdef __linux__
+#define LINUX
 #endif
 
 /* end of tipconf.h */
diff --git a/tip/tipout.c b/tip/tipout.c
deleted file mode 100644
index 6a77903250..0000000000
--- a/tip/tipout.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 1983, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *	This product includes software developed by the University of
- *	California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)tipout.c	8.1 (Berkeley) 6/6/93";
-#endif
-static const char rcsid[] =
-	"$Id: tipout.c,v 1.1 2000-12-22 18:48:49 mike Exp $";
-#endif /* not lint */
-
-#include "tip.h"
-#include <errno.h>
-/*
- * tip
- *
- * lower fork of tip -- handles passive side
- *  reading from the remote host
- */
-
-static	jmp_buf sigbuf;
-
-/*
- * TIPOUT wait state routine --
- *   sent by TIPIN when it wants to posses the remote host
- */
-void
-intIOT()
-{
-
-	write(repdes[1],&ccc,1);
-	read(fildes[0], &ccc,1);
-	longjmp(sigbuf, 1);
-}
-
-/*
- * Scripting command interpreter --
- *  accepts script file name over the pipe and acts accordingly
- */
-void
-intEMT()
-{
-	char c, line[256];
-	register char *pline = line;
-	char reply;
-
-	read(fildes[0], &c, 1);
-	while (c != '\n' && pline - line < sizeof(line)) {
-		*pline++ = c;
-		read(fildes[0], &c, 1);
-	}
-	*pline = '\0';
-	if (boolean(value(SCRIPT)) && fscript != NULL)
-		fclose(fscript);
-	if (pline == line) {
-		boolean(value(SCRIPT)) = FALSE;
-		reply = 'y';
-	} else {
-		if ((fscript = fopen(line, "a")) == NULL)
-			reply = 'n';
-		else {
-			reply = 'y';
-			boolean(value(SCRIPT)) = TRUE;
-		}
-	}
-	write(repdes[1], &reply, 1);
-	longjmp(sigbuf, 1);
-}
-
-void
-intTERM()
-{
-
-	if (boolean(value(SCRIPT)) && fscript != NULL)
-		fclose(fscript);
-	exit(0);
-}
-
-void
-intSYS()
-{
-
-	boolean(value(BEAUTIFY)) = !boolean(value(BEAUTIFY));
-	longjmp(sigbuf, 1);
-}
-
-/*
- * ****TIPOUT   TIPOUT****
- */
-void
-tipout()
-{
-	char buf[BUFSIZ];
-	register char *cp;
-	register int cnt;
-	int omask;
-
-	signal(SIGINT, SIG_IGN);
-	signal(SIGQUIT, SIG_IGN);
-	signal(SIGEMT, intEMT);		/* attention from TIPIN */
-	signal(SIGTERM, intTERM);	/* time to go signal */
-	signal(SIGIOT, intIOT);		/* scripting going on signal */
-	signal(SIGHUP, intTERM);	/* for dial-ups */
-	signal(SIGSYS, intSYS);		/* beautify toggle */
-	(void) setjmp(sigbuf);
-	for (omask = 0;; sigsetmask(omask)) {
-		cnt = read(FD, buf, BUFSIZ);
-		if (cnt <= 0) {
-			/* lost carrier */
-			if (cnt < 0 && errno == EIO) {
-				sigblock(sigmask(SIGTERM));
-				intTERM();
-				/*NOTREACHED*/
-			} else if (cnt == 0 && errno == ENOENT) {
-				if (getppid() != 1)
-					kill(getppid(),SIGUSR1);
-				sigblock(sigmask(SIGTERM));
-				intTERM();
-				/*NOTREACHED*/
-			} else if (cnt < 0) {
-				if (getppid() != 1)
-					kill(getppid(),SIGUSR1);
-				sigblock(sigmask(SIGTERM));
-				intTERM();
-				/*NOTREACHED*/
-			}
-			continue;
-		}
-#define	ALLSIGS	sigmask(SIGEMT)|sigmask(SIGTERM)|sigmask(SIGIOT)|sigmask(SIGSYS)
-		omask = sigblock(ALLSIGS);
-		for (cp = buf; cp < buf + cnt; cp++)
-			*cp &= 0177;
-		write(1, buf, cnt);
-		if (boolean(value(SCRIPT)) && fscript != NULL) {
-			if (!boolean(value(BEAUTIFY))) {
-				fwrite(buf, 1, cnt, fscript);
-				continue;
-			}
-			for (cp = buf; cp < buf + cnt; cp++)
-				if ((*cp >= ' ' && *cp <= '~') ||
-				    any(*cp, value(EXCEPTIONS)))
-					putc(*cp, fscript);
-		}
-	}
-}
diff --git a/tip/value.c b/tip/value.c
index 7faa1039d8..1b3ccd251f 100644
--- a/tip/value.c
+++ b/tip/value.c
@@ -36,7 +36,7 @@
 static char sccsid[] = "@(#)value.c	8.1 (Berkeley) 6/6/93";
 #endif
 static const char rcsid[] =
-	"$Id: value.c,v 1.1 2000-12-22 18:48:50 mike Exp $";
+	"$Id: value.c,v 1.2 2000-12-27 00:49:36 mike Exp $";
 #endif /* not lint */
 
 #include "tip.h"
@@ -93,6 +93,17 @@ vinit()
 	 * To allow definition of exception prior to fork
 	 */
 	vtable[EXCEPTIONS].v_access &= ~(WRITE<<PUBLIC);
+
+	/*
+	 * Disable most magic keys in raw mode
+	 */
+	if (rflag) {
+		character(value(RAISECHAR)) = 0;
+		character(value(FORCE)) = 0;
+		if (value(PARITY) == NOSTR ||
+		    !equal(value(PARITY), "none"))
+			value(PARITY) = "none";
+	}
 }
 
 static int vaccess();
@@ -236,11 +247,12 @@ vprint(p)
 	case STRING:
 		printf("%s=", p->v_name);
 		col++;
-		if (p->v_value) {
+		if (p->v_value)
 			cp = interp(p->v_value, NULL);
-			col += size(cp);
-			printf("%s", cp);
-		}
+		else
+			cp = "<NULL>";
+		col += size(cp);
+		printf("%s", cp);
 		break;
 
 	case NUMBER:
@@ -251,11 +263,12 @@ vprint(p)
 	case CHAR:
 		printf("%s=", p->v_name);
 		col++;
-		if (p->v_value) {
+		if (p->v_value)
 			cp = ctrl(character(p->v_value));
-			col += size(cp);
-			printf("%s", cp);
-		}
+		else
+			cp = "<NULL>";
+		col += size(cp);
+		printf("%s", cp);
 		break;
 	}
 	if (col >= MIDDLE) {
-- 
GitLab