[PATCH] config definition file hooking (for external modules), ie. sqlbox, mbuni, etc.

Stipe Tolj <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Organization tolj.org system architecture
Message-ID <[email protected]>
Hi list,

now, as Kannel maintains its own way of "knowing" what config directives are 
allowed in group sections, this is a problem if external modules, ie. Rene's 
sqlbox or Paul's Mbuni need to use the same gwlib/cfg.[ch] thingies.

I tried to introduce a generic hooking mechanism for the 2 functions 
is_allowed_in_group() and is_single_group() that use the #include "cfg.def" for 
the core.

Now extenal modules can use cfg_add_hooks(void *a, void *b) to offer their own 
"version" of these 2 routines and hence #include "foobar-cfg.def" in their own 
code space.

The hooks are appended to a list and a wrapper loops arround the functiokns in 
the lists to get a boolean value.

I know that this is not the most elegant way. Alex suggested using dlopne() and 
dlsym(), which are of course a "better" approach, but still we need to 
"concatenate" the defined groups and I had no idea how to do.

Please review and vote.

Stipe

-------------------------------------------------------------------
Kölner Landstrasse 419
40589 Düsseldorf, NRW, Germany

tolj.org system architecture      Kannel Software Foundation (KSF)
http://www.tolj.org/              http://www.kannel.org/

mailto:st_{at}_tolj.org           mailto:stolj_{at}_kannel.org
-------------------------------------------------------------------
cfg-hook.patch (text/plain, 2.7 KB)
### Eclipse Workspace Patch 1.0
#P gateway-cvs
Index: gwlib/cfg.h
===================================================================
RCS file: /home/cvs/gateway/gwlib/cfg.h,v
retrieving revision 1.14
diff -u -r1.14 cfg.h
--- gwlib/cfg.h	11 Feb 2005 15:35:48 -0000	1.14
+++ gwlib/cfg.h	2 Jun 2006 15:33:27 -0000
@@ -73,6 +73,7 @@
 Cfg *cfg_create(Octstr *filename);
 void cfg_destroy(Cfg *cfg);
 int cfg_read(Cfg *cfg);
+void cfg_add_hooks(void *allowed, void *single);
 
 CfgGroup *cfg_get_single_group(Cfg *cfg, Octstr *name);
 List *cfg_get_multi_group(Cfg *cfg, Octstr *name);
Index: gwlib/cfg.c
===================================================================
RCS file: /home/cvs/gateway/gwlib/cfg.c,v
retrieving revision 1.30
diff -u -r1.30 cfg.c
--- gwlib/cfg.c	11 Feb 2005 15:35:48 -0000	1.30
+++ gwlib/cfg.c	2 Jun 2006 15:33:27 -0000
@@ -152,7 +152,16 @@
 };
 
 
-static int is_allowed_in_group(Octstr *group, Octstr *variable)
+/********************************************************************
+ * Section providing hooks to external modules to apply their specific
+ * is_allowed_in_group() and is_single_group() with their own
+ * foobar-cfg.def.
+ */
+
+static List *allowed_hooks;
+static List *single_hooks;
+
+static int core_is_allowed_in_group(Octstr *group, Octstr *variable)
 {
     Octstr *groupstr;
     
@@ -181,7 +190,7 @@
 }
 
 
-static int is_single_group(Octstr *query)
+static int core_is_single_group(Octstr *query)
 {
     #define OCTSTR(name)
     #define SINGLE_GROUP(name, fields) \
@@ -195,6 +204,43 @@
 }
 
 
+static int is_allowed_in_group(Octstr *group, Octstr *variable)
+{
+    long i;
+    int r = 0;
+
+    for (i = 0; i < gwlist_len(allowed_hooks); ++i) {
+        r += ((int(*)(Octstr *, Octstr *))
+            gwlist_get(allowed_hooks, i))(group, variable);
+    }
+
+    return (r > 0);
+}
+
+
+static int is_single_group(Octstr *query)
+{
+    long i;
+    int r = 0;
+
+    for (i = 0; i < gwlist_len(single_hooks); ++i) {
+        r += ((int(*)(Octstr *))
+            gwlist_get(single_hooks, i))(query);
+    }
+
+    return (r > 0);
+}
+
+
+void cfg_add_hooks(void *allowed, void *single)
+{
+    gwlist_append(allowed_hooks, allowed);
+    gwlist_append(single_hooks, single);
+}
+
+
+
+
 static int add_group(Cfg *cfg, CfgGroup *grp)
 {
     Octstr *groupname;
@@ -247,6 +293,14 @@
     cfg->filename = octstr_duplicate(filename);
     cfg->single_groups = dict_create(64, destroy_group);
     cfg->multi_groups = dict_create(64, destroy_group_list);
+
+   /* make sure we put our own core hooks into the lists */
+    allowed_hooks = gwlist_create();
+    single_hooks = gwlist_create();
+
+    gwlist_append(allowed_hooks, &core_is_allowed_in_group);
+    gwlist_append(single_hooks, &core_is_single_group);
+
     return cfg;
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.