@@ -481,7 +481,7 @@ static int print_static_binding(const char *var_name, const char *callback_name,
return 0;
}
-static int print_active_callback(struct env_entry *entry)
+static int print_active_callback(struct env_entry *entry, void *priv)
{
struct env_clbk_tbl *clbkp;
int i;
@@ -544,7 +544,7 @@ int do_env_callback(struct cmd_tbl *cmdtp, int flag, int argc,
puts("Active callback bindings:\n");
printf("\t%-20s %-20s\n", "Variable Name", "Callback Name");
printf("\t%-20s %-20s\n", "-------------", "-------------");
- hwalk_r(&env_htab, print_active_callback);
+ hwalk_r(&env_htab, print_active_callback, NULL);
return 0;
}
#endif
@@ -563,7 +563,7 @@ static int print_static_flags(const char *var_name, const char *flags,
return 0;
}
-static int print_active_flags(struct env_entry *entry)
+static int print_active_flags(struct env_entry *entry, void *priv)
{
enum env_flags_vartype type;
enum env_flags_varaccess access;
@@ -617,7 +617,7 @@ int do_env_flags(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
"Variable Access");
printf("\t%-20s %-20s %-20s\n", "-------------", "-------------",
"---------------");
- hwalk_r(&env_htab, print_active_flags);
+ hwalk_r(&env_htab, print_active_flags, NULL);
return 0;
}
#endif
@@ -83,7 +83,7 @@ void env_callback_init(struct env_entry *var_entry)
* Called on each existing env var prior to the blanket update since removing
* a callback association should remove its callback.
*/
-static int clear_callback(struct env_entry *entry)
+static int clear_callback(struct env_entry *entry, void *priv)
{
entry->callback = NULL;
@@ -127,7 +127,7 @@ static int on_callbacks(const char *name, const char *value, enum env_op op,
int flags)
{
/* remove all callbacks */
- hwalk_r(&env_htab, clear_callback);
+ hwalk_r(&env_htab, clear_callback, NULL);
/* configure any static callback bindings */
env_attr_walk(ENV_CALLBACK_LIST_STATIC, set_callback, NULL);
@@ -468,7 +468,7 @@ void env_flags_init(struct env_entry *var_entry)
* Called on each existing env var prior to the blanket update since removing
* a flag in the flag list should remove its flags.
*/
-static int clear_flags(struct env_entry *entry)
+static int clear_flags(struct env_entry *entry, void *priv)
{
entry->flags = 0;
@@ -503,7 +503,7 @@ static int on_flags(const char *name, const char *value, enum env_op op,
int flags)
{
/* remove all flags */
- hwalk_r(&env_htab, clear_flags);
+ hwalk_r(&env_htab, clear_flags, NULL);
/* configure any static flags */
env_attr_walk(ENV_FLAGS_LIST_STATIC, set_flags, NULL);
@@ -105,7 +105,7 @@ int himport_r(struct hsearch_data *htab, const char *env, size_t size,
/* Walk the whole table calling the callback on each element */
int hwalk_r(struct hsearch_data *htab,
- int (*callback)(struct env_entry *entry));
+ int (*callback)(struct env_entry *entry, void *priv), void *priv);
/* Flags for himport_r(), hexport_r(), hdelete_r(), and hsearch_r() */
#define H_NOCLEAR (1 << 0) /* do not clear hash table before importing */
@@ -998,14 +998,15 @@ end:
* Walk all of the entries in the hash, calling the callback for each one.
* this allows some generic operation to be performed on each element.
*/
-int hwalk_r(struct hsearch_data *htab, int (*callback)(struct env_entry *entry))
+int hwalk_r(struct hsearch_data *htab,
+ int (*callback)(struct env_entry *entry, void *priv), void *priv)
{
int i;
int retval;
for (i = 1; i <= htab->size; ++i) {
if (htab->table[i].used > 0) {
- retval = callback(&htab->table[i].entry);
+ retval = callback(&htab->table[i].entry, priv);
if (retval)
return retval;
}
This allows callers of hwalk_r to pass data to their callback. This mirrors e.g. env_attr_walk. Signed-off-by: Sean Anderson <seanga2@gmail.com> --- cmd/nvedit.c | 8 ++++---- env/callback.c | 4 ++-- env/flags.c | 4 ++-- include/search.h | 2 +- lib/hashtable.c | 5 +++-- 5 files changed, 12 insertions(+), 11 deletions(-)