From ae2aed9dff0e8f25c462bbfc1b501aed7cebfe59 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 20 Dec 2006 02:49:26 +0000 Subject: [PATCH] fix dialplan stack git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3746 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/applications/mod_enum/mod_enum.c | 3 -- .../mod_dialplan_directory.c | 2 - .../mod_dialplan_xml/mod_dialplan_xml.c | 4 -- src/switch_core.c | 41 +++++++++++-------- 4 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/mod/applications/mod_enum/mod_enum.c b/src/mod/applications/mod_enum/mod_enum.c index a954ba212f..9b20625166 100644 --- a/src/mod/applications/mod_enum/mod_enum.c +++ b/src/mod/applications/mod_enum/mod_enum.c @@ -549,11 +549,8 @@ static switch_caller_extension_t *enum_dialplan_hunt(switch_core_session_t *sess if (extension) { switch_channel_set_state(channel, CS_EXECUTE); - } else { - switch_channel_hangup(channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); } - return extension; } diff --git a/src/mod/dialplans/mod_dialplan_directory/mod_dialplan_directory.c b/src/mod/dialplans/mod_dialplan_directory/mod_dialplan_directory.c index 01f665c1b5..c8bb93ee3f 100644 --- a/src/mod/dialplans/mod_dialplan_directory/mod_dialplan_directory.c +++ b/src/mod/dialplans/mod_dialplan_directory/mod_dialplan_directory.c @@ -150,8 +150,6 @@ static switch_caller_extension_t *directory_dialplan_hunt(switch_core_session_t if (extension) { switch_channel_set_state(channel, CS_EXECUTE); - } else { - switch_channel_hangup(channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); } return extension; diff --git a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c index aa508f28af..0714144009 100644 --- a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c +++ b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c @@ -290,7 +290,6 @@ static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session) if (switch_xml_locate("dialplan", NULL, NULL, NULL, &xml, &cfg, stream.data) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of dialplan failed\n"); - switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); return NULL; } @@ -300,7 +299,6 @@ static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session) if (!(xcontext = switch_xml_find_child(cfg, "context", "name", context))) { if (!(xcontext = switch_xml_find_child(cfg, "context", "name", "global"))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "context %s not found\n", context); - switch_channel_hangup(channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); switch_xml_free(xml); return NULL; } @@ -328,8 +326,6 @@ static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session) if (extension) { switch_channel_set_state(channel, CS_EXECUTE); - } else { - switch_channel_hangup(channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); } return extension; diff --git a/src/switch_core.c b/src/switch_core.c index f1d93cded2..a10b9ef5e1 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -2617,45 +2617,50 @@ static void switch_core_standard_on_ring(switch_core_session_t *session) { switch_dialplan_interface_t *dialplan_interface = NULL; switch_caller_profile_t *caller_profile; - switch_caller_extension_t *extension; + switch_caller_extension_t *extension = NULL; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Standard RING %s\n", switch_channel_get_name(session->channel)); if ((caller_profile = switch_channel_get_caller_profile(session->channel)) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't get profile!\n"); switch_channel_hangup(session->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); + return; } else { char *dp[25]; + char *dpstr; int argc, x, count = 0; if (!switch_strlen_zero(caller_profile->dialplan)) { - argc = switch_separate_string(caller_profile->dialplan, ',', dp, (sizeof(dp) / sizeof(dp[0]))); - for (x = 0; x < argc; x++) { - if (!(dialplan_interface = switch_loadable_module_get_dialplan_interface(dp[x]))) { - continue; - } + if ((dpstr = switch_core_session_strdup(session, caller_profile->dialplan))) { + argc = switch_separate_string(dpstr, ',', dp, (sizeof(dp) / sizeof(dp[0]))); + for (x = 0; x < argc; x++) { + if (!(dialplan_interface = switch_loadable_module_get_dialplan_interface(dp[x]))) { + continue; + } - count++; + count++; - if ((extension = dialplan_interface->hunt_function(session)) != 0) { - switch_channel_set_caller_extension(session->channel, extension); - break; - } - } - } + if ((extension = dialplan_interface->hunt_function(session)) != 0) { + switch_channel_set_caller_extension(session->channel, extension); + return; + } + } + } + } if (!count) { if (switch_channel_test_flag(session->channel, CF_OUTBOUND)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No Dialplan, changing state to HOLD\n"); switch_channel_set_state(session->channel, CS_HOLD); return; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No Dialplan, Aborting\n"); - switch_channel_hangup(session->channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); - } + } } } - + + if (!extension) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No Route, Aborting\n"); + switch_channel_hangup(session->channel, SWITCH_CAUSE_NO_ROUTE_DESTINATION); + } } static void switch_core_standard_on_execute(switch_core_session_t *session)