diff --git a/conf/vanilla/autoload_configs/av.conf.xml b/conf/vanilla/autoload_configs/av.conf.xml index cf28fab3d3..5a53668c4d 100644 --- a/conf/vanilla/autoload_configs/av.conf.xml +++ b/conf/vanilla/autoload_configs/av.conf.xml @@ -141,5 +141,6 @@ enum AVColorRange { + diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 18c221bf5a..864114ad9c 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -624,6 +624,7 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-png (= \${binary:Version}), freeswitch-mod-redis (= \${binary:Version}), freeswitch-mod-rss (= \${binary:Version}), + freeswitch-mod-signalwire (= \${binary:Version}), freeswitch-mod-shout (= \${binary:Version}), freeswitch-mod-sms (= \${binary:Version}), freeswitch-mod-snapshot (= \${binary:Version}), diff --git a/debian/freeswitch-systemd.freeswitch.service b/debian/freeswitch-systemd.freeswitch.service index 6225d37d5c..c283f1df39 100644 --- a/debian/freeswitch-systemd.freeswitch.service +++ b/debian/freeswitch-systemd.freeswitch.service @@ -2,8 +2,9 @@ [Unit] Description=freeswitch +Wants=network-online.target Requires=syslog.socket network.target local-fs.target -After=syslog.socket network.target local-fs.target +After=syslog.socket network.target network-online.target local-fs.target [Service] ; service @@ -11,6 +12,7 @@ Type=forking PIDFile=/run/freeswitch/freeswitch.pid Environment="DAEMON_OPTS=-nonat" EnvironmentFile=-/etc/default/freeswitch +ExecStartPre=/bin/chown -R freeswitch:freeswitch /var/lib/freeswitch /var/log/freeswitch /etc/freeswitch /usr/share/freeswitch /var/run/freeswitch ExecStart=/usr/bin/freeswitch -u freeswitch -g freeswitch -ncwait $DAEMON_OPTS TimeoutSec=45s Restart=always @@ -28,6 +30,7 @@ IOSchedulingPriority=2 CPUSchedulingPolicy=rr CPUSchedulingPriority=89 UMask=0007 +NoNewPrivileges=false ; alternatives which you can enforce by placing a unit drop-in into ; /etc/systemd/system/freeswitch.service.d/*.conf: diff --git a/html5/verto/verto_communicator/src/vertoControllers/controllers/LoginController.js b/html5/verto/verto_communicator/src/vertoControllers/controllers/LoginController.js index d6f1d0366f..d9caa5c1f0 100644 --- a/html5/verto/verto_communicator/src/vertoControllers/controllers/LoginController.js +++ b/html5/verto/verto_communicator/src/vertoControllers/controllers/LoginController.js @@ -11,7 +11,18 @@ } } preRoute(); - + + var name = $location.search().name; + var email = $location.search().email; + var skipPreview = $location.search().skipPreview; + + if (name && email) { + verto.data.name = name; + verto.data.email = email; + $scope.login(true, skipPreview); + return; + } + verto.data.name = $scope.storage.data.name; verto.data.email = $scope.storage.data.email; diff --git a/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js b/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js index 066b69b33e..29d5ed8f44 100644 --- a/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js +++ b/html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js @@ -77,10 +77,15 @@ * Login the user to verto server and * redirects him to dialpad page. */ - $scope.login = function(redirect) { + $rootScope.login = function(redirect, skipPreview) { if(redirect == undefined) { redirect = true; } + + if(skipPreview == undefined) { + skipPreview = false; + } + var connectCallback = function(v, connected) { $scope.$apply(function() { verto.data.connecting = false; @@ -97,7 +102,7 @@ verto.testSpeed(); } - if (redirect && storage.data.preview) { + if (redirect && storage.data.preview && !skipPreview) { $location.path('/loading'); } else if (redirect) { $location.path('/dialpad'); diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index 3bdadf11d3..609d9e2e00 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -1420,8 +1420,10 @@ int main(int argc, char *argv[]) const char *line = NULL; char cmd_str[2048] = ""; cli_profile_t *profile = NULL; +#ifdef HAVE_LIBEDIT int argv_use_history_file = 1; int use_history_file = 0; +#endif #ifndef WIN32 char hfile[512] = "/tmp/fs_cli_history"; char cfile[512] = "/etc/fs_cli.conf"; @@ -1581,7 +1583,9 @@ int main(int argc, char *argv[]) argv_batch = 1; break; case 'Q': +#ifdef HAVE_LIBEDIT argv_use_history_file = 0; +#endif break; case 'i': allow_ctl_c = 1; @@ -1645,9 +1649,11 @@ int main(int argc, char *argv[]) profile->batch_mode = 1; feature_level=0; } +#ifdef HAVE_LIBEDIT if (argv_use_history_file && profile->use_history_file) { use_history_file = 1; } +#endif if (*argv_loglevel) { esl_set_string(profile->loglevel, argv_loglevel); profile->quiet = 0; diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c index 8d6de2909b..c004781e12 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c @@ -150,7 +150,7 @@ static int cheezy_get_var(char *data, char *name, char *buf, size_t buflen) */ do { - if(!strncmp(p,name,strlen(name)) && *(p+strlen(name))==':') break; + if(!strncasecmp(p,name,strlen(name)) && *(p+strlen(name))==':') break; } while((p = (strstr(p,"\n")+1))!=(char *)1); diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 298639d6ab..526fe26323 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -1992,7 +1992,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_speech_open(_In_ switch_speech_handl \param flags flags in/out for fine tuning \return SWITCH_STATUS_SUCCESS with len adjusted to the bytes written if successful */ -SWITCH_DECLARE(switch_status_t) switch_core_speech_feed_tts(switch_speech_handle_t *sh, char *text, switch_speech_flag_t *flags); +SWITCH_DECLARE(switch_status_t) switch_core_speech_feed_tts(switch_speech_handle_t *sh, const char *text, switch_speech_flag_t *flags); /*! \brief Flush TTS audio on a given handle diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h index 3525ab28ff..5a444d552b 100644 --- a/src/include/switch_ivr.h +++ b/src/include/switch_ivr.h @@ -292,7 +292,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_start_input_timers(swit \param fh file handle to use (NULL for builtin one) \return SWITCH_STATUS_SUCCESS if all is well */ -SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t *session, char *file, uint32_t limit, switch_file_handle_t *fh); +SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t *session, const char *file, uint32_t limit, switch_file_handle_t *fh); SWITCH_DECLARE(switch_status_t) switch_ivr_transfer_recordings(switch_core_session_t *orig_session, switch_core_session_t *new_session); @@ -471,7 +471,7 @@ SWITCH_DECLARE(switch_status_t) switch_play_and_get_digits(switch_core_session_t SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text_handle(switch_core_session_t *session, switch_speech_handle_t *sh, - switch_codec_t *codec, switch_timer_t *timer, char *text, switch_input_args_t *args); + switch_codec_t *codec, switch_timer_t *timer, const char *text, switch_input_args_t *args); SWITCH_DECLARE(void) switch_ivr_clear_speech_cache(switch_core_session_t *session); /*! \brief Speak given text with given tts engine @@ -483,7 +483,7 @@ SWITCH_DECLARE(void) switch_ivr_clear_speech_cache(switch_core_session_t *sessio \return SWITCH_STATUS_SUCCESS if all is well */ SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text(switch_core_session_t *session, - const char *tts_name, const char *voice_name, char *text, switch_input_args_t *args); + const char *tts_name, const char *voice_name, const char *text, switch_input_args_t *args); /*! \brief Make an outgoing call diff --git a/src/include/switch_loadable_module.h b/src/include/switch_loadable_module.h index 9299857f68..9cc99ee0be 100644 --- a/src/include/switch_loadable_module.h +++ b/src/include/switch_loadable_module.h @@ -302,7 +302,7 @@ SWITCH_DECLARE(switch_status_t) switch_json_api_execute(cJSON *json, switch_core \param err pointer to error message \return the status */ -SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname, switch_bool_t runtime, const char **err); +SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(const char *dir, const char *fname, switch_bool_t runtime, const char **err); /*! \brief Check if a module is loaded diff --git a/src/include/switch_stun.h b/src/include/switch_stun.h index f05a6e11df..54b03088e8 100644 --- a/src/include/switch_stun.h +++ b/src/include/switch_stun.h @@ -259,6 +259,15 @@ SWITCH_DECLARE(uint8_t) switch_stun_packet_attribute_add_priority(switch_stun_pa SWITCH_DECLARE(switch_status_t) switch_stun_lookup(char **ip, switch_port_t *port, char *stunip, switch_port_t stunport, char **err, switch_memory_pool_t *pool); +/*! + \brief Perform a stun ip lookup + \param external_ip replaced with stun results + \param sourceip stun:, host: or an ip + \param external_pool the memory pool to use + \return SUCCESS or FAIL +*/ +SWITCH_DECLARE(switch_status_t) switch_stun_ip_lookup(char **external_ip, const char *sourceip, switch_memory_pool_t *external_pool); + /*! \brief Obtain the padded length of an attribute's value diff --git a/src/mod/applications/mod_av/avformat.c b/src/mod/applications/mod_av/avformat.c index 42abce911c..67628da7cd 100644 --- a/src/mod/applications/mod_av/avformat.c +++ b/src/mod/applications/mod_av/avformat.c @@ -50,6 +50,7 @@ GCC_DIAG_ON(deprecated-declarations) #define AVUTIL_TIMESTAMP_H #define AV_TS_MAX_STRING_SIZE 32 +#define UINTVAL(v) (v > 0 ? v : 0); // Compatibility with old libav on Debian Jessie // Not required if libavcodec version > 56.34.1 @@ -59,6 +60,12 @@ GCC_DIAG_ON(deprecated-declarations) #define AV_CODEC_CAP_VARIABLE_FRAME_SIZE CODEC_CAP_VARIABLE_FRAME_SIZE #endif +struct avformat_globals { + enum AVColorSpace colorspace; +}; + +struct avformat_globals avformat_globals = { 0 }; + /* App interface */ // a wrapper around a single output AVStream @@ -119,6 +126,7 @@ struct av_file_context { AVFormatContext *fc; AVCodec *audio_codec; AVCodec *video_codec; + enum AVColorSpace colorspace; int has_audio; int has_video; @@ -566,8 +574,9 @@ GCC_DIAG_ON(deprecated-declarations) // av_opt_set_int(c->priv_data, "slice-max-size", SWITCH_DEFAULT_VIDEO_SIZE, 0); - c->colorspace = AVCOL_SPC_RGB; + c->colorspace = context->colorspace; c->color_range = AVCOL_RANGE_JPEG; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "colorspace = %d\n", c->colorspace); break; default: @@ -1598,7 +1607,8 @@ static switch_status_t av_file_open(switch_file_handle_t *handle, const char *pa context->offset = DFT_RECORD_OFFSET; context->handle = handle; context->audio_timer = 1; - + context->colorspace = avformat_globals.colorspace; + if (handle->params) { if ((tmp = switch_event_get_header(handle->params, "av_video_offset"))) { context->offset = atoi(tmp); @@ -1608,6 +1618,14 @@ static switch_status_t av_file_open(switch_file_handle_t *handle, const char *pa context->audio_timer = 0; } } + if ((tmp = switch_event_get_header(handle->params, "colorspace"))) { + int value = atoi(tmp); + enum AVColorSpace colorspace = UINTVAL(value); + + if (colorspace <= AVCOL_SPC_NB) { + context->colorspace = colorspace; + } + } } switch_mutex_init(&context->mutex, SWITCH_MUTEX_NESTED, handle->memory_pool); @@ -2626,11 +2644,45 @@ static char *supported_formats[SWITCH_MAX_CODECS] = { 0 }; static const char modname[] = "mod_av"; +static switch_status_t load_config() +{ + char *cf = "avformat.conf"; + switch_xml_t cfg, xml, param, settings; + + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "open of %s failed\n", cf); + return SWITCH_STATUS_TERM; + } + + if ((settings = switch_xml_child(cfg, "settings"))) { + for (param = switch_xml_child(settings, "param"); param; param = param->next) { + char *var = (char *) switch_xml_attr_soft(param, "name"); + char *val = (char *) switch_xml_attr_soft(param, "value"); + + if (!strcasecmp(var, "colorspace")) { + int value = atoi(val); + + avformat_globals.colorspace = UINTVAL(value); + + if (avformat_globals.colorspace > AVCOL_SPC_NB) { + avformat_globals.colorspace = AVCOL_SPC_RGB; + } + } + } + } + + switch_xml_free(xml); + return SWITCH_STATUS_SUCCESS; +} + SWITCH_MODULE_LOAD_FUNCTION(mod_avformat_load) { switch_file_interface_t *file_interface; int i = 0; + memset(&avformat_globals, 0, sizeof(struct avformat_globals)); + load_config(); + supported_formats[i++] = "av"; supported_formats[i++] = "rtmp"; supported_formats[i++] = "rtsp"; diff --git a/src/mod/applications/mod_av/test/Makefile.am b/src/mod/applications/mod_av/test/Makefile.am index 4c66bd22f6..b7111a2275 100644 --- a/src/mod/applications/mod_av/test/Makefile.am +++ b/src/mod/applications/mod_av/test/Makefile.am @@ -1,4 +1,4 @@ -bin_PROGRAMS = test_mod_av +bin_PROGRAMS = test_mod_av test_avformat AM_CFLAGS = $(SWITCH_AM_CFLAGS) -I../ $(AVFORMAT_CFLAGS) $(AVCODEC_CFLAGS) $(SWSCALE_CFLAGS) $(AVUTIL_CFLAGS) $(AVRESAMPLE_CFALGS) AM_LDFLAGS = $(switch_builddir)/libfreeswitch.la $(AVFORMAT_LIBS) $(AVCODEC_LIBS) $(SWSCALE_LIBS) $(AVUTIL_LIBS) $(AVRESAMPLE_LIBS) -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) ../mod_av.la TESTS = $(bin_PROGRAMS) diff --git a/src/mod/applications/mod_av/test/cluecon.png b/src/mod/applications/mod_av/test/cluecon.png new file mode 100644 index 0000000000..91abe81dd8 Binary files /dev/null and b/src/mod/applications/mod_av/test/cluecon.png differ diff --git a/src/mod/applications/mod_av/test/test_avformat.c b/src/mod/applications/mod_av/test/test_avformat.c new file mode 100644 index 0000000000..fed0264d34 --- /dev/null +++ b/src/mod/applications/mod_av/test/test_avformat.c @@ -0,0 +1,167 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005-2018, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Seven Du + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * + * test_avformat -- avformat tests + * + */ + +#include + +#define SAMPLES 160 + +FST_CORE_BEGIN("conf") +{ + FST_MODULE_BEGIN(mod_av, mod_av_test) + { + FST_SETUP_BEGIN() + { + fst_requires_module("mod_av"); + } + FST_SETUP_END() + + FST_TEST_BEGIN(avformat_test_colorspace_RGB) + { + switch_status_t status; + switch_image_t *img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, 1280, 720, 1); + switch_file_handle_t fh = { 0 }; + uint8_t data[SAMPLES * 2] = { 0 }; + switch_frame_t frame = { 0 }; + switch_size_t len = SAMPLES; + uint32_t flags = SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT | SWITCH_FILE_FLAG_VIDEO; + int i = 0; + + fst_requires(img); + + status = switch_core_file_open(&fh, "{colorspace=0}./test_RGB.mp4", 1, 8000, flags, fst_pool); + fst_requires(status == SWITCH_STATUS_SUCCESS); + fst_requires(switch_test_flag(&fh, SWITCH_FILE_OPEN)); + + status = switch_core_file_write(&fh, data, &len); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "status: %d len: %d\n", status, (int)len); + fst_check(status == SWITCH_STATUS_SUCCESS); + // fst_requires(len == SAMPLES); + + frame.img = img; + status = switch_core_file_write_video(&fh, &frame); + fst_check(status == SWITCH_STATUS_SUCCESS); + + switch_image_t *ccimg = switch_img_read_png("./cluecon.png", SWITCH_IMG_FMT_ARGB); + fst_requires(ccimg); + + switch_rgb_color_t color = {0}; + color.a = 255; + + for (i = 0; i < 30; i++) { + len = SAMPLES; + + if (i == 10) { + color.r = 255; + } else if (i == 20) { + color.r = 0; + color.b = 255; + } + + switch_img_fill(img, 0, 0, img->d_w, img->d_h, &color); + switch_img_patch(img, ccimg, i * 10, i * 10); + + status = switch_core_file_write(&fh, data, &len); + status = switch_core_file_write_video(&fh, &frame); + switch_yield(100000); + } + + switch_core_file_close(&fh); + switch_img_free(&img); + switch_img_free(&ccimg); + } + FST_TEST_END() + + FST_TEST_BEGIN(avformat_test_colorspace_BT7) + { + switch_status_t status; + switch_image_t *img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, 1280, 720, 1); + switch_file_handle_t fh = { 0 }; + uint8_t data[SAMPLES * 2] = { 0 }; + switch_frame_t frame = { 0 }; + switch_size_t len = SAMPLES; + uint32_t flags = SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT | SWITCH_FILE_FLAG_VIDEO; + int i = 0; + + fst_requires(img); + + status = switch_core_file_open(&fh, "{colorspace=1}./test_BT7.mp4", 1, 8000, flags, fst_pool); + fst_requires(status == SWITCH_STATUS_SUCCESS); + fst_requires(switch_test_flag(&fh, SWITCH_FILE_OPEN)); + + status = switch_core_file_write(&fh, data, &len); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "status: %d len: %d\n", status, (int)len); + fst_check(status == SWITCH_STATUS_SUCCESS); + // fst_requires(len == SAMPLES); + + frame.img = img; + status = switch_core_file_write_video(&fh, &frame); + fst_check(status == SWITCH_STATUS_SUCCESS); + + switch_image_t *ccimg = switch_img_read_png("./cluecon.png", SWITCH_IMG_FMT_ARGB); + fst_requires(ccimg); + + switch_rgb_color_t color = {0}; + color.a = 255; + + for (i = 0; i < 30; i++) { + len = SAMPLES; + + if (i == 10) { + color.r = 255; + } else if (i == 20) { + color.r = 0; + color.b = 255; + } + + switch_img_fill(img, 0, 0, img->d_w, img->d_h, &color); + switch_img_patch(img, ccimg, i * 10, i * 10); + + status = switch_core_file_write(&fh, data, &len); + status = switch_core_file_write_video(&fh, &frame); + switch_yield(100000); + } + + switch_core_file_close(&fh); + switch_img_free(&img); + switch_img_free(&ccimg); + } + FST_TEST_END() + + FST_TEARDOWN_BEGIN() + { + const char *err = NULL; + switch_sleep(1000000); + //fst_check(switch_loadable_module_unload_module(SWITCH_GLOBAL_dirs.mod_dir, (char *)"mod_av", SWITCH_TRUE, &err) == SWITCH_STATUS_SUCCESS); + } + FST_TEARDOWN_END() + } + FST_MODULE_END() +} +FST_CORE_END() diff --git a/src/mod/applications/mod_http_cache/mod_http_cache.c b/src/mod/applications/mod_http_cache/mod_http_cache.c index 2af2cd1770..dd4b1ef2c8 100644 --- a/src/mod/applications/mod_http_cache/mod_http_cache.c +++ b/src/mod/applications/mod_http_cache/mod_http_cache.c @@ -1708,7 +1708,7 @@ static switch_status_t http_cache_file_open(switch_file_handle_t *handle, const { switch_status_t status = SWITCH_STATUS_SUCCESS; struct http_context *context = switch_core_alloc(handle->memory_pool, sizeof(*context)); - int file_flags = SWITCH_FILE_DATA_SHORT; + int file_flags = SWITCH_FILE_DATA_SHORT | (switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO) ? SWITCH_FILE_FLAG_VIDEO : 0); if (handle->params) { context->profile = url_cache_http_profile_find(&gcache, switch_event_get_header(handle->params, "profile")); diff --git a/src/mod/applications/mod_signalwire/Makefile.am b/src/mod/applications/mod_signalwire/Makefile.am index d46251b832..405dea9807 100644 --- a/src/mod/applications/mod_signalwire/Makefile.am +++ b/src/mod/applications/mod_signalwire/Makefile.am @@ -7,9 +7,9 @@ if HAVE_SIGNALWIRE_CLIENT mod_LTLIBRARIES = mod_signalwire.la mod_signalwire_la_SOURCES = mod_signalwire.c mod_signalwire_la_CFLAGS = $(AM_CFLAGS) -mod_signalwire_la_CFLAGS += $(KS_CFLAGS) $(SIGNALWIRE_CLIENT_CFLAGS) +mod_signalwire_la_CFLAGS += $(CURL_CFLAGS) $(KS_CFLAGS) $(SIGNALWIRE_CLIENT_CFLAGS) mod_signalwire_la_LIBADD = $(switch_builddir)/libfreeswitch.la -mod_signalwire_la_LDFLAGS = -avoid-version -module -no-undefined -shared $(KS_LIBS) $(SIGNALWIRE_CLIENT_LIBS) +mod_signalwire_la_LDFLAGS = $(CURL_LIBS) -avoid-version -module -no-undefined -shared $(KS_LIBS) $(SIGNALWIRE_CLIENT_LIBS) else install: error diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index 242f3c645c..202dfa186b 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -831,7 +831,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc if (switch_test_flag(frame, SFF_CNG) || (switch_test_flag(tech_pvt, TFLAG_BOWOUT) && switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) { switch_core_timer_sync(&tech_pvt->timer); - switch_core_timer_sync(&tech_pvt->other_tech_pvt->timer); + if (tech_pvt->other_tech_pvt) switch_core_timer_sync(&tech_pvt->other_tech_pvt->timer); return SWITCH_STATUS_SUCCESS; } @@ -991,10 +991,10 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s done = 1; switch_set_flag(tech_pvt, TFLAG_CLEAR); - switch_set_flag(tech_pvt->other_tech_pvt, TFLAG_CLEAR); + if (tech_pvt->other_tech_pvt) switch_set_flag(tech_pvt->other_tech_pvt, TFLAG_CLEAR); switch_core_timer_sync(&tech_pvt->timer); - switch_core_timer_sync(&tech_pvt->other_tech_pvt->timer); + if (tech_pvt->other_tech_pvt) switch_core_timer_sync(&tech_pvt->other_tech_pvt->timer); } break; default: diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 0c7a27534d..d4e6bb2285 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -502,6 +502,7 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session) switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Sending BYE to %s\n", switch_channel_get_name(channel)); if (!sofia_test_flag(tech_pvt, TFLAG_BYE)) { nua_bye(tech_pvt->nh, + TAG_IF(tech_pvt->record_route, NUTAG_PROXY(tech_pvt->record_route)), SIPTAG_CONTACT(SIP_NONE), TAG_IF(!zstr(reason), SIPTAG_REASON_STR(reason)), TAG_IF(call_info, SIPTAG_CALL_INFO_STR(call_info)), diff --git a/src/mod/endpoints/mod_verto/mod_verto.c b/src/mod/endpoints/mod_verto/mod_verto.c index 7dc8336bd9..6ad57d2760 100644 --- a/src/mod/endpoints/mod_verto/mod_verto.c +++ b/src/mod/endpoints/mod_verto/mod_verto.c @@ -31,6 +31,7 @@ */ #include #include +#include /* Prototypes */ @@ -4824,7 +4825,7 @@ static switch_status_t parse_config(const char *cf) if (zstr(val)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid External RTP IP.\n"); } else { - profile->extrtpip = switch_core_strdup(profile->pool, val); + switch_stun_ip_lookup(&profile->extrtpip, val, profile->pool); } } else if (!strcasecmp(var, "debug")) { if (val) { diff --git a/src/mod/endpoints/mod_verto/ws.c b/src/mod/endpoints/mod_verto/ws.c index 86c73c18fa..b4702d30c3 100644 --- a/src/mod/endpoints/mod_verto/ws.c +++ b/src/mod/endpoints/mod_verto/ws.c @@ -150,7 +150,7 @@ static int cheezy_get_var(char *data, char *name, char *buf, size_t buflen) */ do { - if(!strncmp(p,name,strlen(name)) && *(p+strlen(name))==':') break; + if(!strncasecmp(p,name,strlen(name)) && *(p+strlen(name))==':') break; } while((p = (strstr(p,"\n")+1))!=(char *)1); diff --git a/src/mod/languages/mod_v8/src/fssession.cpp b/src/mod/languages/mod_v8/src/fssession.cpp index a34406a493..c8a315ced0 100644 --- a/src/mod/languages/mod_v8/src/fssession.cpp +++ b/src/mod/languages/mod_v8/src/fssession.cpp @@ -1530,11 +1530,23 @@ JS_SESSION_GET_PROPERTY_IMPL(GetProperty) info.GetReturnValue().Set(Integer::New(info.GetIsolate(), this->_cause)); } } else if (!strcmp(prop, "name")) { - info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_get_name(channel))); + if (channel) { + info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_get_name(channel))); + } else { + info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), "")); + } } else if (!strcmp(prop, "uuid")) { - info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_get_uuid(channel))); + if (channel) { + info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_get_uuid(channel))); + } else { + info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), "")); + } } else if (!strcmp(prop, "state")) { - info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_state_name(switch_channel_get_state(channel)))); + if (channel) { + info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), switch_channel_state_name(switch_channel_get_state(channel)))); + } else { + info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), "")); + } } else if (!strcmp(prop, "dialplan")) { if (caller_profile) { info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), caller_profile->dialplan)); diff --git a/src/mod/xml_int/mod_xml_rpc/ws.c b/src/mod/xml_int/mod_xml_rpc/ws.c index 44a3860ae4..a5ad9c7a3b 100644 --- a/src/mod/xml_int/mod_xml_rpc/ws.c +++ b/src/mod/xml_int/mod_xml_rpc/ws.c @@ -119,7 +119,7 @@ static int cheezy_get_var(char *data, char *name, char *buf, size_t buflen) */ do { - if(!strncmp(p,name,strlen(name)) && *(p+strlen(name))==':') break; + if(!strncasecmp(p,name,strlen(name)) && *(p+strlen(name))==':') break; } while((p = (strstr(p,"\n")+1))!=(char *)1); diff --git a/src/switch_core_speech.c b/src/switch_core_speech.c index 91d7fa9f78..956b4ce37b 100644 --- a/src/switch_core_speech.c +++ b/src/switch_core_speech.c @@ -96,7 +96,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_speech_open(switch_speech_handle_t * return status; } -SWITCH_DECLARE(switch_status_t) switch_core_speech_feed_tts(switch_speech_handle_t *sh, char *text, switch_speech_flag_t *flags) +SWITCH_DECLARE(switch_status_t) switch_core_speech_feed_tts(switch_speech_handle_t *sh, const char *text, switch_speech_flag_t *flags) { switch_status_t status = SWITCH_STATUS_SUCCESS; char *param_string = NULL; diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index f318fd9874..db4ceac9cc 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -2538,7 +2538,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session return status; } -SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t *session, char *file, uint32_t limit, switch_file_handle_t *fh) +SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t *session, const char *file, uint32_t limit, switch_file_handle_t *fh) { switch_channel_t *channel = switch_core_session_get_channel(session); const char *p; diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c index abc028852d..dd923be81a 100644 --- a/src/switch_ivr_play_say.c +++ b/src/switch_ivr_play_say.c @@ -2644,7 +2644,7 @@ SWITCH_DECLARE(switch_status_t) switch_play_and_get_digits(switch_core_session_t SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text_handle(switch_core_session_t *session, switch_speech_handle_t *sh, - switch_codec_t *codec, switch_timer_t *timer, char *text, switch_input_args_t *args) + switch_codec_t *codec, switch_timer_t *timer, const char *text, switch_input_args_t *args) { switch_channel_t *channel = switch_core_session_get_channel(session); short abuf[SWITCH_RECOMMENDED_BUFFER_SIZE]; @@ -2656,8 +2656,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text_handle(switch_core_session switch_status_t status = SWITCH_STATUS_SUCCESS; switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE; switch_size_t extra = 0; - char *p, *tmp = NULL; - const char *star, *pound; + char *tmp = NULL; + const char *star, *pound, *p; switch_size_t starlen, poundlen; if (!sh) { @@ -2940,7 +2940,7 @@ SWITCH_DECLARE(void) switch_ivr_clear_speech_cache(switch_core_session_t *sessio } SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text(switch_core_session_t *session, - const char *tts_name, const char *voice_name, char *text, switch_input_args_t *args) + const char *tts_name, const char *voice_name, const char *text, switch_input_args_t *args) { switch_channel_t *channel = switch_core_session_get_channel(session); uint32_t rate = 0; diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index 8a1d65379b..b3ec9d4ebb 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -95,7 +95,7 @@ struct switch_loadable_module_container { static struct switch_loadable_module_container loadable_modules; static switch_status_t do_shutdown(switch_loadable_module_t *module, switch_bool_t shutdown, switch_bool_t unload, switch_bool_t fail_if_busy, const char **err); -static switch_status_t switch_loadable_module_load_module_ex(char *dir, char *fname, switch_bool_t runtime, switch_bool_t global, const char **err); +static switch_status_t switch_loadable_module_load_module_ex(const char *dir, const char *fname, switch_bool_t runtime, switch_bool_t global, const char **err); static void *SWITCH_THREAD_FUNC switch_loadable_module_exec(switch_thread_t *thread, void *obj) { @@ -1544,12 +1544,12 @@ static switch_status_t switch_loadable_module_load_file(char *path, char *filena return SWITCH_STATUS_SUCCESS; } -SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(char *dir, char *fname, switch_bool_t runtime, const char **err) +SWITCH_DECLARE(switch_status_t) switch_loadable_module_load_module(const char *dir, const char *fname, switch_bool_t runtime, const char **err) { return switch_loadable_module_load_module_ex(dir, fname, runtime, SWITCH_FALSE, err); } -static switch_status_t switch_loadable_module_load_module_ex(char *dir, char *fname, switch_bool_t runtime, switch_bool_t global, const char **err) +static switch_status_t switch_loadable_module_load_module_ex(const char *dir, const char *fname, switch_bool_t runtime, switch_bool_t global, const char **err) { switch_size_t len = 0; char *path; @@ -1902,7 +1902,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(switch_bool_t autolo if (path && zstr(path)) { path = SWITCH_GLOBAL_dirs.mod_dir; } - if (switch_loadable_module_load_module_ex((char *) path, (char *) val, SWITCH_FALSE, global, &err) == SWITCH_STATUS_GENERR) { + if (switch_loadable_module_load_module_ex(path, val, SWITCH_FALSE, global, &err) == SWITCH_STATUS_GENERR) { if (critical && switch_true(critical)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Failed to load critical module '%s', abort()\n", val); abort(); @@ -1935,7 +1935,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(switch_bool_t autolo if (path && zstr(path)) { path = SWITCH_GLOBAL_dirs.mod_dir; } - switch_loadable_module_load_module_ex((char *) path, (char *) val, SWITCH_FALSE, global, &err); + switch_loadable_module_load_module_ex(path, val, SWITCH_FALSE, global, &err); count++; } } @@ -1975,7 +1975,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(switch_bool_t autolo continue; } - switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) fname, SWITCH_FALSE, &err); + switch_loadable_module_load_module(SWITCH_GLOBAL_dirs.mod_dir, fname, SWITCH_FALSE, &err); } apr_dir_close(module_dir_handle); } diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 9f4de55f31..824e01b7ee 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -1933,7 +1933,7 @@ static int rtcp_stats(switch_rtp_t *rtp_session) if (pkt_seq < max_seq) { stats->cycle++; switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "rtcp_stats:[cycle change] pkt_seq[%d] cycle[%d] max_seq[%d] stats_ssrc[%u] local_ts[%u]\n", - pkt_seq, stats->cycle, max_seq, stats->ssrc, rtp_session->write_timer.samplecount); + pkt_seq, stats->cycle, max_seq, stats->ssrc, rtp_session->timer.samplecount); } pkt_extended_seq = stats->cycle << 16 | pkt_seq; /* getting the extended packet extended sequence ID */ if (pkt_extended_seq > stats->high_ext_seq_recv) { @@ -1963,7 +1963,7 @@ static int rtcp_stats(switch_rtp_t *rtp_session) stats->period_pkt_count, pkt_seq, stats->cycle, stats->ssrc, rtp_session->write_timer.samplecount); #endif /* Interarrival jitter calculation */ - pkt_tsdiff = abs((int32_t)(rtp_session->write_timer.samplecount - ntohl(hdr->ts))); /* relative transit times for this packet */ + pkt_tsdiff = abs((int32_t)(rtp_session->timer.samplecount - ntohl(hdr->ts))); /* relative transit times for this packet */ if (stats->pkt_count < 2) { /* Can not compute Jitter with only one packet */ stats->last_pkt_tsdiff = pkt_tsdiff; } else { @@ -1976,7 +1976,7 @@ static int rtcp_stats(switch_rtp_t *rtp_session) #ifdef DEBUG_RTCP switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG10, "rtcp_stats: pkt_ts[%d]local_ts[%d]diff[%d]pkt_spacing[%d]inter_jitter[%f]seq[%d]stats_ssrc[%d]", - ntohl(hdr->ts), rtp_session->write_timer.samplecount, pkt_tsdiff, packet_spacing_diff, stats->inter_jitter, ntohs(hdr->seq), stats->ssrc); + ntohl(hdr->ts), rtp_session->timer.samplecount, pkt_tsdiff, packet_spacing_diff, stats->inter_jitter, ntohs(hdr->seq), stats->ssrc); #endif return 1; } diff --git a/src/switch_stun.c b/src/switch_stun.c index 6573d3eceb..f759a2607c 100644 --- a/src/switch_stun.c +++ b/src/switch_stun.c @@ -851,6 +851,79 @@ SWITCH_DECLARE(switch_status_t) switch_stun_lookup(char **ip, return SWITCH_STATUS_FALSE; } +SWITCH_DECLARE(switch_status_t) switch_stun_ip_lookup(char **external_ip, const char *sourceip, switch_memory_pool_t *external_pool) +{ + switch_status_t status = SWITCH_STATUS_FALSE; + char *stun_ip = NULL; + switch_port_t stun_port = (switch_port_t)SWITCH_STUN_DEFAULT_PORT; + char *p; + char ip_buf[256] = ""; + char *ip = NULL; + switch_port_t port = 0; + switch_memory_pool_t *local_pool = NULL; + char *error = ""; + + if (!sourceip || !external_pool) { + *external_ip = NULL; + goto end; + } + + ip = ip_buf; + + if (!strncasecmp(sourceip, "host:", 5)) { + status = (*external_ip = switch_stun_host_lookup(sourceip + 5, external_pool)) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; + } + else if (!strncasecmp(sourceip, "stun:", 5)) { + + switch_core_new_memory_pool(&local_pool); + + stun_ip = switch_core_strdup(local_pool, sourceip + 5); + + switch_assert(stun_ip); + + if ((p = strchr(stun_ip, ':'))) { + int iport; + *p++ = '\0'; + iport = atoi(p); + if (iport > 0 && iport < 0xFFFF) { + stun_port = (switch_port_t)iport; + } + } + else { + p = stun_ip; + } + + switch_find_local_ip(ip_buf, sizeof(ip_buf), NULL, AF_INET); + + if (zstr(stun_ip)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "STUN Failed! NO STUN SERVER\n"); + } + else { + if ((switch_stun_lookup(&ip, &port, stun_ip, stun_port, &error, local_pool)) == SWITCH_STATUS_SUCCESS && ip && port) { + *external_ip = switch_core_strdup(external_pool, ip); + status = SWITCH_STATUS_SUCCESS; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "External ip address detected using STUN: %s\n", ip); + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "STUN Failed! [%s]\n", error); + } + } + + if (status != SWITCH_STATUS_SUCCESS) { + *external_ip = ""; + } + + switch_core_destroy_memory_pool(&local_pool); + } + else { + *external_ip = switch_core_strdup(external_pool, sourceip); + status = SWITCH_STATUS_SUCCESS; + } + +end: + + return status; +} diff --git a/src/switch_time.c b/src/switch_time.c index 2847158861..a90d1a863e 100644 --- a/src/switch_time.c +++ b/src/switch_time.c @@ -692,7 +692,6 @@ static switch_status_t timer_init(switch_timer_t *timer) timer->start = switch_micro_time_now(); if (timer->interval == 1) { - runtime.microseconds_per_tick = 10000; switch_mutex_lock(globals.mutex); globals.timer_count++; switch_mutex_unlock(globals.mutex); diff --git a/src/switch_xml.c b/src/switch_xml.c index 37400a13b5..26e4481b53 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -56,6 +56,7 @@ */ #include +#include #ifndef WIN32 #include #include @@ -141,6 +142,46 @@ static void preprocess_exec_set(char *keyval) } } +static void preprocess_stun_set(char *keyval) +{ + char *key = keyval; + char *val = strchr(key, '='); + + if (val) { + char *ve = val++; + while (*val && *val == ' ') { + val++; + } + *ve-- = '\0'; + while (*ve && *ve == ' ') { + *ve-- = '\0'; + } + } + + if (key && val) { + char *external_ip = NULL; + switch_memory_pool_t *pool; + + switch_core_new_memory_pool(&pool); + + if (switch_stun_ip_lookup(&external_ip, val, pool) == SWITCH_STATUS_SUCCESS) { + if (!zstr(external_ip)) { + char *tmp = external_ip; + tmp = &tmp[strlen(tmp) - 1]; + while (tmp >= external_ip && (tmp[0] == ' ' || tmp[0] == '\n')) { + tmp[0] = '\0'; /* remove trailing spaces and newlines */ + tmp--; + } + switch_core_set_variable(key, external_ip); + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "stun-set failed.\n"); + } + + switch_core_destroy_memory_pool(&pool); + } +} + static void preprocess_env_set(char *keyval) { char *key = keyval; @@ -1487,6 +1528,8 @@ static int preprocess(const char *cwd, const char *file, FILE *write_fd, int rle } else if (!strcasecmp(tcmd, "exec-set")) { preprocess_exec_set(targ); + } else if (!strcasecmp(tcmd, "stun-set")) { + preprocess_stun_set(targ); } else if (!strcasecmp(tcmd, "env-set")) { preprocess_env_set(targ); } else if (!strcasecmp(tcmd, "include")) { @@ -1549,6 +1592,8 @@ static int preprocess(const char *cwd, const char *file, FILE *write_fd, int rle } else if (!strcasecmp(cmd, "exec-set")) { preprocess_exec_set(arg); + } else if (!strcasecmp(cmd, "stun-set")) { + preprocess_stun_set(arg); } else if (!strcasecmp(cmd, "include")) { preprocess_glob(cwd, arg, write_fd, rlevel + 1); } else if (!strcasecmp(cmd, "exec")) { diff --git a/tests/unit/switch_event.c b/tests/unit/switch_event.c index c11dfc24d3..1f55b574b9 100644 --- a/tests/unit/switch_event.c +++ b/tests/unit/switch_event.c @@ -27,7 +27,7 @@ FST_TEST_BEGIN(benchmark) int rc = 0, loops = 10, x = 0; switch_status_t status = SWITCH_STATUS_SUCCESS; char **index = NULL; - unsigned long long micro_total = 0; + uint64_t micro_total = 0; double micro_per = 0; double rate_per_sec = 0; @@ -63,7 +63,7 @@ FST_TEST_BEGIN(benchmark) micro_total = small_end_ts - small_start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - printf("switch_event add_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_event add_header: Total %" SWITCH_UINT64_T_FMT "us / %d loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); #endif @@ -84,7 +84,7 @@ FST_TEST_BEGIN(benchmark) micro_total = small_end_ts - small_start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - printf("switch_event get_header: Total %ldus / %ld loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_event get_header: Total %" SWITCH_UINT64_T_FMT "us / %d loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); #endif @@ -101,7 +101,7 @@ FST_TEST_BEGIN(benchmark) micro_total = end_ts - start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - printf("switch_event Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_event Total %" SWITCH_UINT64_T_FMT "us / %d loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); } diff --git a/tests/unit/switch_hash.c b/tests/unit/switch_hash.c index a8d57c527c..43d3e18692 100644 --- a/tests/unit/switch_hash.c +++ b/tests/unit/switch_hash.c @@ -24,7 +24,7 @@ FST_TEST_BEGIN(benchmark) switch_bool_t verbose = SWITCH_TRUE; const char *err = NULL; switch_time_t start_ts, end_ts; - unsigned long long micro_total = 0; + uint64_t micro_total = 0; double micro_per = 0; double rate_per_sec = 0; int x = 0; @@ -131,7 +131,7 @@ FST_TEST_BEGIN(benchmark) micro_total = end_ts - start_ts; micro_per = micro_total / (double) loops; rate_per_sec = 1000000 / micro_per; - printf("switch_hash Total %ldus / %d loops, %.2f us per loop, %.0f loops per second\n", + printf("switch_hash Total %" SWITCH_UINT64_T_FMT "us / %d loops, %.2f us per loop, %.0f loops per second\n", micro_total, loops, micro_per, rate_per_sec); } FST_TEST_END() diff --git a/tests/unit/switch_ivr_originate.c b/tests/unit/switch_ivr_originate.c index 3b2cb4154b..1b7ff19a4a 100644 --- a/tests/unit/switch_ivr_originate.c +++ b/tests/unit/switch_ivr_originate.c @@ -42,6 +42,8 @@ static switch_status_t my_on_reporting(switch_core_session_t *session) switch_assert(session); reporting++; switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "session reporting %d\n", reporting); + + return SWITCH_STATUS_SUCCESS; } static switch_status_t my_on_destroy(switch_core_session_t *session) @@ -49,6 +51,8 @@ static switch_status_t my_on_destroy(switch_core_session_t *session) switch_assert(session); destroy++; switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "session destroy %d\n", destroy); + + return SWITCH_STATUS_SUCCESS; } static switch_state_handler_table_t state_handlers = {