all: updated FSF address in GPL text
[sip-router] / cfg / cfg.c
index c718f5a..329ee05 100644 (file)
--- a/cfg/cfg.c
+++ b/cfg/cfg.c
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  *
  * History
  * -------
@@ -43,8 +43,12 @@ int cfg_declare(char *group_name, cfg_def_t *def, void *values, int def_size,
 {
        int     i, num, size, group_name_len;
        cfg_mapping_t   *mapping = NULL;
+       cfg_group_t     *group;
        int types;
 
+       if(def==NULL || def[0].name==NULL)
+               return -1;
+
        /* check the number of the variables */
        for (num=0; def[num].name; num++);
 
@@ -140,27 +144,35 @@ int cfg_declare(char *group_name, cfg_def_t *def, void *values, int def_size,
                goto error;
        }
 
-       group_name_len = strlen(group_name);
-       /* check for duplicates */
-       if (cfg_lookup_group(group_name, group_name_len)) {
-               LOG(L_ERR, "ERROR: register_cfg_def(): "
-                       "configuration group has been already declared: %s\n",
-                       group_name);
-               goto error;
-       }
-
-       /* create a new group
-       I will allocate memory in shm mem for the variables later in a single block,
-       when we know the size of all the registered groups. */
-       if (!cfg_new_group(group_name, group_name_len, num, mapping, values, size, handle))
-               goto error;
-
        /* The cfg variables are ready to use, let us set the handle
        before passing the new definitions to the drivers.
        We make the interface usable for the fixup functions
-       at this step */
+       at this step
+       cfg_set_group() and cfg_new_group() need the handle to be set because
+       they save its original value. */
        *handle = values;
 
+       group_name_len = strlen(group_name);
+       /* check for duplicates */
+       if ((group = cfg_lookup_group(group_name, group_name_len))) {
+               if (group->dynamic != CFG_GROUP_UNKNOWN) {
+                       /* conflict with another module/core group, or with a dynamic group */
+                       LOG(L_ERR, "ERROR: register_cfg_def(): "
+                               "configuration group has been already declared: %s\n",
+                               group_name);
+                       goto error;
+               }
+               /* An empty group is found which does not have any variable yet */
+               cfg_set_group(group, num, mapping, values, size, handle);
+       } else {
+               /* create a new group
+               I will allocate memory in shm mem for the variables later in a single block,
+               when we know the size of all the registered groups. */
+               if (!(group = cfg_new_group(group_name, group_name_len, num, mapping, values, size, handle)))
+                       goto error;
+       }
+       group->dynamic = CFG_GROUP_STATIC;
+
        /* notify the drivers about the new config definition */
        cfg_notify_drivers(group_name, group_name_len, def);
 
@@ -220,13 +232,63 @@ int cfg_declare_str(char *group_name, char *var_name, char *val, char *descr)
        return 0;
 }
 
+/* Add a varibale to a group instance with integer type.
+ * The group instance is created if it does not exist.
+ * wrapper function for new_add_var()
+ */
+int cfg_ginst_var_int(char *group_name, unsigned int group_id, char *var_name,
+                       int val)
+{
+       str     gname, vname;
+
+       gname.s = group_name;
+       gname.len = strlen(group_name);
+       vname.s = var_name;
+       vname.len = strlen(var_name);
+
+       return new_add_var(&gname, group_id, &vname,
+                       (void *)(long)val, CFG_VAR_INT);
+}
+
+/* Add a varibale to a group instance with string type.
+ * The group instance is created if it does not exist.
+ * wrapper function for new_add_var()
+ */
+int cfg_ginst_var_string(char *group_name, unsigned int group_id, char *var_name,
+                       char *val)
+{
+       str     gname, vname;
+
+       gname.s = group_name;
+       gname.len = strlen(group_name);
+       vname.s = var_name;
+       vname.len = strlen(var_name);
+
+       return new_add_var(&gname, group_id, &vname,
+                       (void *)val, CFG_VAR_STRING);
+}
+
+/* Create a new group instance.
+ * wrapper function for new_add_var()
+ */
+int cfg_new_ginst(char *group_name, unsigned int group_id)
+{
+       str     gname;
+
+       gname.s = group_name;
+       gname.len = strlen(group_name);
+
+       return new_add_var(&gname, group_id, NULL /* var */,
+                       NULL /* val */, 0 /* type */);
+}
+
 /* returns the handle of a cfg group */
 void **cfg_get_handle(char *gname)
 {
        cfg_group_t     *group;
 
        group = cfg_lookup_group(gname, strlen(gname));
-       if (!group || group->dynamic) return NULL;
+       if (!group || (group->dynamic != CFG_GROUP_STATIC)) return NULL;
 
        return group->handle;
 }