[asterisk-commits] russell: branch russell/sla_rewrite r51460 - /team/russell/sla_rewrite/apps/

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Mon Jan 22 14:54:18 MST 2007


Author: russell
Date: Mon Jan 22 15:54:17 2007
New Revision: 51460

URL: http://svn.digium.com/view/asterisk?view=rev&rev=51460
Log:
- Start supporting module reload for SLA configuration
- Implement the "autocontext" option for trunks

Modified:
    team/russell/sla_rewrite/apps/app_meetme.c

Modified: team/russell/sla_rewrite/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/russell/sla_rewrite/apps/app_meetme.c?view=diff&rev=51460&r1=51459&r2=51460
==============================================================================
--- team/russell/sla_rewrite/apps/app_meetme.c (original)
+++ team/russell/sla_rewrite/apps/app_meetme.c Mon Jan 22 15:54:17 2007
@@ -356,6 +356,8 @@
 
 static AST_RWLIST_HEAD_STATIC(sla_stations, sla_station);
 static AST_RWLIST_HEAD_STATIC(sla_trunks, sla_trunk);
+
+static const char sla_registrar[] = "SLA";
 
 /*! The number of audio buffers to be allocated on pseudo channels
  *  when in a conference */
@@ -2675,21 +2677,6 @@
 	return AST_DEVICE_INUSE;
 }
 
-static int slastation_exec(struct ast_channel *chan, void *data)
-{
-	return 0;
-}
-
-static int slatrunk_exec(struct ast_channel *chan, void *data)
-{
-	return 0;
-}
-
-static int sla_state(const char *data)
-{
-	return AST_DEVICE_INUSE;
-}
-
 static void load_config_meetme(void)
 {
 	struct ast_config *cfg;
@@ -2716,6 +2703,57 @@
 	ast_config_destroy(cfg);
 }
 
+static int slastation_exec(struct ast_channel *chan, void *data)
+{
+	return 0;
+}
+
+static int slatrunk_exec(struct ast_channel *chan, void *data)
+{
+	return 0;
+}
+
+static int sla_state(const char *data)
+{
+	return AST_DEVICE_INUSE;
+}
+
+static void destroy_trunk(struct sla_trunk *trunk)
+{
+	if (!ast_strlen_zero(trunk->autocontext))
+		ast_context_remove_extension(trunk->autocontext, "s", 1, sla_registrar);
+
+	ast_string_field_free_all(trunk);
+	free(trunk);
+}
+
+static void destroy_station(struct sla_station *station)
+{
+	struct sla_trunk_ref *trunk_ref;
+
+	while ((trunk_ref = AST_LIST_REMOVE_HEAD(&station->trunks, entry)))
+		free(trunk_ref);
+
+	ast_string_field_free_all(station);
+	free(station);
+}
+
+static void destroy_sla(void)
+{
+	struct sla_trunk *trunk;
+	struct sla_station *station;
+
+	AST_RWLIST_WRLOCK(&sla_trunks);
+	while ((trunk = AST_RWLIST_REMOVE_HEAD(&sla_trunks, entry)))
+		destroy_trunk(trunk);
+	AST_RWLIST_UNLOCK(&sla_trunks);
+
+	AST_RWLIST_WRLOCK(&sla_stations);
+	while ((station = AST_RWLIST_REMOVE_HEAD(&sla_stations, entry)))
+		destroy_station(station);
+	AST_RWLIST_UNLOCK(&sla_stations);
+}
+
 static int build_trunk(struct ast_config *cfg, const char *cat)
 {
 	struct sla_trunk *trunk;
@@ -2740,9 +2778,27 @@
 	for (var = ast_variable_browse(cfg, cat); var; var = var->next) {
 		if (!strcasecmp(var->name, "autocontext"))
 			ast_string_field_set(trunk, autocontext, var->value);
-		else {
+		else if (strcasecmp(var->name, "type") && strcasecmp(var->name, "device")) {
 			ast_log(LOG_ERROR, "Invalid option '%s' specified at line %d of %s!\n",
 				var->name, var->lineno, SLA_CONFIG_FILE);
+		}
+	}
+
+	if (!ast_strlen_zero(trunk->autocontext)) {
+		struct ast_context *context;
+		context = ast_context_find_or_create(NULL, trunk->autocontext, sla_registrar);
+		if (!context) {
+			ast_log(LOG_ERROR, "Failed to automatically find or create "
+				"context '%s' for SLA!\n", trunk->autocontext);
+			destroy_trunk(trunk);
+			return -1;
+		}
+		if (ast_add_extension2(context, 0 /* don't replace */, "s", 1,
+			NULL, NULL, slatrunk_app, (void *) trunk->name, NULL, sla_registrar)) {
+			ast_log(LOG_ERROR, "Failed to automatically create extension "
+				"for trunk '%s'!\n", trunk->name);
+			destroy_trunk(trunk);
+			return -1;
 		}
 	}
 
@@ -2794,7 +2850,7 @@
 			AST_LIST_INSERT_TAIL(&station->trunks, trunk_ref, entry);
 		} else if (!strcasecmp(var->name, "autocontext")) {
 			ast_string_field_set(station, autocontext, var->value);
-		} else {
+		} else if (strcasecmp(var->name, "type") && strcasecmp(var->name, "device")) {
 			ast_log(LOG_ERROR, "Invalid option '%s' specified at line %d of %s!\n",
 				var->name, var->lineno, SLA_CONFIG_FILE);
 		}
@@ -2839,29 +2895,6 @@
 	ast_config_destroy(cfg);
 
 	return res;
-}
-
-static void destroy_sla(void)
-{
-	struct sla_trunk *trunk;
-	struct sla_station *station;
-
-	AST_RWLIST_WRLOCK(&sla_trunks);
-	while ((trunk = AST_RWLIST_REMOVE_HEAD(&sla_trunks, entry))) {
-		ast_string_field_free_all(trunk);
-		free(trunk);
-	}
-	AST_RWLIST_UNLOCK(&sla_trunks);
-
-	AST_RWLIST_WRLOCK(&sla_stations);
-	while ((station = AST_RWLIST_REMOVE_HEAD(&sla_stations, entry))) {
-		struct sla_trunk_ref *trunk_ref;
-		while ((trunk_ref = AST_LIST_REMOVE_HEAD(&station->trunks, entry)))
-			free(trunk_ref);
-		ast_string_field_free_all(station);
-		free(station);
-	}
-	AST_RWLIST_UNLOCK(&sla_stations);
 }
 
 static int load_config(void)
@@ -2919,9 +2952,8 @@
 
 static int reload(void)
 {
-	load_config();
-
-	return 0;
+	destroy_sla();
+	return load_config();
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "MeetMe conference bridge",



More information about the asterisk-commits mailing list