From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gerlando Falauto Date: Fri, 24 Aug 2012 17:16:37 +0200 Subject: [U-Boot] [PATCH v4 7/7] env: delete selected vars not present in imported env In-Reply-To: <201208241658.56669.marex@denx.de> References: <1321634955-5561-1-git-send-email-gerlando.falauto@keymile.com> <1345803102-21110-1-git-send-email-gerlando.falauto@keymile.com> <1345803102-21110-8-git-send-email-gerlando.falauto@keymile.com> <201208241658.56669.marex@denx.de> Message-ID: <50379AD5.6030709@keymile.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 08/24/2012 04:58 PM, Marek Vasut wrote: > 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 > > 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 ? Nope, if we find it, we should delete all of them (see comment above). > >> + } >> } >> - 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 ;-) Like... one? three? ;-) > >> { >> 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 Best regards, Gerlando