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;
 }
 
