aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-04-14 22:59:59 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-04-14 22:59:59 +0000
commit7462f51766b6f66d09c0816b474e86c0c3f1a710 (patch)
tree72ec2e75b9bc658e7df98d272e25d6299f21b2af /main
parent09d31bf391547639229cd4648e81227da1e3c460 (diff)
Merged revisions 257262 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r257262 | tilghman | 2010-04-14 17:57:35 -0500 (Wed, 14 Apr 2010) | 15 lines Yet another issue where the conversion of the application delimiter to comma caused an issue. Application arguments within the feature map could possibly contain a comma, which conflicts with the syntax of the features.conf configuration file. This patch allows the argument to be wrapped in parentheses or quoted, to allow the application arguments to be interpreted as a single configuration parameter. (closes issue #16646) Reported by: pinga-fogo Patches: 20100414__issue16646.diff.txt uploaded by tilghman (license 14) Tested by: tilghman Review: https://reviewboard.asterisk.org/r/547/ ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@257263 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/features.c69
1 files changed, 40 insertions, 29 deletions
diff --git a/main/features.c b/main/features.c
index cf8e84678..3a00fb521 100644
--- a/main/features.c
+++ b/main/features.c
@@ -3320,25 +3320,33 @@ static int load_config(void)
ast_unregister_features();
for (var = ast_variable_browse(cfg, "applicationmap"); var; var = var->next) {
char *tmp_val = ast_strdupa(var->value);
- char *exten, *activateon, *activatedby, *app, *app_args, *moh_class;
+ char *activateon;
struct ast_call_feature *feature;
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(exten);
+ AST_APP_ARG(activatedby);
+ AST_APP_ARG(app);
+ AST_APP_ARG(app_args);
+ AST_APP_ARG(moh_class);
+ );
- /* strsep() sets the argument to NULL if match not found, and it
- * is safe to use it with a NULL argument, so we don't check
- * between calls.
- */
- exten = strsep(&tmp_val,",");
- activatedby = strsep(&tmp_val,",");
- app = strsep(&tmp_val,",");
- app_args = strsep(&tmp_val,",");
- moh_class = strsep(&tmp_val,",");
+ AST_STANDARD_APP_ARGS(args, tmp_val);
+ if (strchr(args.app, '(')) {
+ /* New syntax */
+ args.moh_class = args.app_args;
+ args.app_args = strchr(args.app, '(');
+ *args.app_args++ = '\0';
+ if (args.app_args[strlen(args.app_args) - 1] == ')') {
+ args.app_args[strlen(args.app_args) - 1] = '\0';
+ }
+ }
- activateon = strsep(&activatedby, "/");
+ activateon = strsep(&args.activatedby, "/");
/*! \todo XXX var_name or app_args ? */
- if (ast_strlen_zero(app) || ast_strlen_zero(exten) || ast_strlen_zero(activateon) || ast_strlen_zero(var->name)) {
+ if (ast_strlen_zero(args.app) || ast_strlen_zero(args.exten) || ast_strlen_zero(activateon) || ast_strlen_zero(var->name)) {
ast_log(LOG_NOTICE, "Please check the feature Mapping Syntax, either extension, name, or app aren't provided %s %s %s %s\n",
- app, exten, activateon, var->name);
+ args.app, args.exten, activateon, var->name);
continue;
}
@@ -3350,20 +3358,23 @@ static int load_config(void)
}
AST_RWLIST_UNLOCK(&feature_list);
- if (!(feature = ast_calloc(1, sizeof(*feature))))
- continue;
+ if (!(feature = ast_calloc(1, sizeof(*feature)))) {
+ continue;
+ }
ast_copy_string(feature->sname, var->name, FEATURE_SNAME_LEN);
- ast_copy_string(feature->app, app, FEATURE_APP_LEN);
- ast_copy_string(feature->exten, exten, FEATURE_EXTEN_LEN);
+ ast_copy_string(feature->app, args.app, FEATURE_APP_LEN);
+ ast_copy_string(feature->exten, args.exten, FEATURE_EXTEN_LEN);
- if (app_args)
- ast_copy_string(feature->app_args, app_args, FEATURE_APP_ARGS_LEN);
+ if (args.app_args) {
+ ast_copy_string(feature->app_args, args.app_args, FEATURE_APP_ARGS_LEN);
+ }
- if (moh_class)
- ast_copy_string(feature->moh_class, moh_class, FEATURE_MOH_LEN);
-
- ast_copy_string(feature->exten, exten, sizeof(feature->exten));
+ if (args.moh_class) {
+ ast_copy_string(feature->moh_class, args.moh_class, FEATURE_MOH_LEN);
+ }
+
+ ast_copy_string(feature->exten, args.exten, sizeof(feature->exten));
feature->operation = feature_exec_app;
ast_set_flag(feature, AST_FEATURE_FLAG_NEEDSDTMF);
@@ -3378,13 +3389,13 @@ static int load_config(void)
continue;
}
- if (ast_strlen_zero(activatedby))
+ if (ast_strlen_zero(args.activatedby))
ast_set_flag(feature, AST_FEATURE_FLAG_BYBOTH);
- else if (!strcasecmp(activatedby, "caller"))
+ else if (!strcasecmp(args.activatedby, "caller"))
ast_set_flag(feature, AST_FEATURE_FLAG_BYCALLER);
- else if (!strcasecmp(activatedby, "callee"))
+ else if (!strcasecmp(args.activatedby, "callee"))
ast_set_flag(feature, AST_FEATURE_FLAG_BYCALLEE);
- else if (!strcasecmp(activatedby, "both"))
+ else if (!strcasecmp(args.activatedby, "both"))
ast_set_flag(feature, AST_FEATURE_FLAG_BYBOTH);
else {
ast_log(LOG_NOTICE, "Invalid 'ActivatedBy' specification for feature '%s',"
@@ -3393,8 +3404,8 @@ static int load_config(void)
}
ast_register_feature(feature);
-
- ast_verb(2, "Mapping Feature '%s' to app '%s(%s)' with code '%s'\n", var->name, app, app_args, exten);
+
+ ast_verb(2, "Mapping Feature '%s' to app '%s(%s)' with code '%s'\n", var->name, args.app, args.app_args, args.exten);
}
ast_unregister_groups();