* [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor
@ 2021-10-17 15:36 Marek Behún
2021-10-17 15:36 ` [PATCH v3 01/13] env: Fix documentation for env_get_f() Marek Behún
` (24 more replies)
0 siblings, 25 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
Hi Simon, Tom,
env_get_char() is a relic from the past when env was read char-by-char
from underlying device. Currently it only accesses in-memory arrays.
We can remove it and access the arrays directly. This simplifies the old
code of env_get_f().
Changes since v2:
- added patch
env: Simplify env_match() and inline into env_get_f()
- remove patch
env: Check for terminating null-byte in env_match()
(not needed with the above patch added)
- changed order of patches a little
- rebased to accomodate the order change and the added and removed patch
Changes since v1:
- use memcpy() instead of strncpy() when copying value to buffer
- fixed a bug in patch adding check to terminating NULL-byte
- added patch fixing documentation for env_get_f()
- added patch changing behaviour of return value of env_get_f()
- some other cosmetic changes
Marek
Marek Behún (13):
env: Fix documentation for env_get_f()
env: Drop env_get_char_spec() and old, unused .get_char()
implementations
examples: api: glue: Remove comment that does not apply anymore
env: Change env_match() to static and remove from header
env: Inline env_get_char() into its only user
env: Use string pointer instead of indexes in env_get_f()
env: Use better name for variable in env_get_f()
env: Don't match empty variable name in env_match()
env: Early return from env_get_f() on NULL name
env: Make return value of env_get_f() behave like sprintf() on success
env: Use memcpy() instead of ad-hoc code to copy variable value
env: Simplify env_match() and inline into env_get_f()
env: Move non-cli env functions to env/common.c
cmd/nvedit.c | 188 --------------------------------------------
env/common.c | 180 ++++++++++++++++++++++++++++++++++++++++++
env/eeprom.c | 18 -----
env/env.c | 13 ---
env/nowhere.c | 5 +-
env/nvram.c | 14 ----
examples/api/glue.c | 5 --
include/env.h | 24 +-----
8 files changed, 184 insertions(+), 263 deletions(-)
--
2.32.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH v3 01/13] env: Fix documentation for env_get_f()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 02/13] env: Drop env_get_char_spec() and old, unused .get_char() implementations Marek Behún
` (23 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
This function actually returns:
- the number of bytes written into @buf excluding the terminating
NULL-byte, if there was enough space in @buf
- the number of bytes written into @buf including the terminating
NULL-byte, if there wasn't enough space in @buf
- -1 if the variable is not found
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
include/env.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/include/env.h b/include/env.h
index d5e2bcb530..b1a4003681 100644
--- a/include/env.h
+++ b/include/env.h
@@ -131,7 +131,10 @@ char *from_env(const char *envvar);
* support reading the value (slowly) and some will not.
*
* @varname: Variable to look up
- * @return value of variable, or NULL if not found
+ * @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
*/
int env_get_f(const char *name, char *buf, unsigned int len);
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 02/13] env: Drop env_get_char_spec() and old, unused .get_char() implementations
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
2021-10-17 15:36 ` [PATCH v3 01/13] env: Fix documentation for env_get_f() Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 03/13] examples: api: glue: Remove comment that does not apply anymore Marek Behún
` (22 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
Commit b2cdef4861be ("env: restore old env_get_char() behaviour")
dropped the .get_char() method from struct env_driver, but left the two
existing implementations (eeprom and nvram) in case someone would use
them by overwriting weak function env_get_char_spec().
Since this was never done in the 3.5 years, let's drop these methods and
simplify the code.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
env/eeprom.c | 18 ------------------
env/env.c | 7 +------
env/nvram.c | 14 --------------
3 files changed, 1 insertion(+), 38 deletions(-)
diff --git a/env/eeprom.c b/env/eeprom.c
index 253bdf1428..f8556a4721 100644
--- a/env/eeprom.c
+++ b/env/eeprom.c
@@ -64,24 +64,6 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset,
return rcode;
}
-/** Call this function from overridden env_get_char_spec() if you need
- * this functionality.
- */
-int env_eeprom_get_char(int index)
-{
- uchar c;
- unsigned int off = CONFIG_ENV_OFFSET;
-
-#ifdef CONFIG_ENV_OFFSET_REDUND
- if (gd->env_valid == ENV_REDUND)
- off = CONFIG_ENV_OFFSET_REDUND;
-#endif
- eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR,
- off + index + offsetof(env_t, data), &c, 1);
-
- return c;
-}
-
static int env_eeprom_load(void)
{
char buf_env[CONFIG_ENV_SIZE];
diff --git a/env/env.c b/env/env.c
index e534008006..91d220c3dd 100644
--- a/env/env.c
+++ b/env/env.c
@@ -166,17 +166,12 @@ static struct env_driver *env_driver_lookup(enum env_operation op, int prio)
return drv;
}
-__weak int env_get_char_spec(int index)
-{
- return *(uchar *)(gd->env_addr + index);
-}
-
int env_get_char(int index)
{
if (gd->env_valid == ENV_INVALID)
return default_environment[index];
else
- return env_get_char_spec(index);
+ return *(uchar *)(gd->env_addr + index);
}
int env_load(void)
diff --git a/env/nvram.c b/env/nvram.c
index f4126858b5..261b31edfb 100644
--- a/env/nvram.c
+++ b/env/nvram.c
@@ -42,20 +42,6 @@ extern void nvram_write(long dest, const void *src, size_t count);
static env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR;
#endif
-#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
-/** Call this function from overridden env_get_char_spec() if you need
- * this functionality.
- */
-int env_nvram_get_char(int index)
-{
- uchar c;
-
- nvram_read(&c, CONFIG_ENV_ADDR + index, 1);
-
- return c;
-}
-#endif
-
static int env_nvram_load(void)
{
char buf[CONFIG_ENV_SIZE];
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 03/13] examples: api: glue: Remove comment that does not apply anymore
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
2021-10-17 15:36 ` [PATCH v3 01/13] env: Fix documentation for env_get_f() Marek Behún
2021-10-17 15:36 ` [PATCH v3 02/13] env: Drop env_get_char_spec() and old, unused .get_char() implementations Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 04/13] env: Change env_match() to static and remove from header Marek Behún
` (21 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
This comment is not true since commit 6215bd4c1fd6 ("api: Use hashtable
function for API_env_enum").
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
examples/api/glue.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/examples/api/glue.c b/examples/api/glue.c
index 91d13157a1..075d307ae2 100644
--- a/examples/api/glue.c
+++ b/examples/api/glue.c
@@ -365,11 +365,6 @@ const char * ub_env_enum(const char *last)
env = NULL;
- /*
- * It's OK to pass only the name piece as last (and not the whole
- * 'name=val' string), since the API_ENUM_ENV call uses env_match()
- * internally, which handles such case
- */
if (!syscall(API_ENV_ENUM, NULL, last, &env))
return NULL;
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 04/13] env: Change env_match() to static and remove from header
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (2 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 03/13] examples: api: glue: Remove comment that does not apply anymore Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 05/13] env: Inline env_get_char() into its only user Marek Behún
` (20 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
This function was used by other parts of U-Boot in the past when
environment was read from underlying device one character at a time.
This is not the case anymore.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 30 +++++++++++++++---------------
include/env.h | 11 -----------
2 files changed, 15 insertions(+), 26 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index ddc715b4f9..742e0924af 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -706,6 +706,21 @@ char *from_env(const char *envvar)
return ret;
}
+static int env_match(uchar *s1, int i2)
+{
+ if (s1 == NULL)
+ return -1;
+
+ while (*s1 == env_get_char(i2++))
+ if (*s1++ == '=')
+ return i2;
+
+ if (*s1 == '\0' && env_get_char(i2-1) == '=')
+ return i2;
+
+ return -1;
+}
+
/*
* Look up variable from environment for restricted C runtime env.
*/
@@ -816,21 +831,6 @@ static int do_env_select(struct cmd_tbl *cmdtp, int flag, int argc,
#endif /* CONFIG_SPL_BUILD */
-int env_match(uchar *s1, int i2)
-{
- if (s1 == NULL)
- return -1;
-
- while (*s1 == env_get_char(i2++))
- if (*s1++ == '=')
- return i2;
-
- if (*s1 == '\0' && env_get_char(i2-1) == '=')
- return i2;
-
- return -1;
-}
-
#ifndef CONFIG_SPL_BUILD
static int do_env_default(struct cmd_tbl *cmdtp, int flag,
int argc, char *const argv[])
diff --git a/include/env.h b/include/env.h
index b1a4003681..a9b2a4c8b2 100644
--- a/include/env.h
+++ b/include/env.h
@@ -90,17 +90,6 @@ int env_init(void);
*/
void env_relocate(void);
-/**
- * env_match() - Match a name / name=value pair
- *
- * This is used prior to relocation for finding envrionment variables
- *
- * @name: A simple 'name', or a 'name=value' pair.
- * @index: The environment index for a 'name2=value2' pair.
- * @return index for the value if the names match, else -1.
- */
-int env_match(unsigned char *name, int index);
-
/**
* env_get() - Look up the value of an environment variable
*
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 05/13] env: Inline env_get_char() into its only user
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (3 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 04/13] env: Change env_match() to static and remove from header Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 06/13] env: Use string pointer instead of indexes in env_get_f() Marek Behún
` (19 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
This function is a relic from the past when environment was read from
underlying device one character at a time.
It is used only in the case when getting an environemnt variable prior
relocation, and the function is simple enough to be inlined there.
Since env_get_char() is being changed to simple access to an array, we
can drop the failing cases and simplify the code (this could have been
done before, since env_get_char() did not fail even before).
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 28 ++++++++++++++--------------
env/env.c | 8 --------
env/nowhere.c | 5 ++---
include/env.h | 10 ----------
4 files changed, 16 insertions(+), 35 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 742e0924af..3952deda1b 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -706,16 +706,16 @@ char *from_env(const char *envvar)
return ret;
}
-static int env_match(uchar *s1, int i2)
+static int env_match(const char *env, const char *s1, int i2)
{
if (s1 == NULL)
return -1;
- while (*s1 == env_get_char(i2++))
+ while (*s1 == env[i2++])
if (*s1++ == '=')
return i2;
- if (*s1 == '\0' && env_get_char(i2-1) == '=')
+ if (*s1 == '\0' && env[i2-1] == '=')
return i2;
return -1;
@@ -726,28 +726,28 @@ static int env_match(uchar *s1, int i2)
*/
int env_get_f(const char *name, char *buf, unsigned len)
{
- int i, nxt, c;
+ const char *env;
+ int i, nxt;
- for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
+ if (gd->env_valid == ENV_INVALID)
+ env = (const char *)default_environment;
+ else
+ env = (const char *)gd->env_addr;
+
+ for (i = 0; env[i] != '\0'; i = nxt + 1) {
int val, n;
- for (nxt = i; (c = env_get_char(nxt)) != '\0'; ++nxt) {
- if (c < 0)
- return c;
+ for (nxt = i; env[nxt] != '\0'; ++nxt)
if (nxt >= CONFIG_ENV_SIZE)
return -1;
- }
- val = env_match((uchar *)name, i);
+ val = env_match(env, name, i);
if (val < 0)
continue;
/* found; copy out */
for (n = 0; n < len; ++n, ++buf) {
- c = env_get_char(val++);
- if (c < 0)
- return c;
- *buf = c;
+ *buf = env[val++];
if (*buf == '\0')
return n;
}
diff --git a/env/env.c b/env/env.c
index 91d220c3dd..e4dfb92e15 100644
--- a/env/env.c
+++ b/env/env.c
@@ -166,14 +166,6 @@ static struct env_driver *env_driver_lookup(enum env_operation op, int prio)
return drv;
}
-int env_get_char(int index)
-{
- if (gd->env_valid == ENV_INVALID)
- return default_environment[index];
- else
- return *(uchar *)(gd->env_addr + index);
-}
-
int env_load(void)
{
struct env_driver *drv;
diff --git a/env/nowhere.c b/env/nowhere.c
index 41557f5ce4..1fcf503453 100644
--- a/env/nowhere.c
+++ b/env/nowhere.c
@@ -31,9 +31,8 @@ static int env_nowhere_init(void)
static int env_nowhere_load(void)
{
/*
- * for SPL, set env_valid = ENV_INVALID is enough as env_get_char()
- * return the default env if env_get is used
- * and SPL don't used env_import to reduce its size
+ * For SPL, setting env_valid = ENV_INVALID is enough, as env_get()
+ * searches default_environment array in that case.
* For U-Boot proper, import the default environment to allow reload.
*/
if (!IS_ENABLED(CONFIG_SPL_BUILD))
diff --git a/include/env.h b/include/env.h
index a9b2a4c8b2..220ab979d9 100644
--- a/include/env.h
+++ b/include/env.h
@@ -351,16 +351,6 @@ char *env_get_default(const char *name);
/* [re]set to the default environment */
void env_set_default(const char *s, int flags);
-/**
- * env_get_char() - Get a character from the early environment
- *
- * This reads from the pre-relocation environment
- *
- * @index: Index of character to read (0 = first)
- * @return character read, or -ve on error
- */
-int env_get_char(int index);
-
/**
* env_reloc() - Relocate the 'env' sub-commands
*
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 06/13] env: Use string pointer instead of indexes in env_get_f()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (4 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 05/13] env: Inline env_get_char() into its only user Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 07/13] env: Use better name for variable " Marek Behún
` (18 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
Since we no longer use env_get_char() to access n-th character of
linearized environment data, but rather access the arrays themselves, we
can convert the iteration to use string pointers instead of position
indexes.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 3952deda1b..f395d2893a 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -706,19 +706,19 @@ char *from_env(const char *envvar)
return ret;
}
-static int env_match(const char *env, const char *s1, int i2)
+static const char *env_match(const char *p, const char *s1)
{
if (s1 == NULL)
- return -1;
+ return NULL;
- while (*s1 == env[i2++])
+ while (*s1 == *p++)
if (*s1++ == '=')
- return i2;
+ return p;
- if (*s1 == '\0' && env[i2-1] == '=')
- return i2;
+ if (*s1 == '\0' && p[-1] == '=')
+ return p;
- return -1;
+ return NULL;
}
/*
@@ -726,28 +726,28 @@ static int env_match(const char *env, const char *s1, int i2)
*/
int env_get_f(const char *name, char *buf, unsigned len)
{
- const char *env;
- int i, nxt;
+ const char *env, *p, *nxt;
if (gd->env_valid == ENV_INVALID)
env = (const char *)default_environment;
else
env = (const char *)gd->env_addr;
- for (i = 0; env[i] != '\0'; i = nxt + 1) {
- int val, n;
+ for (p = env; *p != '\0'; p = nxt + 1) {
+ const char *value;
+ int n;
- for (nxt = i; env[nxt] != '\0'; ++nxt)
- if (nxt >= CONFIG_ENV_SIZE)
+ for (nxt = p; *nxt != '\0'; ++nxt)
+ if (nxt - env >= CONFIG_ENV_SIZE)
return -1;
- val = env_match(env, name, i);
- if (val < 0)
+ value = env_match(p, name);
+ if (value == NULL)
continue;
/* found; copy out */
for (n = 0; n < len; ++n, ++buf) {
- *buf = env[val++];
+ *buf = *value++;
if (*buf == '\0')
return n;
}
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 07/13] env: Use better name for variable in env_get_f()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (5 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 06/13] env: Use string pointer instead of indexes in env_get_f() Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 08/13] env: Don't match empty variable name in env_match() Marek Behún
` (17 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
The `nxt` variable actually points to the terminating null-byte of the
current env var, and the next env var is at `nxt + 1`, not `nxt`. So a
better name for this variable is `end`.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index f395d2893a..5b1d4c2448 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -726,19 +726,19 @@ static const char *env_match(const char *p, const char *s1)
*/
int env_get_f(const char *name, char *buf, unsigned len)
{
- const char *env, *p, *nxt;
+ const char *env, *p, *end;
if (gd->env_valid == ENV_INVALID)
env = (const char *)default_environment;
else
env = (const char *)gd->env_addr;
- for (p = env; *p != '\0'; p = nxt + 1) {
+ for (p = env; *p != '\0'; p = end + 1) {
const char *value;
int n;
- for (nxt = p; *nxt != '\0'; ++nxt)
- if (nxt - env >= CONFIG_ENV_SIZE)
+ for (end = p; *end != '\0'; ++end)
+ if (end - env >= CONFIG_ENV_SIZE)
return -1;
value = env_match(p, name);
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 08/13] env: Don't match empty variable name in env_match()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (6 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 07/13] env: Use better name for variable " Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 09/13] env: Early return from env_get_f() on NULL name Marek Behún
` (16 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
Do we really allow zero-length variable name? I guess not.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 5b1d4c2448..8d53579d92 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -708,7 +708,7 @@ char *from_env(const char *envvar)
static const char *env_match(const char *p, const char *s1)
{
- if (s1 == NULL)
+ if (s1 == NULL || *s1 == '\0')
return NULL;
while (*s1 == *p++)
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 09/13] env: Early return from env_get_f() on NULL name
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (7 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 08/13] env: Don't match empty variable name in env_match() Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 10/13] env: Make return value of env_get_f() behave like sprintf() on success Marek Behún
` (15 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
Test non-NULL name immediately, not in env_match().
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 8d53579d92..063cc76282 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -708,9 +708,6 @@ char *from_env(const char *envvar)
static const char *env_match(const char *p, const char *s1)
{
- if (s1 == NULL || *s1 == '\0')
- return NULL;
-
while (*s1 == *p++)
if (*s1++ == '=')
return p;
@@ -728,6 +725,9 @@ int env_get_f(const char *name, char *buf, unsigned len)
{
const char *env, *p, *end;
+ if (name == NULL || *name == '\0')
+ return -1;
+
if (gd->env_valid == ENV_INVALID)
env = (const char *)default_environment;
else
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 10/13] env: Make return value of env_get_f() behave like sprintf() on success
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (8 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 09/13] env: Early return from env_get_f() on NULL name Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 11/13] env: Use memcpy() instead of ad-hoc code to copy variable value Marek Behún
` (14 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
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 | 8 +++++---
include/env.h | 6 ++----
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 063cc76282..527b522e9e 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -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;
diff --git a/include/env.h b/include/env.h
index 220ab979d9..ee5e30d036 100644
--- a/include/env.h
+++ b/include/env.h
@@ -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);
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 11/13] env: Use memcpy() instead of ad-hoc code to copy variable value
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (9 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 10/13] env: Make return value of env_get_f() behave like sprintf() on success Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-17 15:36 ` [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f() Marek Behún
` (13 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
Copy the value of the found variable into given buffer with memcpy()
instead of ad-hoc code.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 527b522e9e..ffcfb55f10 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -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, res;
+ unsigned res;
for (end = p; *end != '\0'; ++end)
if (end - env >= CONFIG_ENV_SIZE)
@@ -746,20 +746,14 @@ int env_get_f(const char *name, char *buf, unsigned len)
continue;
res = end - value;
+ memcpy(buf, value, min(len, res + 1));
- /* found; copy out */
- for (n = 0; n < len; ++n, ++buf) {
- *buf = *value++;
- if (*buf == '\0')
- return res;
+ if (len <= res) {
+ buf[len - 1] = '\0';
+ printf("env_buf [%u bytes] too small for value of \"%s\"\n",
+ len, name);
}
- if (n)
- *--buf = '\0';
-
- printf("env_buf [%u bytes] too small for value of \"%s\"\n",
- len, name);
-
return res;
}
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (10 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 11/13] env: Use memcpy() instead of ad-hoc code to copy variable value Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-18 18:12 ` Simon Glass
2021-10-17 15:36 ` [PATCH v3 13/13] env: Move non-cli env functions to env/common.c Marek Behún
` (12 subsequent siblings)
24 siblings, 1 reply; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
In the past the env_match() function was used to match envs with
- name, i.e. string "name"
- variable assignment, i.e. string "name=other_value"
The latter is not the case anymore, since the env_match() function is
now used only in env_get_f(), and so we can simplify the function into
a simple strncmp() with an additional comparison to '='.
Let's do this, and since the resulting function is quite simple, let's
also inline its code into env_get_f().
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
cmd/nvedit.c | 19 +++++--------------
1 file changed, 5 insertions(+), 14 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index ffcfb55f10..272d0c7718 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -706,28 +706,19 @@ char *from_env(const char *envvar)
return ret;
}
-static const char *env_match(const char *p, const char *s1)
-{
- while (*s1 == *p++)
- if (*s1++ == '=')
- return p;
-
- if (*s1 == '\0' && p[-1] == '=')
- return p;
-
- return NULL;
-}
-
/*
* Look up variable from environment for restricted C runtime env.
*/
int env_get_f(const char *name, char *buf, unsigned len)
{
const char *env, *p, *end;
+ size_t name_len;
if (name == NULL || *name == '\0')
return -1;
+ name_len = strlen(name);
+
if (gd->env_valid == ENV_INVALID)
env = (const char *)default_environment;
else
@@ -741,9 +732,9 @@ int env_get_f(const char *name, char *buf, unsigned len)
if (end - env >= CONFIG_ENV_SIZE)
return -1;
- value = env_match(p, name);
- if (value == NULL)
+ if (strncmp(name, p, name_len) || p[name_len] != '=')
continue;
+ value = &p[name_len + 1];
res = end - value;
memcpy(buf, value, min(len, res + 1));
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH v3 13/13] env: Move non-cli env functions to env/common.c
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (11 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f() Marek Behún
@ 2021-10-17 15:36 ` Marek Behún
2021-10-21 18:49 ` Simon Glass
` (11 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-17 15:36 UTC (permalink / raw)
To: Simon Glass, Tom Rini; +Cc: U-Boot Mailing List, Marek Behún
From: Marek Behún <marek.behun@nic.cz>
Move the following functions from cmd/nvedit.c to env/common.c:
env_set_ulong()
env_set_hex()
env_get_hex()
eth_env_get_enetaddr()
eth_env_set_enetaddr()
env_get()
from_env()
env_get_f()
env_get_ulong()
since these functions are not specific for U-Boot's CLI.
We leave env_set() in cmd/nvedit.c, since it calls _do_env_set(), which
is a static function in that file.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 175 -------------------------------------------------
env/common.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 180 insertions(+), 175 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 272d0c7718..3bb6e764c0 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -30,7 +30,6 @@
#include <env.h>
#include <env_internal.h>
#include <log.h>
-#include <net.h>
#include <search.h>
#include <errno.h>
#include <malloc.h>
@@ -38,7 +37,6 @@
#include <asm/global_data.h>
#include <linux/bitops.h>
#include <u-boot/crc.h>
-#include <watchdog.h>
#include <linux/stddef.h>
#include <asm/byteorder.h>
#include <asm/io.h>
@@ -320,69 +318,6 @@ int env_set(const char *varname, const char *varvalue)
return _do_env_set(0, 3, (char * const *)argv, H_PROGRAMMATIC);
}
-/**
- * Set an environment variable to an integer value
- *
- * @param varname Environment variable to set
- * @param value Value to set it to
- * @return 0 if ok, 1 on error
- */
-int env_set_ulong(const char *varname, ulong value)
-{
- /* TODO: this should be unsigned */
- char *str = simple_itoa(value);
-
- return env_set(varname, str);
-}
-
-/**
- * Set an environment variable to an value in hex
- *
- * @param varname Environment variable to set
- * @param value Value to set it to
- * @return 0 if ok, 1 on error
- */
-int env_set_hex(const char *varname, ulong value)
-{
- char str[17];
-
- sprintf(str, "%lx", value);
- return env_set(varname, str);
-}
-
-ulong env_get_hex(const char *varname, ulong default_val)
-{
- const char *s;
- ulong value;
- char *endp;
-
- s = env_get(varname);
- if (s)
- value = hextoul(s, &endp);
- if (!s || endp == s)
- return default_val;
-
- return value;
-}
-
-int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr)
-{
- string_to_enetaddr(env_get(name), enetaddr);
- return is_valid_ethaddr(enetaddr);
-}
-
-int eth_env_set_enetaddr(const char *name, const uint8_t *enetaddr)
-{
- char buf[ARP_HLEN_ASCII + 1];
-
- if (eth_env_get_enetaddr(name, (uint8_t *)buf))
- return -EEXIST;
-
- sprintf(buf, "%pM", enetaddr);
-
- return env_set(name, buf);
-}
-
#ifndef CONFIG_SPL_BUILD
static int do_env_set(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
@@ -661,117 +596,7 @@ static int do_env_edit(struct cmd_tbl *cmdtp, int flag, int argc,
}
}
#endif /* CONFIG_CMD_EDITENV */
-#endif /* CONFIG_SPL_BUILD */
-/*
- * Look up variable from environment,
- * return address of storage for that variable,
- * or NULL if not found
- */
-char *env_get(const char *name)
-{
- if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */
- struct env_entry e, *ep;
-
- WATCHDOG_RESET();
-
- e.key = name;
- e.data = NULL;
- hsearch_r(e, ENV_FIND, &ep, &env_htab, 0);
-
- return ep ? ep->data : NULL;
- }
-
- /* restricted capabilities before import */
- if (env_get_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
- return (char *)(gd->env_buf);
-
- return NULL;
-}
-
-/*
- * Like env_get, but prints an error if envvar isn't defined in the
- * environment. It always returns what env_get does, so it can be used in
- * place of env_get without changing error handling otherwise.
- */
-char *from_env(const char *envvar)
-{
- char *ret;
-
- ret = env_get(envvar);
-
- if (!ret)
- printf("missing environment variable: %s\n", envvar);
-
- return ret;
-}
-
-/*
- * Look up variable from environment for restricted C runtime env.
- */
-int env_get_f(const char *name, char *buf, unsigned len)
-{
- const char *env, *p, *end;
- size_t name_len;
-
- if (name == NULL || *name == '\0')
- return -1;
-
- name_len = strlen(name);
-
- if (gd->env_valid == ENV_INVALID)
- env = (const char *)default_environment;
- else
- env = (const char *)gd->env_addr;
-
- for (p = env; *p != '\0'; p = end + 1) {
- const char *value;
- unsigned res;
-
- for (end = p; *end != '\0'; ++end)
- if (end - env >= CONFIG_ENV_SIZE)
- return -1;
-
- if (strncmp(name, p, name_len) || p[name_len] != '=')
- continue;
- value = &p[name_len + 1];
-
- res = end - value;
- memcpy(buf, value, min(len, res + 1));
-
- if (len <= res) {
- buf[len - 1] = '\0';
- printf("env_buf [%u bytes] too small for value of \"%s\"\n",
- len, name);
- }
-
- return res;
- }
-
- return -1;
-}
-
-/**
- * Decode the integer value of an environment variable and return it.
- *
- * @param name Name of environment variable
- * @param base Number base to use (normally 10, or 16 for hex)
- * @param default_val Default value to return if the variable is not
- * found
- * @return the decoded value, or default_val if not found
- */
-ulong env_get_ulong(const char *name, int base, ulong default_val)
-{
- /*
- * We can use env_get() here, even before relocation, since the
- * environment variable value is an integer and thus short.
- */
- const char *str = env_get(name);
-
- return str ? simple_strtoul(str, NULL, base) : default_val;
-}
-
-#ifndef CONFIG_SPL_BUILD
#if defined(CONFIG_CMD_SAVEENV) && defined(ENV_IS_IN_DEVICE)
static int do_env_save(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
diff --git a/env/common.c b/env/common.c
index 81e9e0b2aa..db213b7748 100644
--- a/env/common.c
+++ b/env/common.c
@@ -21,6 +21,8 @@
#include <malloc.h>
#include <u-boot/crc.h>
#include <dm/ofnode.h>
+#include <net.h>
+#include <watchdog.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -33,6 +35,184 @@ struct hsearch_data env_htab = {
.change_ok = env_flags_validate,
};
+/*
+ * This env_set() function is defined in cmd/nvedit.c, since it calls
+ * _do_env_set(), whis is a static function in that file.
+ *
+ * int env_set(const char *varname, const char *varvalue);
+ */
+
+/**
+ * Set an environment variable to an integer value
+ *
+ * @param varname Environment variable to set
+ * @param value Value to set it to
+ * @return 0 if ok, 1 on error
+ */
+int env_set_ulong(const char *varname, ulong value)
+{
+ /* TODO: this should be unsigned */
+ char *str = simple_itoa(value);
+
+ return env_set(varname, str);
+}
+
+/**
+ * Set an environment variable to an value in hex
+ *
+ * @param varname Environment variable to set
+ * @param value Value to set it to
+ * @return 0 if ok, 1 on error
+ */
+int env_set_hex(const char *varname, ulong value)
+{
+ char str[17];
+
+ sprintf(str, "%lx", value);
+ return env_set(varname, str);
+}
+
+ulong env_get_hex(const char *varname, ulong default_val)
+{
+ const char *s;
+ ulong value;
+ char *endp;
+
+ s = env_get(varname);
+ if (s)
+ value = hextoul(s, &endp);
+ if (!s || endp == s)
+ return default_val;
+
+ return value;
+}
+
+int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr)
+{
+ string_to_enetaddr(env_get(name), enetaddr);
+ return is_valid_ethaddr(enetaddr);
+}
+
+int eth_env_set_enetaddr(const char *name, const uint8_t *enetaddr)
+{
+ char buf[ARP_HLEN_ASCII + 1];
+
+ if (eth_env_get_enetaddr(name, (uint8_t *)buf))
+ return -EEXIST;
+
+ sprintf(buf, "%pM", enetaddr);
+
+ return env_set(name, buf);
+}
+
+/*
+ * Look up variable from environment,
+ * return address of storage for that variable,
+ * or NULL if not found
+ */
+char *env_get(const char *name)
+{
+ if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */
+ struct env_entry e, *ep;
+
+ WATCHDOG_RESET();
+
+ e.key = name;
+ e.data = NULL;
+ hsearch_r(e, ENV_FIND, &ep, &env_htab, 0);
+
+ return ep ? ep->data : NULL;
+ }
+
+ /* restricted capabilities before import */
+ if (env_get_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
+ return (char *)(gd->env_buf);
+
+ return NULL;
+}
+
+/*
+ * Like env_get, but prints an error if envvar isn't defined in the
+ * environment. It always returns what env_get does, so it can be used in
+ * place of env_get without changing error handling otherwise.
+ */
+char *from_env(const char *envvar)
+{
+ char *ret;
+
+ ret = env_get(envvar);
+
+ if (!ret)
+ printf("missing environment variable: %s\n", envvar);
+
+ return ret;
+}
+
+/*
+ * Look up variable from environment for restricted C runtime env.
+ */
+int env_get_f(const char *name, char *buf, unsigned len)
+{
+ const char *env, *p, *end;
+ size_t name_len;
+
+ if (name == NULL || *name == '\0')
+ return -1;
+
+ name_len = strlen(name);
+
+ if (gd->env_valid == ENV_INVALID)
+ env = (const char *)default_environment;
+ else
+ env = (const char *)gd->env_addr;
+
+ for (p = env; *p != '\0'; p = end + 1) {
+ const char *value;
+ unsigned res;
+
+ for (end = p; *end != '\0'; ++end)
+ if (end - env >= CONFIG_ENV_SIZE)
+ return -1;
+
+ if (strncmp(name, p, name_len) || p[name_len] != '=')
+ continue;
+ value = &p[name_len + 1];
+
+ res = end - value;
+ memcpy(buf, value, min(len, res + 1));
+
+ if (len <= res) {
+ buf[len - 1] = '\0';
+ printf("env_buf [%u bytes] too small for value of \"%s\"\n",
+ len, name);
+ }
+
+ return res;
+ }
+
+ return -1;
+}
+
+/**
+ * Decode the integer value of an environment variable and return it.
+ *
+ * @param name Name of environment variable
+ * @param base Number base to use (normally 10, or 16 for hex)
+ * @param default_val Default value to return if the variable is not
+ * found
+ * @return the decoded value, or default_val if not found
+ */
+ulong env_get_ulong(const char *name, int base, ulong default_val)
+{
+ /*
+ * We can use env_get() here, even before relocation, since the
+ * environment variable value is an integer and thus short.
+ */
+ const char *str = env_get(name);
+
+ return str ? simple_strtoul(str, NULL, base) : default_val;
+}
+
/*
* Read an environment variable as a boolean
* Return -1 if variable does not exist (default to true)
--
2.32.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f()
2021-10-17 15:36 ` [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f() Marek Behún
@ 2021-10-18 18:12 ` Simon Glass
2021-10-19 0:49 ` Marek Behún
0 siblings, 1 reply; 30+ messages in thread
From: Simon Glass @ 2021-10-18 18:12 UTC (permalink / raw)
To: Marek Behún; +Cc: Tom Rini, U-Boot Mailing List, Marek Behún
On Sun, 17 Oct 2021 at 09:37, Marek Behún <kabel@kernel.org> wrote:
>
> From: Marek Behún <marek.behun@nic.cz>
>
> In the past the env_match() function was used to match envs with
> - name, i.e. string "name"
> - variable assignment, i.e. string "name=other_value"
>
> The latter is not the case anymore, since the env_match() function is
> now used only in env_get_f(), and so we can simplify the function into
> a simple strncmp() with an additional comparison to '='.
>
> Let's do this, and since the resulting function is quite simple, let's
> also inline its code into env_get_f().
>
> Signed-off-by: Marek Behún <marek.behun@nic.cz>
> ---
> cmd/nvedit.c | 19 +++++--------------
> 1 file changed, 5 insertions(+), 14 deletions(-)
Reviewed-by: Simon Glass <sjg@chromium.org>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f()
2021-10-18 18:12 ` Simon Glass
@ 2021-10-19 0:49 ` Marek Behún
2021-10-19 14:11 ` Simon Glass
2021-10-21 18:49 ` Simon Glass
0 siblings, 2 replies; 30+ messages in thread
From: Marek Behún @ 2021-10-19 0:49 UTC (permalink / raw)
To: Simon Glass; +Cc: Tom Rini, U-Boot Mailing List, Marek Behún
> Reviewed-by: Simon Glass <sjg@chromium.org>
Simon, thanks. Will you be taking this through your tree or should I
change delegate to Tom?
Marek
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f()
2021-10-19 0:49 ` Marek Behún
@ 2021-10-19 14:11 ` Simon Glass
2021-10-21 18:49 ` Simon Glass
1 sibling, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-19 14:11 UTC (permalink / raw)
To: Marek Behún; +Cc: Tom Rini, U-Boot Mailing List, Marek Behún
Hi Marek,
On Mon, 18 Oct 2021 at 18:50, Marek Behún <kabel@kernel.org> wrote:
>
> > Reviewed-by: Simon Glass <sjg@chromium.org>
>
> Simon, thanks. Will you be taking this through your tree or should I
> change delegate to Tom?
I see it in my queue so I'll pick it up.
Regards,
Simon
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f()
2021-10-19 0:49 ` Marek Behún
2021-10-19 14:11 ` Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
1 sibling, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Simon Glass
Cc: Tom Rini, U-Boot Mailing List, Marek Behún, Marek Behún
Hi Marek,
On Mon, 18 Oct 2021 at 18:50, Marek Behún <kabel@kernel.org> wrote:
>
> > Reviewed-by: Simon Glass <sjg@chromium.org>
>
> Simon, thanks. Will you be taking this through your tree or should I
> change delegate to Tom?
I see it in my queue so I'll pick it up.
Regards,
Simon
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 13/13] env: Move non-cli env functions to env/common.c
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (12 preceding siblings ...)
2021-10-17 15:36 ` [PATCH v3 13/13] env: Move non-cli env functions to env/common.c Marek Behún
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 11/13] env: Use memcpy() instead of ad-hoc code to copy variable value Simon Glass
` (10 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
Move the following functions from cmd/nvedit.c to env/common.c:
env_set_ulong()
env_set_hex()
env_get_hex()
eth_env_get_enetaddr()
eth_env_set_enetaddr()
env_get()
from_env()
env_get_f()
env_get_ulong()
since these functions are not specific for U-Boot's CLI.
We leave env_set() in cmd/nvedit.c, since it calls _do_env_set(), which
is a static function in that file.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 175 -------------------------------------------------
env/common.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 180 insertions(+), 175 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 11/13] env: Use memcpy() instead of ad-hoc code to copy variable value
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (13 preceding siblings ...)
2021-10-21 18:49 ` Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 10/13] env: Make return value of env_get_f() behave like sprintf() on success Simon Glass
` (9 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
Copy the value of the found variable into given buffer with memcpy()
instead of ad-hoc code.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 10/13] env: Make return value of env_get_f() behave like sprintf() on success
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (14 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 11/13] env: Use memcpy() instead of ad-hoc code to copy variable value Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 09/13] env: Early return from env_get_f() on NULL name Simon Glass
` (8 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
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 | 8 +++++---
include/env.h | 6 ++----
2 files changed, 7 insertions(+), 7 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 09/13] env: Early return from env_get_f() on NULL name
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (15 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 10/13] env: Make return value of env_get_f() behave like sprintf() on success Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 07/13] env: Use better name for variable in env_get_f() Simon Glass
` (7 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
Test non-NULL name immediately, not in env_match().
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 07/13] env: Use better name for variable in env_get_f()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (16 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 09/13] env: Early return from env_get_f() on NULL name Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 08/13] env: Don't match empty variable name in env_match() Simon Glass
` (6 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
The `nxt` variable actually points to the terminating null-byte of the
current env var, and the next env var is at `nxt + 1`, not `nxt`. So a
better name for this variable is `end`.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 08/13] env: Don't match empty variable name in env_match()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (17 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 07/13] env: Use better name for variable in env_get_f() Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 06/13] env: Use string pointer instead of indexes in env_get_f() Simon Glass
` (5 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
Do we really allow zero-length variable name? I guess not.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 06/13] env: Use string pointer instead of indexes in env_get_f()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (18 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 08/13] env: Don't match empty variable name in env_match() Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 05/13] env: Inline env_get_char() into its only user Simon Glass
` (4 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
Since we no longer use env_get_char() to access n-th character of
linearized environment data, but rather access the arrays themselves, we
can convert the iteration to use string pointers instead of position
indexes.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 05/13] env: Inline env_get_char() into its only user
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (19 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 06/13] env: Use string pointer instead of indexes in env_get_f() Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 03/13] examples: api: glue: Remove comment that does not apply anymore Simon Glass
` (3 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
This function is a relic from the past when environment was read from
underlying device one character at a time.
It is used only in the case when getting an environemnt variable prior
relocation, and the function is simple enough to be inlined there.
Since env_get_char() is being changed to simple access to an array, we
can drop the failing cases and simplify the code (this could have been
done before, since env_get_char() did not fail even before).
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 28 ++++++++++++++--------------
env/env.c | 8 --------
env/nowhere.c | 5 ++---
include/env.h | 10 ----------
4 files changed, 16 insertions(+), 35 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 04/13] env: Change env_match() to static and remove from header
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (21 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 03/13] examples: api: glue: Remove comment that does not apply anymore Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 02/13] env: Drop env_get_char_spec() and old, unused .get_char() implementations Simon Glass
2021-10-21 18:49 ` [PATCH v3 01/13] env: Fix documentation for env_get_f() Simon Glass
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
This function was used by other parts of U-Boot in the past when
environment was read from underlying device one character at a time.
This is not the case anymore.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
cmd/nvedit.c | 30 +++++++++++++++---------------
include/env.h | 11 -----------
2 files changed, 15 insertions(+), 26 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 03/13] examples: api: glue: Remove comment that does not apply anymore
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (20 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 05/13] env: Inline env_get_char() into its only user Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 04/13] env: Change env_match() to static and remove from header Simon Glass
` (2 subsequent siblings)
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
This comment is not true since commit 6215bd4c1fd6 ("api: Use hashtable
function for API_env_enum").
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
examples/api/glue.c | 5 -----
1 file changed, 5 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 02/13] env: Drop env_get_char_spec() and old, unused .get_char() implementations
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (22 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 04/13] env: Change env_match() to static and remove from header Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 01/13] env: Fix documentation for env_get_f() Simon Glass
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
Commit b2cdef4861be ("env: restore old env_get_char() behaviour")
dropped the .get_char() method from struct env_driver, but left the two
existing implementations (eeprom and nvram) in case someone would use
them by overwriting weak function env_get_char_spec().
Since this was never done in the 3.5 years, let's drop these methods and
simplify the code.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
env/eeprom.c | 18 ------------------
env/env.c | 7 +------
env/nvram.c | 14 --------------
3 files changed, 1 insertion(+), 38 deletions(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH v3 01/13] env: Fix documentation for env_get_f()
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
` (23 preceding siblings ...)
2021-10-21 18:49 ` [PATCH v3 02/13] env: Drop env_get_char_spec() and old, unused .get_char() implementations Simon Glass
@ 2021-10-21 18:49 ` Simon Glass
24 siblings, 0 replies; 30+ messages in thread
From: Simon Glass @ 2021-10-21 18:49 UTC (permalink / raw)
To: Marek Behún
Cc: U-Boot Mailing List, Marek Behún, Simon Glass, Tom Rini
From: Marek Behún <marek.behun@nic.cz>
This function actually returns:
- the number of bytes written into @buf excluding the terminating
NULL-byte, if there was enough space in @buf
- the number of bytes written into @buf including the terminating
NULL-byte, if there wasn't enough space in @buf
- -1 if the variable is not found
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
include/env.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
Applied to u-boot-dm, thanks!
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2021-10-21 18:52 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-17 15:36 [PATCH v3 00/13] env_get_char() removal and env_get_f() refactor Marek Behún
2021-10-17 15:36 ` [PATCH v3 01/13] env: Fix documentation for env_get_f() Marek Behún
2021-10-17 15:36 ` [PATCH v3 02/13] env: Drop env_get_char_spec() and old, unused .get_char() implementations Marek Behún
2021-10-17 15:36 ` [PATCH v3 03/13] examples: api: glue: Remove comment that does not apply anymore Marek Behún
2021-10-17 15:36 ` [PATCH v3 04/13] env: Change env_match() to static and remove from header Marek Behún
2021-10-17 15:36 ` [PATCH v3 05/13] env: Inline env_get_char() into its only user Marek Behún
2021-10-17 15:36 ` [PATCH v3 06/13] env: Use string pointer instead of indexes in env_get_f() Marek Behún
2021-10-17 15:36 ` [PATCH v3 07/13] env: Use better name for variable " Marek Behún
2021-10-17 15:36 ` [PATCH v3 08/13] env: Don't match empty variable name in env_match() Marek Behún
2021-10-17 15:36 ` [PATCH v3 09/13] env: Early return from env_get_f() on NULL name Marek Behún
2021-10-17 15:36 ` [PATCH v3 10/13] env: Make return value of env_get_f() behave like sprintf() on success Marek Behún
2021-10-17 15:36 ` [PATCH v3 11/13] env: Use memcpy() instead of ad-hoc code to copy variable value Marek Behún
2021-10-17 15:36 ` [PATCH v3 12/13] env: Simplify env_match() and inline into env_get_f() Marek Behún
2021-10-18 18:12 ` Simon Glass
2021-10-19 0:49 ` Marek Behún
2021-10-19 14:11 ` Simon Glass
2021-10-21 18:49 ` Simon Glass
2021-10-17 15:36 ` [PATCH v3 13/13] env: Move non-cli env functions to env/common.c Marek Behún
2021-10-21 18:49 ` Simon Glass
2021-10-21 18:49 ` [PATCH v3 11/13] env: Use memcpy() instead of ad-hoc code to copy variable value Simon Glass
2021-10-21 18:49 ` [PATCH v3 10/13] env: Make return value of env_get_f() behave like sprintf() on success Simon Glass
2021-10-21 18:49 ` [PATCH v3 09/13] env: Early return from env_get_f() on NULL name Simon Glass
2021-10-21 18:49 ` [PATCH v3 07/13] env: Use better name for variable in env_get_f() Simon Glass
2021-10-21 18:49 ` [PATCH v3 08/13] env: Don't match empty variable name in env_match() Simon Glass
2021-10-21 18:49 ` [PATCH v3 06/13] env: Use string pointer instead of indexes in env_get_f() Simon Glass
2021-10-21 18:49 ` [PATCH v3 05/13] env: Inline env_get_char() into its only user Simon Glass
2021-10-21 18:49 ` [PATCH v3 03/13] examples: api: glue: Remove comment that does not apply anymore Simon Glass
2021-10-21 18:49 ` [PATCH v3 04/13] env: Change env_match() to static and remove from header Simon Glass
2021-10-21 18:49 ` [PATCH v3 02/13] env: Drop env_get_char_spec() and old, unused .get_char() implementations Simon Glass
2021-10-21 18:49 ` [PATCH v3 01/13] env: Fix documentation for env_get_f() Simon Glass
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).