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.fala...@keymile.com>
> ---
>  lib/hashtable.c |   48 +++++++++++++++++++++++++++++++++++++++++-------
>  1 files 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;
> +             }
>       }
> -     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)
>  {
>       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);

Stupid question -- do you need the local copy at all? Why?

> +
>       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 */
>  }
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to