diff options
author | Simon Glass <sjg@chromium.org> | 2020-11-05 10:33:37 -0700 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2020-12-04 16:09:06 -0500 |
commit | 96434a76fd254248ded19e95dc967d28e65a5edf (patch) | |
tree | f7bcdd880ec983c695273b842276bda423a72741 /lib/hashtable.c | |
parent | 4c450daf7d5d48ef075980e11052bf6bb28db4f6 (diff) | |
download | u-boot-96434a76fd254248ded19e95dc967d28e65a5edf.tar.gz u-boot-96434a76fd254248ded19e95dc967d28e65a5edf.tar.bz2 u-boot-96434a76fd254248ded19e95dc967d28e65a5edf.zip |
env: Allow returning errors from hdelete_r()
At present this function returns 1 on success and 0 on failure. But in
the latter case it provides no indication of what went wrong.
If an attempt is made to delete a non-existent variable, the caller may
want to ignore this error. This happens when setting a non-existent
variable to "", for example.
Update the function to return 0 on success and a useful error code on
failure. Add a function comment too.
Make sure that env_set() does not return an error if it is deleting a
variable that doesn't exist. We could update env_set() to return useful
error numbers also, but that is beyond the scope of this change.
Signed-off-by: Simon Glass <sjg@chromium.org>
wip
Diffstat (limited to 'lib/hashtable.c')
-rw-r--r-- | lib/hashtable.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/lib/hashtable.c b/lib/hashtable.c index 7c08f5c805..ff5ff72639 100644 --- a/lib/hashtable.c +++ b/lib/hashtable.c @@ -472,7 +472,7 @@ int hdelete_r(const char *key, struct hsearch_data *htab, int flag) idx = hsearch_r(e, ENV_FIND, &ep, htab, 0); if (idx == 0) { __set_errno(ESRCH); - return 0; /* not found */ + return -ENOENT; /* not found */ } /* Check for permission */ @@ -481,7 +481,7 @@ int hdelete_r(const char *key, struct hsearch_data *htab, int flag) debug("change_ok() rejected deleting variable " "%s, skipping it!\n", key); __set_errno(EPERM); - return 0; + return -EPERM; } /* If there is a callback, call it */ @@ -490,12 +490,12 @@ int hdelete_r(const char *key, struct hsearch_data *htab, int flag) debug("callback() rejected deleting variable " "%s, skipping it!\n", key); __set_errno(EINVAL); - return 0; + return -EINVAL; } _hdelete(key, htab, ep, idx); - return 1; + return 0; } #if !(defined(CONFIG_SPL_BUILD) && !defined(CONFIG_SPL_SAVEENV)) @@ -917,7 +917,7 @@ int himport_r(struct hsearch_data *htab, if (!drop_var_from_set(name, nvars, localvars)) continue; - if (hdelete_r(name, htab, flag) == 0) + if (hdelete_r(name, htab, flag)) debug("DELETE ERROR ##############################\n"); continue; @@ -979,7 +979,7 @@ int himport_r(struct hsearch_data *htab, * b) if the variable was not present in current env, we notify * it might be a typo */ - if (hdelete_r(localvars[i], htab, flag) == 0) + if (hdelete_r(localvars[i], htab, flag)) printf("WARNING: '%s' neither in running nor in imported env!\n", localvars[i]); else printf("WARNING: '%s' not in imported env, deleting it!\n", localvars[i]); |