env: Make return value of env_get_f() behave like sprintf() on success

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>
This commit is contained in:
Marek Behún 2021-10-17 17:36:35 +02:00 committed by Simon Glass
parent 6b6e3eeba9
commit 3112ce0ce8
2 changed files with 7 additions and 7 deletions

View 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;

View 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);