]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
env: remove vars that are not in default env
authorRavi Minnikanti <rminnikanti@marvell.com>
Sun, 11 Aug 2024 18:44:15 +0000 (11:44 -0700)
committerTom Rini <trini@konsulko.com>
Thu, 15 Aug 2024 17:50:47 +0000 (11:50 -0600)
current env_set_default_vars() doesn't delete
var that are not in the imported env. hashtable
removes vars that are not in the imported
env but present in the current env only if H_NOCLEAR
flag is not set.

This change is to avoid passing H_NOCLEAR flag if
specific vars are passed to env_set_default_vars()

Without this change:
Marvell>> env default boot_mode
Marvell>>

With the change:
Marvell>> env default boot_mode
WARNING: 'boot_mode' not in imported env, deleting it!

Signed-off-by: Ravi Minnikanti <rminnikanti@marvell.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
doc/usage/cmd/env.rst
env/common.c
test/env/cmd_ut_env.c

index 9629f97ffc4779d252a0c4ea6cecd20fc9073e42..b65d85b66813117bc1a844c2a28588097e076109 100644 (file)
@@ -79,7 +79,8 @@ The *env default* command resets the selected variables in the U-Boot
 environment to their default values.
 
     var
-        list of variable name.
+        list of variable names. If variable is not part of default
+        environment, it is deleted with a warning message on console.
     \-a
         all U-Boot environment.
     \-f
@@ -309,6 +310,7 @@ Delete environment variable in memory::
 Reset environment variable to default value, in memory::
 
     => env default bootcmd
+    => env default ipaddr serverip
     => env default -a
 
 Save current environment in persistent storage::
index 8d47d726059e11acb103d6e3a083d35c73329829..6cba7f1c187fc780837d305c9d7132079baa30c3 100644 (file)
@@ -401,7 +401,15 @@ int env_set_default_vars(int nvars, char * const vars[], int flags)
         * Special use-case: import from default environment
         * (and use \0 as a separator)
         */
-       flags |= H_NOCLEAR | H_DEFAULT;
+
+       /*
+        * When vars are passed remove variables that are not in
+        * the default environment.
+        */
+       if (!nvars)
+               flags |= H_NOCLEAR;
+
+       flags |= H_DEFAULT;
        return himport_r(&env_htab, default_environment,
                                sizeof(default_environment), '\0',
                                flags, 0, nvars, vars);
index 13e0998341e7e4ed3b59583b092cdfb4b74a6791..238cf3103678a8efa00831a2224ce89ecbf2c5a6 100644 (file)
@@ -9,6 +9,33 @@
 #include <test/suites.h>
 #include <test/ut.h>
 
+static int env_test_env_cmd(struct unit_test_state *uts)
+{
+       ut_assertok(run_command("setenv non_default_var1 1", 0));
+       ut_assert_console_end();
+
+       ut_assertok(run_command("setenv non_default_var2 1", 0));
+       ut_assert_console_end();
+
+       ut_assertok(run_command("env print non_default_var1", 0));
+       ut_assert_nextline("non_default_var1=1");
+       ut_assert_console_end();
+
+       ut_assertok(run_command("env default non_default_var1 non_default_var2", 0));
+       ut_assert_nextline("WARNING: 'non_default_var1' not in imported env, deleting it!");
+       ut_assert_nextline("WARNING: 'non_default_var2' not in imported env, deleting it!");
+       ut_assert_console_end();
+
+       ut_asserteq(1, run_command("env exists non_default_var1", 0));
+       ut_assert_console_end();
+
+       ut_asserteq(1, run_command("env exists non_default_var2", 0));
+       ut_assert_console_end();
+
+       return 0;
+}
+ENV_TEST(env_test_env_cmd, UT_TESTF_CONSOLE_REC);
+
 int do_ut_env(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
        struct unit_test *tests = UNIT_TEST_SUITE_START(env_test);