Reinstate the __cdecl for now, and specify the first kernel version
(2.6.9-rc2) for which it's not needed.

diff --git a/ash/LINUX.DIFFS b/ash/LINUX.DIFFS
deleted file mode 100644
index 32e3eb2..0000000
--- a/ash/LINUX.DIFFS
+++ /dev/null
@@ -1,701 +0,0 @@
-These are context diffs against the NetBSD-current version as of 93/09/18.
-Use "patch -p0 -s < LINUX.DIFFS" to patch the source code.
-
-
---- Makefile
-+++ Makefile	1993/10/04 18:48:13
-@@ -1,41 +1,59 @@
- #	Makefile,v 1.7 1993/08/09 04:58:18 mycroft Exp
- 
- PROG=	sh
--SRCS=	builtins.c cd.c dirent.c echo.c error.c eval.c exec.c expand.c \
-+SRCS=	builtins.c cd.c dirent.c bltin/echo.c error.c eval.c exec.c expand.c \
- 	input.c jobs.c mail.c main.c memalloc.c miscbltin.c \
- 	mystring.c nodes.c options.c parser.c redir.c show.c \
--	syntax.c trap.c output.c var.c
--OBJS+=	init.o
--CFLAGS+=-DSHELL -I. -I${.CURDIR}
--.PATH:	${.CURDIR}/bltin
--CLEANFILES+=\
-+	syntax.c trap.c output.c var.c bltin/test.c
-+
-+OBJ1 =	init.o
-+OBJ2 =	builtins.o cd.o dirent.o bltin/echo.o error.o eval.o exec.o expand.o \
-+	input.o jobs.o mail.o main.o memalloc.o miscbltin.o \
-+	mystring.o nodes.o options.o parser.o redir.o show.o \
-+	syntax.o trap.o output.o var.o bltin/test.o
-+
-+OBJS =	$(OBJ1) $(OBJ2)
-+
-+CFLAGS = -O2 -fomit-frame-pointer -m486 -DSHELL -I/usr/include/bsd -I.
-+LDFLAGS = -s -lbsd
-+
-+CLEANFILES =\
- 	builtins.c builtins.h init.c mkinit mknodes mksyntax \
- 	nodes.c nodes.h syntax.c syntax.h token.def
- 
--.depend parser.o: token.def
-+all:	$(OBJS)
-+	$(CC) -o $(PROG) $(OBJS) $(LDFLAGS)
-+
-+install: all
-+	install sh /bin/ash
-+	install -m 644 sh.1 /usr/man/man1/ash.1
-+
-+parser.o: token.def
- token.def: mktokens
--	sh ${.CURDIR}/mktokens
-+	sh ./mktokens
- 
--builtins.h builtins.c: ${.CURDIR}/mkbuiltins ${.CURDIR}/builtins
--	cd ${.CURDIR}; sh mkbuiltins
-+builtins.h builtins.c: mkbuiltins builtins
-+	sh ./mkbuiltins
- 
--init.c: mkinit ${SRCS}
--	./mkinit '${CC} -c ${CFLAGS} init.c' ${.ALLSRC}
--	touch ${.TARGET}
-+init.c: mkinit $(SRCS)
-+	./mkinit '${CC} -c $(CFLAGS) init.c' $(SRCS)
-+	touch init.c
- 
--mkinit: ${.CURDIR}/mkinit.c
--	${CC} ${CFLAGS} ${LDFLAGS} ${.CURDIR}/mkinit.c -o $@ ${LDADD}
-+mkinit: mkinit.c
-+	$(CC) $(CFLAGS) $(LDFLAGS) mkinit.c -o $@ $(LDADD)
- 
--nodes.c nodes.h: mknodes ${.CURDIR}/nodetypes ${.CURDIR}/nodes.c.pat
--	./mknodes ${.CURDIR}/nodetypes ${.CURDIR}/nodes.c.pat
-+nodes.c nodes.h: mknodes nodetypes nodes.c.pat
-+	./mknodes nodetypes nodes.c.pat
- 
--mknodes: ${.CURDIR}/mknodes.c
--	${CC} ${CFLAGS} ${LDFLAGS} ${.CURDIR}/mknodes.c -o $@ ${LDADD}
-+mknodes: mknodes.c
-+	$(CC) $(CFLAGS) $(LDFLAGS) mknodes.c -o $@ $(LDADD)
- 
- syntax.c syntax.h: mksyntax
- 	./mksyntax
- 
--mksyntax: ${.CURDIR}/mksyntax.c ${.CURDIR}/parser.h
--	${CC} ${CFLAGS} ${LDFLAGS} ${.CURDIR}/mksyntax.c -o $@ ${LDADD}
-+mksyntax: mksyntax.c parser.h
-+	$(CC) $(CFLAGS) $(LDFLAGS) mksyntax.c -o $@ $(LDADD)
-+
-+clean:
-+	rm -f core $(CLEANFILES) $(PROG) $(OBJS)
- 
--.include <bsd.prog.mk>
---- bltin/test.c
-+++ bltin/test.c	1993/10/04 18:48:13
-@@ -0,0 +1,390 @@
-+/*
-+ * test(1); version 7-like  --  author Erik Baalbergen
-+ * modified by Eric Gisin to be used as built-in.
-+ * modified by Arnold Robbins to add SVR3 compatibility
-+ * (-x -c -b -p -u -g -k) plus Korn's -L -nt -ot -ef and new -S (socket).
-+ */
-+
-+static char *RCSid = "$Id: LINUX.DIFFS,v 1.1.1.1 2002/08/17 01:36:06 hpa Exp $";
-+
-+#include <stddef.h>
-+/*#include <string.h>*/
-+#include <signal.h>
-+#include <errno.h>
-+#include <setjmp.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include "bltin.h"
-+
-+/* test(1) accepts the following grammar:
-+	oexpr	::= aexpr | aexpr "-o" oexpr ;
-+	aexpr	::= nexpr | nexpr "-a" aexpr ;
-+	nexpr	::= primary ! "!" primary
-+	primary	::= unary-operator operand
-+		| operand binary-operator operand
-+		| operand
-+		| "(" oexpr ")"
-+		;
-+	unary-operator ::= "-r"|"-w"|"-x"|"-f"|"-d"|"-c"|"-b"|"-p"|
-+		"-u"|"-g"|"-k"|"-s"|"-t"|"-z"|"-n"|"-o"|"-O"|"-G"|"-L"|"-S";
-+
-+	binary-operator ::= "="|"!="|"-eq"|"-ne"|"-ge"|"-gt"|"-le"|"-lt"|
-+			"-nt"|"-ot"|"-ef";
-+	operand ::= <any legal UNIX file name>
-+*/
-+
-+#define	evaluate(x)	getn(x)
-+#define	errorf		error
-+
-+#define EOI	0
-+#define FILRD	1
-+#define FILWR	2
-+#define FILREG	3
-+#define FILID	4
-+#define FILGZ	5
-+#define FILTT	6
-+#define STZER	7
-+#define STNZE	8
-+#define STEQL	9
-+#define STNEQ	10
-+#define INTEQ	11
-+#define INTNE	12
-+#define INTGE	13
-+#define INTGT	14
-+#define INTLE	15
-+#define INTLT	16
-+#define UNOT	17
-+#define BAND	18
-+#define BOR	19
-+#define LPAREN	20
-+#define RPAREN	21
-+#define OPERAND	22
-+#define FILEX	23
-+#define FILCDEV	24
-+#define FILBDEV	25
-+#define FILFIFO	26
-+#define FILSETU	27
-+#define FILSETG	28
-+#define FILSTCK	29
-+#define FILSYM	30
-+#define FILNT	31
-+#define FILOT	32
-+#define FILEQ	33
-+#define FILSOCK	34
-+#define	FILUID	35
-+#define	FILGID	36
-+#define	OPTION	37
-+
-+#define UNOP	1
-+#define BINOP	2
-+#define BUNOP	3
-+#define BBINOP	4
-+#define PAREN	5
-+
-+struct t_op {
-+	char *op_text;
-+	short op_num, op_type;
-+} const ops [] = {
-+	{"-r",	FILRD,	UNOP},
-+	{"-w",	FILWR,	UNOP},
-+	{"-x",	FILEX,	UNOP},
-+	{"-f",	FILREG,	UNOP},
-+	{"-d",	FILID,	UNOP},
-+	{"-c",	FILCDEV,UNOP},
-+	{"-b",	FILBDEV,UNOP},
-+	{"-p",	FILFIFO,UNOP},
-+	{"-u",	FILSETU,UNOP},
-+	{"-g",	FILSETG,UNOP},
-+	{"-k",	FILSTCK,UNOP},
-+	{"-s",	FILGZ,	UNOP},
-+	{"-t",	FILTT,	UNOP},
-+	{"-z",	STZER,	UNOP},
-+	{"-n",	STNZE,	UNOP},
-+#if 0				/* conficts with binary -o */
-+	{"-o",	OPTION,	UNOP},
-+#endif
-+	{"-U",	FILUID,	UNOP},
-+	{"-G",	FILGID,	UNOP},
-+	{"-L",	FILSYM,	UNOP},
-+	{"-S",	FILSOCK,UNOP},
-+	{"=",	STEQL,	BINOP},
-+	{"!=",	STNEQ,	BINOP},
-+	{"-eq",	INTEQ,	BINOP},
-+	{"-ne",	INTNE,	BINOP},
-+	{"-ge",	INTGE,	BINOP},
-+	{"-gt",	INTGT,	BINOP},
-+	{"-le",	INTLE,	BINOP},
-+	{"-lt",	INTLT,	BINOP},
-+	{"-nt",	FILNT,	BINOP},
-+	{"-ot",	FILOT,	BINOP},
-+	{"-ef",	FILEQ,	BINOP},
-+	{"!",	UNOT,	BUNOP},
-+	{"-a",	BAND,	BBINOP},
-+	{"-o",	BOR,	BBINOP},
-+	{"(",	LPAREN,	PAREN},
-+	{")",	RPAREN,	PAREN},
-+	{0,	0,	0}
-+};
-+
-+char **t_wp;
-+struct t_op const *t_wp_op;
-+
-+static void syntax();
-+
-+int
-+testcmd(argc, wp)
-+	char **wp;
-+{
-+	int	res;
-+
-+	t_wp = wp+1;
-+	if (strcmp(wp[0], "[") == 0) {
-+		while (*wp != NULL)
-+			wp++;
-+		if (strcmp(*--wp, "]") != 0)
-+			errorf("[: missing ]");
-+		*wp = NULL;
-+	}
-+	res = *t_wp == NULL || !oexpr(t_lex(*t_wp));
-+
-+	if (*t_wp != NULL && *++t_wp != NULL)
-+		syntax(*t_wp, "unknown operand");
-+
-+	return res;
-+}
-+
-+static void
-+syntax(op, msg)
-+	char	*op;
-+	char	*msg;
-+{
-+	if (op && *op)
-+		errorf("%s: %s", op, msg);
-+	else
-+		errorf("%s", msg);
-+}
-+
-+oexpr(n)
-+{
-+	int res;
-+
-+	res = aexpr(n);
-+	if (t_lex(*++t_wp) == BOR)
-+		return oexpr(t_lex(*++t_wp)) || res;
-+	t_wp--;
-+	return res;
-+}
-+
-+aexpr(n)
-+{
-+	int res;
-+
-+	res = nexpr(n);
-+	if (t_lex(*++t_wp) == BAND)
-+		return aexpr(t_lex(*++t_wp)) && res;
-+	t_wp--;
-+	return res;
-+}
-+
-+nexpr(n)
-+	int n;			/* token */
-+{
-+	if (n == UNOT)
-+		return !nexpr(t_lex(*++t_wp));
-+	return primary(n);
-+}
-+
-+primary(n)
-+	int n;			/* token */
-+{
-+	register char *opnd1, *opnd2;
-+	int res;
-+
-+	if (n == EOI)
-+		syntax(NULL, "argument expected");
-+	if (n == LPAREN) {
-+		res = oexpr(t_lex(*++t_wp));
-+		if (t_lex(*++t_wp) != RPAREN)
-+			syntax(NULL, "closing paren expected");
-+		return res;
-+	}
-+	if (t_wp_op && t_wp_op->op_type == UNOP) {
-+		/* unary expression */
-+		if (*++t_wp == NULL && n != FILTT)
-+			syntax(t_wp_op->op_text, "argument expected");
-+		switch (n) {
-+		  /**
-+		  case OPTION:
-+			return flag[option(*t_wp)];
-+		    **/
-+		  case STZER:
-+			return strlen(*t_wp) == 0;
-+		  case STNZE:
-+			return strlen(*t_wp) != 0;
-+		  case FILTT:
-+			if (**t_wp < '0' || **t_wp > '9')
-+				return filstat("0", n);
-+		  default:	/* all other FIL* */
-+			return filstat(*t_wp, n);
-+		}
-+	}
-+	opnd1 = *t_wp;
-+	(void) t_lex(*++t_wp);
-+	if (t_wp_op && t_wp_op->op_type == BINOP) {
-+		struct t_op const *op = t_wp_op;
-+
-+		if ((opnd2 = *++t_wp) == (char *)0)
-+			syntax(op->op_text, "argument expected");
-+		
-+		switch (op->op_num) {
-+		case STEQL:
-+			return strcmp(opnd1, opnd2) == 0;
-+		case STNEQ:
-+			return strcmp(opnd1, opnd2) != 0;
-+		case INTEQ:
-+			return evaluate(opnd1) == evaluate(opnd2);
-+		case INTNE:
-+			return evaluate(opnd1) != evaluate(opnd2);
-+		case INTGE:
-+			return evaluate(opnd1) >= evaluate(opnd2);
-+		case INTGT:
-+			return evaluate(opnd1) > evaluate(opnd2);
-+		case INTLE:
-+			return evaluate(opnd1) <= evaluate(opnd2);
-+		case INTLT:
-+			return evaluate(opnd1) < evaluate(opnd2);
-+		case FILNT:
-+			return newerf (opnd1, opnd2);
-+		case FILOT:
-+			return olderf (opnd1, opnd2);
-+		case FILEQ:
-+			return equalf (opnd1, opnd2);
-+		}
-+	}
-+	t_wp--;
-+	return strlen(opnd1) > 0;
-+}
-+
-+filstat(nm, mode)
-+	char *nm;
-+{
-+	struct stat s;
-+	
-+	switch (mode) {
-+	case FILRD:
-+		return access(nm, 4) == 0;
-+	case FILWR:
-+		return access(nm, 2) == 0;
-+	case FILEX:
-+		return access(nm, 1) == 0;
-+	case FILREG:
-+		return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFREG;
-+	case FILID:
-+		return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFDIR;
-+	case FILCDEV:
-+		return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFCHR;
-+	case FILBDEV:
-+		return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFBLK;
-+	case FILFIFO:
-+#ifdef S_IFIFO
-+		return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFIFO;
-+#else
-+		return 0;
-+#endif
-+	case FILSETU:
-+		return stat(nm, &s) == 0 && (s.st_mode & S_ISUID) == S_ISUID;
-+	case FILSETG:
-+		return stat(nm, &s) == 0 && (s.st_mode & S_ISGID) == S_ISGID;
-+	case FILSTCK:
-+		return stat(nm, &s) == 0 && (s.st_mode & S_ISVTX) == S_ISVTX;
-+	case FILGZ:
-+		return stat(nm, &s) == 0 && s.st_size > 0L;
-+	case FILTT:
-+		return isatty(getn(nm));
-+	  case FILUID:
-+		return stat(nm, &s) == 0 && s.st_uid == geteuid();
-+	  case FILGID:
-+		return stat(nm, &s) == 0 && s.st_gid == getegid();
-+#ifdef S_IFLNK
-+	case FILSYM:
-+		return lstat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFLNK;
-+#endif
-+#ifdef S_IFSOCK
-+	case FILSOCK:
-+		return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFSOCK;
-+#endif
-+	  default:
-+		return 1;
-+	}
-+}
-+
-+int
-+t_lex(s)
-+	register char *s;
-+{
-+	register struct t_op const *op = ops;
-+
-+	if (s == 0) {
-+		t_wp_op = (struct t_op *)0;
-+		return EOI;
-+	}
-+	while (op->op_text) {
-+		if (strcmp(s, op->op_text) == 0) {
-+			t_wp_op = op;
-+			return op->op_num;
-+		}
-+		op++;
-+	}
-+	t_wp_op = (struct t_op *)0;
-+	return OPERAND;
-+}
-+
-+newerf (f1, f2)
-+char *f1, *f2;
-+{
-+	struct stat b1, b2;
-+
-+	return (stat (f1, &b1) == 0 &&
-+		stat (f2, &b2) == 0 &&
-+		b1.st_mtime > b2.st_mtime);
-+}
-+
-+olderf (f1, f2)
-+char *f1, *f2;
-+{
-+	struct stat b1, b2;
-+
-+	return (stat (f1, &b1) == 0 &&
-+		stat (f2, &b2) == 0 &&
-+		b1.st_mtime < b2.st_mtime);
-+}
-+
-+equalf (f1, f2)
-+char *f1, *f2;
-+{
-+	struct stat b1, b2;
-+
-+	return (stat (f1, &b1) == 0 &&
-+		stat (f2, &b2) == 0 &&
-+		b1.st_dev == b2.st_dev &&
-+		b1.st_ino == b2.st_ino);
-+}
-+
-+/* atoi with error detection */
-+
-+getn(as)
-+	char *as;
-+{
-+	register char *s;
-+	register int n;
-+
-+	s = as;
-+	if (*s == '-')
-+		s++;
-+	for (n = 0; *s >= '0' && *s <= '9'; s++)
-+		n = (n*10) + (*s-'0');
-+	if (*s)
-+		errorf("%s: bad number", as);
-+	return (*as == '-') ? -n : n;
-+}
-+
---- builtins
-+++ builtins	1993/10/04 18:48:13
-@@ -79,6 +79,7 @@
- setcmd		set
- setvarcmd	setvar
- shiftcmd	shift
-+testcmd		test [
- trapcmd		trap
- truecmd		: true
- umaskcmd	umask
---- cd.c
-+++ cd.c	1993/10/04 18:48:13
-@@ -121,7 +121,7 @@
- 		print = 1;
- #endif
- 	INTOFF;
--	if (chdir(dest) < 0) {
-+	if (dest[0] != '\0' && chdir(dest) < 0) {
- 		INTON;
- 		return -1;
- 	}
-@@ -217,7 +217,7 @@
- 	STPUTC('\0', p);
- 	p = grabstackstr(p);
- 	INTOFF;
--	if (chdir(p) < 0) {
-+	if (p[0] != '\0' && chdir(p) < 0) {
- 		INTON;
- 		return -1;
- 	}
---- error.h
-+++ error.h	1993/10/04 18:48:13
-@@ -109,6 +109,8 @@
-  */
- 
- #ifdef BSD
-+#ifndef linux
- #define setjmp(jmploc)	_setjmp(jmploc)
- #define longjmp(jmploc, val)	_longjmp(jmploc, val)
-+#endif
- #endif
---- exec.c
-+++ exec.c	1993/10/04 18:48:14
-@@ -485,7 +485,10 @@
- 			stunalloc(fullname);
- 			goto success;
- 		}
--		if (statb.st_uid == geteuid()) {
-+		if (geteuid() == 0) {
-+			if ((statb.st_mode & 0111) == 0)
-+				goto loop;
-+		} else if (statb.st_uid == geteuid()) {
- 			if ((statb.st_mode & 0100) == 0)
- 				goto loop;
- 		} else if (statb.st_gid == getegid()) {
---- jobs.c
-+++ jobs.c	1993/10/04 18:48:14
-@@ -129,7 +129,9 @@
- 				continue;
- 			}
- 		} while (0);
--		if (ioctl(2, TIOCGETD, (char *)&ldisc) < 0 || ldisc != NTTYDISC) {
-+/*		if (ioctl(2, TIOCGETD, (char *)&ldisc) < 0 || ldisc != NTTYDISC) {*/
-+		/* crude hack for linux */
-+		if (ioctl(2, TIOCGETD, (char *)&ldisc) < 0) {
- 			out2str("ash: need new tty driver to run job control; job control turned off\n");
- 			jflag = 0;
- 			return;
-@@ -578,6 +580,7 @@
- 		}
- 		return pid;
- 	}
-+#if JOBS
- 	if (rootshell && mode != FORK_NOJOB && jflag) {
- 		if (jp == NULL || jp->nprocs == 0)
- 			pgrp = pid;
-@@ -585,6 +588,7 @@
- 			pgrp = jp->ps[0].pid;
- 		setpgrp(pid, pgrp);
- 	}
-+#endif
- 	if (mode == FORK_BG)
- 		backgndpid = pid;		/* set $! */
- 	if (jp) {
-@@ -634,8 +638,10 @@
- 	INTOFF;
- 	TRACE(("waitforjob(%%%d) called\n", jp - jobtab + 1));
- 	while (jp->state == 0) {
--		dowait(1, jp);
-+		if (dowait(1, jp) == -1 && errno == ECHILD) {
-+			error("waitforjob: no children");
- 	}
-+	}
- #if JOBS
- 	if (jp->jobctl) {
- 		if (ioctl(2, TIOCSPGRP, (char *)&mypgrp) < 0)
-@@ -657,8 +663,10 @@
- 	if (! JOBS || jp->state == JOBDONE)
- 		freejob(jp);
- 	CLEAR_PENDING_INT;
-+#if 0
- 	if ((status & 0x7F) == SIGINT)
- 		kill(getpid(), SIGINT);
-+#endif
- 	INTON;
- 	return st;
- }
---- main.c
-+++ main.c	1993/10/04 18:48:14
-@@ -104,6 +104,9 @@
- #if PROFILE
- 	monitor(4, etext, profile_buf, sizeof profile_buf, 50);
- #endif
-+#ifdef linux
-+	signal(SIGCHLD,SIG_DFL);
-+#endif /* linux */
- 	state = 0;
- 	if (setjmp(jmploc.loc)) {
- 		/*
-@@ -318,9 +321,9 @@
- /*
-  * Should never be called.
-  */
-+#endif
- 
- void
- exit(exitstatus) {
- 	_exit(exitstatus);
- }
--#endif
---- miscbltin.c
-+++ miscbltin.c	1993/10/04 18:48:14
-@@ -207,12 +207,16 @@
- 			} while (*++ap != '\0');
- 			umask(mask);
- 		} else {
-+#ifndef __linux__
- 			void *set; 
- 			if ((set = setmode (ap)) == 0)
-+#endif
- 					error("Illegal number: %s", ap);
- 
-+#ifndef __linux__
- 			mask = getmode (set, ~mask & 0777);
- 			umask(~mask & 0777);
-+#endif
- 		}
- 	}
- 	return 0;
---- options.h
-+++ options.h	1993/10/04 18:48:14
-@@ -57,11 +57,12 @@
- #define xflag optval[7]
- #define zflag optval[8]
- #define vflag optval[9]
-+#define uflag optval[10]
- 
--#define NOPTS	10
-+#define NOPTS	11
- 
- #ifdef DEFINE_OPTIONS
--const char optchar[NOPTS+1] = "efIijnsxzv";       /* shell flags */
-+const char optchar[NOPTS+1] = "efIijnsxzvu";       /* shell flags */
- char optval[NOPTS+1];           /* values of option flags */
- #else
- extern const char optchar[NOPTS+1];
---- redir.c
-+++ redir.c	1993/10/04 18:48:14
-@@ -57,7 +57,7 @@
- 
- 
- #define EMPTY -2		/* marks an unused slot in redirtab */
--#define PIPESIZE 4096		/* amount of buffering in a pipe */
-+#define PIPESIZE 4095		/* amount of buffering in a pipe */
- 
- 
- MKINIT
---- shell.h
-+++ shell.h	1993/10/04 18:48:14
-@@ -55,13 +55,13 @@
-  */
- 
- 
--#define JOBS 1
-+#define JOBS 0
- #define SYMLINKS 1
- #define DIRENT 1
- #define UDIR 0
- #define ATTY 0
- #define BSD
--#define DEBUG 1
-+/* #define DEBUG */
- 
- #ifdef __STDC__
- typedef void *pointer;
---- var.c
-+++ var.c	1993/10/04 18:48:14
-@@ -235,7 +235,7 @@
- 			vp->flags &=~ (VTEXTFIXED|VSTACK|VUNSET);
- 			vp->flags |= flags;
- 			vp->text = s;
--			if (vp == &vmpath || (vp == &vmail && ! mpathset()))
-+			if (iflag && (vp == &vmpath || (vp == &vmail && ! mpathset())))
- 				chkmail(1);
- 			INTON;
- 			return;
-@@ -283,10 +283,12 @@
- 	for (v = *hashvar(name) ; v ; v = v->next) {
- 		if (varequal(v->text, name)) {
- 			if (v->flags & VUNSET)
--				return NULL;
-+				break;
- 			return strchr(v->text, '=') + 1;
- 		}
- 	}
-+	if (uflag)
-+		error("%.*s: variable not set", strchr(name, '=') - name, name);
- 	return NULL;
- }
- 
diff --git a/ash/README.Linux b/ash/README.Linux
deleted file mode 100644
index 80a75ff..0000000
--- a/ash/README.Linux
+++ /dev/null
@@ -1,92 +0,0 @@
-NetBSD's ash (Almquist sh) for Linux
-====================================
-
-Version of this Linux port: 0.2
-This version can be found on ftp.sbusol.uni-sb.de(134.96.7.7) in the
-directory /pub/Linux/local/florian.
-
-I took from the NetBSD-current release as of 93/09/18 the source code
-of ash. Then I applied again the Linux patches. This will hopefully
-fix some bugs.
-
-ash is a Bourne compatible shell. It is without job control only 62K.
-The slackware distribution has shown, that such a small shell can be usefull
-for a good bootdisk. But I don't think, this shell is good for interactive
-use. Take other shells like bash, ksh or tcsh for that.
-Also bash 1.13 is now much better than 1.12...
-
-If you have problems and you can give me an exact bug report, I will have
-a look into ash. I will also keep a look at the NetBSD people.
-If someone else wants to do more work on ash, I could pass on all the email
-messages about ash I got from Arjan. Maybe this will help a little bit.
-
-
-Florian  La Roche     flla@stud.uni-sb.de  or  rzsfl@sbusol.uni-sb.de
-
-
-
-Known bugs in NetBSD's ash or the Linux ports.
-==============================================
-
-* There are bug reports, that 'ash' will hang, if invoked from 'cron' or
-  in '/etc/rc'. I am not sure, if this is still true.
-
-* The following code from trn 3.2's Pnews script gives a non-empty
-  $moderator variable for all newsgroups (even the non-moderated ones).
-  bash gives an empty $moderator for non-moderated groups.
-
-  ---------------------------------------------------------------------------
-		for newsgroup in $*; do
-  # the following screwy sed should prevent Eunice from hanging on no match
-		    moderator=`$sed <$lib/moderators \
-		    -e "/^$newsgroup[ 	]/!s/.*//" \
-		    -e "s/^$newsgroup[ 	]//"`
-		    case ${moderator}X in
-		    X)  tryinews=yes
-			;;
-		    *)
-			$echo Mailing to moderator $moderator
-  ---------------------------------------------------------------------------
-
-
-
-History of NetBSD's ash for Linux
-=================================
-
-
-* Version 0.2 released by Florian La Roche
-
-- I took a newer version from NetBSD-current (93/09/18) and applied again the
-  patches for Linux. Maybe this fixes some errors.
-
-
-* Version 0.1 released August 21, 1993 devet@adv.win.tue.nl
-
-- added builtin test command and -u flag for detecting unset variables
-  (patches from Branko Lankester).
-
-- fixed `permission denied' errors when running as root and trying to execute
-  executables not owned by root (Branko).
-
-- more fixes, additions and cleanups by Branko.
-
-
-* Version 0.0 released August 20, 1993 devet@adv.win.tue.nl
-
-- original sources fetched August 10
-
-- patches for Makefile and some other files by Sunando Sen
-
-- chdir() fixes in cd.c and an initial signal(SIGCHLD,SIG_DFL) in main.c
-
-
-The patches are based on Sunando Sen's <sens@fasecon.econ.nyu.edu>
-patches with further fixes suggested by Linus Torvalds, Branko Lankester
-and Alan Cox.
-
-
-Branko Lankester:	branko@hacktic.nl
-Sunando Sen:		sens@fasecon.econ.nyu.edu
-Arjan de Vet:		devet@adv.win.tue.nl
-Florian La Roche:       flla@stud.uni-sb.de  or rzsfl@sbusol.uni-sb.de
-
diff --git a/ash/builtins.in b/ash/builtins.in
deleted file mode 100644
index cdef877..0000000
--- a/ash/builtins.in
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/sh -
-#
-# Copyright (c) 1991 The Regents of the University of California.
-# All rights reserved.
-#
-# This code is derived from software contributed to Berkeley by
-# Kenneth Almquist.
-#
-# 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.
-#
-#	@(#)builtins	5.1 (Berkeley) 3/7/91
-#
-#	/b/source/CVS/src/bin/sh/builtins,v 1.4 1993/07/07 01:11:56 jtc Exp
-
-#
-# This file lists all the builtin commands.  The first column is the name
-# of a C routine.  The -j flag, if present, specifies that this command
-# is to be excluded from systems without job control.  The rest of the line
-# specifies the command name or names used to run the command.  The entry
-# for nullcmd, which is run when the user does not specify a command, must
-# come first.
-#
-# Copyright (C) 1989 by Kenneth Almquist.  All rights reserved.
-# This file is part of ash, which is distributed under the terms specified
-# by the Ash General Public License.  See the file named LICENSE.
-
-bltincmd	command
-#alloccmd	alloc
-bgcmd -j	bg
-breakcmd	break continue
-#catfcmd	catf
-cdcmd		cd chdir
-dotcmd		.
-echocmd		echo
-evalcmd		eval
-execcmd		exec
-exitcmd		exit
-exportcmd	export readonly
-#exprcmd	expr test [
-falsecmd	false
-fgcmd -j	fg
-getoptscmd	getopts
-hashcmd		hash
-jobidcmd	jobid
-jobscmd		jobs
-lccmd		lc
-#linecmd		line
-localcmd	local
-#nlechocmd	nlecho
-pwdcmd		pwd
-readcmd		read
-returncmd	return
-setcmd		set
-setvarcmd	setvar
-shiftcmd	shift
-testcmd		test [
-trapcmd		trap
-truecmd		: true
-umaskcmd	umask
-unsetcmd	unset
-waitcmd		wait
diff --git a/ash/dirent.c b/ash/dirent.c
deleted file mode 100644
index b75cd67..0000000
--- a/ash/dirent.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*-
- * Copyright (c) 1991 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Kenneth Almquist.
- *
- * 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
-/*static char sccsid[] = "from: @(#)dirent.c	5.1 (Berkeley) 3/7/91";*/
-static char rcsid[] = "dirent.c,v 1.4 1993/08/01 18:58:21 mycroft Exp";
-#endif /* not lint */
-
-#include "shell.h"	/* definitions for pointer, NULL, DIRENT, and BSD */
-
-#if ! DIRENT
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <unistd.h>
-
-#ifndef S_ISDIR				/* macro to test for directory file */
-#define	S_ISDIR(mode)		(((mode) & S_IFMT) == S_IFDIR)
-#endif
-
-#ifdef BSD
-
-#ifdef __STDC__
-int stat(char *, struct stat *);
-#else
-int stat();
-#endif
-
-
-/*
- * The BSD opendir routine doesn't check that what is being opened is a
- * directory, so we have to include the check in a wrapper routine.
- */
-
-#undef opendir
-
-DIR *
-myopendir(dirname)
-	char *dirname;			/* name of directory */
-	{
-	struct stat statb;
-
-	if (stat(dirname, &statb) != 0 || ! S_ISDIR(statb.st_mode)) {
-		errno = ENOTDIR;
-		return NULL;		/* not a directory */
-	}
-	return opendir(dirname);
-}
-
-#else /* not BSD */
-
-/*
- * Dirent routines for old style file systems.
- */
-
-#ifdef __STDC__
-pointer malloc(unsigned);
-void free(pointer);
-int open(char *, int, ...);
-int close(int);
-int fstat(int, struct stat *);
-#else
-pointer malloc();
-void free();
-int open();
-int close();
-int fstat();
-#endif
-
-
-DIR *
-opendir(dirname)
-	char		*dirname;	/* name of directory */
-	{
-	register DIR	*dirp;		/* -> malloc'ed storage */
-	register int	fd;		/* file descriptor for read */
-	struct stat	statb;		/* result of fstat() */
-
-#ifdef O_NDELAY
-	fd = open(dirname, O_RDONLY|O_NDELAY);
-#else
-	fd = open(dirname, O_RDONLY);
-#endif
-	if (fd < 0)
-		return NULL;		/* errno set by open() */
-
-	if (fstat(fd, &statb) != 0 || !S_ISDIR(statb.st_mode)) {
-		(void)close(fd);
-		errno = ENOTDIR;
-		return NULL;		/* not a directory */
-	}
-
-	if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
-		(void)close(fd);
-		errno = ENOMEM;
-		return NULL;		/* not enough memory */
-	}
-
-	dirp->dd_fd = fd;
-	dirp->dd_nleft = 0;		/* refill needed */
-
-	return dirp;
-}
-
-
-
-int
-closedir(dirp)
-	register DIR *dirp;		/* stream from opendir() */
-	{
-	register int fd;
-
-	if (dirp == NULL) {
-		errno = EFAULT;
-		return -1;			/* invalid pointer */
-	}
-
-	fd = dirp->dd_fd;
-	free((pointer)dirp);
-	return close(fd);
-}
-
-
-
-struct dirent *
-readdir(dirp)
-	register DIR *dirp;		/* stream from opendir() */
-	{
-	register struct direct *dp;
-	register char *p, *q;
-	register int i;
-
-	do {
-		if ((dirp->dd_nleft -= sizeof (struct direct)) < 0) {
-			if ((i = read(dirp->dd_fd,
-					   (char *)dirp->dd_buf,
-					   DIRBUFENT*sizeof(struct direct))) <= 0) {
-				if (i == 0)
-					errno = 0;	/* unnecessary */
-				return NULL;		/* EOF or error */
-			}
-			dirp->dd_loc = dirp->dd_buf;
-			dirp->dd_nleft = i - sizeof (struct direct);
-		}
-		dp = dirp->dd_loc++;
-	} while (dp->d_ino == 0);
-	dirp->dd_entry.d_ino = dp->d_ino;
-
-	/* now copy the name, nul terminating it */
-	p = dp->d_name;
-	q = dirp->dd_entry.d_name;
-	i = DIRSIZ;
-	while (--i >= 0 && *p != '\0')
-		*q++ = *p++;
-	*q = '\0';
-	return &dirp->dd_entry;
-}
-
-#endif /* BSD */
-#endif /* DIRENT */
diff --git a/ash/mkinit.c b/ash/mkinit.c
deleted file mode 100644
index 9cc0804..0000000
--- a/ash/mkinit.c
+++ /dev/null
@@ -1,547 +0,0 @@
-/*-
- * Copyright (c) 1991 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Kenneth Almquist.
- *
- * 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
-char copyright[] =
-"@(#) Copyright (c) 1991 The Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)mkinit.c	5.3 (Berkeley) 3/13/91";*/
-static char rcsid[] = "mkinit.c,v 1.4 1993/08/01 18:58:09 mycroft Exp";
-#endif /* not lint */
-
-/*
- * This program scans all the source files for code to handle various
- * special events and combines this code into one file.  This (allegedly)
- * improves the structure of the program since there is no need for
- * anyone outside of a module to know that that module performs special
- * operations on particular events.  The command is executed iff init.c
- * is actually changed.
- *
- * Usage:  mkinit command sourcefile...
- */
-
-
-#include <sys/cdefs.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-
-/*
- * OUTFILE is the name of the output file.  Output is initially written
- * to the file OUTTEMP, which is then moved to OUTFILE if OUTTEMP and
- * OUTFILE are different.
- */
-
-#define OUTFILE "init.c"
-#define OUTTEMP "init.c.new"
-#define OUTOBJ "init.o"
-
-
-/*
- * A text structure is basicly just a string that grows as more characters
- * are added onto the end of it.  It is implemented as a linked list of
- * blocks of characters.  The routines addstr and addchar append a string
- * or a single character, respectively, to a text structure.  Writetext
- * writes the contents of a text structure to a file.
- */
-
-#define BLOCKSIZE 512
-
-struct text {
-	char *nextc;
-	int nleft;
-	struct block *start;
-	struct block *last;
-};      
-
-struct block {
-	struct block *next;
-	char text[BLOCKSIZE];
-};
-
-
-/*
- * There is one event structure for each event that mkinit handles.
- */
-
-struct event {
-	char *name;		/* name of event (e.g. INIT) */
-	char *routine;		/* name of routine called on event */
-	char *comment;		/* comment describing routine */
-	struct text code;		/* code for handling event */
-};
-
-
-char writer[] = "\
-/*\n\
- * This file was generated by the mkinit program.\n\
- */\n\
-\n";
-
-char init[] = "\
-/*\n\
- * Initialization code.\n\
- */\n";
-
-char reset[] = "\
-/*\n\
- * This routine is called when an error or an interrupt occurs in an\n\
- * interactive shell and control is returned to the main command loop.\n\
- */\n";
-
-char shellproc[] = "\
-/*\n\
- * This routine is called to initialize the shell to run a shell procedure.\n\
- */\n";
-
-
-struct event event[] = {
-	{"INIT", "init", init},
-	{"RESET", "reset", reset},
-	{"SHELLPROC", "initshellproc", shellproc},
-	{NULL, NULL}
-};
-
-
-char *curfile;				/* current file */
-int linno;				/* current line */
-char *header_files[200];		/* list of header files */
-struct text defines;			/* #define statements */
-struct text decls;			/* declarations */
-int amiddecls;				/* for formatting */
-
-
-void readfile(), doevent(), doinclude(), dodecl(), output();
-void addstr(), addchar(), writetext();
-
-#define equal(s1, s2)	(strcmp(s1, s2) == 0)
-
-FILE *ckfopen();
-char *savestr();
-void *ckmalloc __P((int));
-void error();
-
-main(argc, argv)
-	char **argv;
-	{
-	char **ap;
-	int fd;
-	char c;
-
-	if (argc < 2)
-		error("Usage:  mkinit command file...");
-	header_files[0] = "\"shell.h\"";
-	header_files[1] = "\"mystring.h\"";
-	for (ap = argv + 2 ; *ap ; ap++)
-		readfile(*ap);
-	output();
-	if (file_changed()) {
-		unlink(OUTFILE);
-		link(OUTTEMP, OUTFILE);
-		unlink(OUTTEMP);
-	} else {
-		unlink(OUTTEMP);
-		if (touch(OUTOBJ))
-			exit(0);		/* no compilation necessary */
-	}
-	printf("%s\n", argv[1]);
-	execl("/bin/sh", "sh", "-c", argv[1], (char *)0);
-	error("Can't exec shell");
-}
-
-
-/*
- * Parse an input file.
- */
-
-void
-readfile(fname)
-	char *fname;
-	{
-	FILE *fp;
-	char line[1024];
-	struct event *ep;
-
-	fp = ckfopen(fname, "r");
-	curfile = fname;
-	linno = 0;
-	amiddecls = 0;
-	while (fgets(line, sizeof line, fp) != NULL) {
-		linno++;
-		for (ep = event ; ep->name ; ep++) {
-			if (line[0] == ep->name[0] && match(ep->name, line)) {
-				doevent(ep, fp, fname);
-				break;
-			}
-		}
-		if (line[0] == 'I' && match("INCLUDE", line))
-			doinclude(line);
-		if (line[0] == 'M' && match("MKINIT", line))
-			dodecl(line, fp);
-		if (line[0] == '#' && gooddefine(line))
-			addstr(line, &defines);
-	}
-	fclose(fp);
-}
-
-
-int
-match(name, line)
-	char *name;
-	char *line;
-	{
-	register char *p, *q;
-
-	p = name, q = line;
-	while (*p) {
-		if (*p++ != *q++)
-			return 0;
-	}
-	if (*q != '{' && *q != ' ' && *q != '\t' && *q != '\n')
-		return 0;
-	return 1;
-}
-
-
-int
-gooddefine(line)
-	char *line;
-	{
-	register char *p;
-
-	if (! match("#define", line))
-		return 0;			/* not a define */
-	p = line + 7;
-	while (*p == ' ' || *p == '\t')
-		p++;
-	while (*p != ' ' && *p != '\t') {
-		if (*p == '(')
-			return 0;		/* macro definition */
-		p++;
-	}
-	while (*p != '\n' && *p != '\0')
-		p++;
-	if (p[-1] == '\\')
-		return 0;			/* multi-line definition */
-	return 1;
-}
-
-
-void
-doevent(ep, fp, fname)
-	register struct event *ep;
-	FILE *fp;
-	char *fname;
-	{
-	char line[1024];
-	int indent;
-	char *p;
-
-	sprintf(line, "\n      /* from %s: */\n", fname);
-	addstr(line, &ep->code);
-	addstr("      {\n", &ep->code);
-	for (;;) {
-		linno++;
-		if (fgets(line, sizeof line, fp) == NULL)
-			error("Unexpected EOF");
-		if (equal(line, "}\n"))
-			break;
-		indent = 6;
-		for (p = line ; *p == '\t' ; p++)
-			indent += 8;
-		for ( ; *p == ' ' ; p++)
-			indent++;
-		if (*p == '\n' || *p == '#')
-			indent = 0;
-		while (indent >= 8) {
-			addchar('\t', &ep->code);
-			indent -= 8;
-		}
-		while (indent > 0) {
-			addchar(' ', &ep->code);
-			indent--;
-		}
-		addstr(p, &ep->code);
-	}
-	addstr("      }\n", &ep->code);
-}
-
-
-void
-doinclude(line)
-	char *line;
-	{
-	register char *p;
-	char *name;
-	register char **pp;
-
-	for (p = line ; *p != '"' && *p != '<' && *p != '\0' ; p++);
-	if (*p == '\0')
-		error("Expecting '\"' or '<'");
-	name = p;
-	while (*p != ' ' && *p != '\t' && *p != '\n')
-		p++;
-	if (p[-1] != '"' && p[-1] != '>')
-		error("Missing terminator");
-	*p = '\0';
-
-	/* name now contains the name of the include file */
-	for (pp = header_files ; *pp && ! equal(*pp, name) ; pp++);
-	if (*pp == NULL)
-		*pp = savestr(name);
-}
-
-
-void
-dodecl(line1, fp)
-	char *line1;
-	FILE *fp;
-	{
-	char line[1024];
-	register char *p, *q;
-
-	if (strcmp(line1, "MKINIT\n") == 0) { /* start of struct/union decl */
-		addchar('\n', &decls);
-		do {
-			linno++;
-			if (fgets(line, sizeof line, fp) == NULL)
-				error("Unterminated structure declaration");
-			addstr(line, &decls);
-		} while (line[0] != '}');
-		amiddecls = 0;
-	} else {
-		if (! amiddecls)
-			addchar('\n', &decls);
-		q = NULL;
-		for (p = line1 + 6 ; *p && *p != '=' && *p != '/' ; p++);
-		if (*p == '=') {		/* eliminate initialization */
-			for (q = p ; *q && *q != ';' ; q++);
-			if (*q == '\0')
-				q = NULL;
-			else {
-				while (p[-1] == ' ')
-					p--;
-				*p = '\0';
-			}
-		}
-		addstr("extern", &decls);
-		addstr(line1 + 6, &decls);
-		if (q != NULL)
-			addstr(q, &decls);
-		amiddecls = 1;
-	}
-}
-
-
-
-/*
- * Write the output to the file OUTTEMP.
- */
-
-void
-output() {
-	FILE *fp;
-	char **pp;
-	struct event *ep;
-
-	fp = ckfopen(OUTTEMP, "w");
-	fputs(writer, fp);
-	for (pp = header_files ; *pp ; pp++)
-		fprintf(fp, "#include %s\n", *pp);
-	fputs("\n\n\n", fp);
-	writetext(&defines, fp);
-	fputs("\n\n", fp);
-	writetext(&decls, fp);
-	for (ep = event ; ep->name ; ep++) {
-		fputs("\n\n\n", fp);
-		fputs(ep->comment, fp);
-		fprintf(fp, "\nvoid\n%s() {\n", ep->routine);
-		writetext(&ep->code, fp);
-		fprintf(fp, "}\n");
-	}
-	fclose(fp);
-}
-
-
-/*
- * Return true if the new output file is different from the old one.
- */
-
-int
-file_changed() {
-	register FILE *f1, *f2;
-	register int c;
-
-	if ((f1 = fopen(OUTFILE, "r")) == NULL
-	 || (f2 = fopen(OUTTEMP, "r")) == NULL)
-		return 1;
-	while ((c = getc(f1)) == getc(f2)) {
-		if (c == EOF)
-			return 0;
-	}
-	return 1;
-}
-
-
-/*
- * Touch a file.  Returns 0 on failure, 1 on success.
- */
-
-int
-touch(file)
-	char *file;
-	{
-	int fd;
-	char c;
-
-	if ((fd = open(file, O_RDWR)) < 0)
-		return 0;
-	if (read(fd, &c, 1) != 1) {
-		close(fd);
-		return 0;
-	}
-	lseek(fd, 0L, 0);
-	write(fd, &c, 1);
-	close(fd);
-	return 1;
-}
-
-
-
-/*
- * A text structure is simply a block of text that is kept in memory.
- * Addstr appends a string to the text struct, and addchar appends a single
- * character.
- */
-
-void
-addstr(s, text)
-	register char *s;
-	register struct text *text;
-	{
-	while (*s) {
-		if (--text->nleft < 0)
-			addchar(*s++, text);
-		else
-			*text->nextc++ = *s++;
-	}
-}
-
-
-void
-addchar(c, text)
-	register struct text *text;
-	{
-	struct block *bp;
-
-	if (--text->nleft < 0) {
-		bp = ckmalloc(sizeof *bp);
-		if (text->start == NULL)
-			text->start = bp;
-		else
-			text->last->next = bp;
-		text->last = bp;
-		text->nextc = bp->text;
-		text->nleft = BLOCKSIZE - 1;
-	}
-	*text->nextc++ = c;
-}
-
-/*
- * Write the contents of a text structure to a file.
- */
-void
-writetext(text, fp)
-	struct text *text;
-	FILE *fp;
-	{
-	struct block *bp;
-
-	if (text->start != NULL) {
-		for (bp = text->start ; bp != text->last ; bp = bp->next)
-			fwrite(bp->text, sizeof (char), BLOCKSIZE, fp);
-		fwrite(bp->text, sizeof (char), BLOCKSIZE - text->nleft, fp);
-	}
-}
-
-FILE *
-ckfopen(file, mode)
-	char *file;
-	char *mode;
-	{
-	FILE *fp;
-
-	if ((fp = fopen(file, mode)) == NULL) {
-		fprintf(stderr, "Can't open %s\n", file);
-		exit(2);
-	}
-	return fp;
-}
-
-void *
-ckmalloc(nbytes) {
-	register char *p;
-	char *malloc();
-
-	if ((p = malloc(nbytes)) == NULL)
-		error("Out of space");
-	return p;
-}
-
-char *
-savestr(s)
-	char *s;
-	{
-	register char *p;
-
-	p = ckmalloc(strlen(s) + 1);
-	strcpy(p, s);
-	return p;
-}
-
-void
-error(msg)
-	char *msg;
-	{
-	if (curfile != NULL)
-		fprintf(stderr, "%s:%d: ", curfile, linno);
-	fprintf(stderr, "%s\n", msg);
-	exit(2);
-}
diff --git a/ash/mknodes.c b/ash/mknodes.c
deleted file mode 100644
index 88f632b..0000000
--- a/ash/mknodes.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/*-
- * Copyright (c) 1991 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Kenneth Almquist.
- *
- * 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
-char copyright[] =
-"@(#) Copyright (c) 1991 The Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-/*static char sccsid[] = "from: @(#)mknodes.c	5.1 (Berkeley) 3/7/91";*/
-static char rcsid[] = "mknodes.c,v 1.5 1993/09/05 17:32:07 mycroft Exp";
-#endif /* not lint */
-
-/*
- * This program reads the nodetypes file and nodes.c.pat file.  It generates
- * the files nodes.h and nodes.c.
- */
-
-#include <stdio.h>
-
-
-#define MAXTYPES 50		/* max number of node types */
-#define MAXFIELDS 20		/* max fields in a structure */
-#define BUFLEN 100		/* size of character buffers */
-
-/* field types */
-#define T_NODE 1		/* union node *field */
-#define T_NODELIST 2		/* struct nodelist *field */
-#define T_STRING 3
-#define T_INT 4			/* int field */
-#define T_OTHER 5		/* other */
-#define T_TEMP 6		/* don't copy this field */
-
-
-struct field {			/* a structure field */
-	char *name;		/* name of field */
-	int type;			/* type of field */
-	char *decl;		/* declaration of field */
-};
-
-
-struct str {			/* struct representing a node structure */
-	char *tag;		/* structure tag */
-	int nfields;		/* number of fields in the structure */
-	struct field field[MAXFIELDS];	/* the fields of the structure */
-	int done;			/* set if fully parsed */
-};
-
-
-int ntypes;			/* number of node types */
-char *nodename[MAXTYPES];	/* names of the nodes */
-struct str *nodestr[MAXTYPES];	/* type of structure used by the node */
-int nstr;			/* number of structures */
-struct str str[MAXTYPES];	/* the structures */
-struct str *curstr;		/* current structure */
-
-
-FILE *infp;
-char line[1024];
-int linno;
-char *linep;
-
-
-char *savestr();
-#define equal(s1, s2)	(strcmp(s1, s2) == 0)
-
-
-main(argc, argv)
-	char **argv;
-{
-	infp = stdin;
-
-	if (argc != 3) {
-		error("usage: mknodes file\n");
-		return(1);
-	}
-	if ((infp = fopen(argv[1], "r")) == NULL) {
-		error("Can't open %s", argv[1]);
-		return(1);
-	}
-	while (readline()) {
-		if (line[0] == ' ' || line[0] == '\t')
-			parsefield();
-		else if (line[0] != '\0')
-			parsenode();
-	}
-	output(argv[2]);
-	return(0);
-}
-
-
-
-parsenode() {
-	char name[BUFLEN];
-	char tag[BUFLEN];
-	struct str *sp;
-
-	if (curstr && curstr->nfields > 0)
-		curstr->done = 1;
-	nextfield(name);
-	if (! nextfield(tag))
-		error("Tag expected");
-	if (*linep != '\0')
-		error("Garbage at end of line");
-	nodename[ntypes] = savestr(name);
-	for (sp = str ; sp < str + nstr ; sp++) {
-		if (equal(sp->tag, tag))
-			break;
-	}
-	if (sp >= str + nstr) {
-		sp->tag = savestr(tag);
-		sp->nfields = 0;
-		curstr = sp;
-		nstr++;
-	}
-	nodestr[ntypes] = sp;
-	ntypes++;
-}
-
-
-parsefield() {
-	char name[BUFLEN];
-	char type[BUFLEN];
-	char decl[2 * BUFLEN];
-	struct field *fp;
-
-	if (curstr == NULL || curstr->done)
-		error("No current structure to add field to");
-	if (! nextfield(name))
-		error("No field name");
-	if (! nextfield(type))
-		error("No field type");
-	fp = &curstr->field[curstr->nfields];
-	fp->name = savestr(name);
-	if (equal(type, "nodeptr")) {
-		fp->type = T_NODE;
-		sprintf(decl, "union node *%s", name);
-	} else if (equal(type, "nodelist")) {
-		fp->type = T_NODELIST;
-		sprintf(decl, "struct nodelist *%s", name);
-	} else if (equal(type, "string")) {
-		fp->type = T_STRING;
-		sprintf(decl, "char *%s", name);
-	} else if (equal(type, "int")) {
-		fp->type = T_INT;
-		sprintf(decl, "int %s", name);
-	} else if (equal(type, "other")) {
-		fp->type = T_OTHER;
-	} else if (equal(type, "temp")) {
-		fp->type = T_TEMP;
-	} else {
-		error("Unknown type %s", type);
-	}
-	if (fp->type == T_OTHER || fp->type == T_TEMP) {
-		skipbl();
-		fp->decl = savestr(linep);
-	} else {
-		if (*linep)
-			error("Garbage at end of line");
-		fp->decl = savestr(decl);
-	}
-	curstr->nfields++;
-}
-
-
-char writer[] = "\
-/*\n\
- * This file was generated by the mknodes program.\n\
- */\n\
-\n";
-
-output(file)
-	char *file;
-	{
-	FILE *hfile;
-	FILE *cfile;
-	FILE *patfile;
-	int i;
-	struct str *sp;
-	struct field *fp;
-	char *p;
-
-	if ((patfile = fopen(file, "r")) == NULL)
-		error("Can't open %s", file);
-	if ((hfile = fopen("nodes.h", "w")) == NULL)
-		error("Can't create nodes.h");
-	if ((cfile = fopen("nodes.c", "w")) == NULL)
-		error("Can't create nodes.c");
-	fputs(writer, hfile);
-	for (i = 0 ; i < ntypes ; i++)
-		fprintf(hfile, "#define %s %d\n", nodename[i], i);
-	fputs("\n\n\n", hfile);
-	for (sp = str ; sp < &str[nstr] ; sp++) {
-		fprintf(hfile, "struct %s {\n", sp->tag);
-		for (i = sp->nfields, fp = sp->field ; --i >= 0 ; fp++) {
-			fprintf(hfile, "      %s;\n", fp->decl);
-		}
-		fputs("};\n\n\n", hfile);
-	}
-	fputs("union node {\n", hfile);
-	fprintf(hfile, "      int type;\n");
-	for (sp = str ; sp < &str[nstr] ; sp++) {
-		fprintf(hfile, "      struct %s %s;\n", sp->tag, sp->tag);
-	}
-	fputs("};\n\n\n", hfile);
-	fputs("struct nodelist {\n", hfile);
-	fputs("\tstruct nodelist *next;\n", hfile);
-	fputs("\tunion node *n;\n", hfile);
-	fputs("};\n\n\n", hfile);
-	fputs("#ifdef __STDC__\n", hfile);
-	fputs("union node *copyfunc(union node *);\n", hfile);
-	fputs("void freefunc(union node *);\n", hfile);
-	fputs("#else\n", hfile);
-	fputs("union node *copyfunc();\n", hfile);
-	fputs("void freefunc();\n", hfile);
-	fputs("#endif\n", hfile);
-
-	fputs(writer, cfile);
-	while (fgets(line, sizeof line, patfile) != NULL) {
-		for (p = line ; *p == ' ' || *p == '\t' ; p++);
-		if (equal(p, "%SIZES\n"))
-			outsizes(cfile);
-		else if (equal(p, "%CALCSIZE\n"))
-			outfunc(cfile, 1);
-		else if (equal(p, "%COPY\n"))
-			outfunc(cfile, 0);
-		else
-			fputs(line, cfile);
-	}
-}
-
-
-
-outsizes(cfile)
-	FILE *cfile;
-	{
-	int i;
-
-	fprintf(cfile, "static const short nodesize[%d] = {\n", ntypes);
-	for (i = 0 ; i < ntypes ; i++) {
-		fprintf(cfile, "      ALIGN(sizeof (struct %s)),\n", nodestr[i]->tag);
-	}
-	fprintf(cfile, "};\n");
-}
-
-
-outfunc(cfile, calcsize)
-	FILE *cfile;
-	{
-	struct str *sp;
-	struct field *fp;
-	int i;
-
-	fputs("      if (n == NULL)\n", cfile);
-	if (calcsize)
-		fputs("	    return;\n", cfile);
-	else
-		fputs("	    return NULL;\n", cfile);
-	if (calcsize)
-		fputs("      funcblocksize += nodesize[n->type];\n", cfile);
-	else {
-		fputs("      new = funcblock;\n", cfile);
-		fputs("      funcblock += nodesize[n->type];\n", cfile);
-	}
-	fputs("      switch (n->type) {\n", cfile);
-	for (sp = str ; sp < &str[nstr] ; sp++) {
-		for (i = 0 ; i < ntypes ; i++) {
-			if (nodestr[i] == sp)
-				fprintf(cfile, "      case %s:\n", nodename[i]);
-		}
-		for (i = sp->nfields ; --i >= 1 ; ) {
-			fp = &sp->field[i];
-			switch (fp->type) {
-			case T_NODE:
-				if (calcsize) {
-					indent(12, cfile);
-					fprintf(cfile, "calcsize(n->%s.%s);\n",
-						sp->tag, fp->name);
-				} else {
-					indent(12, cfile);
-					fprintf(cfile, "new->%s.%s = copynode(n->%s.%s);\n",
-						sp->tag, fp->name, sp->tag, fp->name);
-				}
-				break;
-			case T_NODELIST:
-				if (calcsize) {
-					indent(12, cfile);
-					fprintf(cfile, "sizenodelist(n->%s.%s);\n",
-						sp->tag, fp->name);
-				} else {
-					indent(12, cfile);
-					fprintf(cfile, "new->%s.%s = copynodelist(n->%s.%s);\n",
-						sp->tag, fp->name, sp->tag, fp->name);
-				}
-				break;
-			case T_STRING:
-				if (calcsize) {
-					indent(12, cfile);
-					fprintf(cfile, "funcstringsize += strlen(n->%s.%s) + 1;\n",
-						sp->tag, fp->name);
-				} else {
-					indent(12, cfile);
-					fprintf(cfile, "new->%s.%s = nodesavestr(n->%s.%s);\n",
-						sp->tag, fp->name, sp->tag, fp->name);
-				}
-				break;
-			case T_INT:
-			case T_OTHER:
-				if (! calcsize) {
-					indent(12, cfile);
-					fprintf(cfile, "new->%s.%s = n->%s.%s;\n",
-						sp->tag, fp->name, sp->tag, fp->name);
-				}
-				break;
-			}
-		}
-		indent(12, cfile);
-		fputs("break;\n", cfile);
-	}
-	fputs("      };\n", cfile);
-	if (! calcsize)
-		fputs("      new->type = n->type;\n", cfile);
-}
-
-
-indent(amount, fp)
-	FILE *fp;
-	{
-	while (amount >= 8) {
-		putc('\t', fp);
-		amount -= 8;
-	}
-	while (--amount >= 0) {
-		putc(' ', fp);
-	}
-}
-
-
-int
-nextfield(buf)
-	char *buf;
-	{
-	register char *p, *q;
-
-	p = linep;
-	while (*p == ' ' || *p == '\t')
-		p++;
-	q = buf;
-	while (*p != ' ' && *p != '\t' && *p != '\0')
-		*q++ = *p++;
-	*q = '\0';
-	linep = p;
-	return (q > buf);
-}
-
-
-skipbl() {
-	while (*linep == ' ' || *linep == '\t')
-		linep++;
-}
-
-
-int
-readline() {
-	register char *p;
-
-	if (fgets(line, 1024, infp) == NULL)
-		return 0;
-	for (p = line ; *p != '#' && *p != '\n' && *p != '\0' ; p++);
-	while (p > line && (p[-1] == ' ' || p[-1] == '\t'))
-		p--;
-	*p = '\0';
-	linep = line;
-	linno++;
-	if (p - line > BUFLEN)
-		error("Line too long");
-	return 1;
-}
-
-
-
-error(msg, a1, a2, a3, a4, a5, a6)
-	char *msg;
-	{
-	fprintf(stderr, "line %d: ", linno);
-	fprintf(stderr, msg, a1, a2, a3, a4, a5, a6);
-	putc('\n', stderr);
-	exit(2);
-}
-
-
-
-char *
-savestr(s)
-	char *s;
-	{
-	register char *p;
-	char *malloc();
-
-	if ((p = malloc(strlen(s) + 1)) == NULL)
-		error("Out of space");
-	strcpy(p, s);
-	return p;
-}
diff --git a/ash/trap.c b/ash/trap.c
index 3496404..bf254af 100644
--- a/ash/trap.c
+++ b/ash/trap.c
@@ -391,9 +391,9 @@
  * Signal handler.
  *
  * The __cdecl is to work around the fact that the Linux/i386 kernel prior
- * to 2.6.9(?) didn't pass the proper arguments to regparm'd signal handlers.
+ * to 2.6.9-rc2 didn't pass the proper arguments to regparm'd signal handlers.
  */
-/*__cdecl*/ void
+__cdecl void
 onsig(int signo)
 {
 	bsd_signal(signo, onsig);