[U-Boot] [PATCH v4 7/7] env: delete selected vars not present in imported env
Marek Vasut
marek.vasut at gmail.com
Fri Aug 24 16:58:56 CEST 2012
Dear Gerlando Falauto,
> When variables explicitly specified on the command line are not present
> in the imported env, delete them from the running env.
> If the variable is also missing from the running env, issue a warning.
>
> Signed-off-by: Gerlando Falauto <gerlando.falauto at keymile.com>
Whew! I made it through ... it wasn't that scary in the end ;-)
> ---
> lib/hashtable.c | 48 +++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 41 insertions(+), 7 deletions(-)
>
> diff --git a/lib/hashtable.c b/lib/hashtable.c
> index f3f47de..b3d0b64 100644
> --- a/lib/hashtable.c
> +++ b/lib/hashtable.c
> @@ -607,22 +607,32 @@ ssize_t hexport_r(struct hsearch_data *htab, const
> char sep, * himport()
> */
>
> -/* Check whether variable name is amongst vars[] */
> -static int is_var_in_set(const char *name, int nvars, char * const vars[])
> +/*
> + * Check whether variable 'name' is amongst vars[],
> + * and remove all instances by setting the pointer to NULL
> + */
> +static int is_var_in_set(const char *name, int nvars, char * vars[])
> {
> int i = 0;
> + int res = 0;
>
> /* No variables specified means process all of them */
> if (nvars == 0)
> return 1;
>
> for (i = 0; i < nvars; i++) {
> - if (!strcmp(name, vars[i]))
> - return 1;
> + if (vars[i] == NULL)
> + continue;
> + /* If we found it, delete all of them */
> + if (!strcmp(name, vars[i])) {
> + vars[i] = NULL;
> + res = 1;
break here ?
> + }
> }
> - debug("Skipping non-listed variable %s\n", name);
> + if (!res)
> + debug("Skipping non-listed variable %s\n", name);
>
> - return 0;
> + return res;
> }
>
> /*
> @@ -662,9 +672,11 @@ static int is_var_in_set(const char *name, int nvars,
> char * const vars[])
>
> int himport_r(struct hsearch_data *htab,
> const char *env, size_t size, const char sep, int flag,
> - int nvars, char * const vars[], int do_apply)
> + int nvars, char * const __vars[], int do_apply)
Two underscores are reserved, use something else ;-)
> {
> char *data, *sp, *dp, *name, *value;
> + char *vars[nvars];
> + int i;
>
> /* Test for correct arguments. */
> if (htab == NULL) {
> @@ -681,6 +693,10 @@ int himport_r(struct hsearch_data *htab,
> memcpy(data, env, size);
> dp = data;
>
> + /* make a local copy of the list of variables */
> + if (nvars)
> + memcpy(vars, __vars, sizeof(__vars[0]) * nvars);
> +
> if ((flag & H_NOCLEAR) == 0) {
> /* Destroy old hash table if one exists */
> debug("Destroy Hash Table: %p table = %p\n", htab,
> @@ -809,6 +825,24 @@ int himport_r(struct hsearch_data *htab,
> debug("INSERT: free(data = %p)\n", data);
> free(data);
>
> + /* process variables which were not considered */
> + for (i = 0; i < nvars; i++) {
> + if (vars[i] == NULL)
> + continue;
> + /*
> + * All variables which were not deleted from the variable list
> + * were not present in the imported env
> + * This could mean two things:
> + * a) if the variable was present in current env, we delete it
> + * b) if the variable was not present in current env, we notify
> + * it might be a typo
> + */
> + if (hdelete_r(vars[i], htab, do_apply) == 0)
> + printf("WARNING: '%s' neither in running nor in imported
env!\n",
> vars[i]); + else
> + printf("WARNING: '%s' not in imported env, deleting it!
\n", vars[i]);
> + }
> +
> debug("INSERT: done\n");
> return 1; /* everything OK */
> }
Best regards,
Marek Vasut
More information about the U-Boot
mailing list