mirror of
https://github.com/linux-sunxi/u-boot-sunxi.git
synced 2024-02-12 11:16:03 +08:00
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:

committed by
Tom Rini

parent
348b1f1c60
commit
c5983592e9
@ -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",
|
||||
|
Reference in New Issue
Block a user