Make getenv() work before relocation.

So far, getenv() would work before relocation is most cases, even
though it was not intended to be used that way.  When switching to a
hash table based implementation, this would break a number of boards.

For convenience, we make getenv() check if it's running before
relocation and, if so, use getenv_f() internally.

Note that this is limited to simple cases, as we use a small static
buffer (32 bytes) in the global data for this purpose.

For this reason, it is also not a good idea to convert all current
uses of getenv_f() into getenv() - some of the existing use cases need
to be able to deal with longer variable values, so getenv_f() is still
needed and recommended for use before relocation.

Signed-off-by: Wolfgang Denk <wd@denx.de>
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index dc15750..74a5069 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -511,24 +511,31 @@
 
 char *getenv (char *name)
 {
-	int i, nxt;
+	if (gd->flags & GD_FLG_RELOC) {	/* full C runtime after reloc */
+		int i, nxt;
 
-	WATCHDOG_RESET();
+		WATCHDOG_RESET();
 
-	for (i=0; env_get_char(i) != '\0'; i=nxt+1) {
-		int val;
+		for (i=0; env_get_char(i) != '\0'; i=nxt+1) {
+			int val;
 
-		for (nxt=i; env_get_char(nxt) != '\0'; ++nxt) {
-			if (nxt >= CONFIG_ENV_SIZE) {
-				return (NULL);
+			for (nxt=i; env_get_char(nxt) != '\0'; ++nxt) {
+				if (nxt >= CONFIG_ENV_SIZE) {
+					return (NULL);
+				}
 			}
+			if ((val=envmatch((uchar *)name, i)) < 0)
+				continue;
+			return ((char *)env_get_addr(val));
 		}
-		if ((val=envmatch((uchar *)name, i)) < 0)
-			continue;
-		return ((char *)env_get_addr(val));
+
+		return (NULL);
 	}
 
-	return (NULL);
+	/* restricted C runtime before reloc */
+
+	return ((getenv_f(name,gd->env_buf,sizeof(gd->env_buf)) > 0) ?
+		gd->env_buf : NULL);
 }
 
 int getenv_f(char *name, char *buf, unsigned len)