From: Richard Mudgett Date: Mon, 15 Aug 2011 17:24:08 +0000 (+0000) Subject: Fix some minor chan_dahdi config load issues. X-Git-Tag: 1.8.7.0-rc1~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=acc2d27a4737b3156476f041c6bf7c8ce98841bb;p=thirdparty%2Fasterisk.git Fix some minor chan_dahdi config load issues. * Address chan_dahdi.conf dahdichan option todo item about needing line number. * Make ignore_failed_channels option also apply to dahdichan option. * Don't attempt to create a default pseudo channel if the chan_dahdi.conf channel/channels option is not allowed. * Add a similar check for dahdichan in normal chan_dahdi.conf sections as is done in users.conf. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@331955 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 8f62cadcbe..4658606d2f 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -16715,7 +16715,7 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct struct dahdi_pvt *tmp; int y; int found_pseudo = 0; - char dahdichan[MAX_CHANLIST_LEN] = {}; + struct ast_variable *dahdichan = NULL; for (; v; v = v->next) { if (!ast_jb_read_conf(&global_jbconf, v->name, v->value)) @@ -16749,7 +16749,8 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct confp->chan.usefaxbuffers = 1; } } else if (!strcasecmp(v->name, "dahdichan")) { - ast_copy_string(dahdichan, v->value, sizeof(dahdichan)); + /* Only process the last dahdichan value. */ + dahdichan = v; } else if (!strcasecmp(v->name, "usedistinctiveringdetection")) { usedistinctiveringdetection = ast_true(v->value); } else if (!strcasecmp(v->name, "distinctiveringaftercid")) { @@ -17746,11 +17747,17 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct confp->chan.vars = NULL; } - if (dahdichan[0]) { - /* The user has set 'dahdichan' */ - /*< \todo pass proper line number instead of 0 */ - if (build_channels(confp, dahdichan, reload, 0, &found_pseudo)) { - return -1; + if (dahdichan) { + /* Process the deferred dahdichan value. */ + if (build_channels(confp, dahdichan->value, reload, dahdichan->lineno, + &found_pseudo)) { + if (confp->ignore_failed_channels) { + ast_log(LOG_WARNING, + "Dahdichan '%s' failure ignored: ignore_failed_channels.\n", + dahdichan->value); + } else { + return -1; + } } } @@ -17766,7 +17773,7 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct /*< \todo why check for the pseudo in the per-channel section. * Any actual use for manual setup of the pseudo channel? */ - if (!found_pseudo && reload != 1) { + if (!found_pseudo && reload != 1 && !(options & PROC_DAHDI_OPT_NOCHAN)) { /* use the default configuration for a channel, so that any settings from real configured channels don't "leak" into the pseudo channel config @@ -17826,6 +17833,7 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str struct ast_config *ucfg; struct ast_variable *v; struct ast_flags config_flags = { reload == 1 ? CONFIG_FLAG_FILEUNCHANGED : 0 }; + const char *chans; const char *cat; int res; @@ -17939,7 +17947,9 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str mwimonitornotify[0] = '\0'; v = ast_variable_browse(cfg, "channels"); - if ((res = process_dahdi(base_conf, "", v, reload, 0))) { + if ((res = process_dahdi(base_conf, + "" /* Must be empty for the channels category. Silly voicemail mailbox. */, + v, reload, 0))) { ast_mutex_unlock(&iflock); ast_config_destroy(cfg); if (ucfg) { @@ -17960,6 +17970,12 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str continue; } + chans = ast_variable_retrieve(ucfg, cat, "dahdichan"); + if (ast_strlen_zero(chans)) { + /* Section is useless without a dahdichan value present. */ + continue; + } + /* Copy base_conf to conf. */ deep_copy_dahdi_chan_conf(conf, base_conf); @@ -17976,11 +17992,11 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str ast_config_destroy(cfg); if (ucfg) { - const char *chans; - - /* Reset base_conf, so things don't leak from dahdi_chan.conf */ + /* Reset base_conf, so things don't leak from chan_dahdi.conf */ deep_copy_dahdi_chan_conf(base_conf, default_conf); - process_dahdi(base_conf, "", ast_variable_browse(ucfg, "general"), 1, 0); + process_dahdi(base_conf, + "" /* Must be empty for the general category. Silly voicemail mailbox. */, + ast_variable_browse(ucfg, "general"), 1, 0); for (cat = ast_category_browse(ucfg, NULL); cat ; cat = ast_category_browse(ucfg, cat)) { if (!strcasecmp(cat, "general")) { @@ -17988,8 +18004,8 @@ static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, str } chans = ast_variable_retrieve(ucfg, cat, "dahdichan"); - if (ast_strlen_zero(chans)) { + /* Section is useless without a dahdichan value present. */ continue; }