[asterisk-commits] twilson: branch twilson/config_work r362138 - in /team/twilson/config_work: a...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sat Apr 14 09:12:49 CDT 2012
Author: twilson
Date: Sat Apr 14 09:12:44 2012
New Revision: 362138
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=362138
Log:
Add field matching, aco_info_init/destroy
Modified:
team/twilson/config_work/apps/app_skel.c
team/twilson/config_work/include/asterisk/config_options.h
team/twilson/config_work/main/config_options.c
Modified: team/twilson/config_work/apps/app_skel.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/apps/app_skel.c?view=diff&rev=362138&r1=362137&r2=362138
==============================================================================
--- team/twilson/config_work/apps/app_skel.c (original)
+++ team/twilson/config_work/apps/app_skel.c Sat Apr 14 09:12:44 2012
@@ -508,8 +508,7 @@
static int unload_module(void)
{
ast_cli_unregister_multiple(skel_cli, ARRAY_LEN(skel_cli));
- ao2_ref(cfg_info.opts, -1);
- ao2_ref(cfg_info.objs, -1);
+ aco_info_destroy(&cfg_info);
ao2_global_obj_release(global_config);
return ast_unregister_application(app);
}
@@ -519,13 +518,7 @@
RAII_VAR(struct aco_type *, global_type, NULL, ao2_cleanup);
RAII_VAR(struct aco_type *, priv_type, NULL, ao2_cleanup);
- if (!(cfg_info.opts = aco_option_container_new())) {
- ast_log(LOG_ERROR, "1\n");
- goto error;
- }
-
- if (!(cfg_info.objs = aco_type_container_new())) {
- ast_log(LOG_ERROR, "2\n");
+ if (aco_info_init(&cfg_info)) {
goto error;
}
@@ -534,13 +527,13 @@
goto error;
}
- if (!(priv_type = aco_type_private_alloc("private", CONTEXT_DENY, "general", (aco_type_alloc) skel_pvt_cfg_alloc, skel_containers_alloc, skel_find_or_create_pvt, skel_find_pvt, NULL, NULL))) {
+ if (!(priv_type = aco_type_private_alloc("private", CONTEXT_DENY, "general", NULL, NULL, (aco_type_alloc) skel_pvt_cfg_alloc, skel_containers_alloc, skel_find_or_create_pvt, skel_find_pvt, NULL, NULL))) {
ast_log(LOG_ERROR, "4\n");
goto error;
}
- aco_type_register(cfg_info.objs, global_type);
- aco_type_register(cfg_info.objs, priv_type);
+ aco_type_register(&cfg_info, global_type);
+ aco_type_register(&cfg_info, priv_type);
/* General Options */
aco_option_register(cfg_info.opts, "foo", global_type, "booya", OPT_STRINGFIELD_T, struct skel_global_config, 0, foo);
Modified: team/twilson/config_work/include/asterisk/config_options.h
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/include/asterisk/config_options.h?view=diff&rev=362138&r1=362137&r2=362138
==============================================================================
--- team/twilson/config_work/include/asterisk/config_options.h (original)
+++ team/twilson/config_work/include/asterisk/config_options.h Sat Apr 14 09:12:44 2012
@@ -59,6 +59,8 @@
enum aco_type_t type;
const char *name;
const char *context;
+ const char *matchfield;
+ const char *matchvalue;
regex_t *regex;
enum aco_context_op context_allow;
aco_type_alloc cfg_alloc;
@@ -80,10 +82,9 @@
struct ao2_container *aco_type_container_new(void);
struct aco_type *aco_type_global_alloc(const char *name, enum aco_context_op op, const char *context, aco_type_alloc alloc);
-struct aco_type *aco_type_private_alloc(const char *name, enum aco_context_op op, const char *context,
+struct aco_type *aco_type_private_alloc(const char *name, enum aco_context_op op, const char *context, const char *matchfield, const char *matchvalue,
aco_type_alloc alloc, aco_type_containers_alloc containers_alloc, aco_type_find_or_create_pvt find_or_create_pvt,
aco_type_find_pvt find_pvt, aco_type_post_cfg_init post_cfg_init, aco_type_prelink prelink);
-int aco_type_register(struct ao2_container *container, struct aco_type *obj);
typedef int (*aco_apply_config)(void);
@@ -95,6 +96,10 @@
aco_apply_config apply_config;
const char *preload[]; /* Use a sentinel! */
};
+
+int aco_info_init(struct aco_info *info);
+void aco_info_destroy(struct aco_info *info);
+int aco_type_register(struct aco_info *info, struct aco_type *obj);
/*! \brief The option types with default handlers
*
Modified: team/twilson/config_work/main/config_options.c
URL: http://svnview.digium.com/svn/asterisk/team/twilson/config_work/main/config_options.c?view=diff&rev=362138&r1=362137&r2=362138
==============================================================================
--- team/twilson/config_work/main/config_options.c (original)
+++ team/twilson/config_work/main/config_options.c Sat Apr 14 09:12:44 2012
@@ -235,17 +235,35 @@
return 0;
}
-static int config_opt_obj_context_cmp(void *obj, void *arg, int flags)
+static int config_opt_obj_context_cmp(void *obj, void *arg, void *data, int flags)
{
struct aco_type *match = obj;
const char *context = arg;
-
- return !regexec(match->regex, context, 0, NULL, 0) == !match->context_allow ? 0 : CMP_MATCH | CMP_STOP;
-}
-
-static struct aco_type *ast_config_option_object_find(struct ao2_container *container, const char *context)
-{
- return ao2_callback(container, 0, config_opt_obj_context_cmp, (void *) context);
+ struct ast_config *cfg = data;
+ const char *val;
+
+ /* First make sure we are an object that can service this context */
+ if (!regexec(match->regex, context, 0, NULL, 0) == !match->context_allow) {
+ return 0;
+ }
+
+ /* Then, see if we need to match a particular field */
+ if (!ast_strlen_zero(match->matchfield) && !ast_strlen_zero(match->matchvalue)) {
+ if (!(val = ast_variable_retrieve(cfg, context, match->matchfield))) {
+ ast_log(LOG_ERROR, "Required match field '%s' not found\n", match->matchfield);
+ return CMP_STOP;
+ }
+ if (strcasecmp(val, match->matchvalue)) {
+ return 0;
+ }
+ }
+
+ return CMP_MATCH | CMP_STOP;
+}
+
+static struct aco_type *internal_aco_type_find(struct ao2_container *container, struct ast_config *cfg, const char *context)
+{
+ return ao2_callback_data(container, 0, config_opt_obj_context_cmp, (void *) context, (void *) cfg);
}
static int is_preload(struct aco_info *info, const char *cat)
@@ -267,7 +285,7 @@
static int process_category(struct ast_config *cfg, struct aco_info *info, const char *cat, int preload) {
RAII_VAR(void *, tmppvt, NULL, ao2_cleanup);
RAII_VAR(void *, tmpcfg, NULL, ao2_cleanup);
- RAII_VAR(struct aco_type *, obj, ast_config_option_object_find(info->objs, cat), ao2_cleanup);
+ RAII_VAR(struct aco_type *, obj, internal_aco_type_find(info->objs, cfg, cat), ao2_cleanup);
/* Skip preloaded categories if we aren't preloading */
if (!preload && is_preload(info, cat)) {
@@ -276,7 +294,7 @@
/* Find config object by context, if not found it is an error */
if (!obj) {
- ast_log(LOG_NOTICE, "2\n");
+ ast_log(LOG_ERROR, "Could not find config type for category '%s' in '%s'\n", cat, info->filename);
return -1;
}
@@ -430,6 +448,27 @@
return 0;
}
+int aco_info_init(struct aco_info *info)
+{
+ if (!(info->opts = aco_option_container_new())) {
+ return -1;
+ }
+ if (!(info->objs = aco_type_container_new())) {
+ return -1;
+ }
+ return 0;
+}
+
+void aco_info_destroy(struct aco_info *info)
+{
+ if (info->opts) {
+ ao2_ref(info->opts, -1);
+ }
+ if (info->objs) {
+ ao2_ref(info->objs, -1);
+ }
+}
+
/*! \brief match for anything where the context passes (or fails if !context_allow) the context regex
*/
static int match_option_by_context(void *obj, void *arg, int flags)
@@ -521,7 +560,7 @@
return obj;
}
-struct aco_type *aco_type_private_alloc(const char *name, enum aco_context_op op, const char *context,
+struct aco_type *aco_type_private_alloc(const char *name, enum aco_context_op op, const char *context, const char *matchfield, const char *matchvalue,
aco_type_alloc alloc, aco_type_containers_alloc containers_alloc, aco_type_find_or_create_pvt find_or_create_pvt,
aco_type_find_pvt find_pvt, aco_type_post_cfg_init post_cfg_init, aco_type_prelink prelink)
{
@@ -541,6 +580,8 @@
obj->context_allow = op;
obj->cfg_alloc = alloc;
obj->context = context;
+ obj->matchfield = matchfield;
+ obj->matchvalue = matchvalue;
obj->containers_alloc = containers_alloc;
obj->find_or_create_pvt = find_or_create_pvt;
obj->find_pvt = find_pvt;
@@ -550,9 +591,9 @@
return obj;
}
-int aco_type_register(struct ao2_container *container, struct aco_type *obj)
-{
- return !ao2_link(container, obj);
+int aco_type_register(struct aco_info *info, struct aco_type *obj)
+{
+ return !ao2_link(info->objs, obj);
}
/* default config option handlers */
More information about the asterisk-commits
mailing list