diff --git a/src/include/switch_types.h b/src/include/switch_types.h index fa01f73c04..51a79ee95b 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -102,6 +102,7 @@ SWITCH_BEGIN_EXTERN_C #define SWITCH_PATH_SEPARATOR "/" #endif #define SWITCH_URL_SEPARATOR "://" +#define SWITCH_API_HANGUP_HOOK_VARIABLE "api_hangup_hook" #define SWITCH_PROCESS_CDR_VARIABLE "process_cdr" #define SWITCH_BRIDGE_CHANNEL_VARIABLE "bridge_channel" #define SWITCH_CHANNEL_NAME_VARIABLE "channel_name" diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index bc6c5ae249..4a81c8b1a2 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -412,6 +412,7 @@ SWITCH_DECLARE(void) switch_core_session_run(switch_core_session_t *session) case CS_HANGUP: /* Deactivate and end the thread */ { const char *var = switch_channel_get_variable(session->channel, SWITCH_PROCESS_CDR_VARIABLE); + const char *hook_var = switch_channel_get_variable(session->channel, SWITCH_API_HANGUP_HOOK_VARIABLE); if (!switch_strlen_zero(var)) { if (!strcasecmp(var, "a_only")) { @@ -429,6 +430,19 @@ SWITCH_DECLARE(void) switch_core_session_run(switch_core_session_t *session) switch_core_session_signal_lock(session); STATE_MACRO(hangup, "HANGUP"); switch_core_session_signal_unlock(session); + + if (!switch_strlen_zero(hook_var)) { + switch_stream_handle_t stream = { 0 }; + char *cmd = switch_core_session_strdup(session, hook_var); + char *arg = NULL; + if ((arg = strchr(cmd, ' '))) { + *arg++ = '\0'; + } + SWITCH_STANDARD_STREAM(stream); + switch_api_execute(cmd, arg, session, &stream); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Hangup Command %s(%s):\n%s\n", cmd, arg, switch_str_nil((char *) stream.data)); + switch_safe_free(stream.data); + } } goto done; case CS_INIT: /* Basic setup tasks */