diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 7b13e28c6b..e8f9dd5bb4 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -638,7 +638,8 @@ static void conf_play(struct ast_channel *chan, struct ast_conference *conf, enu * \return A pointer to the conference struct, or NULL if it wasn't found and * make or dynamic were not set. */ -static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin, int make, int dynamic, int refcount) +static struct ast_conference *build_conf(const char *confno, const char *pin, + const char *pinadmin, int make, int dynamic, int refcount) { struct ast_conference *cnf; struct zt_confinfo ztc; @@ -2087,6 +2088,55 @@ bailoutandtrynormal: return ret; } +static struct ast_conference *build_conf_from_config(struct ast_conference *conf, const char *confno, + int make, int dynamic, int refcount) +{ + 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) { + char *parse; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(confno); + AST_APP_ARG(pin); + AST_APP_ARG(pinadmin); + ); + + if (strcasecmp(var->name, "conf")) + continue; + + parse = ast_strdupa(var->value); + AST_NONSTANDARD_APP_ARGS(args, parse, ','); + + if (strcasecmp(args.confno, confno)) + continue; + + if (!conf) { + conf = build_conf(args.confno, S_OR(args.pin, ""), + S_OR(args.pinadmin, ""), make, dynamic, refcount); + break; + } + + ast_copy_string(conf->pin, S_OR(args.pin, ""), sizeof(conf->pin)); + ast_copy_string(conf->pinadmin, S_OR(args.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_realtime(struct ast_channel *chan, char *confno, int make, int dynamic, char *dynamic_pin, size_t pin_buf_len, int refcount, struct ast_flags *confflags) { @@ -2143,19 +2193,10 @@ static struct ast_conference *find_conf_realtime(struct ast_channel *chan, char return cnf; } - static struct ast_conference *find_conf(struct ast_channel *chan, char *confno, int make, int dynamic, char *dynamic_pin, size_t pin_buf_len, int refcount, struct ast_flags *confflags) { - struct ast_config *cfg; - struct ast_variable *var; struct ast_conference *cnf; - char *parse; - AST_DECLARE_APP_ARGS(args, - AST_APP_ARG(confno); - AST_APP_ARG(pin); - AST_APP_ARG(pinadmin); - ); /* Check first in the conference list */ AST_LIST_LOCK(&confs); @@ -2183,33 +2224,7 @@ static struct ast_conference *find_conf(struct ast_channel *chan, char *confno, cnf = build_conf(confno, "", "", make, dynamic, refcount); } } 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; - } - for (var = ast_variable_browse(cfg, "rooms"); var; var = var->next) { - if (strcasecmp(var->name, "conf")) - continue; - - if (!(parse = ast_strdupa(var->value))) - return NULL; - - AST_NONSTANDARD_APP_ARGS(args, parse, ','); - if (!strcasecmp(args.confno, confno)) { - /* Bingo it's a valid conference */ - cnf = build_conf(args.confno, - S_OR(args.pin, ""), - S_OR(args.pinadmin, ""), - make, dynamic, refcount); - break; - } - } - 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, refcount); } } else if (dynamic_pin) { /* Correct for the user selecting 'D' instead of 'd' to have @@ -2217,6 +2232,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, 0); } if (cnf) {