From f09491a69b2c2b03c394cc916c9b3434afbca1c3 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 10 May 2006 15:47:54 +0000 Subject: [PATCH] XMLification (wave 4) git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@1412 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_console.h | 4 + src/include/switch_loadable_module.h | 6 +- src/include/switch_module_interfaces.h | 8 ++ src/include/switch_types.h | 9 +- src/include/switch_utils.h | 3 +- src/include/switch_xml.h | 5 +- .../applications/mod_commands/mod_commands.c | 91 ++++++++----------- .../mod_dialplan_directory.c | 2 +- .../mod_dialplan_xml/mod_dialplan_xml.c | 8 +- .../endpoints/mod_dingaling/mod_dingaling.c | 22 ++--- src/mod/endpoints/mod_exosip/mod_exosip.c | 2 +- src/mod/endpoints/mod_iax/mod_iax.c | 2 +- src/mod/endpoints/mod_opal/mod_opal.c | 2 +- .../endpoints/mod_portaudio/mod_portaudio.c | 50 +++++----- src/mod/endpoints/mod_wanpipe/mod_wanpipe.c | 2 +- src/mod/endpoints/mod_woomera/mod_woomera.c | 2 +- .../mod_event_multicast/mod_event_multicast.c | 2 +- .../mod_xmpp_event/mod_xmpp_event.c | 2 +- .../mod_zeroconf/mod_zeroconf.c | 2 +- .../mod_spidermonkey/mod_spidermonkey.c | 13 ++- src/mod/loggers/mod_console/mod_console.c | 2 +- src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c | 72 +++++++++------ src/switch_console.c | 49 +++++++++- src/switch_loadable_module.c | 17 ++-- src/switch_utils.c | 45 +++++++++ src/switch_xml.c | 9 +- 26 files changed, 275 insertions(+), 156 deletions(-) diff --git a/src/include/switch_console.h b/src/include/switch_console.h index 3b7701cc89..7789a4fcd0 100644 --- a/src/include/switch_console.h +++ b/src/include/switch_console.h @@ -53,6 +53,10 @@ SWITCH_DECLARE(void) switch_console_loop(void); */ SWITCH_DECLARE(void) switch_console_printf(switch_text_channel_t channel, char *file, const char *func, int line, char *fmt, ...); +/*! + \brief A method akin to printf for dealing with api streams +*/ +SWITCH_DECLARE(switch_status_t) switch_console_stream_write(switch_stream_handle_t *handle, char *fmt, ...); END_EXTERN_C #endif diff --git a/src/include/switch_loadable_module.h b/src/include/switch_loadable_module.h index 185fb74d50..31f7a273d0 100644 --- a/src/include/switch_loadable_module.h +++ b/src/include/switch_loadable_module.h @@ -193,11 +193,11 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(switch_codec_interf \brief Execute a registered API command \param cmd the name of the API command to execute \param arg the optional arguement to the command - \param retbuf a buffer to write output to - \param len the length in bytes of retbuf + \param stream stream for output \return the status returned by the API call */ -SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, char *retbuf, switch_size_t len); +SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, switch_stream_handle_t *stream); + /*! diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h index 2198293901..85af4379e4 100644 --- a/src/include/switch_module_interfaces.h +++ b/src/include/switch_module_interfaces.h @@ -62,6 +62,14 @@ struct switch_state_handler_table { switch_state_handler_t on_hold; }; +struct switch_stream_handle { + switch_stream_handle_write_function_t write_function; + void *data; + void *end; + switch_size_t data_size; + switch_size_t data_len; +}; + /*! \brief Node in which to store custom outgoing channel callback hooks */ struct switch_io_event_hook_outgoing_channel { /*! the outgoing channel callback hook*/ diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 1bc5aad546..bb0c721491 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -671,7 +671,9 @@ typedef switch_status_t (*switch_kill_channel_hook_t)(switch_core_session_t *, i typedef switch_status_t (*switch_waitfor_read_hook_t)(switch_core_session_t *, int, int); typedef switch_status_t (*switch_waitfor_write_hook_t)(switch_core_session_t *, int, int); typedef switch_status_t (*switch_send_dtmf_hook_t)(switch_core_session_t *, char *); -typedef switch_status_t (*switch_api_function_t)(char *in, char *out, switch_size_t outlen); +typedef struct switch_stream_handle switch_stream_handle_t; +typedef switch_status_t (*switch_stream_handle_write_function_t)(switch_stream_handle_t *handle, char *fmt, ...); +typedef switch_status_t (*switch_api_function_t)(char *in, switch_stream_handle_t *stream); typedef switch_status_t (*switch_dtmf_callback_function_t)(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen); typedef int (*switch_core_db_callback_func_t)(void *pArg, int argc, char **argv, char **columnNames); typedef switch_status_t (*switch_module_load_t) (switch_loadable_module_interface_t **, char *); @@ -686,10 +688,11 @@ typedef struct switch_core_time_duration switch_core_time_duration_t; typedef switch_xml_t (*switch_xml_search_function_t)(char *section, char *tag_name, char *key_name, - char *key_value); + char *key_value, + char *params); + /* things we don't deserve to know about */ - /*! \brief A channel */ struct switch_channel; /*! \brief A core session representing a call and all of it's resources */ diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index 06aedbff0a..f5395faf56 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -184,7 +184,8 @@ SWITCH_DECLARE(char *) switch_string_replace(const char *string, const char *sea SWITCH_DECLARE(switch_status_t) switch_string_match(const char *string, size_t string_len, const char *search, size_t search_len); #define SWITCH_READ_ACCEPTABLE(status) status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK - +SWITCH_DECLARE(int) switch_url_encode(char *url, char *buf, size_t len); +SWITCH_DECLARE(char *) switch_url_decode(char *s); END_EXTERN_C #endif diff --git a/src/include/switch_xml.h b/src/include/switch_xml.h index 654f785572..c909f9b665 100644 --- a/src/include/switch_xml.h +++ b/src/include/switch_xml.h @@ -196,9 +196,10 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate(char *section, char *key_name, char *key_value, switch_xml_t *root, - switch_xml_t *node); + switch_xml_t *node, + char *params); -SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *node); +SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *node, char *params); SWITCH_DECLARE(switch_status_t) switch_xml_bind_search_function(switch_xml_search_function_t function); END_EXTERN_C diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 83e9525de5..82f32a214e 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -33,15 +33,31 @@ static const char modname[] = "mod_commands"; - -static switch_status_t load_function(char *mod, char *out, size_t outlen) +static switch_status_t status_function(char *cmd, switch_stream_handle_t *stream) { - switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) mod); - snprintf(out, outlen, "OK\n"); + switch_core_time_duration_t duration; + switch_core_measure_time(switch_core_uptime(), &duration); + + stream->write_function(stream, "UP %u year(s), %u day(s), %u hour(s), %u minute(s), %u second(s), %u millisecond(s), %u microsecond(s)\n", + duration.yr, + duration.day, + duration.hr, + duration.min, + duration.sec, + duration.ms, + duration.mms + ); return SWITCH_STATUS_SUCCESS; } -static switch_status_t kill_function(char *dest, char *out, size_t outlen) +static switch_status_t load_function(char *mod, switch_stream_handle_t *stream) +{ + switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) mod); + stream->write_function(stream, "OK\n"); + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t kill_function(char *dest, switch_stream_handle_t *stream) { switch_core_session_t *session = NULL; @@ -50,16 +66,16 @@ static switch_status_t kill_function(char *dest, char *out, size_t outlen) switch_core_session_kill_channel(session, SWITCH_SIG_KILL); switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); switch_core_session_rwunlock(session); - snprintf(out, outlen, "OK\n"); + stream->write_function(stream, "OK\n"); } else { - snprintf(out, outlen, "No Such Channel!\n"); + stream->write_function(stream, "No Such Channel!\n"); } return SWITCH_STATUS_SUCCESS; } -static switch_status_t transfer_function(char *cmd, char *out, size_t outlen) +static switch_status_t transfer_function(char *cmd, switch_stream_handle_t *stream) { switch_core_session_t *session = NULL; char *argv[4] = {0}; @@ -68,7 +84,7 @@ static switch_status_t transfer_function(char *cmd, char *out, size_t outlen) argc = switch_separate_string(cmd, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); if (argc < 2 || argc > 4) { - snprintf(out, outlen, "Invalid Parameters\n"); + stream->write_function(stream, "Invalid Parameters\n"); } else { char *uuid = argv[0]; char *dest = argv[1]; @@ -78,15 +94,15 @@ static switch_status_t transfer_function(char *cmd, char *out, size_t outlen) if ((session = switch_core_session_locate(uuid))) { if (switch_ivr_session_transfer(session, dest, dp, context) == SWITCH_STATUS_SUCCESS) { - snprintf(out, outlen, "OK\n"); + stream->write_function(stream, "OK\n"); } else { - snprintf(out, outlen, "ERROR\n"); + stream->write_function(stream, "ERROR\n"); } switch_core_session_rwunlock(session); } else { - snprintf(out, outlen, "No Such Channel!\n"); + stream->write_function(stream, "No Such Channel!\n"); } } @@ -96,7 +112,7 @@ static switch_status_t transfer_function(char *cmd, char *out, size_t outlen) -static switch_status_t pause_function(char *cmd, char *out, size_t outlen) +static switch_status_t pause_function(char *cmd, switch_stream_handle_t *stream) { switch_core_session_t *session = NULL; char *argv[4] = {0}; @@ -105,7 +121,7 @@ static switch_status_t pause_function(char *cmd, char *out, size_t outlen) argc = switch_separate_string(cmd, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); if (argc < 2) { - snprintf(out, outlen, "Invalid Parameters\n"); + stream->write_function(stream, "Invalid Parameters\n"); } else { char *uuid = argv[0]; char *dest = argv[1]; @@ -122,66 +138,32 @@ static switch_status_t pause_function(char *cmd, char *out, size_t outlen) switch_core_session_rwunlock(session); } else { - snprintf(out, outlen, "No Such Channel!\n"); + stream->write_function(stream, "No Such Channel!\n"); } } return SWITCH_STATUS_SUCCESS; } -struct show_return { - char *out; - size_t remaining; -}; - static int show_callback(void *pArg, int argc, char **argv, char **columnNames){ - struct show_return *returnval = (struct show_return *) pArg; - char temp[1024]; - size_t len; + switch_stream_handle_t *stream = (switch_stream_handle_t *) pArg; - sprintf(temp, "%s\n", argv[1]); - len = strlen(temp); - - if (len < returnval->remaining) { - strcpy(returnval->out, temp); - returnval->remaining -= len; - returnval->out += len; - } + stream->write_function(stream, "%s\n", argv[1]); return 0; } -static switch_status_t status_function(char *cmd, char *out, size_t outlen) -{ - switch_core_time_duration_t duration; - switch_core_measure_time(switch_core_uptime(), &duration); - snprintf(out, outlen, "UP %u year(s), %u day(s), %u hour(s), %u minute(s), %u second(s), %u millisecond(s), %u microsecond(s)\n", - duration.yr, - duration.day, - duration.hr, - duration.min, - duration.sec, - duration.ms, - duration.mms - ); - return SWITCH_STATUS_SUCCESS; -} - -static switch_status_t show_function(char *cmd, char *out, size_t outlen) +static switch_status_t show_function(char *cmd, switch_stream_handle_t *stream) { char sql[1024]; char *errmsg; - struct show_return returnval; switch_core_db_t *db = switch_core_db_handle(); sprintf (sql, "select * from interfaces"); - returnval.out = out; - returnval.remaining = outlen; - - switch_core_db_exec(db, sql, show_callback, &returnval, &errmsg); + switch_core_db_exec(db, sql, show_callback, stream, &errmsg); if (errmsg) { - snprintf(out, outlen, "SQL ERR [%s]\n",errmsg); + stream->write_function(stream, "SQL ERR [%s]\n",errmsg); switch_core_db_free(errmsg); errmsg = NULL; } @@ -234,7 +216,6 @@ static switch_api_interface_t commands_api_interface = { /*.next */ &load_api_interface }; - static const switch_loadable_module_interface_t mod_commands_module_interface = { /*.module_name */ modname, /*.endpoint_interface */ NULL, 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 abcafa2998..4e9a40c694 100644 --- a/src/mod/dialplans/mod_dialplan_directory/mod_dialplan_directory.c +++ b/src/mod/dialplans/mod_dialplan_directory/mod_dialplan_directory.c @@ -57,7 +57,7 @@ static void load_config(void) switch_xml_t cfg, xml, settings, param; - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return; } 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 2d401a421f..a64e3b4157 100644 --- a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c +++ b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c @@ -131,7 +131,7 @@ static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session) char *exten_name = NULL; switch_xml_t cfg, xml, xcontext, xexten, xaction, xcond; char *context = NULL; - + char params[1024]; channel = switch_core_session_get_channel(session); if ((caller_profile = switch_channel_get_caller_profile(channel))) { @@ -142,10 +142,10 @@ static switch_caller_extension_t *dialplan_hunt(switch_core_session_t *session) } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Processing %s->%s!\n", caller_profile->caller_id_name, - caller_profile->destination_number); - + caller_profile->destination_number); - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + snprintf(params, sizeof(params), "dest=%s", caller_profile->destination_number); + if (!(xml = switch_xml_open_cfg(cf, &cfg, params))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); return NULL; diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index fcaa880f99..10d04c4596 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -148,8 +148,8 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, globals.dialplan); SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_string, globals.codec_string); SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_rates_string, globals.codec_rates_string); -static switch_status_t dl_login(char *arg, char *out, size_t outlen); -static switch_status_t dl_logout(char *profile_name, char *out, size_t outlen); +static switch_status_t dl_login(char *arg, switch_stream_handle_t *stream); +static switch_status_t dl_logout(char *profile_name, switch_stream_handle_t *stream); static switch_status_t channel_on_init(switch_core_session_t *session); static switch_status_t channel_on_hangup(switch_core_session_t *session); static switch_status_t channel_on_ring(switch_core_session_t *session); @@ -1222,20 +1222,20 @@ static void set_profile_val(struct mdl_profile *profile, char *var, char *val) } } -static switch_status_t dl_logout(char *profile_name, char *out, size_t outlen) +static switch_status_t dl_logout(char *profile_name, switch_stream_handle_t *stream) { struct mdl_profile *profile; if ((profile = switch_core_hash_find(globals.profile_hash, profile_name))) { ldl_handle_stop(profile->handle); - snprintf(out, outlen, "OK\n"); + stream->write_function(stream, "OK\n"); } else { - snprintf(out, outlen, "NO SUCH PROFILE %s\n", profile_name); + stream->write_function(stream, "NO SUCH PROFILE %s\n", profile_name); } return SWITCH_STATUS_SUCCESS; } -static switch_status_t dl_login(char *arg, char *out, size_t outlen) +static switch_status_t dl_login(char *arg, switch_stream_handle_t *stream) { char *argv[10] = {0}; int argc = 0; @@ -1244,7 +1244,7 @@ static switch_status_t dl_login(char *arg, char *out, size_t outlen) int x; if (switch_strlen_zero(arg)) { - snprintf(out, outlen, "FAIL\n"); + stream->write_function(stream, "FAIL\n"); return SWITCH_STATUS_SUCCESS; } @@ -1259,7 +1259,7 @@ static switch_status_t dl_login(char *arg, char *out, size_t outlen) if (profile) { if (switch_test_flag(profile, TFLAG_IO)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profile already exists."); - snprintf(out, outlen, "Profile already exists\n"); + stream->write_function(stream, "Profile already exists\n"); return SWITCH_STATUS_SUCCESS; } @@ -1277,9 +1277,9 @@ static switch_status_t dl_login(char *arg, char *out, size_t outlen) } if (profile && init_profile(profile, 1) == SWITCH_STATUS_SUCCESS) { - snprintf(out, outlen, "OK\n"); + stream->write_function(stream, "OK\n"); } else { - snprintf(out, outlen, "FAIL\n"); + stream->write_function(stream, "FAIL\n"); } return SWITCH_STATUS_SUCCESS; @@ -1298,7 +1298,7 @@ static switch_status_t load_config(void) switch_core_hash_init(&globals.profile_hash, module_pool); - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/endpoints/mod_exosip/mod_exosip.c b/src/mod/endpoints/mod_exosip/mod_exosip.c index 29d4b19282..1c7feb958d 100644 --- a/src/mod/endpoints/mod_exosip/mod_exosip.c +++ b/src/mod/endpoints/mod_exosip/mod_exosip.c @@ -1609,7 +1609,7 @@ static int config_exosip(int reload) globals.bytes_per_frame = DEFAULT_BYTES_PER_FRAME; - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/endpoints/mod_iax/mod_iax.c b/src/mod/endpoints/mod_iax/mod_iax.c index 6182ea5a42..8bb79bfb60 100644 --- a/src/mod/endpoints/mod_iax/mod_iax.c +++ b/src/mod/endpoints/mod_iax/mod_iax.c @@ -822,7 +822,7 @@ static switch_status_t load_config(void) memset(&globals, 0, sizeof(globals)); - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/endpoints/mod_opal/mod_opal.c b/src/mod/endpoints/mod_opal/mod_opal.c index 3a5b126892..d093ddeed2 100644 --- a/src/mod/endpoints/mod_opal/mod_opal.c +++ b/src/mod/endpoints/mod_opal/mod_opal.c @@ -352,7 +352,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod memset(&globals, 0, sizeof(globals)); - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/endpoints/mod_portaudio/mod_portaudio.c b/src/mod/endpoints/mod_portaudio/mod_portaudio.c index 5d424234db..824511c6be 100644 --- a/src/mod/endpoints/mod_portaudio/mod_portaudio.c +++ b/src/mod/endpoints/mod_portaudio/mod_portaudio.c @@ -115,11 +115,11 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, globals.dialplan) static int dump_info(void); static switch_status_t load_config(void); static int get_dev_by_name(char *name, int in); - static switch_status_t place_call(char *dest, char *out, size_t outlen); - static switch_status_t hup_call(char *callid, char *out, size_t outlen); - static switch_status_t call_info(char *callid, char *out, size_t outlen); - static switch_status_t send_dtmf(char *callid, char *out, size_t outlen); - static switch_status_t answer_call(char *callid, char *out, size_t outlen); + static switch_status_t place_call(char *dest, switch_stream_handle_t *stream); + static switch_status_t hup_call(char *callid, switch_stream_handle_t *stream); + static switch_status_t call_info(char *callid, switch_stream_handle_t *stream); + static switch_status_t send_dtmf(char *callid, switch_stream_handle_t *stream); + static switch_status_t answer_call(char *callid, switch_stream_handle_t *stream); /* State methods they get called when the state changes to the specific state @@ -571,7 +571,7 @@ static switch_status_t load_config(void) memset(&globals, 0, sizeof(globals)); - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } @@ -794,7 +794,7 @@ static switch_status_t engage_device(struct private_object *tech_pvt) return SWITCH_STATUS_FALSE; } -static switch_status_t place_call(char *dest, char *out, size_t outlen) +static switch_status_t place_call(char *dest, switch_stream_handle_t *stream) { switch_core_session_t *session; switch_status_t status = SWITCH_STATUS_FALSE; @@ -804,8 +804,8 @@ static switch_status_t place_call(char *dest, char *out, size_t outlen) return SWITCH_STATUS_FALSE; } - strncpy(out, "FAIL", outlen - 1); - + stream->write_function(stream, "FAIL"); + if ((session = switch_core_session_request(&channel_endpoint_interface, NULL)) != 0) { struct private_object *tech_pvt; switch_channel_t *channel; @@ -838,14 +838,14 @@ static switch_status_t place_call(char *dest, char *out, size_t outlen) if ((status = engage_device(tech_pvt)) == SWITCH_STATUS_SUCCESS) { switch_channel_set_state(channel, CS_INIT); switch_core_session_thread_launch(tech_pvt->session); - snprintf(out, outlen, "SUCCESS:%s:%s", tech_pvt->call_id, switch_core_session_get_uuid(tech_pvt->session)); + stream->write_function(stream, "SUCCESS:%s:%s", tech_pvt->call_id, switch_core_session_get_uuid(tech_pvt->session)); } } return status; } -static switch_status_t hup_call(char *callid, char *out, size_t outlen) +static switch_status_t hup_call(char *callid, switch_stream_handle_t *stream) { struct private_object *tech_pvt; switch_channel_t *channel = NULL; @@ -869,7 +869,7 @@ static switch_status_t hup_call(char *callid, char *out, size_t outlen) i++; } - snprintf(out, outlen, "HUNGUP: %d", i); + stream->write_function(stream, "HUNGUP: %d", i); return SWITCH_STATUS_SUCCESS; } @@ -880,16 +880,16 @@ static switch_status_t hup_call(char *callid, char *out, size_t outlen) assert(channel != NULL); switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); - strncpy(out, "OK", outlen - 1); + stream->write_function(stream, "OK"); } else { - strncpy(out, "NO SUCH CALL", outlen - 1); + stream->write_function(stream, "NO SUCH CALL"); } return SWITCH_STATUS_SUCCESS; } -static switch_status_t send_dtmf(char *callid, char *out, size_t outlen) +static switch_status_t send_dtmf(char *callid, switch_stream_handle_t *stream) { struct private_object *tech_pvt = NULL; switch_channel_t *channel = NULL; @@ -905,15 +905,15 @@ static switch_status_t send_dtmf(char *callid, char *out, size_t outlen) channel = switch_core_session_get_channel(tech_pvt->session); assert(channel != NULL); switch_channel_queue_dtmf(channel, dtmf); - strncpy(out, "OK", outlen - 1); + stream->write_function(stream, "OK"); } else { - strncpy(out, "NO SUCH CALL", outlen - 1); + stream->write_function(stream, "NO SUCH CALL"); } return SWITCH_STATUS_SUCCESS; } -static switch_status_t answer_call(char *callid, char *out, size_t outlen) +static switch_status_t answer_call(char *callid, switch_stream_handle_t *stream) { struct private_object *tech_pvt = NULL; switch_channel_t *channel = NULL; @@ -924,20 +924,20 @@ static switch_status_t answer_call(char *callid, char *out, size_t outlen) switch_set_flag(tech_pvt, TFLAG_ANSWER); switch_channel_answer(channel); } else { - strncpy(out, "NO SUCH CALL", outlen - 1); + stream->write_function(stream, "NO SUCH CALL"); } return SWITCH_STATUS_SUCCESS; } -static void print_info(struct private_object *tech_pvt, char *out, size_t outlen) +static void print_info(struct private_object *tech_pvt, switch_stream_handle_t *stream) { switch_channel_t *channel = NULL; channel = switch_core_session_get_channel(tech_pvt->session); assert(channel != NULL); - snprintf(out, outlen, "CALL %s\t%s\t%s\t%s\t%s\n", - tech_pvt->call_id, + stream->write_function(stream, "CALL %s\t%s\t%s\t%s\t%s\n", + tech_pvt->call_id, tech_pvt->caller_profile->caller_id_name ? tech_pvt->caller_profile->caller_id_name : "n/a", tech_pvt->caller_profile->caller_id_number ? tech_pvt->caller_profile->caller_id_number : "n/a", tech_pvt->caller_profile->destination_number ? tech_pvt->caller_profile->destination_number : "n/a", @@ -945,7 +945,7 @@ static void print_info(struct private_object *tech_pvt, char *out, size_t outlen } -static switch_status_t call_info(char *callid, char *out, size_t outlen) +static switch_status_t call_info(char *callid, switch_stream_handle_t *stream) { struct private_object *tech_pvt; switch_hash_index_t *hi; @@ -954,12 +954,12 @@ static switch_status_t call_info(char *callid, char *out, size_t outlen) for (hi = apr_hash_first(module_pool, globals.call_hash); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, NULL, NULL, &val); tech_pvt = val; - print_info(tech_pvt, out + strlen(out), outlen - strlen(out)); + print_info(tech_pvt, stream); } } else if (callid && (tech_pvt = switch_core_hash_find(globals.call_hash, callid)) != 0) { print_info(tech_pvt, out, outlen); } else { - strncpy(out, "NO SUCH CALL", outlen - 1); + stream->write_function(stream, "NO SUCH CALL"); } return SWITCH_STATUS_SUCCESS; diff --git a/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c b/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c index 331548f231..47e8239244 100644 --- a/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c +++ b/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c @@ -1293,7 +1293,7 @@ static switch_status_t config_wanpipe(int reload) globals.dtmf_off = 50; - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/endpoints/mod_woomera/mod_woomera.c b/src/mod/endpoints/mod_woomera/mod_woomera.c index 0d20b3b4cd..37febb7057 100644 --- a/src/mod/endpoints/mod_woomera/mod_woomera.c +++ b/src/mod/endpoints/mod_woomera/mod_woomera.c @@ -1308,7 +1308,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod memset(&globals, 0, sizeof(globals)); globals.next_woomera_port = WOOMERA_MIN_PORT; - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c b/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c index dae1addd22..655c1b5d60 100644 --- a/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c +++ b/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c @@ -54,7 +54,7 @@ static switch_status_t load_config(void) char *cf = "event_multicast.conf"; switch_xml_t cfg, xml, settings, param; - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c b/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c index 098affa455..c4d6cea030 100644 --- a/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c +++ b/src/mod/event_handlers/mod_xmpp_event/mod_xmpp_event.c @@ -104,7 +104,7 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_jid, globals.jid) memset(&globals, 0, sizeof(globals)); - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c b/src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c index a0b1c88a3a..05234cbca9 100644 --- a/src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c +++ b/src/mod/event_handlers/mod_zeroconf/mod_zeroconf.c @@ -199,7 +199,7 @@ static switch_status_t load_config(void) sw_discovery_oid *oid; switch_xml_t cfg, xml, settings, param; - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c index 5f2def4c21..f57719f3c4 100644 --- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c +++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c @@ -1791,8 +1791,13 @@ static JSBool js_api_execute(JSContext *cx, JSObject *obj, uintN argc, jsval *ar if (argc > 1) { char *cmd = JS_GetStringBytes(JS_ValueToString(cx, argv[0])); char *arg = JS_GetStringBytes(JS_ValueToString(cx, argv[1])); + switch_stream_handle_t stream = {0}; char retbuf[2048] = ""; - switch_api_execute(cmd, arg, retbuf, sizeof(retbuf)); + + stream.data = retbuf; + stream.end = stream.data; + stream.data_size = sizeof(retbuf); + switch_api_execute(cmd, arg, &stream); *rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, retbuf)); } else { *rval = STRING_TO_JSVAL (JS_NewStringCopyZ(cx, "")); @@ -2149,16 +2154,16 @@ static void js_thread_launch(char *text) } -static switch_status_t launch_async(char *text, char *out, size_t outlen) +static switch_status_t launch_async(char *text, switch_stream_handle_t *stream) { if (switch_strlen_zero(text)) { - switch_copy_string(out, "INVALID", outlen); + stream->write_function(stream, "INVALID"); return SWITCH_STATUS_SUCCESS; } js_thread_launch(text); - switch_copy_string(out, "OK", outlen); + stream->write_function(stream, "OK"); return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/loggers/mod_console/mod_console.c b/src/mod/loggers/mod_console/mod_console.c index 0fe866d3a0..4598265bd0 100644 --- a/src/mod/loggers/mod_console/mod_console.c +++ b/src/mod/loggers/mod_console/mod_console.c @@ -83,7 +83,7 @@ static switch_status_t config_logger(void) char *cf = "console.conf"; switch_xml_t cfg, xml, settings, param; - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } diff --git a/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c b/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c index f395c39a67..c83c511e25 100644 --- a/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c +++ b/src/mod/xml_int/mod_xml_rpc/mod_xml_rpc.c @@ -41,6 +41,7 @@ static const char modname[] = "mod_xml_rpc"; + static struct { int port; uint8_t running; @@ -65,16 +66,18 @@ static size_t file_callback(void *ptr, size_t size, size_t nmemb, void *data) static switch_xml_t xml_url_fetch(char *section, - char *tag_name, - char *key_name, - char *key_value) + char *tag_name, + char *key_name, + char *key_value, + char *params) { char url[1024] = "", filename[1024] = ""; CURL *curl_handle = NULL; struct config_data config_data; switch_xml_t xml; - - snprintf(url, sizeof(url), "%s?section=%s&tag_name=%s&key_name=%s&key_value=%s\n", globals.url, section, tag_name, key_name, key_value); + + snprintf(url, sizeof(url), "%s?section=%s&tag_name=%s&key_name=%s&key_value=%s%s%s\n", + globals.url, section, tag_name, key_name, key_value, params ? "&" : "", params ? params : ""); srand(time(NULL) + strlen(url)); snprintf(filename, sizeof(filename), "%s%04x.tmp", SWITCH_GLOBAL_dirs.temp_dir, (rand() & 0xffff)); curl_global_init(CURL_GLOBAL_ALL); @@ -126,7 +129,7 @@ static switch_status_t do_config(void) char *cf = "xml_rpc.conf"; switch_xml_t cfg, xml, settings, param; - if (!(xml = switch_xml_open_cfg(cf, &cfg))) { + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; } @@ -171,13 +174,37 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod } -#define CMDLEN 10240 +static switch_status_t http_stream_write(switch_stream_handle_t *handle, char *fmt, ...) +{ + va_list ap; + TSession *r = handle->data; + int ret = 0; + char *data; + + va_start(ap, fmt); +#ifdef HAVE_VASPRINTF + ret = vasprintf(&data, fmt, ap); +#else + if ((data = (char *) malloc(2048))) { + vsnprintf(data, 2048, fmt, ap); + } +#endif + va_end(ap); + + if (data) { + ret = 0; + HTTPWrite(r, data, strlen(data)); + free(data); + } + + return ret ? SWITCH_STATUS_FALSE : SWITCH_STATUS_SUCCESS; +} + abyss_bool HandleHook(TSession *r) { char *m = "text/html"; - char *retbuf = malloc(CMDLEN); char *command, *arg; - char *ret = NULL; + switch_stream_handle_t stream = {0}; if(strncmp(r->uri, "/api/", 5)) { return FALSE; @@ -191,33 +218,22 @@ abyss_bool HandleHook(TSession *r) } ResponseChunked(r); ResponseStatus(r,200); - memset(retbuf, 0, CMDLEN); - switch_api_execute(command, arg, retbuf, CMDLEN); - if (!strncasecmp(retbuf, "content-type: ", 14)) { - - m = retbuf + 14; - if ((ret = strchr(m, '\n'))) { - *ret++ = '\0'; - } - } - - if (!ret) { - ret = retbuf; - } ResponseContentType(r, m); ResponseWrite(r); - HTTPWrite(r, ret , strlen(ret)); + stream.data = r; + stream.write_function = http_stream_write; + switch_api_execute(command, arg, &stream); HTTPWriteEnd(r); free(command); - free(retbuf); return TRUE; } - +#define CMDLEN 1024 * 256 static xmlrpc_value *freeswitch_api(xmlrpc_env *const envP, xmlrpc_value *const paramArrayP, void *const userData) { char *command, *arg; char *retbuf = malloc(CMDLEN); + switch_stream_handle_t stream = {0}; xmlrpc_value *val; /* Parse our argument array. */ @@ -227,7 +243,11 @@ static xmlrpc_value *freeswitch_api(xmlrpc_env *const envP, xmlrpc_value *const } memset(retbuf, 0, CMDLEN); - switch_api_execute(command, arg, retbuf, CMDLEN); + stream.data = retbuf; + stream.end = stream.data; + stream.data_size = CMDLEN; + stream.write_function = switch_console_stream_write; + switch_api_execute(command, arg, &stream); /* Return our result. */ val = xmlrpc_build_value(envP, "s", retbuf); diff --git a/src/switch_console.c b/src/switch_console.c index bec20be0c3..3a6d95ac5f 100644 --- a/src/switch_console.c +++ b/src/switch_console.c @@ -33,10 +33,51 @@ #include #define CMD_BUFLEN 1024 * 1000 + +SWITCH_DECLARE(switch_status_t) switch_console_stream_write(switch_stream_handle_t *handle, char *fmt, ...) +{ + va_list ap; + char *buf = handle->data; + char *end = handle->end; + int ret = 0; + char *data; + + if (handle->data_len >= handle->data_size) { + return SWITCH_STATUS_FALSE; + } + + va_start(ap, fmt); +#ifdef HAVE_VASPRINTF + ret = vasprintf(&data, fmt, ap); +#else + if ((data = (char *) malloc(2048))) { + vsnprintf(data, 2048, fmt, ap); + } +#endif + va_end(ap); + + if (data) { + uint32_t len = handle->data_size - handle->data_len; + + if (len <= strlen(data)) { + ret = -1; + } else { + ret = 0; + snprintf(end, len, data); + handle->data_len = strlen(buf); + handle->end = handle->data + handle->data_len; + } + free(data); + } + + return ret ? SWITCH_STATUS_FALSE : SWITCH_STATUS_SUCCESS; +} + + static int switch_console_process(char *cmd, char *retbuf, int retlen) { char *arg = NULL; - + switch_stream_handle_t stream = {0}; if (!strcmp(cmd, "shutdown") || !strcmp(cmd, "...")) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Bye!\n"); @@ -62,7 +103,11 @@ static int switch_console_process(char *cmd, char *retbuf, int retlen) *arg++ = '\0'; } - if (switch_api_execute(cmd, arg, retbuf, retlen) == SWITCH_STATUS_SUCCESS) { + stream.data = retbuf; + stream.end = stream.data; + stream.data_size = retlen; + stream.write_function = switch_console_stream_write; + if (switch_api_execute(cmd, arg, &stream) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_CONSOLE, "API CALL [%s(%s)] output:\n%s\n", cmd, arg ? arg : "", retbuf); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Unknown Command: %s\n", cmd); diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index 2630babf4c..90e616c8e1 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -471,7 +471,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init() switch_core_hash_init(&loadable_modules.directory_hash, loadable_modules.pool); switch_core_hash_init(&loadable_modules.dialplan_hash, loadable_modules.pool); - if ((xml = switch_xml_open_cfg(cf, &cfg))) { + if ((xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_xml_t mods, ld; if ((mods = switch_xml_child(cfg, "modules"))) { @@ -491,7 +491,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init() switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "open of %s failed\n", cf); } - if ((xml = switch_xml_open_cfg(pcf, &cfg))) { + if ((xml = switch_xml_open_cfg(pcf, &cfg, NULL))) { switch_xml_t mods, ld; if ((mods = switch_xml_child(cfg, "modules"))) { @@ -667,17 +667,22 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(switch_codec_interf return i; } -SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, char *retbuf, switch_size_t len) +SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, switch_stream_handle_t *stream) { switch_api_interface_t *api; switch_status_t status; switch_event_t *event; + assert(stream != NULL); + assert(stream->data != NULL); + assert(stream->write_function != NULL); + if ((api = switch_loadable_module_get_api_interface(cmd)) != 0) { - status = api->function(arg, retbuf, len); + status = api->function(arg, stream); } else { status = SWITCH_STATUS_FALSE; - snprintf(retbuf, len, "INVALID COMMAND [%s]", cmd); + stream->write_function(stream, "INVALID COMMAND [%s]", cmd); + //snprintf(retbuf, len, "INVALID COMMAND [%s]", cmd); } if (switch_event_create(&event, SWITCH_EVENT_API) == SWITCH_STATUS_SUCCESS) { @@ -687,7 +692,7 @@ SWITCH_DECLARE(switch_status_t) switch_api_execute(char *cmd, char *arg, char *r if (arg) { switch_event_add_header(event, SWITCH_STACK_BOTTOM, "API-Command-Arguement", arg); } - switch_event_add_body(event, retbuf); + //switch_event_add_body(event, retbuf); switch_event_fire(&event); } diff --git a/src/switch_utils.c b/src/switch_utils.c index b2dfad5225..82b3b5910c 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -212,6 +212,51 @@ SWITCH_DECLARE(int) switch_socket_waitfor(switch_pollfd_t *poll, int ms) return nsds; } + +SWITCH_DECLARE(int) switch_url_encode(char *url, char *buf, size_t len) +{ + char *p; + int x = 0; + const char urlunsafe[] = " \"#%&+:;<=>?@[\\]^`{|}"; + const char hex[] = "0123456789ABCDEF"; + + memset(buf, 0, len); + for( p = url ; *p ; p++) { + if (*p < ' ' || *p > '~' || strchr(urlunsafe, *p)) { + if ((x + 3) > len) { + break; + } + buf[x++] = '%'; + buf[x++] = hex[*p >> 4]; + buf[x++] = hex[*p & 0x0f]; + } else { + buf[x++] = *p; + } + if (x == len) { + break; + } + } + return x; +} + +SWITCH_DECLARE(char *) switch_url_decode(char *s) +{ + char *o; + unsigned int tmp; + + for (o = s; *s; s++, o++) { + if (*s == '%' && strlen(s) > 2 && sscanf(s + 1, "%2x", &tmp) == 1) { + *o = tmp; + s += 2; + } else { + *o = *s; + } + } + *o = '\0'; + return s; +} + + #ifdef WIN32 //this forces certain symbols to not be optimized out of the dll void include_me(void) diff --git a/src/switch_xml.c b/src/switch_xml.c index b13864287d..ef17e897f4 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -745,7 +745,8 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate(char *section, char *key_name, char *key_value, switch_xml_t *root, - switch_xml_t *node) + switch_xml_t *node, + char *params) { switch_xml_t conf = NULL; switch_xml_t tag = NULL; @@ -756,7 +757,7 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate(char *section, switch_mutex_lock(XML_LOCK); for(binding = BINDINGS; binding; binding = binding->next) { - if ((xml = binding->function(section, tag_name, key_name, key_value))) { + if ((xml = binding->function(section, tag_name, key_name, key_value, params))) { const char *err = NULL; err = switch_xml_error(xml); @@ -883,7 +884,7 @@ SWITCH_DECLARE(switch_status_t) switch_xml_destroy(void) return SWITCH_STATUS_FALSE; } -SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *node) +SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t *node, char *params) { switch_xml_t xml = NULL, cfg = NULL; @@ -891,7 +892,7 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_open_cfg(char *file_path, switch_xml_t * assert(MAIN_XML_ROOT != NULL); - if (switch_xml_locate("configuration", "configuration", "name", file_path, &xml, &cfg) == SWITCH_STATUS_SUCCESS) { + if (switch_xml_locate("configuration", "configuration", "name", file_path, &xml, &cfg, params) == SWITCH_STATUS_SUCCESS) { *node = cfg; }