aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-16 20:56:58 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-16 20:56:58 +0000
commit87ef22fdc006bcb2df978489affcf027b6912fb5 (patch)
tree7ec2bae40f41bd8f567f856b3c480c67339b4032
parentcc163493d9febb51fa15b3a80a7c457c60f79a73 (diff)
For conferences that are configured in meetme.conf, check the configuration
file every time someone joins the conference instead of only when the conference is first created. This is to ensure that changes to the pin numbers in the config file are always honored. (issue #9073) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@54955 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_meetme.c91
1 files changed, 51 insertions, 40 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index 1efd4bbb4..9897e78b1 100644
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -438,7 +438,8 @@ static void conf_play(struct ast_channel *chan, struct ast_conference *conf, int
ast_autoservice_stop(chan);
}
-static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin, int make, int dynamic)
+static struct ast_conference *build_conf(const char *confno, const char *pin,
+ const char *pinadmin, int make, int dynamic)
{
struct ast_conference *cnf;
struct zt_confinfo ztc;
@@ -1645,11 +1646,53 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
return ret;
}
-static struct ast_conference *find_conf(struct ast_channel *chan, char *confno, int make, int dynamic, char *dynamic_pin,
- struct ast_flags *confflags)
+static struct ast_conference *build_conf_from_config(struct ast_conference *conf, const char *confno,
+ int make, int dynamic)
{
struct ast_config *cfg;
struct ast_variable *var;
+
+ if (!(cfg = ast_config_load(CONFIG_FILE_NAME))) {
+ ast_log(LOG_WARNING, "No %s file :(\n", CONFIG_FILE_NAME);
+ return NULL;
+ }
+
+ var = ast_variable_browse(cfg, "rooms");
+ for (; var; var = var->next) {
+ /* Separate the PIN */
+ char *pin, *pinadmin, *conf_name;
+ if (strcasecmp(var->name, "conf"))
+ continue;
+
+ pinadmin = ast_strdupa(var->value);
+ conf_name = strsep(&pinadmin, "|,");
+ pin = strsep(&pinadmin, "|,");
+
+ if (strcasecmp(conf_name, confno))
+ continue;
+
+ if (!conf) {
+ conf = build_conf(confno, pin ? pin : "", pinadmin ? pinadmin : "", make, dynamic);
+ break;
+ }
+
+ ast_copy_string(conf->pin, pin ? pin : "", sizeof(conf->pin));
+ ast_copy_string(conf->pinadmin, pinadmin ? pinadmin : "", sizeof(conf->pinadmin));
+
+ break;
+ }
+
+ if (!var && !conf)
+ ast_log(LOG_DEBUG, "%s isn't a valid conference\n", confno);
+
+ ast_config_destroy(cfg);
+
+ return conf;
+}
+
+static struct ast_conference *find_conf(struct ast_channel *chan, char *confno, int make, int dynamic, char *dynamic_pin,
+ struct ast_flags *confflags)
+{
struct ast_conference *cnf;
/* Check first in the conference list */
@@ -1675,43 +1718,7 @@ static struct ast_conference *find_conf(struct ast_channel *chan, char *confno,
cnf = build_conf(confno, "", "", make, dynamic);
}
} else {
- /* Check the config */
- cfg = ast_config_load(CONFIG_FILE_NAME);
- if (!cfg) {
- ast_log(LOG_WARNING, "No %s file :(\n", CONFIG_FILE_NAME);
- return NULL;
- }
- var = ast_variable_browse(cfg, "rooms");
- while (var) {
- if (!strcasecmp(var->name, "conf")) {
- /* Separate the PIN */
- char *pin, *pinadmin, *conf;
-
- if ((pinadmin = ast_strdupa(var->value))) {
- conf = strsep(&pinadmin, "|,");
- pin = strsep(&pinadmin, "|,");
- if (!strcasecmp(conf, confno)) {
- /* Bingo it's a valid conference */
- if (pin)
- if (pinadmin)
- cnf = build_conf(confno, pin, pinadmin, make, dynamic);
- else
- cnf = build_conf(confno, pin, "", make, dynamic);
- else
- if (pinadmin)
- cnf = build_conf(confno, "", pinadmin, make, dynamic);
- else
- cnf = build_conf(confno, "", "", make, dynamic);
- break;
- }
- }
- }
- var = var->next;
- }
- if (!var) {
- ast_log(LOG_DEBUG, "%s isn't a valid conference\n", confno);
- }
- ast_config_destroy(cfg);
+ cnf = build_conf_from_config(NULL, confno, make, dynamic);
}
} else if (dynamic_pin) {
/* Correct for the user selecting 'D' instead of 'd' to have
@@ -1719,6 +1726,10 @@ static struct ast_conference *find_conf(struct ast_channel *chan, char *confno,
with a pin. */
if (dynamic_pin[0] == 'q')
dynamic_pin[0] = '\0';
+ } else if (!cnf->isdynamic) {
+ /* If the conference exists, check the config again, just in case
+ * the pin in the file has changed. */
+ build_conf_from_config(cnf, confno, 0, 0);
}
if (cnf) {