Hi, On Wed, Dec 7, 2011 at 5:30 AM, Gerlando Falauto <gerlando.fala...@keymile.com> wrote: > The logic of checking special parameters (e.g. baudrate, stdin, stdout, > for a valid value and/or whether can be overwritten) and applying the > new value to the running system is now all within a single function > env_check_apply() which can be called whenever changes are made > to the environment, no matter if by set, default or import.
Thanks for the rebase - I was able to try this out. > > With this patch env_check_apply() is only called by "env set", > retaining previous behavior. > > Also allow for selectively importing/resetting variables. > > So add 3 new arguments to himport_r(): > o "nvars", "vars":, number and list of variables to take into account > (0 means ALL) > > o "apply" callback function to check whether a variable can be > overwritten, and possibly immediately apply the changes; > when NULL, no check is performed. > > Signed-off-by: Gerlando Falauto <gerlando.fala...@keymile.com> Tested-by: Simon Glass <s...@chromium.org> > --- > common/cmd_nvedit.c | 174 > +++++++++++++++++++++++++++++++------------------ > common/env_common.c | 6 +- > include/environment.h | 7 ++ > include/search.h | 17 +++++- > lib/hashtable.c | 43 ++++++++++++- > 5 files changed, 180 insertions(+), 67 deletions(-) > > diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c > index 5995354..a31d413 100644 > --- a/common/cmd_nvedit.c > +++ b/common/cmd_nvedit.c > @@ -197,32 +197,23 @@ static int do_env_grep(cmd_tbl_t *cmdtp, int flag, > #endif > > /* > - * Set a new environment variable, > - * or replace or delete an existing one. > + * Performs consistency checking before setting, replacing, > + * or deleting an environment variable, then (if successful) > + * apply the changes to internals so to make them effective. > + * Code for this function was taken out of _do_env_set(), > + * which now calls it. > + * Also called as a callback function by himport_r(). > + * Returns 0 in case of success, 1 in case of failure. > + * When (flag & H_FORCE) is set, force overwriting of > + * write-once variables. can you word-wrap that to 72 columns perhaps? > diff --git a/include/environment.h b/include/environment.h > index 3c145af..3a3e6b8 100644 > --- a/include/environment.h > +++ b/include/environment.h > @@ -193,6 +193,13 @@ void set_default_env(const char *s); > /* Import from binary representation into hash table */ > int env_import(const char *buf, int check); > > +/* > + * Check if variable "name" can be changed from oldval to newval, > + * and if so, apply the changes (e.g. baudrate) Can you document flag here also please? > @@ -47,6 +47,13 @@ typedef struct entry { > struct _ENTRY; > > /* > + * Callback function to be called for checking whether the given change may > + * be applied or not. Must return 0 for approval, 1 for denial. > + */ > +typedef int (*apply_cb)(const char *name, const char *oldval, > + const char *newval, int flag); can you document args also? > + > +/* > * Family of hash table handling functions. The functions also > * have reentrant counterparts ending with _r. The non-reentrant > * functions all work on a signle internal hashing table. > @@ -94,11 +101,19 @@ extern ssize_t hexport_r(struct hsearch_data *__htab, > const char __sep, char **__resp, size_t __size, > int argc, char * const argv[]); > > +/* > + * nvars, vars: variables to import (nvars == 0 means all) > + * apply_cb: callback function to check validity of the new argument, > + * and possibly apply changes (NULL means accept everything) > + */ What is vars? Is it a NULL terminated list of string pointers? Please document. But actually you already have function comments in the C file so I think you should either add your comments there or (better in my view but I may be alone) move the comments to the header file. > extern int himport_r(struct hsearch_data *__htab, > const char *__env, size_t __size, const char __sep, > - int __flag); > + int __flag, > + int nvars, char * const vars[], > + apply_cb apply); > diff --git a/lib/hashtable.c b/lib/hashtable.c > index abd61c8..75b9b07 100644 > --- a/lib/hashtable.c > +++ b/lib/hashtable.c > @@ -603,6 +603,22 @@ ssize_t hexport_r(struct hsearch_data *htab, const char > sep, > * himport() > */ > > +/* Check whether variable name is amongst vars[] */ > +static int process_var(const char *name, int nvars, char * const vars[]) > +{ > + int i = 0; blank line here. Can part of this function be #ifdefed to reduce code size when the feature is not required? > + /* 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; > + } > + debug("Skipping non-listed variable %s\n", name); and here I think according to Mike > + return 0; > +} > + > /* > * Import linearized data into hash table. > * > @@ -743,10 +763,31 @@ int himport_r(struct hsearch_data *htab, > *sp++ = '\0'; /* terminate value */ > ++dp; > > + /* Skip variables which are not supposed to be treated */ s/treated/processed/ ? + if (!process_var(name, nvars, vars)) + continue; if (hdelete_r(name, htab) == 0) debug("DELETE ERROR ##############################\n"); perhaps: if (process_var(name, nvars, vars) && hdelete_r(name, htab) == 0) debug("DELETE ERROR ##############################\n"); himport_r() is getting a bit overloaded, and it's a shame but I can't think of an easy way to refactor it to reduce the number of args. In a way you are adding a processing option and so you could put the three extra args in a structure and pass a pointer to it (or NULL to skip this feature). Not sure though... Also, for me this patch adds 500 bytes. I wonder if more of the code could made optional? Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot