env: allow to export only selected variables

New syntax:
	env export [-t | -b | -c] [-s size] addr [var ...]

With this change it is possible to provide a list of variables names
that shall be exported.  Whenno arguments are given, the whole
environment gets exported.

NOTE: The new handling of the "size" argument means a change to the
user API.

Signed-off-by: Wolfgang Denk <wd@denx.de>
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index 396a171..7194ade 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -125,7 +125,7 @@
 	}
 
 	/* print whole list */
-	len = hexport_r(&env_htab, '\n', &res, 0);
+	len = hexport_r(&env_htab, '\n', &res, 0, 0, NULL);
 
 	if (len > 0) {
 		puts(res);
@@ -647,7 +647,7 @@
 
 #ifdef CONFIG_CMD_EXPORTENV
 /*
- * env export [-t | -b | -c] addr [size]
+ * env export [-t | -b | -c] [-s size] addr [var ...]
  *	-t:	export as text format; if size is given, data will be
  *		padded with '\0' bytes; if not, one terminating '\0'
  *		will be added (which is included in the "filesize"
@@ -657,8 +657,12 @@
  *		'\0', list end marked by double "\0\0")
  *	-c:	export as checksum protected environment format as
  *		used for example by "saveenv" command
+ *	-s size:
+ *		size of output buffer
  *	addr:	memory address where environment gets stored
- *	size:	size of output buffer
+ *	var...	List of variable names that get included into the
+ *		export. Without arguments, the whole environment gets
+ *		exported.
  *
  * With "-c" and size is NOT given, then the export command will
  * format the data as currently used for the persistent storage,
@@ -691,7 +695,7 @@
 {
 	char	buf[32];
 	char	*addr, *cmd, *res;
-	size_t	size;
+	size_t	size = 0;
 	ssize_t	len;
 	env_t	*envp;
 	char	sep = '\n';
@@ -715,6 +719,11 @@
 				sep = '\0';
 				chk = 1;
 				break;
+			case 's':		/* size given */
+				if (--argc <= 0)
+					return cmd_usage(cmdtp);
+				size = simple_strtoul(*++argv, NULL, 16);
+				goto NXTARG;
 			case 't':		/* text format */
 				if (fmt++)
 					goto sep_err;
@@ -724,6 +733,7 @@
 				return cmd_usage(cmdtp);
 			}
 		}
+NXTARG:		;
 	}
 
 	if (argc < 1)
@@ -731,15 +741,14 @@
 
 	addr = (char *)simple_strtoul(argv[0], NULL, 16);
 
-	if (argc == 2) {
-		size = simple_strtoul(argv[1], NULL, 16);
+	if (size)
 		memset(addr, '\0', size);
-	} else {
-		size = 0;
-	}
+
+	argc--;
+	argv++;
 
 	if (sep) {		/* export as text file */
-		len = hexport_r(&env_htab, sep, &addr, size);
+		len = hexport_r(&env_htab, sep, &addr, size, argc, argv);
 		if (len < 0) {
 			error("Cannot export environment: errno = %d\n",
 				errno);
@@ -758,7 +767,7 @@
 	else			/* export as raw binary data */
 		res = addr;
 
-	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
+	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, argc, argv);
 	if (len < 0) {
 		error("Cannot export environment: errno = %d\n",
 			errno);
@@ -965,7 +974,7 @@
 #if defined(CONFIG_CMD_EDITENV)
 	"env edit name - edit environment variable\n"
 #endif
-	"env export [-t | -b | -c] addr [size] - export environment\n"
+	"env export [-t | -b | -c] [-s size] addr [var ...] - export environment\n"
 #if defined(CONFIG_CMD_GREPENV)
 	"env grep string [...] - search environment\n"
 #endif