diff mbox

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

Message ID 1346053980-5514-1-git-send-email-gerlando.falauto@keymile.com
State Accepted
Commit d5370febbcbcee3f554df13ed72b7e2b91e5f66c
Delegated to: Tom Rini
Headers show

Commit Message

Gerlando Falauto Aug. 27, 2012, 7:53 a.m. UTC
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@keymile.com>
---
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(-)

Comments

Marek Vasut Aug. 27, 2012, 10:02 a.m. UTC | #1
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@keymile.com>

Looks reasonable ...

Reviewed-by: Marek Vasut <marex@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 */
>  }
diff mbox

Patch

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 */
 }