[asterisk-commits] twilson: branch twilson/config_work r361951 - in /team/twilson/config_work: a...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Apr 11 23:26:12 CDT 2012


Author: twilson
Date: Wed Apr 11 23:26:08 2012
New Revision: 361951

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=361951
Log:
Bug fixes + handle defaults and regex context matching

Modified:
    team/twilson/config_work/apps/app_skel.c
    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=361951&r1=361950&r2=361951
==============================================================================
--- team/twilson/config_work/apps/app_skel.c (original)
+++ team/twilson/config_work/apps/app_skel.c Wed Apr 11 23:26:08 2012
@@ -139,29 +139,31 @@
 	NUM_GLOBAL_OBJECTS,
 };
 
+#define PVT_BUCKETS 17
+
 static AO2_GLOBAL_OBJ_STATIC(global_config, NUM_GLOBAL_OBJECTS);
 AST_MUTEX_DEFINE_STATIC(reload_lock);
 
 static struct ao2_container *config_opts;
 
-static void *skel_global_alloc(const char *cat);
-static void *skel_pvt_alloc(const char *cat);
-static void *skel_pvt_cfg_alloc(const char *cat);
+static struct skel_global_config *skel_global_alloc(const char *cat);
+static struct skel_pvt *skel_pvt_alloc(const char *cat);
+static struct skel_pvt_config *skel_pvt_cfg_alloc(const char *cat);
 static struct ao2_container *skel_pvt_container_alloc(void);
 static struct ao2_container *skel_pvt_cfg_container_alloc(void);
-static void *skel_find_pvt_by_category(struct ao2_container *tmp_container, const char *category);
+static struct skel_pvt *skel_find_pvt_by_category(struct ao2_container *tmp_container, const char *category);
 static int skel_apply_config(void *new_global, struct ao2_container *new_pvt_container, struct ao2_container *new_cfg_container);
 
 static struct ast_config_option_info config_info = {
 	.module = AST_MODULE,
 	.filename = "app_skel.conf",
 	.global_contexts = "general",
-	.global_alloc = skel_global_alloc,
-	.pvt_alloc = skel_pvt_alloc,
-	.pvt_cfg_alloc = skel_pvt_cfg_alloc,
+	.global_alloc = (ast_config_option_user_item_alloc) skel_global_alloc,
+	.pvt_alloc = (ast_config_option_user_item_alloc) skel_pvt_alloc,
+	.pvt_cfg_alloc = (ast_config_option_user_item_alloc) skel_pvt_cfg_alloc,
 	.pvt_container_alloc = skel_pvt_container_alloc,
 	.pvt_cfg_container_alloc = skel_pvt_cfg_container_alloc,
-	.find_pvt = skel_find_pvt_by_category,
+	.find_pvt = (ast_config_option_find_pvt_by_category) skel_find_pvt_by_category,
 	.apply_config = skel_apply_config,
 };
 
@@ -212,16 +214,17 @@
 	return strcasecmp(one->name, match) ? 0 : (CMP_MATCH | CMP_STOP);
 }
 
-#define PVT_BUCKETS 17
 static struct ao2_container *skel_pvt_container_alloc(void)
 {
 	return ao2_container_alloc(PVT_BUCKETS, skel_pvt_hash, skel_pvt_cmp);
 }
+
 static struct ao2_container *skel_pvt_cfg_container_alloc(void)
 {
 	return ao2_container_alloc(PVT_BUCKETS, skel_pvt_config_hash, skel_pvt_config_cmp);
 }
-void *skel_find_pvt_by_category(struct ao2_container *tmp_container, const char *category)
+
+static struct skel_pvt *skel_find_pvt_by_category(struct ao2_container *tmp_container, const char *category)
 {
 	if (tmp_container) {
 		return ao2_find(tmp_container, category, OBJ_KEY);
@@ -317,7 +320,7 @@
 	return res;
 }
 
-static void *skel_pvt_alloc(const char *name)
+static struct skel_pvt *skel_pvt_alloc(const char *name)
 {
 	struct skel_pvt *pvt;
 
@@ -333,7 +336,7 @@
 	return pvt;
 }
 
-static void *skel_pvt_cfg_alloc(const char *cat)
+static struct skel_pvt_config *skel_pvt_cfg_alloc(const char *cat)
 {
 	struct skel_pvt_config *pvtcfg;
 
@@ -353,15 +356,10 @@
 
 	ast_string_field_set(pvtcfg, name, cat);
 
-	if (ast_config_option_set_defaults(config_opts, cat, pvtcfg)) {
-		ao2_ref(pvtcfg, -1);
-		return NULL;
-	}
-
 	return pvtcfg;
 }
 
-static void *skel_global_alloc(const char *cat)
+static struct skel_global_config *skel_global_alloc(const char *cat)
 {
 	struct skel_global_config *cfg;
 
@@ -375,12 +373,6 @@
 	}
 
 	if (ast_string_field_init(cfg, 128)) {
-		ao2_ref(cfg, -1);
-		return NULL;
-	}
-
-	/* Set defaults */
-	if (ast_config_option_set_defaults(config_opts, "general", cfg)) {
 		ao2_ref(cfg, -1);
 		return NULL;
 	}
@@ -420,7 +412,7 @@
 {
 	RAII_VAR(struct ao2_container *, pvts, NULL, ao2_cleanup);
 	RAII_VAR(struct ao2_container *, cfgs, NULL, ao2_cleanup);
-	struct ao2_iterator iter __attribute__((cleanup(ao2_iterator_destroy)));
+	struct ao2_iterator iter;
 	struct skel_pvt *pvt;
 	char codec_buf[128];
 
@@ -460,8 +452,9 @@
 		ast_cli(a->fd, SKEL_FORMAT1, pvt->name, cfg->description, codec_buf, AST_CLI_YESNO(cfg->permit != NULL), AST_CLI_YESNO(cfg->bit1), AST_CLI_YESNO(cfg->bit2), pvt->non_config_state);
 		ao2_ref(pvt, -1);
 	}
+	ao2_iterator_destroy(&iter);
 #undef SKEL_FORMAT
-#undef SKEL_FORAMT1
+#undef SKEL_FORMAT1
 
 	return CLI_SUCCESS;
 }

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=361951&r1=361950&r2=361951
==============================================================================
--- team/twilson/config_work/main/config_options.c (original)
+++ team/twilson/config_work/main/config_options.c Wed Apr 11 23:26:08 2012
@@ -88,6 +88,34 @@
 	return NULL;
 }
 
+static void regex_cleanup(regex_t *regex)
+{
+	if (regex) {
+		regfree(regex);
+		ast_free(regex);
+	}
+}
+
+static regex_t *build_context_regex(const char *text)
+{
+	int res;
+	regex_t *regex;
+
+	if (!(regex = ast_malloc(sizeof(*regex)))) {
+		return NULL;
+	}
+
+	if ((res = regcomp(regex, text, REG_EXTENDED | REG_ICASE | REG_NOSUB))) {
+		char buf[80];
+		regerror(res, regex, buf, sizeof(buf));
+		ast_log(LOG_ERROR, "Could not compile regex '%s': %s\n", text, buf);
+		ast_free(regex);
+		return NULL;
+	}
+
+	return regex;
+}
+
 /*! \brief build a config option
  * \note this should probably only be called by one of the ast_config_option_register* macros
  */
@@ -104,17 +132,13 @@
 		return NULL;
 	}
 
-	if (!(regex = ast_calloc(1, sizeof(*regex)))) {
-		return NULL;
-	}
-	if ((tmp = regcomp(regex, context, REG_EXTENDED | REG_ICASE | REG_NOSUB))) {
-		char buf[80];
-		regerror(tmp, regex, buf, sizeof(buf));
-		ast_log(LOG_ERROR, "Could not compile regex '%s': %s\n", context, buf);
+	if (!(regex = build_context_regex(context))) {
 		return NULL;
 	}
 
 	if (!(opt = ao2_alloc(sizeof(*opt) + argc * sizeof(opt->args[0]), config_option_destroy))) {
+		regfree(regex);
+		ast_free(regex);
 		return NULL;
 	}
 
@@ -136,6 +160,8 @@
 
 	if (!opt->handler && !(opt->handler = ast_config_option_default_handler(opt->type))) {
 		ao2_ref(opt, -1);
+		regfree(regex);
+		ast_free(regex);
 		return NULL;
 	};
 
@@ -185,12 +211,6 @@
 	return ao2_container_alloc(CONFIG_OPT_BUCKETS, config_opt_hash, config_opt_cmp);
 }
 
-static int is_global_context(struct ast_config_option_info *info, const char *cat)
-{
-	/* XXX Do regex comparison so we can do things like "general|authentication", etc. */
-	return !strcasecmp(cat, "general");
-}
-
 int ast_config_option_parse_config(struct ast_config_option_info *info, int reload)
 {
 	struct ast_config *cfg;
@@ -198,6 +218,7 @@
 	const char *cat = NULL;
 	void *new_global_obj = NULL;
 	struct ao2_container *new_pvt_container = NULL, *new_pvt_cfg_container = NULL;
+	RAII_VAR(regex_t *, regex, NULL, regex_cleanup);
 	
 	if (ast_strlen_zero(info->filename)) {
 		ast_log(LOG_ERROR, "No filename given, cannot proceed!\n");
@@ -233,11 +254,18 @@
 		goto error;
 	}
 
+	if (new_global_obj && !ast_strlen_zero(info->global_contexts) && !(regex = build_context_regex(info->global_contexts))) {
+		goto error;
+	}
+
 	while ((cat = ast_category_browse(cfg, cat))) {
 		RAII_VAR(void *, tmppvt, NULL, ao2_cleanup);
 		RAII_VAR(void *, tmpcfg, NULL, ao2_cleanup);
 
-		if (new_global_obj && is_global_context(info, cat)) {
+		if (new_global_obj && !ast_strlen_zero(info->global_contexts) && !regexec(regex, cat, 0, NULL, 0)) {
+			if (ast_config_option_set_defaults(info->opts_container, cat, new_global_obj)) {
+				goto error;
+			}
 			if (ast_config_parse_category_options(info->opts_container, cfg, cat, new_global_obj)) {
 				goto error;
 			}
@@ -248,14 +276,20 @@
 			}
 
 			/* Get a ref to the existing private, or create a new one */
-			if (!(tmppvt = info->find_pvt(NULL, cat)) && !(tmppvt = info->pvt_alloc(cat))) {
-				/* Since we will be replacing the whole private container, bail out on errors instead of just
-				 * skipping privates with config errors */
-				ast_log(LOG_WARNING, "Could not create pvt '%s,' ignoring all private config changes.\n", cat);
-				goto error;
+			if (!(tmppvt = info->find_pvt(NULL, cat))) {
+				if (!(tmppvt = info->pvt_alloc(cat))) {
+					/* Since we will be replacing the whole private container, bail out on errors instead of just
+					 * skipping privates with config errors */
+					ast_log(LOG_WARNING, "Could not create pvt '%s,' ignoring all private config changes.\n", cat);
+					goto error;
+				}
 			}
 
 			if (!(tmpcfg = info->pvt_cfg_alloc(cat))) {
+				goto error;
+			}
+
+			if (ast_config_option_set_defaults(info->opts_container, cat, tmpcfg)) {
 				goto error;
 			}
 




More information about the asterisk-commits mailing list