env: Make return value of env_get_f() behave like sprintf() on success
authorMarek Behún <marek.behun@nic.cz>
Sun, 17 Oct 2021 15:36:35 +0000 (17:36 +0200)
committerSimon Glass <sjg@chromium.org>
Thu, 21 Oct 2021 18:50:48 +0000 (12:50 -0600)
Currently the env_get_f() function's return value behaves weirdly: it
returns the number of bytes written into `buf`, but whether this is
excluding the terminating NULL-byte or including it depends on whether
there was enough space in `buf`.

Change the function to always return the actual length of the value of
the environment variable (excluding the terminating NULL-byte) on
success. This makes it behave like sprintf().

All users of this function in U-Boot are compatible with this change.

Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
cmd/nvedit.c
include/env.h

index 063cc76..527b522 100644 (file)
@@ -735,7 +735,7 @@ int env_get_f(const char *name, char *buf, unsigned len)
 
        for (p = env; *p != '\0'; p = end + 1) {
                const char *value;
-               int n;
+               int n, res;
 
                for (end = p; *end != '\0'; ++end)
                        if (end - env >= CONFIG_ENV_SIZE)
@@ -745,11 +745,13 @@ int env_get_f(const char *name, char *buf, unsigned len)
                if (value == NULL)
                        continue;
 
+               res = end - value;
+
                /* found; copy out */
                for (n = 0; n < len; ++n, ++buf) {
                        *buf = *value++;
                        if (*buf == '\0')
-                               return n;
+                               return res;
                }
 
                if (n)
@@ -758,7 +760,7 @@ int env_get_f(const char *name, char *buf, unsigned len)
                printf("env_buf [%u bytes] too small for value of \"%s\"\n",
                       len, name);
 
-               return n;
+               return res;
        }
 
        return -1;
index 220ab97..ee5e30d 100644 (file)
@@ -120,10 +120,8 @@ char *from_env(const char *envvar);
  * support reading the value (slowly) and some will not.
  *
  * @varname:   Variable to look up
- * @return number of bytes written into @buf, excluding the terminating
- *     NULL-byte if there was enough space in @buf, and including the
- *     terminating NULL-byte if there wasn't enough space, or -1 if the
- *     variable is not found
+ * @return actual length of the variable value excluding the terminating
+ *     NULL-byte, or -1 if the variable is not found
  */
 int env_get_f(const char *name, char *buf, unsigned int len);