Module: sip-router Branch: master Commit: 62ed44d1cf6f5f2c824604bcafe54619c298ceaf URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=62ed44d1...
Author: Miklos Tirpak miklos@iptel.org Committer: Miklos Tirpak miklos@iptel.org Date: Fri Jun 3 13:38:32 2011 +0200
cfg framework: functions to iterate though the group instances
Two functions, cfg_select_first and cfg_select_next, are added which can be used to iterate though the instances of a cfg group.
---
cfg/cfg_struct.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ cfg/cfg_struct.h | 21 +++++++++++++++++ 2 files changed, 86 insertions(+), 0 deletions(-)
diff --git a/cfg/cfg_struct.c b/cfg/cfg_struct.c index 4e247cd..6e93ca0 100644 --- a/cfg/cfg_struct.c +++ b/cfg/cfg_struct.c @@ -1169,3 +1169,68 @@ int cfg_reset(cfg_group_t *group) group->name_len, group->name); return 0; } + +/* Move the group handle to the first group instance. + * This function together with cfg_select_next() can be used + * to iterate though the list of instances. + * + * Return value: + * -1: no group instance found + * 0: first group instance is successfully selected. + */ +int cfg_select_first(cfg_group_t *group) +{ + cfg_group_meta_t *meta; + cfg_group_inst_t *ginst; + + meta = CFG_GROUP_META(cfg_local, group); + if (!meta || (meta->num == 0)) + return -1; + + ginst = (cfg_group_inst_t *)meta->array; + cfg_move_handle(group, + CFG_HANDLE_TO_GINST(*(group->handle)), /* the active group instance */ + ginst); + + LOG(L_DBG, "DEBUG: cfg_select_first(): group instance '%.*s[%u]' has been selected\n", + group->name_len, group->name, ginst->id); + return 0; +} + +/* Move the group handle to the next group instance. + * This function together with cfg_select_first() can be used + * to iterate though the list of instances. + * + * Return value: + * -1: no more group instance found. Note, that the active group + * instance is not changed in this case. + * 0: the next group instance is successfully selected. + */ +int cfg_select_next(cfg_group_t *group) +{ + cfg_group_meta_t *meta; + cfg_group_inst_t *old_ginst, *new_ginst; + int size; + + if (!(meta = CFG_GROUP_META(cfg_local, group))) + return -1; + + if (!(old_ginst = CFG_HANDLE_TO_GINST(*(group->handle)) /* the active group instance */)) { + LOG(L_ERR, "ERROR: cfg_select_next(): No group instance is set currently. Forgot to call cfg_select_first()?\n"); + return -1; + } + + size = sizeof(cfg_group_inst_t) + group->size - 1; + if (((char *)old_ginst - (char *)meta->array)/size + 1 >= meta->num) + return -1; /* this is the last group instance */ + + new_ginst = (cfg_group_inst_t *)((char *)old_ginst + size); + cfg_move_handle(group, + old_ginst, /* the active group instance */ + new_ginst); + + LOG(L_DBG, "DEBUG: cfg_select_next(): group instance '%.*s[%u]' has been selected\n", + group->name_len, group->name, new_ginst->id); + return 0; +} + diff --git a/cfg/cfg_struct.h b/cfg/cfg_struct.h index f835a7e..2e91691 100644 --- a/cfg/cfg_struct.h +++ b/cfg/cfg_struct.h @@ -513,4 +513,25 @@ int cfg_select(cfg_group_t *group, unsigned int id); /* Reset the group handle to the default, local configuration */ int cfg_reset(cfg_group_t *group);
+/* Move the group handle to the first group instance. + * This function together with cfg_select_next() can be used + * to iterate though the list of instances. + * + * Return value: + * -1: no group instance found + * 0: first group instance is successfully selected. + */ +int cfg_select_first(cfg_group_t *group); + +/* Move the group handle to the next group instance. + * This function together with cfg_select_first() can be used + * to iterate though the list of instances. + * + * Return value: + * -1: no more group instance found. Note, that the active group + * instance is not changed in this case. + * 0: the next group instance is successfully selected. + */ +int cfg_select_next(cfg_group_t *group); + #endif /* _CFG_STRUCT_H */