--- busybox-1.10.3/shell/msh.c	Sat Apr 19 05:50:31 2008
+++ busybox-1.10.3-msh/shell/msh.c	Thu Jun 19 20:49:59 2008
@@ -92,17 +92,17 @@
 #ifdef MSHDEBUG
 static int mshdbg = MSHDEBUG;
 
-#define DBGPRINTF(x)	if (mshdbg>0) printf x
-#define DBGPRINTF0(x)	if (mshdbg>0) printf x
-#define DBGPRINTF1(x)	if (mshdbg>1) printf x
-#define DBGPRINTF2(x)	if (mshdbg>2) printf x
-#define DBGPRINTF3(x)	if (mshdbg>3) printf x
-#define DBGPRINTF4(x)	if (mshdbg>4) printf x
-#define DBGPRINTF5(x)	if (mshdbg>5) printf x
-#define DBGPRINTF6(x)	if (mshdbg>6) printf x
-#define DBGPRINTF7(x)	if (mshdbg>7) printf x
-#define DBGPRINTF8(x)	if (mshdbg>8) printf x
-#define DBGPRINTF9(x)	if (mshdbg>9) printf x
+#define DBGPRINTF(x)	if (mshdbg > 0) printf x
+#define DBGPRINTF0(x)	if (mshdbg > 0) printf x
+#define DBGPRINTF1(x)	if (mshdbg > 1) printf x
+#define DBGPRINTF2(x)	if (mshdbg > 2) printf x
+#define DBGPRINTF3(x)	if (mshdbg > 3) printf x
+#define DBGPRINTF4(x)	if (mshdbg > 4) printf x
+#define DBGPRINTF5(x)	if (mshdbg > 5) printf x
+#define DBGPRINTF6(x)	if (mshdbg > 6) printf x
+#define DBGPRINTF7(x)	if (mshdbg > 7) printf x
+#define DBGPRINTF8(x)	if (mshdbg > 8) printf x
+#define DBGPRINTF9(x)	if (mshdbg > 9) printf x
 
 static int mshdbg_rc = 0;
 
@@ -124,7 +124,7 @@
 
 #define RCPRINTF(x) ((void)0)
 
-#endif							/* MSHDEBUG */
+#endif  /* MSHDEBUG */
 
 
 #if ENABLE_FEATURE_EDITING_FANCY_PROMPT
@@ -141,13 +141,13 @@
  * shell
  */
 
-#define	LINELIM	  2100
-#define	NPUSH	  8				/* limit to input nesting */
+#define LINELIM   2100
+#define NPUSH     8             /* limit to input nesting */
 
 #undef NOFILE
-#define	NOFILE	  20			/* Number of open files */
-#define	NUFILE	  10			/* Number of user-accessible files */
-#define	FDBASE	  10			/* First file usable by Shell */
+#define NOFILE    20            /* Number of open files */
+#define NUFILE    10            /* Number of user-accessible files */
+#define FDBASE    10            /* First file usable by Shell */
 
 /*
  * values returned by wait
@@ -159,7 +159,7 @@
 /*
  * library and system definitions
  */
-typedef void xint;                     	/* base type of jmp_buf, for not broken compilers */
+typedef void xint;              /* base type of jmp_buf, for not broken compilers */
 
 /*
  * shell components
@@ -588,14 +588,13 @@
 	{ NULL      , NULL       },
 };
 
-static struct op *scantree(struct op *);
 static struct op *dowholefile(int /*, int*/);
 
 
 /* Globals */
 static char **dolv;
 static int dolc;
-static int exstat;
+static uint8_t exstat;
 static smallint gflg;                   /* (seems to be a parse error indicator) */
 static smallint interactive;            /* Is this an interactive shell */
 static smallint execflg;
@@ -726,7 +725,7 @@
 		return;
 	}
 
-	DBGPRINTF(("NODE: %p,  left %p, right %p\n", head, head->left,
+	DBGPRINTF(("NODE: %p, left %p, right %p\n", head, head->left,
 			   head->right));
 
 	if (head->left)
@@ -744,7 +743,7 @@
 static void prs(const char *s)
 {
 	if (*s)
-		write(2, s, strlen(s));
+		write(STDERR_FILENO, s, strlen(s));
 }
 
 static void prn(unsigned u)
@@ -807,7 +806,8 @@
 {
 	if (*s) {
 		prs(s);
-		exstat = -1;
+		if (!exstat)
+			exstat = 255;
 	}
 	prs("\n");
 	if (FLAG['e'])
@@ -1278,6 +1278,7 @@
 }
 
 
+#ifdef UNUSED
 struct op *scantree(struct op *head)
 {
 	struct op *dotnode;
@@ -1309,6 +1310,7 @@
 
 	return NULL;
 }
+#endif
 
 
 static void onecommand(void)
@@ -2740,7 +2742,7 @@
 	// longjmps away (at "Run builtin" below), leaving t->op_words clobbered!
 	// See http://bugs.busybox.net/view.php?id=846.
 	// Now we do not touch t->op_words, but separately pass wp as param list
-	// to builtins 
+	// to builtins
 	DBGPRINTF(("FORKEXEC: bltin %p, no_fork %d, owp %p\n", bltin,
 			no_fork, owp));
 	/* Don't fork if it is a lone builtin (not in pipe)
@@ -2854,7 +2856,7 @@
 	if (t->op_type == TPAREN)
 		_exit(execute(t->left, NOPIPE, NOPIPE, /* no_fork: */ 1));
 	if (wp[0] == NULL)
-		_exit(0);
+		_exit(EXIT_SUCCESS);
 
 	cp = rexecve(wp[0], wp, makenv(0, NULL));
 	prs(wp[0]);
@@ -3006,7 +3008,7 @@
 					prs(" - core dumped");
 				if (rv >= ARRAY_SIZE(signame) || signame[rv])
 					prs("\n");
-				rv = -1;
+				rv |= 0x80;
 			} else
 				rv = WAITVAL(s);
 		}
@@ -3070,8 +3072,6 @@
 		if (tp != global_env.linep)
 			*tp++ = '/';
 		strcpy(tp, c);
-		//for (i = 0; (*tp++ = c[i++]) != '\0';)
-		//	continue;
 
 		DBGPRINTF3(("REXECVE: global_env.linep is %s\n", global_env.linep));
 
@@ -3079,10 +3079,13 @@
 
 		switch (errno) {
 		case ENOEXEC:
+			/* File is executable but file format isnt recognized */
+			/* Run it as a shell script */
+			/* (execve above didnt do it itself, unlike execvp) */
 			*v = global_env.linep;
 			v--;
 			tp = *v;
-			*v = global_env.linep;
+			*v = (char*)DEFAULT_SHELL;
 			execve(DEFAULT_SHELL, v, envp);
 			*v = tp;
 			return "no shell";
@@ -3094,7 +3097,12 @@
 			return "argument list too long";
 		}
 	}
-	return errno == ENOENT ? "not found" : "cannot execute";
+	if (errno == ENOENT) {
+		exstat = 127; /* standards require this */
+		return "not found";
+	}
+	exstat = 126; /* mimic bash */
+	return "cannot execute";
 }
 
 /*
@@ -3383,7 +3391,7 @@
 	}
 	for (wp = args + 1; *wp; wp++) {
 		for (cp = global_env.linep; !nl && cp < elinep - 1; cp++) {
-			nb = nonblock_safe_read(0, cp, sizeof(*cp));
+			nb = nonblock_safe_read(STDIN_FILENO, cp, sizeof(*cp));
 			if (nb != sizeof(*cp))
 				break;
 			nl = (*cp == '\n');
@@ -4206,7 +4214,7 @@
 	prs(argument_list[0]);
 	prs(": ");
 	err(cp);
-	_exit(1);
+	_exit(EXIT_FAILURE);
 }
 
 
@@ -4308,9 +4316,7 @@
 	dname[NAME_MAX] = '\0';
 	while ((de = readdir(dirp)) != NULL) {
 		/* XXX Hmmm... What this could be? (abial) */
-		/*
-		   if (ent[j].d_ino == 0)
-		      continue;
+		/* if (ent[j].d_ino == 0) continue;
 		 */
 		strncpy(dname, de->d_name, NAME_MAX);
 		if (dname[0] == '.')
@@ -4521,7 +4527,7 @@
 static void ioecho(char c)
 {
 	if (FLAG['v'])
-		write(2, &c, sizeof c);
+		write(STDERR_FILENO, &c, sizeof c);
 }
 
 static void pushio(struct ioarg *argp, int (*fn) (struct ioarg *))
@@ -4732,7 +4738,7 @@
 		while (size == 0 || position >= size) {
 			size = read_line_input(current_prompt, filechar_cmdbuf, BUFSIZ, line_input_state);
 			if (size < 0) /* Error/EOF */
-				exit(0);
+				exit(EXIT_SUCCESS);
 			position = 0;
 			/* if Ctrl-C, size == 0 and loop will repeat */
 		}
@@ -4817,7 +4823,7 @@
 }
 
 /*
- * remap fd into Shell's fd space
+ * Remap fd into shell's fd space
  */
 static int remap(int fd)
 {
@@ -5203,7 +5209,7 @@
 
 /* Shell is non-interactive, activate printf-based debug */
 #ifdef MSHDEBUG
-			mshdbg = (int) (((char) (mshdbg_var->value[0])) - '0');
+			mshdbg = mshdbg_var->value[0] - '0';
 			if (mshdbg < 0)
 				mshdbg = 0;
 #endif
@@ -5211,7 +5217,7 @@
 
 			name = *++argv;
 			if (newfile(name))
-				exit(1);		/* Exit on error */
+				exit(EXIT_FAILURE);  /* Exit on error */
 		}
 	}
 
