env: Allow env_attr_walk to pass a priv * to callback

In some cases it can be helpful to have context in the callback about
the calling situation. This is needed for following patches.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Joe Hershberger 2015-05-20 14:27:19 -05:00 committed by Tom Rini
parent 032ea185d6
commit cca98fd6aa
5 changed files with 20 additions and 17 deletions

View file

@ -427,7 +427,8 @@ int do_env_ask(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
#endif #endif
#if defined(CONFIG_CMD_ENV_CALLBACK) #if defined(CONFIG_CMD_ENV_CALLBACK)
static int print_static_binding(const char *var_name, const char *callback_name) static int print_static_binding(const char *var_name, const char *callback_name,
void *priv)
{ {
printf("\t%-20s %-20s\n", var_name, callback_name); printf("\t%-20s %-20s\n", var_name, callback_name);
@ -489,7 +490,7 @@ int do_env_callback(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
puts("Static callback bindings:\n"); puts("Static callback bindings:\n");
printf("\t%-20s %-20s\n", "Variable Name", "Callback Name"); printf("\t%-20s %-20s\n", "Variable Name", "Callback Name");
printf("\t%-20s %-20s\n", "-------------", "-------------"); printf("\t%-20s %-20s\n", "-------------", "-------------");
env_attr_walk(ENV_CALLBACK_LIST_STATIC, print_static_binding); env_attr_walk(ENV_CALLBACK_LIST_STATIC, print_static_binding, NULL);
puts("\n"); puts("\n");
/* walk through each variable and print the callback if it has one */ /* walk through each variable and print the callback if it has one */
@ -502,7 +503,8 @@ int do_env_callback(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
#endif #endif
#if defined(CONFIG_CMD_ENV_FLAGS) #if defined(CONFIG_CMD_ENV_FLAGS)
static int print_static_flags(const char *var_name, const char *flags) static int print_static_flags(const char *var_name, const char *flags,
void *priv)
{ {
enum env_flags_vartype type = env_flags_parse_vartype(flags); enum env_flags_vartype type = env_flags_parse_vartype(flags);
enum env_flags_varaccess access = env_flags_parse_varaccess(flags); enum env_flags_varaccess access = env_flags_parse_varaccess(flags);
@ -559,7 +561,7 @@ int do_env_flags(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
"Variable Access"); "Variable Access");
printf("\t%-20s %-20s %-20s\n", "-------------", "-------------", printf("\t%-20s %-20s %-20s\n", "-------------", "-------------",
"---------------"); "---------------");
env_attr_walk(ENV_FLAGS_LIST_STATIC, print_static_flags); env_attr_walk(ENV_FLAGS_LIST_STATIC, print_static_flags, NULL);
puts("\n"); puts("\n");
/* walk through each variable and print the flags if non-default */ /* walk through each variable and print the flags if non-default */

View file

@ -26,7 +26,8 @@
* list = entry[,list] * list = entry[,list]
*/ */
int env_attr_walk(const char *attr_list, int env_attr_walk(const char *attr_list,
int (*callback)(const char *name, const char *attributes)) int (*callback)(const char *name, const char *attributes, void *priv),
void *priv)
{ {
const char *entry, *entry_end; const char *entry, *entry_end;
char *name, *attributes; char *name, *attributes;
@ -93,7 +94,7 @@ int env_attr_walk(const char *attr_list,
if (strlen(name) != 0) { if (strlen(name) != 0) {
int retval = 0; int retval = 0;
retval = callback(name, attributes); retval = callback(name, attributes, priv);
if (retval) { if (retval) {
free(entry_cpy); free(entry_cpy);
return retval; return retval;

View file

@ -90,7 +90,7 @@ static int clear_callback(ENTRY *entry)
/* /*
* Call for each element in the list that associates variables to callbacks * Call for each element in the list that associates variables to callbacks
*/ */
static int set_callback(const char *name, const char *value) static int set_callback(const char *name, const char *value, void *priv)
{ {
ENTRY e, *ep; ENTRY e, *ep;
struct env_clbk_tbl *clbkp; struct env_clbk_tbl *clbkp;
@ -126,9 +126,9 @@ static int on_callbacks(const char *name, const char *value, enum env_op op,
hwalk_r(&env_htab, clear_callback); hwalk_r(&env_htab, clear_callback);
/* configure any static callback bindings */ /* configure any static callback bindings */
env_attr_walk(ENV_CALLBACK_LIST_STATIC, set_callback); env_attr_walk(ENV_CALLBACK_LIST_STATIC, set_callback, NULL);
/* configure any dynamic callback bindings */ /* configure any dynamic callback bindings */
env_attr_walk(value, set_callback); env_attr_walk(value, set_callback, NULL);
return 0; return 0;
} }

View file

@ -435,7 +435,7 @@ static int clear_flags(ENTRY *entry)
/* /*
* Call for each element in the list that defines flags for a variable * Call for each element in the list that defines flags for a variable
*/ */
static int set_flags(const char *name, const char *value) static int set_flags(const char *name, const char *value, void *priv)
{ {
ENTRY e, *ep; ENTRY e, *ep;
@ -463,9 +463,9 @@ static int on_flags(const char *name, const char *value, enum env_op op,
hwalk_r(&env_htab, clear_flags); hwalk_r(&env_htab, clear_flags);
/* configure any static flags */ /* configure any static flags */
env_attr_walk(ENV_FLAGS_LIST_STATIC, set_flags); env_attr_walk(ENV_FLAGS_LIST_STATIC, set_flags, NULL);
/* configure any dynamic flags */ /* configure any dynamic flags */
env_attr_walk(value, set_flags); env_attr_walk(value, set_flags, NULL);
return 0; return 0;
} }

View file

@ -16,13 +16,14 @@
* attributes = [^,:\s]* * attributes = [^,:\s]*
* entry = name[:attributes] * entry = name[:attributes]
* list = entry[,list] * list = entry[,list]
* It will call the "callback" function with the "name" and attribute as "value" * It will call the "callback" function with the "name" and "attributes"
* The callback may return a non-0 to abort the list walk. * The callback may return a non-0 to abort the list walk.
* This return value will be passed through to the caller. * This return value will be passed through to the caller.
* 0 is returned on success. * 0 is returned on success.
*/ */
extern int env_attr_walk(const char *attr_list, int env_attr_walk(const char *attr_list,
int (*callback)(const char *name, const char *value)); int (*callback)(const char *name, const char *attributes, void *priv),
void *priv);
/* /*
* env_attr_lookup takes as input an "attr_list" with the same form as above. * env_attr_lookup takes as input an "attr_list" with the same form as above.
@ -33,7 +34,6 @@ extern int env_attr_walk(const char *attr_list,
* "attr_list" is NULL. * "attr_list" is NULL.
* Returns 0 on success. * Returns 0 on success.
*/ */
extern int env_attr_lookup(const char *attr_list, const char *name, int env_attr_lookup(const char *attr_list, const char *name, char *attributes);
char *attributes);
#endif /* __ENV_ATTR_H__ */ #endif /* __ENV_ATTR_H__ */