Module: sip-router
Branch: master
Commit: 62ed44d1cf6f5f2c824604bcafe54619c298ceaf
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=62ed44d1cf6f5f2c824604bcafe54619c298ceaf

Author: Miklos Tirpak <[email protected]>
Committer: Miklos Tirpak <[email protected]>
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 */


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to