Patch from Gennady Feldman <gfeldman@tradeline.net> to:
    1. Opens redirections w/ the right access.
    2. Doesn't do globbing for every single parameter (so it
	doesn't stat every parameter).
diff --git a/sh.c b/sh.c
index b106142..7a8810a 100644
--- a/sh.c
+++ b/sh.c
@@ -627,10 +627,10 @@
 			mode = O_RDONLY;
 			break;
 		case REDIRECT_OVERWRITE:
-			mode = O_RDWR | O_CREAT | O_TRUNC;
+			mode = O_WRONLY | O_CREAT | O_TRUNC;
 			break;
 		case REDIRECT_APPEND:
-			mode = O_RDWR | O_CREAT | O_APPEND;
+			mode = O_WRONLY | O_CREAT | O_APPEND;
 			break;
 		}
 
@@ -785,30 +785,42 @@
 #endif
 	}
 
-	rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult);
-	if (rc == GLOB_NOSPACE) {
-		errorMsg("out of space during glob operation\n");
-		return;
-	} else if (rc == GLOB_NOMATCH ||
+	if (strpbrk(prog->argv[argc_l - 1],"*[]?")!= NULL){
+		rc = glob(prog->argv[argc_l - 1], flags, NULL, &prog->globResult);
+		if (rc == GLOB_NOSPACE) {
+			errorMsg("out of space during glob operation\n");
+			return;
+		} else if (rc == GLOB_NOMATCH ||
 			   (!rc && (prog->globResult.gl_pathc - i) == 1 &&
 				strcmp(prog->argv[argc_l - 1],
 						prog->globResult.gl_pathv[i]) == 0)) {
-		/* we need to remove whatever \ quoting is still present */
-		src = dst = prog->argv[argc_l - 1];
-		while (*src) {
-			if (*src != '\\')
-				*dst++ = *src;
-			src++;
+			/* we need to remove whatever \ quoting is still present */
+			src = dst = prog->argv[argc_l - 1];
+			while (*src) {
+				if (*src != '\\')
+					*dst++ = *src;
+				src++;
+			}
+			*dst = '\0';
+		} else if (!rc) {
+			argcAlloced += (prog->globResult.gl_pathc - i);
+			prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv));
+			memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i,
+				   sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i));
+			argc_l += (prog->globResult.gl_pathc - i - 1);
 		}
-		*dst = '\0';
-	} else if (!rc) {
-		argcAlloced += (prog->globResult.gl_pathc - i);
-		prog->argv = xrealloc(prog->argv, argcAlloced * sizeof(*prog->argv));
-		memcpy(prog->argv + (argc_l - 1), prog->globResult.gl_pathv + i,
-			   sizeof(*(prog->argv)) * (prog->globResult.gl_pathc - i));
-		argc_l += (prog->globResult.gl_pathc - i - 1);
+	}else{
+	 		src = dst = prog->argv[argc_l - 1];
+			while (*src) {
+				if (*src != '\\')
+					*dst++ = *src;
+				src++;
+			}
+			*dst = '\0';
+			prog->globResult.gl_pathc=0;
+			if (flags==0)
+				prog->globResult.gl_pathv=NULL;
 	}
-
 	*argcAllocedPtr = argcAlloced;
 	*argcPtr = argc_l;
 }
@@ -1128,7 +1140,7 @@
 	}
 
 	*commandPtr = returnCommand;
-
+	
 	return 0;
 }
 
@@ -1143,7 +1155,6 @@
 	const struct BB_applet *a = applets;
 #endif
 
-
 	nextin = 0, nextout = 1;
 	for (i = 0; i < newJob->numProgs; i++) {
 		if ((i + 1) < newJob->numProgs) {