From 05df91a3ac5801fc1f12101ab09f56626b296e83 Mon Sep 17 00:00:00 2001
From: Eric Andersen <andersen@codepoet.org>
Date: Mon, 28 Jul 2003 07:42:19 +0000
Subject: last_patch98 from vodz:

Denis,

># ./busybox env - echo zzz
>zzz
># ./busybox echo -n zzz
>zzz
># ./busybox env - echo -n zzz
>env: invalid option -- n
>
>       obviously, env tried to understand -n as env's option
>       instead of blindly passing it to echo...
>
>BusyBox v1.00-pre1 (2003.07.16-07:53+0000) multi-call binary
>
>Usage: env [-iu] [-] [name=value]... [command]

Ah, you found very old problem.
Last patch also have:

- multiple "-u unsetenv" support
- GNU long option support
- save errno after exec failed before bb_perror_msg()


--w
vodz
---
 coreutils/env.c | 53 +++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 41 insertions(+), 12 deletions(-)

diff --git a/coreutils/env.c b/coreutils/env.c
index a07bd324c..d8a76e364 100644
--- a/coreutils/env.c
+++ b/coreutils/env.c
@@ -33,32 +33,58 @@
  * output error checking.
  */
 
+/*
+ * Modified by Vladimir Oleynik <andersen@codepoet.org> (C) 2003
+ * - corretion "-" option usage
+ * - multiple "-u unsetenv" support
+ * - GNU long option support
+ * - save errno after exec failed before bb_perror_msg()
+ */
+
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <unistd.h>
+#include <getopt.h>
 #include "busybox.h"
 
+
+static const struct option env_long_options[] = {
+	{ "ignore-environment", 0, NULL, 'i' },
+	{ "unset", 1, NULL, 'u' },
+	{ 0, 0, 0, 0 }
+};
+
 extern int env_main(int argc, char** argv)
 {
 	char **ep, *p;
 	char *cleanenv[1] = { NULL };
 	unsigned long opt;
+	llist_t *unset_env;
+	extern char **environ;
 
-	opt = bb_getopt_ulflags(argc, argv, "iu:", &p);
-	if(opt & 1)
-			environ = cleanenv;
-	if(opt & 2)
-		unsetenv(p);
+	bb_opt_complementaly = "u*";
+	bb_applet_long_options = env_long_options;
 
-	argv += optind;
+	opt = bb_getopt_ulflags(argc, argv, "+iu:", &unset_env);
 
+	argv += optind;
 	if (*argv && (argv[0][0] == '-') && !argv[0][1]) {
-		environ = cleanenv;
+		opt |= 1;
 		++argv;
 	}
 
+	if(opt & 1)
+		environ = cleanenv;
+	else if(opt & 2) {
+		while(unset_env) {
+			unsetenv(unset_env->data);
+			unset_env = unset_env->link;
+		}
+	}
+
 	while (*argv && ((p = strchr(*argv, '=')) != NULL)) {
 		if (putenv(*argv) < 0) {
 			bb_perror_msg_and_die("putenv");
@@ -67,9 +93,12 @@ extern int env_main(int argc, char** argv)
 	}
 
 	if (*argv) {
+		int er;
+
 		execvp(*argv, argv);
-		bb_perror_msg("%s", *argv);	/* Avoid multibyte problems. */
-		return (errno == ENOENT) ? 127 : 126;	/* SUSv3-mandated exit codes. */
+		er = errno;
+		bb_perror_msg("%s", *argv);     /* Avoid multibyte problems. */
+		return (er == ENOENT) ? 127 : 126;   /* SUSv3-mandated exit codes. */
 	}
 
 	for (ep = environ; *ep; ep++) {
@@ -81,7 +110,7 @@ extern int env_main(int argc, char** argv)
 
 /*
  * Copyright (c) 1988, 1993, 1994
- *	The Regents of the University of California.  All rights reserved.
+ *      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
@@ -92,8 +121,8 @@ extern int env_main(int argc, char** argv)
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change 
- *		ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> 
+ * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change
+ *		ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change>
  *
  * 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
-- 
cgit v1.2.3-55-g6feb