Disable strict XML documentation config checking; fix crash caused by sorcery
authorMatthew Jordan <mjordan@digium.com>
Fri, 15 Feb 2013 18:44:24 +0000 (18:44 +0000)
committerMatthew Jordan <mjordan@digium.com>
Fri, 15 Feb 2013 18:44:24 +0000 (18:44 +0000)
This patch does two things:
 1. It disables (temporarily) strict XML documentation checking for module
    configurations. We should re-enable it before making any release from
    trunk.
 2. Pass the module flag AST_MODULE through sorcery. This means several of the
    API calls are now macros and will do this automatically for you. The config
    framework needs the module that objects are registering to so it can
    properly construct the documentation. (This was already a required field,
    but sorcery was getting by without it)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@381567 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/sorcery.h
main/config_options.c
main/sorcery.c

index 6f3ec3a..e5f727a 100644 (file)
@@ -275,17 +275,22 @@ struct ast_sorcery *ast_sorcery_open(void);
  *
  * \param sorcery Pointer to a sorcery structure
  * \param name Name of the category to use within the configuration file, normally the module name
+ * \param module The module name (AST_MODULE)
  *
  * \retval 0 success
  * \retval -1 failure
  */
-int ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name);
+int __ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name, const char *module);
+
+#define ast_sorcery_apply_config(sorcery, name) \
+       __ast_sorcery_apply_config((sorcery), (name), AST_MODULE)
 
 /*!
  * \brief Apply default object wizard mappings
  *
  * \param sorcery Pointer to a sorcery structure
  * \param type Type of object to apply to
+ * \param module The name of the module, typically AST_MODULE
  * \param name Name of the wizard to use
  * \param data Data to be passed to wizard
  *
@@ -296,7 +301,10 @@ int ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name);
  *
  * \note Only a single default can exist per object type
  */
-int ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, const char *name, const char *data);
+int __ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, const char *module, const char *name, const char *data);
+
+#define ast_sorcery_apply_default(sorcery, type, name, data) \
+       __ast_sorcery_apply_default((sorcery), (type), AST_MODULE, (name), (data))
 
 /*!
  * \brief Register an object type
index 7a65cc5..06b4521 100644 (file)
@@ -894,7 +894,7 @@ static char *complete_config_option(const char *module, const char *option, cons
 /* Define as 0 if we want to allow configurations to be registered without
  * documentation
  */
-#define XMLDOC_STRICT 1
+#define XMLDOC_STRICT 0
 
 /*! \internal
  * \brief Update the XML documentation for a config type based on its registration
index f9ff6d5..6a0fb4a 100644 (file)
@@ -330,7 +330,7 @@ static void sorcery_object_type_destructor(void *obj)
 }
 
 /*! \brief Internal function which allocates an object type structure */
-static struct ast_sorcery_object_type *sorcery_object_type_alloc(const char *type)
+static struct ast_sorcery_object_type *sorcery_object_type_alloc(const char *type, const char *module)
 {
        struct ast_sorcery_object_type *object_type;
 
@@ -361,6 +361,7 @@ static struct ast_sorcery_object_type *sorcery_object_type_alloc(const char *typ
 
        object_type->info->files[0] = object_type->file;
        object_type->info->files[1] = NULL;
+       object_type->info->module = module;
 
        ast_copy_string(object_type->name, type, sizeof(object_type->name));
 
@@ -382,7 +383,7 @@ static void sorcery_object_wizard_destructor(void *obj)
 }
 
 /*! \brief Internal function which creates an object type and adds a wizard mapping */
-static int sorcery_apply_wizard_mapping(struct ast_sorcery *sorcery, const char *type, const char *name, const char *data, unsigned int caching)
+static int sorcery_apply_wizard_mapping(struct ast_sorcery *sorcery, const char *type, const char *module, const char *name, const char *data, unsigned int caching)
 {
        RAII_VAR(struct ast_sorcery_object_type *, object_type,  ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
        RAII_VAR(struct ast_sorcery_wizard *, wizard, ao2_find(wizards, name, OBJ_KEY), ao2_cleanup);
@@ -394,7 +395,7 @@ static int sorcery_apply_wizard_mapping(struct ast_sorcery *sorcery, const char
        }
 
        if (!object_type) {
-               if (!(object_type = sorcery_object_type_alloc(type))) {
+               if (!(object_type = sorcery_object_type_alloc(type, module))) {
                        return -1;
                }
                created = 1;
@@ -418,7 +419,7 @@ static int sorcery_apply_wizard_mapping(struct ast_sorcery *sorcery, const char
        return 0;
 }
 
-int ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name)
+int __ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name, const char *module)
 {
        struct ast_flags flags = { 0 };
        struct ast_config *config = ast_config_load2("sorcery.conf", "sorcery", flags);
@@ -447,7 +448,7 @@ int ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name)
                }
 
                /* Any error immediately causes us to stop */
-               if ((res = sorcery_apply_wizard_mapping(sorcery, name, wizard, data, caching))) {
+               if ((res = sorcery_apply_wizard_mapping(sorcery, name, module, wizard, data, caching))) {
                        break;
                }
        }
@@ -457,7 +458,7 @@ int ast_sorcery_apply_config(struct ast_sorcery *sorcery, const char *name)
        return res;
 }
 
-int ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, const char *name, const char *data)
+int __ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, const char *module, const char *name, const char *data)
 {
        RAII_VAR(struct ast_sorcery_object_type *, object_type,  ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
 
@@ -466,7 +467,7 @@ int ast_sorcery_apply_default(struct ast_sorcery *sorcery, const char *type, con
                return -1;
        }
 
-       return sorcery_apply_wizard_mapping(sorcery, type, name, data, 0);
+       return sorcery_apply_wizard_mapping(sorcery, type, module, name, data, 0);
 }
 
 int ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type, aco_type_item_alloc alloc, sorcery_transform_handler transform, sorcery_apply_handler apply)