env: add check/apply logic to himport_r()

Change hashtable so that a callback function will decide whether a
variable can be overwritten, and possibly apply the changes.

So add a new field to struct hsearch_data:

 o "apply" callback function to check whether a variable can be
    overwritten, and possibly immediately apply the changes;
    when NULL, no check is performed.

And a new argument to himport_r():
 o "do_apply": whether to call the apply callback function

NOTE: This patch does not change the current behavior.

Signed-off-by: Gerlando Falauto <gerlando.falauto@keymile.com>
Reviewed-by: Marek Vasut <marex@denx.de>
This commit is contained in:
Gerlando Falauto
2012-08-24 00:11:39 +00:00
committed by Tom Rini
parent 348b1f1c60
commit c5983592e9
5 changed files with 48 additions and 6 deletions

View File

@ -658,7 +658,7 @@ 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 nvars, char * const vars[], int do_apply)
{
char *data, *sp, *dp, *name, *value;
@ -772,6 +772,24 @@ int himport_r(struct hsearch_data *htab,
e.key = name;
e.data = value;
/* if there is an apply function, check what it has to say */
if (do_apply && htab->apply != NULL) {
debug("searching before calling cb function"
" for %s\n", name);
/*
* Search for variable in existing env, so to pass
* its previous value to the apply callback
*/
hsearch_r(e, FIND, &rv, htab);
debug("previous value was %s\n", rv ? rv->data : "");
if (htab->apply(name, rv ? rv->data : NULL,
value, flag)) {
debug("callback function refused to set"
" variable %s, skipping it!\n", name);
continue;
}
}
hsearch_r(e, ENTER, &rv, htab);
if (rv == NULL) {
printf("himport_r: can't insert \"%s=%s\" into hash table\n",