Merged revisions 307750 via svnmerge from
[asterisk/asterisk.git] / apps / app_dial.c
index eeedfb3..d0faa38 100644 (file)
@@ -2508,14 +2508,24 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 
                                gosub_argstart = strchr(opt_args[OPT_ARG_CALLEE_GOSUB], ',');
                                if (gosub_argstart) {
+                                       const char *what_is_s = "s";
                                        *gosub_argstart = 0;
-                                       if (asprintf(&gosub_args, "%s,s,1(%s)", opt_args[OPT_ARG_CALLEE_GOSUB], gosub_argstart + 1) < 0) {
+                                       if (!ast_exists_extension(peer, opt_args[OPT_ARG_CALLEE_GOSUB], "s", 1, S_COR(peer->caller.id.number.valid, peer->caller.id.number.str, NULL)) &&
+                                                ast_exists_extension(peer, opt_args[OPT_ARG_CALLEE_GOSUB], "~~s~~", 1, S_COR(peer->caller.id.number.valid, peer->caller.id.number.str, NULL))) {
+                                               what_is_s = "~~s~~";
+                                       }
+                                       if (asprintf(&gosub_args, "%s,%s,1(%s)", opt_args[OPT_ARG_CALLEE_GOSUB], what_is_s, gosub_argstart + 1) < 0) {
                                                ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
                                                gosub_args = NULL;
                                        }
                                        *gosub_argstart = ',';
                                } else {
-                                       if (asprintf(&gosub_args, "%s,s,1", opt_args[OPT_ARG_CALLEE_GOSUB]) < 0) {
+                                       const char *what_is_s = "s";
+                                       if (!ast_exists_extension(peer, opt_args[OPT_ARG_CALLEE_GOSUB], "s", 1, S_COR(peer->caller.id.number.valid, peer->caller.id.number.str, NULL)) &&
+                                                ast_exists_extension(peer, opt_args[OPT_ARG_CALLEE_GOSUB], "~~s~~", 1, S_COR(peer->caller.id.number.valid, peer->caller.id.number.str, NULL))) {
+                                               what_is_s = "~~s~~";
+                                       }
+                                       if (asprintf(&gosub_args, "%s,%s,1", opt_args[OPT_ARG_CALLEE_GOSUB], what_is_s) < 0) {
                                                ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
                                                gosub_args = NULL;
                                        }