[U-Boot] [PATCH v5 7/7] env: delete selected vars not present in imported env

Marek Vasut marex at denx.de
Mon Aug 27 12:02:19 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>

Looks reasonable ...

Reviewed-by: Marek Vasut <marex at denx.de>

> ---
> Changes from v4:
> - renamed is_var_in_set to drop_var_from_set
> - removed leading double underscore from vars[] variable name
> ---
>  lib/hashtable.c |   50 ++++++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 42 insertions(+), 8 deletions(-)
> 
> diff --git a/lib/hashtable.c b/lib/hashtable.c
> index f3f47de..670a704 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 drop_var_from_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;
>  }
> 
>  /*
> @@ -665,6 +675,8 @@ int himport_r(struct hsearch_data *htab,
>  		int nvars, char * const vars[], int do_apply)
>  {
>  	char *data, *sp, *dp, *name, *value;
> +	char *localvars[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(localvars, 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,
> @@ -749,7 +765,7 @@ int himport_r(struct hsearch_data *htab,
>  			*dp++ = '\0';	/* terminate name */
> 
>  			debug("DELETE CANDIDATE: \"%s\"\n", name);
> -			if (!is_var_in_set(name, nvars, vars))
> +			if (!drop_var_from_set(name, nvars, localvars))
>  				continue;
> 
>  			if (hdelete_r(name, htab, do_apply) == 0)
> @@ -769,7 +785,7 @@ int himport_r(struct hsearch_data *htab,
>  		++dp;
> 
>  		/* Skip variables which are not supposed to be processed */
> -		if (!is_var_in_set(name, nvars, vars))
> +		if (!drop_var_from_set(name, nvars, localvars))
>  			continue;
> 
>  		/* enter into hash table */
> @@ -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 (localvars[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(localvars[i], htab, do_apply) == 0)
> +			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]); +	}
> +
>  	debug("INSERT: done\n");
>  	return 1;		/* everything OK */
>  }


More information about the U-Boot mailing list