diff --git a/Makefile.am b/Makefile.am index 09574caa6c..840d114c65 100644 --- a/Makefile.am +++ b/Makefile.am @@ -588,10 +588,6 @@ libs/srtp/libsrtp.la: libs/srtp libs/srtp/.update $(SRTP_SRC) ## ## helper targets ## -yaml-files: - @echo `mkdir $(DESTDIR)$(confdir)/yaml 2>/dev/null` - $(INSTALL) -m 644 $(switch_srcdir)/conf/default/yaml/*.yaml $(DESTDIR)$(confdir)/yaml - vm-sync: test -d $(DESTDIR)$(confdir) || $(mkinstalldirs) $(DESTDIR)$(confdir) test -d $(DESTDIR)$(confdir)/lang || $(mkinstalldirs) $(DESTDIR)$(confdir)/lang diff --git a/build/modules.conf.in b/build/modules.conf.in index d866954bec..8bb2035447 100755 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -29,7 +29,6 @@ applications/mod_httapi #applications/mod_memcache #applications/mod_mongo #applications/mod_nibblebill -#applications/mod_oreka #applications/mod_osp #applications/mod_prefix applications/mod_signalwire @@ -51,7 +50,6 @@ codecs/mod_amr #codecs/mod_amrwb codecs/mod_b64 #codecs/mod_bv -#codecs/mod_clearmode #codecs/mod_codec2 #codecs/mod_com_g729 codecs/mod_g723_1 @@ -60,7 +58,6 @@ codecs/mod_g729 codecs/mod_opus #codecs/mod_silk #codecs/mod_siren -#codecs/mod_theora #databases/mod_mariadb databases/mod_pgsql dialplans/mod_dialplan_asterisk @@ -108,7 +105,6 @@ languages/mod_lua #languages/mod_python #languages/mod_python3 #languages/mod_v8 -#languages/mod_yaml loggers/mod_console #loggers/mod_graylog2 loggers/mod_logfile diff --git a/build/modules.conf.most b/build/modules.conf.most index 44d3169301..25aebe47f7 100755 --- a/build/modules.conf.most +++ b/build/modules.conf.most @@ -29,7 +29,6 @@ applications/mod_lcr applications/mod_memcache applications/mod_mongo applications/mod_nibblebill -applications/mod_oreka #applications/mod_osp applications/mod_prefix applications/mod_signalwire @@ -59,7 +58,6 @@ codecs/mod_ilbc codecs/mod_opus codecs/mod_silk codecs/mod_siren -codecs/mod_theora #databases/mod_mariadb databases/mod_pgsql dialplans/mod_dialplan_asterisk @@ -103,7 +101,6 @@ languages/mod_managed languages/mod_perl languages/mod_python3 #languages/mod_v8 -languages/mod_yaml loggers/mod_console loggers/mod_graylog2 loggers/mod_logfile diff --git a/conf/insideout/autoload_configs/modules.conf.xml b/conf/insideout/autoload_configs/modules.conf.xml index f03dfb749c..267ff4b602 100755 --- a/conf/insideout/autoload_configs/modules.conf.xml +++ b/conf/insideout/autoload_configs/modules.conf.xml @@ -6,8 +6,6 @@ - - diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml index 6363e233cb..ad37dc9b15 100755 --- a/conf/vanilla/autoload_configs/modules.conf.xml +++ b/conf/vanilla/autoload_configs/modules.conf.xml @@ -6,8 +6,6 @@ - - diff --git a/conf/vanilla/autoload_configs/oreka.conf.xml b/conf/vanilla/autoload_configs/oreka.conf.xml deleted file mode 100644 index 29eabd5c29..0000000000 --- a/conf/vanilla/autoload_configs/oreka.conf.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - diff --git a/conf/vanilla/yaml/extensions.yaml b/conf/vanilla/yaml/extensions.yaml deleted file mode 100644 index f74fcf2e3d..0000000000 --- a/conf/vanilla/yaml/extensions.yaml +++ /dev/null @@ -1,4 +0,0 @@ -default: - ${destination_number} =~ (9664): - set: foo=bar - playback: ${hold_music} diff --git a/conf/vanilla/yaml/mod_yaml.yaml b/conf/vanilla/yaml/mod_yaml.yaml deleted file mode 100644 index 65f1b05dda..0000000000 --- a/conf/vanilla/yaml/mod_yaml.yaml +++ /dev/null @@ -1,6 +0,0 @@ -settings: -#look for foo.conf.yaml when foo.conf is looked for in the xml - bind_config: true - - - diff --git a/configure.ac b/configure.ac index fd2e91893b..2e642b4fa0 100755 --- a/configure.ac +++ b/configure.ac @@ -1330,9 +1330,6 @@ PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.6.20]) PKG_CHECK_MODULES([CURL], [libcurl >= 7.19]) PKG_CHECK_MODULES([PCRE], [libpcre >= 7.8]) PKG_CHECK_MODULES([SPEEX], [speex >= 1.2rc1 speexdsp >= 1.2rc1]) -PKG_CHECK_MODULES([YAML], [yaml-0.1 >= 0.1.4],[ - AM_CONDITIONAL([HAVE_YAML],[true])],[ - AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_YAML],[false])]) PKG_CHECK_MODULES([LDNS], [libldns-fs >= 1.6.6],[ AM_CONDITIONAL([HAVE_LDNS],[true])],[ PKG_CHECK_MODULES([LDNS], [libldns >= 1.6.6],[ @@ -2121,7 +2118,6 @@ AC_CONFIG_FILES([Makefile src/mod/applications/mod_memcache/Makefile src/mod/applications/mod_mongo/Makefile src/mod/applications/mod_nibblebill/Makefile - src/mod/applications/mod_oreka/Makefile src/mod/applications/mod_osp/Makefile src/mod/applications/mod_prefix/Makefile src/mod/applications/mod_random/Makefile @@ -2144,7 +2140,6 @@ AC_CONFIG_FILES([Makefile src/mod/codecs/mod_amrwb/Makefile src/mod/codecs/mod_b64/Makefile src/mod/codecs/mod_bv/Makefile - src/mod/codecs/mod_clearmode/Makefile src/mod/codecs/mod_codec2/Makefile src/mod/codecs/mod_com_g729/Makefile src/mod/codecs/mod_g723_1/Makefile @@ -2155,7 +2150,6 @@ AC_CONFIG_FILES([Makefile src/mod/codecs/mod_silk/Makefile src/mod/codecs/mod_siren/Makefile src/mod/codecs/mod_skel_codec/Makefile - src/mod/codecs/mod_theora/Makefile src/mod/databases/mod_mariadb/Makefile src/mod/databases/mod_pgsql/Makefile src/mod/dialplans/mod_dialplan_asterisk/Makefile @@ -2204,7 +2198,6 @@ AC_CONFIG_FILES([Makefile src/mod/languages/mod_python/Makefile src/mod/languages/mod_python3/Makefile src/mod/languages/mod_v8/Makefile - src/mod/languages/mod_yaml/Makefile src/mod/languages/mod_basic/Makefile src/mod/loggers/mod_console/Makefile src/mod/loggers/mod_graylog2/Makefile diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index ce5adea315..2b1487a6c8 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -529,7 +529,6 @@ Recommends: freeswitch-mod-http-cache (= \${binary:Version}), freeswitch-mod-lcr (= \${binary:Version}), freeswitch-mod-nibblebill (= \${binary:Version}), - freeswitch-mod-oreka (= \${binary:Version}), freeswitch-mod-pgsql (= \${binary:Version}), freeswitch-mod-redis (= \${binary:Version}), freeswitch-mod-sms (= \${binary:Version}), @@ -610,7 +609,6 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-lcr (= \${binary:Version}), freeswitch-mod-memcache (= \${binary:Version}), freeswitch-mod-nibblebill (= \${binary:Version}), - freeswitch-mod-oreka (= \${binary:Version}), freeswitch-mod-mariadb (= \${binary:Version}), freeswitch-mod-pgsql (= \${binary:Version}), freeswitch-mod-png (= \${binary:Version}), @@ -655,7 +653,6 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-lua (= \${binary:Version}), freeswitch-mod-perl (= \${binary:Version}), freeswitch-mod-python3 (= \${binary:Version}), - freeswitch-mod-yaml (= \${binary:Version}), freeswitch-mod-console (= \${binary:Version}), freeswitch-mod-logfile (= \${binary:Version}), freeswitch-mod-syslog (= \${binary:Version}), @@ -688,7 +685,6 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-opus (= \${binary:Version}), freeswitch-mod-silk (= \${binary:Version}), freeswitch-mod-spandsp (= \${binary:Version}), - freeswitch-mod-theora (= \${binary:Version}), Suggests: freeswitch-mod-ilbc (= \${binary:Version}), freeswitch-mod-siren (= \${binary:Version}) @@ -711,7 +707,6 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-opus-dbg (= \${binary:Version}), freeswitch-mod-silk-dbg (= \${binary:Version}), freeswitch-mod-spandsp-dbg (= \${binary:Version}), - freeswitch-mod-theora-dbg (= \${binary:Version}), Suggests: freeswitch-mod-ilbc-dbg (= \${binary:Version}), freeswitch-mod-siren-dbg (= \${binary:Version}) @@ -832,7 +827,6 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-lcr-dbg (= \${binary:Version}), freeswitch-mod-memcache-dbg (= \${binary:Version}), freeswitch-mod-nibblebill-dbg (= \${binary:Version}), - freeswitch-mod-oreka-dbg (= \${binary:Version}), freeswitch-mod-mariadb-dbg (= \${binary:Version}), freeswitch-mod-pgsql-dbg (= \${binary:Version}), freeswitch-mod-png-dbg (= \${binary:Version}), @@ -875,7 +869,6 @@ Depends: \${misc:Depends}, freeswitch (= \${binary:Version}), freeswitch-mod-lua-dbg (= \${binary:Version}), freeswitch-mod-perl-dbg (= \${binary:Version}), freeswitch-mod-python3-dbg (= \${binary:Version}), - freeswitch-mod-yaml-dbg (= \${binary:Version}), freeswitch-mod-console-dbg (= \${binary:Version}), freeswitch-mod-logfile-dbg (= \${binary:Version}), freeswitch-mod-syslog-dbg (= \${binary:Version}), diff --git a/debian/control-modules b/debian/control-modules index d27c1146ae..61b5efc031 100755 --- a/debian/control-modules +++ b/debian/control-modules @@ -149,11 +149,6 @@ Description: Nibblebill This module allows for real-time accounting of a cash balance and using that information for call routing. -Module: applications/mod_oreka -Description: Media recording with Oreka - This module provides media recording with the Oreka cross-platfor - audio stream recording and retrieval system. - Module: applications/mod_osp Description: Open Settlement Protocol This module adds support for the Open Settlement Protocol (OSP). @@ -303,10 +298,6 @@ Module: codecs/mod_skel_codec Description: Adds mod_skel_codec Adds mod_skel_codec. -Module: codecs/mod_theora -Description: mod_theora - Adds mod_theora. - Module: codecs/mod_yuv Description: Adds mod_yuv Adds mod_yuv. @@ -557,11 +548,6 @@ Description: mod_v8 Adds mod_v8. Build-Depends: git, libv8-6.1-dev -Module: languages/mod_yaml -Description: mod_yaml - Adds mod_yaml. -Build-Depends: libyaml-dev, libglib2.0-dev - ## mod/loggers Module: loggers/mod_console diff --git a/freeswitch.spec b/freeswitch.spec index 5b46aba69e..bbf5bff667 100755 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -674,14 +674,6 @@ see http://www.polycom.com/usa/en/company/about_us/technology/siren_g7221/siren_ and http://www.polycom.com/usa/en/company/about_us/technology/siren14_g7221c/siren14_g7221c.html At the time of this packaging, Polycom does not charge for licensing. -%package codec-theora -Summary: Theora Video Codec support for FreeSWITCH open source telephony platform -Group: System/Libraries -Requires: %{name} = %{version}-%{release} - -%description codec-theora -Theora Video Codec support for FreeSWITCH open source telephony platform. - ###################################################################################################################### # FreeSWITCH Database Modules ###################################################################################################################### @@ -1233,7 +1225,7 @@ ASR_TTS_MODULES="asr_tts/mod_flite asr_tts/mod_pocketsphinx asr_tts/mod_tts_comm ###################################################################################################################### CODECS_MODULES="codecs/mod_amr codecs/mod_amrwb codecs/mod_bv codecs/mod_codec2 codecs/mod_g723_1 \ codecs/mod_g729 codecs/mod_ilbc codecs/mod_opus codecs/mod_silk \ - codecs/mod_siren codecs/mod_theora" + codecs/mod_siren" # ###################################################################################################################### @@ -1700,7 +1692,6 @@ fi %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/msrp.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/nibblebill.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/opal.conf.xml -%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/oreka.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/osp.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/pocketsphinx.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/post_load_modules.conf.xml @@ -1935,9 +1926,6 @@ fi %files codec-siren %{MODINSTDIR}/mod_siren.so* -%files codec-theora -%{MODINSTDIR}/mod_theora.so* - ###################################################################################################################### # # FreeSWITCH Database Modules diff --git a/src/mod/applications/mod_curl/mod_curl.c b/src/mod/applications/mod_curl/mod_curl.c index 82b38d42a9..cae06bdb30 100644 --- a/src/mod/applications/mod_curl/mod_curl.c +++ b/src/mod/applications/mod_curl/mod_curl.c @@ -898,7 +898,7 @@ SWITCH_STANDARD_APP(curl_app_function) if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) { if (argc == 0) { switch_goto_status(SWITCH_STATUS_SUCCESS, usage); - } else if (argc >= MOD_CURL_MAX_ARGS) { + } else if (argc > MOD_CURL_MAX_ARGS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Max args exceeded: %d\n", MOD_CURL_MAX_ARGS); switch_goto_status(SWITCH_STATUS_FALSE, done); } @@ -1021,7 +1021,7 @@ SWITCH_STANDARD_API(curl_function) if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) { if (argc < 1) { switch_goto_status(SWITCH_STATUS_SUCCESS, usage); - } else if (argc >= MOD_CURL_MAX_ARGS) { + } else if (argc > MOD_CURL_MAX_ARGS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Max args exceeded: %d\n", MOD_CURL_MAX_ARGS); switch_goto_status(SWITCH_STATUS_FALSE, done); } diff --git a/src/mod/applications/mod_oreka/Makefile.am b/src/mod/applications/mod_oreka/Makefile.am deleted file mode 100644 index 446f5183d6..0000000000 --- a/src/mod/applications/mod_oreka/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -include $(top_srcdir)/build/modmake.rulesam -MODNAME=mod_oreka - -mod_LTLIBRARIES = mod_oreka.la -mod_oreka_la_SOURCES = mod_oreka.c -mod_oreka_la_CFLAGS = $(AM_CFLAGS) -mod_oreka_la_LIBADD = $(switch_builddir)/libfreeswitch.la -mod_oreka_la_LDFLAGS = -avoid-version -module -no-undefined -shared diff --git a/src/mod/applications/mod_oreka/mod_oreka.c b/src/mod/applications/mod_oreka/mod_oreka.c deleted file mode 100644 index 560c34f6c6..0000000000 --- a/src/mod/applications/mod_oreka/mod_oreka.c +++ /dev/null @@ -1,786 +0,0 @@ -/* - * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005-2011, 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 / Oreka Recording Module - * - * The Initial Developer of the Original Code is - * Moises Silva - * Portions created by the Initial Developer are Copyright (C) - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Moises Silva - * - * mod_oreka -- Module for Media Recording with Oreka - * - */ - -#include -#include - -static const char SIP_OREKA_HEADER_PREFIX[] = "oreka_sip_h_"; -#define OREKA_PRIVATE "_oreka_" -#define OREKA_BUG_NAME_READ "oreka_read" -#define OREKA_BUG_NAME_WRITE "oreka_write" -#define SIP_OREKA_HEADER_PREFIX_LEN (sizeof(SIP_OREKA_HEADER_PREFIX)-1) - -SWITCH_MODULE_LOAD_FUNCTION(mod_oreka_load); -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_oreka_shutdown); -SWITCH_MODULE_DEFINITION(mod_oreka, mod_oreka_load, mod_oreka_shutdown, NULL); - -typedef struct oreka_session_s { - switch_core_session_t *session; - switch_port_t read_rtp_port; - switch_port_t write_rtp_port; - switch_rtp_t *read_rtp_stream; - switch_rtp_t *write_rtp_stream; - switch_codec_implementation_t read_impl; - switch_codec_implementation_t write_impl; - uint32_t read_cnt; - uint32_t write_cnt; - switch_media_bug_t *read_bug; - switch_event_t *invite_extra_headers; - switch_event_t *bye_extra_headers; - int usecnt; - switch_audio_resampler_t *read_resampler; - switch_audio_resampler_t *write_resampler; - int mux_streams; -} oreka_session_t; - -static struct { - char local_ipv4_str[256]; - char sip_server_addr_str[256]; - char sip_server_ipv4_str[256]; - int sip_server_port; - switch_sockaddr_t *sip_server_addr; - switch_socket_t *sip_socket; - pid_t our_pid; - int mux_streams; -} globals; - -typedef enum { - FS_OREKA_START, - FS_OREKA_STOP -} oreka_recording_status_t; - -typedef enum { - FS_OREKA_READ, - FS_OREKA_WRITE -} oreka_stream_type_t; - -static int oreka_write_udp(oreka_session_t *oreka, switch_stream_handle_t *udp) -{ - switch_size_t udplen = udp->data_len; - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oreka->session), SWITCH_LOG_DEBUG, "Oreka SIP Packet:\n%s", (const char *)udp->data); - switch_socket_sendto(globals.sip_socket, globals.sip_server_addr, 0, (void *)udp->data, &udplen); - if (udplen != udp->data_len) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oreka->session), SWITCH_LOG_ERROR, "Failed to write SIP Packet of len %zd (wrote=%zd)", - udp->data_len, udplen); - } - return 0; -} - -static int oreka_tear_down_rtp(oreka_session_t *oreka, oreka_stream_type_t type) -{ - if (type == FS_OREKA_READ && oreka->read_rtp_stream) { - switch_rtp_release_port(globals.local_ipv4_str, oreka->read_rtp_port); - switch_rtp_destroy(&oreka->read_rtp_stream); - oreka->read_rtp_port = 0; - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oreka->session), SWITCH_LOG_DEBUG, "Destroyed read rtp\n"); - } else if (oreka->write_rtp_stream) { - switch_rtp_release_port(globals.local_ipv4_str, oreka->write_rtp_port); - switch_rtp_destroy(&oreka->write_rtp_stream); - oreka->write_rtp_port = 0; - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oreka->session), SWITCH_LOG_DEBUG, "Destroyed write rtp\n"); - } - return 0; -} - -static int oreka_setup_rtp(oreka_session_t *oreka, oreka_stream_type_t type) -{ - switch_port_t rtp_port = 0; - switch_rtp_flag_t flags[SWITCH_RTP_FLAG_INVALID] = {0}; - switch_rtp_t *rtp_stream = NULL; - switch_codec_implementation_t *codec_impl = NULL; - switch_status_t status = SWITCH_STATUS_SUCCESS; - int res = 0; - const char *err = "unknown error"; - const char *type_str = type == FS_OREKA_READ ? "read" : "write"; - - - if (type == FS_OREKA_READ) { - status = switch_core_session_get_read_impl(oreka->session, &oreka->read_impl); - codec_impl = &oreka->read_impl; - } else { - status = switch_core_session_get_write_impl(oreka->session, &oreka->write_impl); - codec_impl = &oreka->write_impl; - } - - if (status != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No %s codec implementation available!\n", type_str); - res = -1; - goto done; - } - - if (!(rtp_port = switch_rtp_request_port(globals.local_ipv4_str))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to allocate %s RTP port for IP %s\n", type_str, globals.local_ipv4_str); - res = -1; - goto done; - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Allocated %s port %d for local IP %s, destination IP %s\n", type_str, - rtp_port, globals.local_ipv4_str, globals.sip_server_ipv4_str); - rtp_stream = switch_rtp_new(globals.local_ipv4_str, rtp_port, - globals.sip_server_ipv4_str, rtp_port, - 0, /* PCMU IANA*/ - codec_impl->samples_per_packet, - codec_impl->microseconds_per_packet, - flags, NULL, &err, switch_core_session_get_pool(oreka->session), 0, 0); - if (!rtp_stream) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to create %s RTP stream at %s:%d: %s\n", - type_str, globals.local_ipv4_str, rtp_port, err); - res = -1; - goto done; - } - - switch_rtp_intentional_bugs(rtp_stream, RTP_BUG_SEND_LINEAR_TIMESTAMPS); - - -done: - if (res == -1) { - if (rtp_port) { - switch_rtp_release_port(globals.local_ipv4_str, rtp_port); - } - if (rtp_stream) { - switch_rtp_destroy(&rtp_stream); - } - } else { - if (type == FS_OREKA_READ) { - oreka->read_rtp_stream = rtp_stream; - oreka->read_rtp_port = rtp_port; - } else { - oreka->write_rtp_stream = rtp_stream; - oreka->write_rtp_port = rtp_port; - } - } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Successfully created %s RTP stream at %s:%d at %dms@%dHz\n", - type_str, globals.local_ipv4_str, rtp_port, codec_impl->microseconds_per_packet/1000, codec_impl->samples_per_second); - return res; -} - -static void save_extra_headers(switch_event_t *extra_headers, switch_channel_t *channel) -{ - switch_event_header_t *ei = NULL; - for (ei = switch_channel_variable_first(channel); - ei; - ei = ei->next) { - const char *name = ei->name; - char *value = ei->value; - if (!strncasecmp(name, SIP_OREKA_HEADER_PREFIX, SIP_OREKA_HEADER_PREFIX_LEN)) { - switch_event_add_header_string(extra_headers, SWITCH_STACK_BOTTOM, name, value); - } - } - switch_channel_variable_last(channel); - - /* Remove the custom header variables that were saved */ - for (ei = extra_headers->headers; - ei; - ei = ei->next) { - char *varname = ei->name; - switch_channel_set_variable(channel, varname, NULL); - } -} - -static switch_event_t *get_extra_headers(oreka_session_t *oreka, oreka_recording_status_t status) -{ - switch_event_t *extra_headers = NULL; - switch_channel_t *channel = NULL; - switch_core_session_t *session = oreka->session; - - channel = switch_core_session_get_channel(session); - if (status == FS_OREKA_START) { - if (!oreka->invite_extra_headers) { - switch_event_create_subclass(&oreka->invite_extra_headers, SWITCH_EVENT_CLONE, NULL); - switch_assert(oreka->invite_extra_headers); - save_extra_headers(oreka->invite_extra_headers, channel); - } - extra_headers = oreka->invite_extra_headers; - } else if (status == FS_OREKA_STOP) { - if (!oreka->bye_extra_headers) { - switch_event_create_subclass(&oreka->bye_extra_headers, SWITCH_EVENT_CLONE, NULL); - switch_assert(oreka->bye_extra_headers); - save_extra_headers(oreka->bye_extra_headers, channel); - } - extra_headers = oreka->bye_extra_headers; - } - return extra_headers; -} - -static void oreka_destroy(oreka_session_t *oreka) -{ - oreka->usecnt--; - if (!oreka->usecnt) { - if (oreka->invite_extra_headers) { - switch_event_destroy(&oreka->invite_extra_headers); - } - if (oreka->bye_extra_headers) { - switch_event_destroy(&oreka->bye_extra_headers); - } - /* Actual memory for the oreka session was taken from the switch core session pool, the core will take care of it */ - } -} - -static int oreka_send_sip_message(oreka_session_t *oreka, oreka_recording_status_t status, oreka_stream_type_t type) -{ - switch_stream_handle_t sip_header = { 0 }; - switch_stream_handle_t sdp = { 0 }; - switch_stream_handle_t udp_packet = { 0 }; - switch_caller_profile_t *caller_profile = NULL; - switch_channel_t *channel = NULL; - switch_event_t *extra_headers = NULL; - switch_event_header_t *ei = NULL; - switch_core_session_t *session = oreka->session; - const char *method = status == FS_OREKA_START ? "INVITE" : "BYE"; - const char *session_uuid = switch_core_session_get_uuid(oreka->session); - const char *caller_id_number = NULL; - const char *caller_id_name = NULL; - const char *callee_id_number = NULL; - const char *callee_id_name = NULL; - int rc = 0; - - channel = switch_core_session_get_channel(session); - - SWITCH_STANDARD_STREAM(sip_header); - SWITCH_STANDARD_STREAM(sdp); - SWITCH_STANDARD_STREAM(udp_packet); - - extra_headers = get_extra_headers(oreka, status); - - caller_profile = switch_channel_get_caller_profile(channel); - - /* Get caller meta data */ - caller_id_number = switch_caller_get_field_by_name(caller_profile, "caller_id_number"); - - caller_id_name = switch_caller_get_field_by_name(caller_profile, "caller_id_name"); - if (zstr(caller_id_name)) { - caller_id_name = caller_id_number; - } - - callee_id_number = switch_caller_get_field_by_name(caller_profile, "callee_id_number"); - if (zstr(callee_id_number)) { - callee_id_number = switch_caller_get_field_by_name(caller_profile, "destination_number"); - } - - callee_id_name = switch_caller_get_field_by_name(caller_profile, "callee_id_name"); - if (zstr(callee_id_name)) { - callee_id_name = callee_id_number; - } - - /* Setup the RTP */ - if (status == FS_OREKA_START) { - if (oreka_setup_rtp(oreka, type)) { - rc = -1; - goto done; - } - } - - if (status == FS_OREKA_STOP) { - oreka_tear_down_rtp(oreka, type); - } - - /* Fill in the SDP first if this is the beginning */ - if (status == FS_OREKA_START) { - sdp.write_function(&sdp, "v=0\r\n"); - sdp.write_function(&sdp, "o=freeswitch %s 1 IN IP4 %s\r\n", session_uuid, globals.local_ipv4_str); - sdp.write_function(&sdp, "c=IN IP4 %s\r\n", globals.sip_server_ipv4_str); - sdp.write_function(&sdp, "s=Phone Recording (%s)\r\n", type == FS_OREKA_READ ? "RX" : "TX"); - sdp.write_function(&sdp, "i=FreeSWITCH Oreka Recorder (pid=%d)\r\n", globals.our_pid); - sdp.write_function(&sdp, "m=audio %d RTP/AVP 0\r\n", type == FS_OREKA_READ ? oreka->read_rtp_port : oreka->write_rtp_port); - sdp.write_function(&sdp, "a=rtpmap:0 PCMU/%d\r\n", type == FS_OREKA_READ - ? oreka->read_impl.samples_per_second : oreka->write_impl.samples_per_second); - } - - /* Request line */ - sip_header.write_function(&sip_header, "%s sip:%s@%s:5060 SIP/2.0\r\n", method, callee_id_name, globals.local_ipv4_str); - - /* Via */ - sip_header.write_function(&sip_header, "Via: SIP/2.0/UDP %s:5061;branch=z9hG4bK-%s\r\n", globals.local_ipv4_str, session_uuid); - - /* From */ - sip_header.write_function(&sip_header, "From: \r\n", caller_id_number, globals.local_ipv4_str); - - /* To */ - sip_header.write_function(&sip_header, "To: \r\n", callee_id_number, globals.local_ipv4_str); - - /* Call-ID */ - sip_header.write_function(&sip_header, "Call-ID: %s\r\n", session_uuid); - - /* CSeq */ - sip_header.write_function(&sip_header, "CSeq: 1 %s\r\n", method); - - /* Contact */ - sip_header.write_function(&sip_header, "Contact: sip:freeswitch@%s:5061\r\n", globals.local_ipv4_str); - - /* Max-Forwards */ - sip_header.write_function(&sip_header, "Max-Forwards: 70\r\n", method); - - /* Subject */ - sip_header.write_function(&sip_header, "Subject: %s %s recording of %s\r\n", - status == FS_OREKA_START ? "BEGIN": "END", - type == FS_OREKA_READ ? "RX" : "TX", caller_id_name); - - /* Add any custom extra headers */ - for (ei = extra_headers->headers; - ei; - ei = ei->next) { - const char *name = ei->name; - char *value = ei->value; - if (!strncasecmp(name, SIP_OREKA_HEADER_PREFIX, SIP_OREKA_HEADER_PREFIX_LEN)) { - const char *hname = name + SIP_OREKA_HEADER_PREFIX_LEN; - sip_header.write_function(&sip_header, "%s: %s\r\n", hname, value); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Adding custom oreka SIP header %s: %s\n", hname, value); - } - } - - if (status == FS_OREKA_START) { - /* Content-Type */ - sip_header.write_function(&sip_header, "Content-Type: application/sdp\r\n"); - - } - - /* Content-Length */ - sip_header.write_function(&sip_header, "Content-Length: %d\r\n", sdp.data_len); - - udp_packet.write_function(&udp_packet, "%s\r\n%s\n", sip_header.data, sdp.data); - - oreka_write_udp(oreka, &udp_packet); - -done: - if (sip_header.data) { - free(sip_header.data); - } - - if (sdp.data) { - free(sdp.data); - } - - if (udp_packet.data) { - free(udp_packet.data); - } - - if (status == FS_OREKA_STOP) { - oreka_destroy(oreka); - } - - return rc; -} - -static switch_bool_t oreka_audio_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type) -{ - oreka_session_t *oreka = user_data; - switch_core_session_t *session = oreka->session; - switch_frame_t pcmu_frame = { 0 }; - switch_frame_t *linear_frame, raw_frame = { 0 }; - uint8_t pcmu_data[SWITCH_RECOMMENDED_BUFFER_SIZE]; - uint8_t raw_data[SWITCH_RECOMMENDED_BUFFER_SIZE] = { 0 }; - uint8_t resample_data[SWITCH_RECOMMENDED_BUFFER_SIZE]; - uint32_t linear_len = 0; - uint32_t i = 0; - int16_t *linear_samples = NULL; - - - - if (type == SWITCH_ABC_TYPE_READ_REPLACE || type == SWITCH_ABC_TYPE_WRITE_REPLACE || type == SWITCH_ABC_TYPE_READ_PING) { - int16_t *data; - - if (type == SWITCH_ABC_TYPE_READ_REPLACE || type == SWITCH_ABC_TYPE_READ_PING) { - - if (type == SWITCH_ABC_TYPE_READ_REPLACE) { - linear_frame = switch_core_media_bug_get_read_replace_frame(bug); - } else { - switch_status_t status; - - raw_frame.data = raw_data; - raw_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE; - linear_frame = &raw_frame; - - status = switch_core_media_bug_read(bug, &raw_frame, SWITCH_FALSE); - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - return SWITCH_TRUE; - } - } - - if (oreka->read_resampler) { - data = (int16_t *) linear_frame->data; - switch_resample_process(oreka->read_resampler, data, (int) linear_frame->datalen / 2); - linear_len = oreka->read_resampler->to_len * 2; - memcpy(resample_data, oreka->read_resampler->to, linear_len); - linear_samples = (int16_t *)resample_data; - } else { - linear_samples = linear_frame->data; - linear_len = linear_frame->datalen; - } - } - - if (type == SWITCH_ABC_TYPE_WRITE_REPLACE) { - linear_frame = switch_core_media_bug_get_write_replace_frame(bug); - - if (oreka->write_resampler) { - data = (int16_t *) linear_frame->data; - switch_resample_process(oreka->write_resampler, data, (int) linear_frame->datalen / 2); - linear_len = oreka->write_resampler->to_len * 2; - memcpy(resample_data, oreka->write_resampler->to, linear_len); - linear_samples = (int16_t *)resample_data; - } else { - linear_samples = linear_frame->data; - linear_len = linear_frame->datalen; - } - } - - /* convert the L16 frame into PCMU */ - memset(&pcmu_frame, 0, sizeof(pcmu_frame)); - for (i = 0; i < linear_len / sizeof(int16_t); i++) { - pcmu_data[i] = linear_to_ulaw(linear_samples[i]); - } - pcmu_frame.source = __SWITCH_FUNC__; - pcmu_frame.data = pcmu_data; - pcmu_frame.datalen = i; - pcmu_frame.payload = 0; - } - - switch (type) { - case SWITCH_ABC_TYPE_INIT: - { - switch_codec_implementation_t read_impl; - - switch_core_session_get_read_impl(session, &read_impl); - - if (read_impl.actual_samples_per_second != 8000) { - switch_resample_create(&oreka->read_resampler, - read_impl.actual_samples_per_second, - 8000, - 320, SWITCH_RESAMPLE_QUALITY, 1); - - switch_resample_create(&oreka->write_resampler, - read_impl.actual_samples_per_second, - 8000, - 320, SWITCH_RESAMPLE_QUALITY, 1); - } - - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Starting Oreka recording for audio stream\n"); - oreka_send_sip_message(oreka, FS_OREKA_START, FS_OREKA_READ); - if (!oreka->mux_streams) { - oreka_send_sip_message(oreka, FS_OREKA_START, FS_OREKA_WRITE); - } - } - break; - case SWITCH_ABC_TYPE_CLOSE: - { - if (oreka->mux_streams) { - int16_t *data; - - raw_frame.data = raw_data; - raw_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE; - - while (switch_core_media_bug_read(bug, &raw_frame, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { - linear_frame = &raw_frame; - - - if (oreka->read_resampler) { - data = (int16_t *) linear_frame->data; - switch_resample_process(oreka->read_resampler, data, (int) linear_frame->datalen / 2); - linear_len = oreka->read_resampler->to_len * 2; - memcpy(resample_data, oreka->read_resampler->to, linear_len); - linear_samples = (int16_t *)resample_data; - } else { - linear_samples = linear_frame->data; - linear_len = linear_frame->datalen; - } - - memset(&pcmu_frame, 0, sizeof(pcmu_frame)); - for (i = 0; i < linear_len / sizeof(int16_t); i++) { - pcmu_data[i] = linear_to_ulaw(linear_samples[i]); - } - pcmu_frame.source = __SWITCH_FUNC__; - pcmu_frame.data = pcmu_data; - pcmu_frame.datalen = i; - pcmu_frame.payload = 0; - - switch_rtp_write_frame(oreka->read_rtp_stream, &pcmu_frame); - } - } - - - if (oreka->read_resampler) { - switch_resample_destroy(&oreka->read_resampler); - } - - if (oreka->write_resampler) { - switch_resample_destroy(&oreka->write_resampler); - } - - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Stopping Oreka recording for audio stream\n"); - oreka_send_sip_message(oreka, FS_OREKA_STOP, FS_OREKA_READ); - if (!oreka->mux_streams) { - oreka_send_sip_message(oreka, FS_OREKA_STOP, FS_OREKA_WRITE); - } - } - break; - case SWITCH_ABC_TYPE_READ_REPLACE: - case SWITCH_ABC_TYPE_READ_PING: - { - if (pcmu_frame.datalen) { - if (switch_rtp_write_frame(oreka->read_rtp_stream, &pcmu_frame) > 0) { - oreka->read_cnt++; - if (oreka->read_cnt < 10) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Oreka wrote %u bytes! (read)\n", pcmu_frame.datalen); - } - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Failed to write %u bytes! (read)\n", pcmu_frame.datalen); - } - } - } - break; - case SWITCH_ABC_TYPE_WRITE_REPLACE: - { - if (pcmu_frame.datalen) { - if (switch_rtp_write_frame(oreka->write_rtp_stream, &pcmu_frame) > 0) { - oreka->write_cnt++; - if (oreka->write_cnt < 10) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Oreka wrote %u bytes! (write)\n", pcmu_frame.datalen); - } - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Failed to write %u bytes! (write)\n", pcmu_frame.datalen); - } - } - } - break; - default: - break; - } - - return SWITCH_TRUE; -} - - -SWITCH_STANDARD_APP(oreka_start_function) -{ - switch_status_t status; - switch_channel_t *channel = switch_core_session_get_channel(session); - oreka_session_t *oreka = NULL; - switch_media_bug_t *bug = NULL; - char *argv[6]; - int flags = 0; - char *lbuf = NULL; - const char *var; - - if ((oreka = (oreka_session_t *) switch_channel_get_private(channel, OREKA_PRIVATE))) { - if (!zstr(data) && !strcasecmp(data, "stop")) { - switch_channel_set_private(channel, OREKA_PRIVATE, NULL); - if (oreka->read_bug) { - switch_core_media_bug_remove(session, &oreka->read_bug); - oreka->read_bug = NULL; - } - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Stopped oreka recorder\n"); - } else { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Cannot run oreka recording 2 times on the same session!\n"); - } - return; - } - - oreka = switch_core_session_alloc(session, sizeof(*oreka)); - switch_assert(oreka); - memset(oreka, 0, sizeof(*oreka)); - - oreka->mux_streams = globals.mux_streams; - - if ((var = switch_channel_get_variable(channel, "oreka_mux_streams"))) { - oreka->mux_streams = switch_true(var); - } - - if (data && (lbuf = switch_core_session_strdup(session, data)) - && switch_separate_string(lbuf, ' ', argv, (sizeof(argv) / sizeof(argv[0])))) { -#if 0 - if (!strncasecmp(argv[x], "server", sizeof("server"))) { - /* parse server=192.168.1.144 string */ - } -#endif - } - - oreka->session = session; - - if (oreka->mux_streams) { - flags = SMBF_READ_STREAM | SMBF_WRITE_STREAM | SMBF_READ_PING | SMBF_ANSWER_REQ; - } else { - flags = SMBF_READ_REPLACE | SMBF_WRITE_REPLACE | SMBF_ANSWER_REQ; - } - - status = switch_core_media_bug_add(session, OREKA_BUG_NAME_READ, NULL, oreka_audio_callback, oreka, 0, flags, &bug); - - if (status != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Failed to attach oreka to media stream!\n"); - return; - } - oreka->read_bug = bug; - oreka->usecnt++; - bug = NULL; - oreka->usecnt++; - switch_channel_set_private(channel, OREKA_PRIVATE, oreka); - -} - -#define OREKA_XML_CONFIG "oreka.conf" -static int load_config(void) -{ - switch_xml_t cfg, xml, settings, param; - if (!(xml = switch_xml_open_cfg(OREKA_XML_CONFIG, &cfg, NULL))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to open XML configuration '%s'\n", OREKA_XML_CONFIG); - return -1; - } - - 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"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Found parameter %s=%s\n", var, val); - if (!strcasecmp(var, "sip-server-addr")) { - snprintf(globals.sip_server_addr_str, sizeof(globals.sip_server_addr_str), "%s", val); - } else if (!strcasecmp(var, "sip-server-port")) { - globals.sip_server_port = atoi(val); - } else if (!strcasecmp(var, "mux-all-streams")) { - globals.mux_streams = 1; - } - } - } - - switch_xml_free(xml); - return 0; -} - -SWITCH_MODULE_LOAD_FUNCTION(mod_oreka_load) -{ - switch_application_interface_t *app_interface = NULL; - int mask = 0; -#if 0 - switch_status_t status = SWITCH_STATUS_FALSE; - int x = 0; - switch_size_t len = 0; - switch_size_t ilen = 0; - char dummy_output[] = "Parangaricutirimicuaro"; - char dummy_input[sizeof(dummy_output)] = ""; - switch_sockaddr_t *from_addr = NULL; -#endif - - memset(&globals, 0, sizeof(globals)); - - if (load_config()) { - return SWITCH_STATUS_UNLOAD; - } - - if (zstr(globals.sip_server_addr_str)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No sip server address specified!\n"); - return SWITCH_STATUS_UNLOAD; - } - - if (!globals.sip_server_port) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No sip server port specified!\n"); - return SWITCH_STATUS_UNLOAD; - } - - //switch_sockaddr_info_get(&globals.sip_server_addr, "sigchld.sangoma.local", SWITCH_UNSPEC, 5080, 0, pool); - switch_sockaddr_info_get(&globals.sip_server_addr, globals.sip_server_addr_str, SWITCH_UNSPEC, globals.sip_server_port, 0, pool); - - if (!globals.sip_server_addr) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid sip server address specified: %s!\n", globals.sip_server_addr_str); - return SWITCH_STATUS_UNLOAD; - } - - if (switch_socket_create(&globals.sip_socket, switch_sockaddr_get_family(globals.sip_server_addr), SOCK_DGRAM, 0, pool) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to create socket!\n"); - return SWITCH_STATUS_UNLOAD; - } - - switch_find_local_ip(globals.local_ipv4_str, sizeof(globals.local_ipv4_str), &mask, AF_INET); - switch_get_addr(globals.sip_server_ipv4_str, sizeof(globals.sip_server_ipv4_str), globals.sip_server_addr); - globals.our_pid = getpid(); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, - "Loading mod_oreka, sip_server_addr=%s, sip_server_ipv4_str=%s, sip_server_port=%d, local_ipv4_str=%s\n", - globals.sip_server_addr_str, globals.sip_server_ipv4_str, globals.sip_server_port, globals.local_ipv4_str); - -#if 0 - if (switch_socket_bind(globals.sip_socket, globals.sip_addr) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to bind to SIP address: %s!\n", strerror(errno)); - return SWITCH_STATUS_UNLOAD; - } -#endif - -#if 0 - len = sizeof(dummy_output); -#ifndef WIN32 - switch_socket_opt_set(globals.sip_socket, SWITCH_SO_NONBLOCK, TRUE); - - status = switch_socket_sendto(globals.sip_socket, globals.sip_addr, 0, (void *)dummy_output, &len); - if (status != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to send UDP message! (status=%d)\n", status); - } - - status = switch_sockaddr_create(&from_addr, pool); - if (status != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to creat socket address\n"); - } - - while (!ilen) { - ilen = sizeof(dummy_input); - status = switch_socket_recvfrom(from_addr, globals.sip_socket, 0, (void *)dummy_input, &ilen); - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - break; - } - - if (++x > 1000) { - break; - } - - switch_cond_next(); - } - - switch_socket_opt_set(globals.sip_socket, SWITCH_SO_NONBLOCK, FALSE); -#endif -#endif - - *module_interface = switch_loadable_module_create_module_interface(pool, modname); - - SWITCH_ADD_APP(app_interface, "oreka_record", "Send media to Oreka recording server", "Send media to Oreka recording server", - oreka_start_function, "[stop]", SAF_NONE); - return SWITCH_STATUS_SUCCESS; -} - -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_oreka_shutdown) -{ - switch_socket_close(globals.sip_socket); - return SWITCH_STATUS_UNLOAD; -} - -/* For Emacs: - * Local Variables: - * mode:c - * indent-tabs-mode:t - * tab-width:4 - * c-basic-offset:4 - * End: - * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: - */ diff --git a/src/mod/codecs/mod_clearmode/Makefile.am b/src/mod/codecs/mod_clearmode/Makefile.am deleted file mode 100644 index aa19cb3991..0000000000 --- a/src/mod/codecs/mod_clearmode/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -include $(top_srcdir)/build/modmake.rulesam -MODNAME=mod_clearmode - -mod_LTLIBRARIES = mod_clearmode.la -mod_clearmode_la_SOURCES = mod_clearmode.c -mod_clearmode_la_CFLAGS = $(AM_CFLAGS) -mod_clearmode_la_LIBADD = $(switch_builddir)/libfreeswitch.la -mod_clearmode_la_LDFLAGS = -avoid-version -module -no-undefined -shared diff --git a/src/mod/codecs/mod_clearmode/mod_clearmode.c b/src/mod/codecs/mod_clearmode/mod_clearmode.c deleted file mode 100644 index e2d3c8a094..0000000000 --- a/src/mod/codecs/mod_clearmode/mod_clearmode.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005-2014, 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 - * Anthony Minessale II - * Portions created by the Initial Developer are Copyright (C) - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Anthony Minessale II - * Brian West - * - * mod_clear.c -- CLEARMODE Passthru Codec - * - */ - -#include - -SWITCH_MODULE_LOAD_FUNCTION(mod_clearmode_load); -SWITCH_MODULE_DEFINITION(mod_clearmode, mod_clearmode_load, NULL, NULL); - -static switch_status_t switch_clearmode_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings) -{ - int encoding, decoding; - - encoding = (flags & SWITCH_CODEC_FLAG_ENCODE); - decoding = (flags & SWITCH_CODEC_FLAG_DECODE); - - if (!(encoding || decoding)) { - return SWITCH_STATUS_FALSE; - } else { - if (codec->fmtp_in) { - codec->fmtp_out = switch_core_strdup(codec->memory_pool, codec->fmtp_in); - } - return SWITCH_STATUS_SUCCESS; - } -} - -static switch_status_t switch_clearmode_encode(switch_codec_t *codec, - switch_codec_t *other_codec, - void *decoded_data, - uint32_t decoded_data_len, - uint32_t decoded_rate, void *encoded_data, uint32_t *encoded_data_len, uint32_t *encoded_rate, - unsigned int *flag) -{ - return SWITCH_STATUS_FALSE; -} - -static switch_status_t switch_clearmode_decode(switch_codec_t *codec, - switch_codec_t *other_codec, - void *encoded_data, - uint32_t encoded_data_len, - uint32_t encoded_rate, void *decoded_data, uint32_t *decoded_data_len, uint32_t *decoded_rate, - unsigned int *flag) -{ - return SWITCH_STATUS_FALSE; -} - -static switch_status_t switch_clearmode_destroy(switch_codec_t *codec) -{ - return SWITCH_STATUS_SUCCESS; -} - -SWITCH_MODULE_LOAD_FUNCTION(mod_clearmode_load) -{ - switch_codec_interface_t *codec_interface; - /* connect my internal structure to the blank pointer passed to me */ - *module_interface = switch_loadable_module_create_module_interface(pool, modname); - SWITCH_ADD_CODEC(codec_interface, "Clearmode (passthru)"); - switch_core_codec_add_implementation(pool, codec_interface, - SWITCH_CODEC_TYPE_AUDIO, 106, "CLEARMODE", NULL, 8000, 8000, 64000, - 20000, 160, 320, 320, 1, 1, - switch_clearmode_init, switch_clearmode_encode, switch_clearmode_decode, switch_clearmode_destroy); - switch_core_codec_add_implementation(pool, codec_interface, - SWITCH_CODEC_TYPE_AUDIO, 106, "CLEARMODE", NULL, 8000, 8000, 64000, - 30000, 240, 480, 480, 1, 1, - switch_clearmode_init, switch_clearmode_encode, switch_clearmode_decode, switch_clearmode_destroy); - /* indicate that the module should continue to be loaded */ - return SWITCH_STATUS_SUCCESS; -} - -/* For Emacs: - * Local Variables: - * mode:c - * indent-tabs-mode:t - * tab-width:4 - * c-basic-offset:4 - * End: - * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: - */ diff --git a/src/mod/codecs/mod_theora/Makefile.am b/src/mod/codecs/mod_theora/Makefile.am deleted file mode 100644 index 1226a05a73..0000000000 --- a/src/mod/codecs/mod_theora/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -include $(top_srcdir)/build/modmake.rulesam -MODNAME=mod_theora - -mod_LTLIBRARIES = mod_theora.la -mod_theora_la_SOURCES = mod_theora.c -mod_theora_la_CFLAGS = $(AM_CFLAGS) -mod_theora_la_LIBADD = $(switch_builddir)/libfreeswitch.la -mod_theora_la_LDFLAGS = -avoid-version -module -no-undefined -shared diff --git a/src/mod/codecs/mod_theora/mod_theora.c b/src/mod/codecs/mod_theora/mod_theora.c deleted file mode 100644 index e1733d44fc..0000000000 --- a/src/mod/codecs/mod_theora/mod_theora.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005-2014, 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 - * Anthony Minessale II - * Portions created by the Initial Developer are Copyright (C) - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Anthony Minessale II - * - * - * mod_theora.c -- THEORA Video Codec - * - */ - -#include - -SWITCH_MODULE_LOAD_FUNCTION(mod_theora_load); -SWITCH_MODULE_DEFINITION(mod_theora, mod_theora_load, NULL, NULL); - -static switch_status_t switch_theora_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings) -{ - int encoding, decoding; - - encoding = (flags & SWITCH_CODEC_FLAG_ENCODE); - decoding = (flags & SWITCH_CODEC_FLAG_DECODE); - - if (!(encoding || decoding)) { - return SWITCH_STATUS_FALSE; - } else { - if (codec->fmtp_in) { - codec->fmtp_out = switch_core_strdup(codec->memory_pool, codec->fmtp_in); - } - return SWITCH_STATUS_SUCCESS; - } -} - -static switch_status_t switch_theora_encode(switch_codec_t *codec, - switch_codec_t *other_codec, - void *decoded_data, - uint32_t decoded_data_len, - uint32_t decoded_rate, void *encoded_data, uint32_t *encoded_data_len, uint32_t *encoded_rate, - unsigned int *flag) -{ - return SWITCH_STATUS_FALSE; -} - -static switch_status_t switch_theora_decode(switch_codec_t *codec, - switch_codec_t *other_codec, - void *encoded_data, - uint32_t encoded_data_len, - uint32_t encoded_rate, void *decoded_data, uint32_t *decoded_data_len, uint32_t *decoded_rate, - unsigned int *flag) -{ - return SWITCH_STATUS_FALSE; -} - -static switch_status_t switch_theora_destroy(switch_codec_t *codec) -{ - return SWITCH_STATUS_SUCCESS; -} - -SWITCH_MODULE_LOAD_FUNCTION(mod_theora_load) -{ - switch_codec_interface_t *codec_interface; - /* connect my internal structure to the blank pointer passed to me */ - *module_interface = switch_loadable_module_create_module_interface(pool, modname); - SWITCH_ADD_CODEC(codec_interface, "THEORA Video (passthru)"); - switch_core_codec_add_implementation(pool, codec_interface, - SWITCH_CODEC_TYPE_VIDEO, 99, "THEORA", NULL, 90000, 90000, 0, - 0, 0, 0, 0, 1, 1, switch_theora_init, switch_theora_encode, switch_theora_decode, switch_theora_destroy); - /* indicate that the module should continue to be loaded */ - return SWITCH_STATUS_SUCCESS; -} - -/* For Emacs: - * Local Variables: - * mode:c - * indent-tabs-mode:t - * tab-width:4 - * c-basic-offset:4 - * End: - * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: - */ diff --git a/src/mod/databases/mod_pgsql/mod_pgsql.c b/src/mod/databases/mod_pgsql/mod_pgsql.c index 89fdd710f6..1a5874e14c 100644 --- a/src/mod/databases/mod_pgsql/mod_pgsql.c +++ b/src/mod/databases/mod_pgsql/mod_pgsql.c @@ -106,6 +106,22 @@ char * pgsql_handle_get_error(switch_pgsql_handle_t *handle) return err_str; } +void pgsql_handle_set_error_if_not_set(switch_pgsql_handle_t *handle, char **err) +{ + char *err_str; + + if (err && !(*err)) { + err_str = pgsql_handle_get_error(handle); + + if (zstr(err_str)) { + switch_safe_free(err_str); + err_str = strdup((char *)"SQL ERROR!"); + } + + *err = err_str; + } +} + static int db_is_up(switch_pgsql_handle_t *handle) { int ret = 0; @@ -553,8 +569,15 @@ switch_status_t pgsql_handle_exec_detailed(const char *file, const char *func, i goto error; } - return pgsql_finish_results(handle); + if (pgsql_finish_results(handle) != SWITCH_STATUS_SUCCESS) { + goto error; + } + + return SWITCH_STATUS_SUCCESS; + error: + pgsql_handle_set_error_if_not_set(handle, err); + return SWITCH_STATUS_FALSE; } @@ -630,6 +653,7 @@ done: pgsql_free_result(&result); if (pgsql_finish_results(handle) != SWITCH_STATUS_SUCCESS) { + pgsql_handle_set_error_if_not_set(handle, err); sstatus = SWITCH_STATUS_FALSE; } @@ -638,6 +662,7 @@ done: error: pgsql_free_result(&result); + pgsql_handle_set_error_if_not_set(handle, err); return SWITCH_STATUS_FALSE; } @@ -1050,6 +1075,8 @@ switch_status_t pgsql_handle_callback_exec_detailed(const char *file, const char return SWITCH_STATUS_SUCCESS; error: + pgsql_handle_set_error_if_not_set(handle, err); + return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index c41ed9b2e3..086d6dd088 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -254,7 +254,7 @@ char *generate_pai_str(private_object_t *tech_pvt) callee_number = switch_sanitize_number(switch_core_session_strdup(session, callee_number)); callee_name = switch_sanitize_number(switch_core_session_strdup(session, callee_name)); - if (!zstr(callee_number) && (zstr(ua) || !switch_stristr("polycom", ua))) { + if (!zstr(callee_number) && (zstr(ua) || !switch_stristr("poly", ua))) { callee_number = switch_core_session_sprintf(session, "sip:%s@%s", callee_number, host); } @@ -2075,13 +2075,15 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"), TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), SIPTAG_PAYLOAD_STR(message), TAG_END()); } else if (update_allowed && ua && (switch_channel_var_true(tech_pvt->channel, "update_ignore_ua") || - switch_stristr("polycom", ua) || + switch_stristr("poly", ua) || (switch_stristr("aastra", ua) && !switch_stristr("Intelligate", ua)) || (switch_stristr("cisco/spa50", ua) || switch_stristr("cisco/spa525", ua)) || switch_stristr("cisco/spa30", ua) || switch_stristr("Fanvil", ua) || switch_stristr("Grandstream", ua) || + switch_stristr("Ringotel", ua) || + switch_stristr("Groundwire", ua) || switch_stristr("Yealink", ua) || switch_stristr("Mitel", ua) || switch_stristr("Panasonic", ua))) { @@ -2152,7 +2154,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi SIPTAG_PAYLOAD_STR(message), TAG_IF(!zstr(session_id_header), SIPTAG_HEADER_STR(session_id_header)), TAG_END()); - } else if (ua && switch_stristr("polycom", ua)) { + } else if (ua && switch_stristr("poly", ua)) { snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <%s>", msg->string_arg, tech_pvt->caller_profile->destination_number); nua_update(tech_pvt->nh, NUTAG_SESSION_TIMER(tech_pvt->session_timeout), diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index a370b52442..77e4750812 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -10476,7 +10476,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia (!is_tcp && !is_tls && (zstr(network_ip) || !switch_check_network_list_ip(network_ip, profile->local_network)) && profile->server_rport_level >= 2 && sip->sip_user_agent && sip->sip_user_agent->g_string && - (!strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7) || !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20))) + (!strncasecmp(sip->sip_user_agent->g_string, "Poly", 4) || !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20))) ) { if (sip->sip_via) { const char *port = sip->sip_via->v_port; diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 48ad579411..151d6ec634 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -2501,7 +2501,7 @@ static char *gen_pidf(char *user_agent, char *id, char *url, char *open, char *r { char *ret = NULL; - if (switch_stristr("polycom", user_agent)) { + if (switch_stristr("poly", user_agent)) { *ct = "application/xpidf+xml"; /* If unknown/none prpid is provided, just show the user as online. */ diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index d9e04528a8..ccd42bf6ab 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -1661,7 +1661,7 @@ uint8_t sofia_reg_handle_register_token(nua_t *nua, sofia_profile_t *profile, nu if (!is_tcp && !is_tls && (zstr(network_ip) || !switch_check_network_list_ip(network_ip, profile->local_network)) && profile->server_rport_level >= 2 && sip->sip_user_agent && sip->sip_user_agent->g_string && - ( !strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7) || + ( !strncasecmp(sip->sip_user_agent->g_string, "Poly", 4) || !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20) || !strncasecmp(sip->sip_user_agent->g_string, "ADTRAN_Total_Access", 19) )) { if (sip->sip_via) { diff --git a/src/mod/languages/mod_lua/freeswitch.i b/src/mod/languages/mod_lua/freeswitch.i index 501b50fb48..96a5f8c722 100644 --- a/src/mod/languages/mod_lua/freeswitch.i +++ b/src/mod/languages/mod_lua/freeswitch.i @@ -61,6 +61,11 @@ %include "typemaps.i" %apply int *OUTPUT { int *len }; +%typemap(out) DbhQueryRowsReturn { + SWIG_arg += result; +} + + /** * tell swig to grok everything defined in these header files and * build all sorts of c wrappers and lua shadows of the c wrappers. @@ -115,6 +120,7 @@ class Dbh { bool connected(); bool test_reactive(char *test_sql, char *drop_sql = NULL, char *reactive_sql = NULL); bool query(char *sql, SWIGLUA_FN lua_fun); + DbhQueryRowsReturn query_rows(lua_State* L, char *sql); int affected_rows(); char *last_error(); void clear_error(); diff --git a/src/mod/languages/mod_lua/freeswitch_lua.cpp b/src/mod/languages/mod_lua/freeswitch_lua.cpp index 5d89aa28f9..2affbf7e88 100644 --- a/src/mod/languages/mod_lua/freeswitch_lua.cpp +++ b/src/mod/languages/mod_lua/freeswitch_lua.cpp @@ -482,6 +482,62 @@ bool Dbh::query(char *sql, SWIGLUA_FN lua_fun) return false; } +struct query_callback_data { + lua_State *L; + int stack_index; + int *row_num; +}; + +int query2_callback(void *pArg, int argc, char **argv, char **columnNames) +{ + struct query_callback_data *data = (struct query_callback_data *) pArg; + lua_State *tL = data->L; + lua_createtable(tL, 0, argc); + for (int i = 0; i < argc; i++) { + lua_pushstring(tL, argv[i]); + lua_setfield(tL, -2, switch_str_nil(columnNames[i])); + } + lua_rawseti(tL, data->stack_index + 2, (*data->row_num)++); + return 0; +} + +DbhQueryRowsReturn Dbh::query_rows(lua_State* L, char *sql) +{ + int stack_index = lua_gettop(L); + clear_error(); + lua_pushboolean(L, 0); // result success error: stack_index + 1 + lua_newtable(L); // the rows: stack_index + 2 + lua_pushnil(L); // error message if any: stack_index + 3 + + if (zstr(sql)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing SQL query.\n"); + lua_pushstring(L, "Missing SQL query."); + lua_replace(L, stack_index + 3); + return 3; + } + + if (dbh) { + int index = 1; + struct query_callback_data pData = {L, stack_index, &index}; + + if (switch_cache_db_execute_sql_callback(dbh, sql, query2_callback, &pData, &err) == SWITCH_STATUS_SUCCESS) { + // no errors + lua_pushboolean(L, 1); + lua_replace(L, stack_index + 1); + } else { + lua_pushstring(L, !zstr(err) ? err : "Failed to execute sql query"); + lua_replace(L, stack_index + 3); + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DBH NOT Connected.\n"); + lua_pushstring(L, "DBH NOT Connected."); + lua_replace(L, stack_index + 3); + } + + return 3; +} + + int Dbh::affected_rows() { if (dbh) { diff --git a/src/mod/languages/mod_lua/freeswitch_lua.h b/src/mod/languages/mod_lua/freeswitch_lua.h index c357916607..0cd1a64c32 100644 --- a/src/mod/languages/mod_lua/freeswitch_lua.h +++ b/src/mod/languages/mod_lua/freeswitch_lua.h @@ -28,6 +28,7 @@ typedef struct{ #define SWIGLUA_TABLE_GET(fn) {lua_pushvalue(fn.L,fn.idx);} +typedef int DbhQueryRowsReturn; namespace LUA { class Session:public CoreSession { @@ -76,6 +77,7 @@ namespace LUA { bool connected(); bool test_reactive(char *test_sql, char *drop_sql = NULL, char *reactive_sql = NULL); bool query(char *sql, SWIGLUA_FN lua_fun); + DbhQueryRowsReturn query_rows(lua_State* L, char *sql); int affected_rows(); char *last_error(); void clear_error(); diff --git a/src/mod/languages/mod_lua/hack.diff b/src/mod/languages/mod_lua/hack.diff index 95ec620feb..779d4f5a8b 100644 --- a/src/mod/languages/mod_lua/hack.diff +++ b/src/mod/languages/mod_lua/hack.diff @@ -1,6 +1,6 @@ ---- mod_lua_wrap.cpp.old 2015-06-16 12:27:19.024000000 -0500 -+++ mod_lua_wrap.cpp 2015-06-16 12:34:51.540000000 -0500 -@@ -4242,7 +4242,7 @@ static int _wrap_Stream_read(lua_State* L) { +--- mod_lua_wrap.cpp.old 2025-01-15 13:22:48.705853645 +0000 ++++ mod_lua_wrap.cpp 2025-01-15 13:23:33.161847705 +0000 +@@ -4242,7 +4242,7 @@ } result = (char *)(arg1)->read(arg2); @@ -9,7 +9,7 @@ lua_pushnumber(L, (lua_Number) *arg2); SWIG_arg++; return SWIG_arg; -@@ -8304,7 +8304,7 @@ static int _wrap_new_Session__SWIG_0(lua_State* L) { +@@ -8336,7 +8336,7 @@ SWIG_check_num_args("LUA::Session::Session",0,0) result = (LUA::Session *)new LUA::Session(); @@ -18,7 +18,7 @@ return SWIG_arg; if(0) SWIG_fail; -@@ -8331,7 +8331,7 @@ static int _wrap_new_Session__SWIG_1(lua_State* L) { +@@ -8363,7 +8363,7 @@ } result = (LUA::Session *)new LUA::Session(arg1,arg2); @@ -27,7 +27,7 @@ return SWIG_arg; if(0) SWIG_fail; -@@ -8351,7 +8351,7 @@ static int _wrap_new_Session__SWIG_2(lua_State* L) { +@@ -8383,7 +8383,7 @@ if(!SWIG_lua_isnilstring(L,1)) SWIG_fail_arg("LUA::Session::Session",1,"char *"); arg1 = (char *)lua_tostring(L, 1); result = (LUA::Session *)new LUA::Session(arg1); @@ -36,7 +36,7 @@ return SWIG_arg; if(0) SWIG_fail; -@@ -8375,7 +8375,7 @@ static int _wrap_new_Session__SWIG_3(lua_State* L) { +@@ -8407,7 +8407,7 @@ } result = (LUA::Session *)new LUA::Session(arg1); @@ -45,7 +45,7 @@ return SWIG_arg; if(0) SWIG_fail; -@@ -9485,6 +9485,7 @@ static int _wrap_Dbh_test_reactive__SWIG_0(lua_State* L) { +@@ -9517,6 +9517,7 @@ arg2 = (char *)lua_tostring(L, 2); arg3 = (char *)lua_tostring(L, 3); arg4 = (char *)lua_tostring(L, 4); @@ -53,7 +53,7 @@ result = (bool)(arg1)->test_reactive(arg2,arg3,arg4); lua_pushboolean(L,(int)(result!=0)); SWIG_arg++; return SWIG_arg; -@@ -9516,6 +9516,7 @@ static int _wrap_Dbh_test_reactive__SWIG_1(lua_State* L) { +@@ -9547,6 +9548,7 @@ arg2 = (char *)lua_tostring(L, 2); arg3 = (char *)lua_tostring(L, 3); @@ -61,7 +61,7 @@ result = (bool)(arg1)->test_reactive(arg2,arg3); lua_pushboolean(L,(int)(result!=0)); SWIG_arg++; return SWIG_arg; -@@ -9543,6 +9544,7 @@ static int _wrap_Dbh_test_reactive__SWIG_2(lua_State* L) { +@@ -9574,6 +9576,7 @@ } arg2 = (char *)lua_tostring(L, 2); @@ -69,7 +69,7 @@ result = (bool)(arg1)->test_reactive(arg2); lua_pushboolean(L,(int)(result!=0)); SWIG_arg++; return SWIG_arg; -@@ -9672,6 +9673,7 @@ static int _wrap_Dbh_query(lua_State* L) { +@@ -9704,6 +9707,7 @@ (&arg3)->idx = 3; } } @@ -77,7 +77,15 @@ result = (bool)(arg1)->query(arg2,arg3); lua_pushboolean(L,(int)(result!=0)); SWIG_arg++; return SWIG_arg; -@@ -9695,7 +9697,7 @@ static int _wrap_Dbh_affected_rows(lua_State* L) { +@@ -9733,6 +9737,7 @@ + } + + arg3 = (char *)lua_tostring(L, 2); ++ switch_assert(arg1); + result = (arg1)->query_rows(arg2,arg3); + { + SWIG_arg += result; +@@ -9758,7 +9763,7 @@ if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_LUA__Dbh,0))){ SWIG_fail_ptr("Dbh_affected_rows",1,SWIGTYPE_p_LUA__Dbh); } @@ -86,7 +94,7 @@ result = (int)(arg1)->affected_rows(); lua_pushnumber(L, (lua_Number) result); SWIG_arg++; return SWIG_arg; -@@ -9719,7 +9721,7 @@ static int _wrap_Dbh_last_error(lua_State* L) { +@@ -9782,7 +9787,7 @@ if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_LUA__Dbh,0))){ SWIG_fail_ptr("Dbh_last_error",1,SWIGTYPE_p_LUA__Dbh); } @@ -95,7 +103,7 @@ result = (char *)(arg1)->last_error(); lua_pushstring(L,(const char *)result); SWIG_arg++; return SWIG_arg; -@@ -9742,7 +9744,7 @@ static int _wrap_Dbh_clear_error(lua_State* L) { +@@ -9805,7 +9810,7 @@ if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_LUA__Dbh,0))){ SWIG_fail_ptr("Dbh_clear_error",1,SWIGTYPE_p_LUA__Dbh); } @@ -104,7 +112,7 @@ (arg1)->clear_error(); return SWIG_arg; -@@ -9770,6 +9772,7 @@ static int _wrap_Dbh_load_extension(lua_State* L) { +@@ -9833,6 +9838,7 @@ } arg2 = (char *)lua_tostring(L, 2); @@ -112,7 +120,7 @@ result = (int)(arg1)->load_extension((char const *)arg2); lua_pushnumber(L, (lua_Number) result); SWIG_arg++; return SWIG_arg; -@@ -9869,6 +9872,7 @@ static int _wrap_JSON_decode(lua_State* L) { +@@ -9933,6 +9939,7 @@ } arg2 = (char *)lua_tostring(L, 2); @@ -120,7 +128,7 @@ result = (cJSON *)(arg1)->decode((char const *)arg2); { SWIG_arg += LUA::JSON::cJSON2LuaTable(L, result); -@@ -9902,6 +9906,7 @@ static int _wrap_JSON_encode(lua_State* L) { +@@ -9966,6 +9973,7 @@ (&arg2)->L = L; (&arg2)->idx = 2; } @@ -128,7 +136,7 @@ result = (arg1)->encode(arg2); lua_pushlstring(L,(&result)->data(),(&result)->size()); SWIG_arg++; return SWIG_arg; -@@ -9929,6 +9934,7 @@ static int _wrap_JSON_execute__SWIG_0(lua_State* L) { +@@ -9993,6 +10001,7 @@ } arg2 = (char *)lua_tostring(L, 2); @@ -136,7 +144,7 @@ result = (cJSON *)(arg1)->execute((char const *)arg2); { SWIG_arg += LUA::JSON::cJSON2LuaTable(L, result); -@@ -9962,6 +9968,7 @@ static int _wrap_JSON_execute__SWIG_1(lua_State* L) { +@@ -10026,6 +10035,7 @@ (&arg2)->L = L; (&arg2)->idx = 2; } @@ -144,7 +152,7 @@ result = (cJSON *)(arg1)->execute(arg2); { SWIG_arg += LUA::JSON::cJSON2LuaTable(L, result); -@@ -10046,6 +10053,7 @@ static int _wrap_JSON_execute2__SWIG_0(lua_State* L) { +@@ -10110,6 +10120,7 @@ } arg2 = (char *)lua_tostring(L, 2); @@ -152,7 +160,7 @@ result = (arg1)->execute2((char const *)arg2); lua_pushlstring(L,(&result)->data(),(&result)->size()); SWIG_arg++; return SWIG_arg; -@@ -10076,6 +10084,7 @@ static int _wrap_JSON_execute2__SWIG_1(lua_State* L) { +@@ -10140,6 +10151,7 @@ (&arg2)->L = L; (&arg2)->idx = 2; } @@ -160,7 +168,7 @@ result = (arg1)->execute2(arg2); lua_pushlstring(L,(&result)->data(),(&result)->size()); SWIG_arg++; return SWIG_arg; -@@ -10156,6 +10165,7 @@ static int _wrap_JSON_encode_empty_table_as_object(lua_State* L) { +@@ -10220,6 +10232,7 @@ } arg2 = (lua_toboolean(L, 2)!=0); @@ -168,7 +176,7 @@ (arg1)->encode_empty_table_as_object(arg2); return SWIG_arg; -@@ -10182,6 +10192,7 @@ static int _wrap_JSON_return_unformatted_json(lua_State* L) { +@@ -10246,6 +10259,7 @@ } arg2 = (lua_toboolean(L, 2)!=0); diff --git a/src/mod/languages/mod_lua/mod_lua_wrap.cpp b/src/mod/languages/mod_lua/mod_lua_wrap.cpp index 93ba825557..e40b50a348 100644 --- a/src/mod/languages/mod_lua/mod_lua_wrap.cpp +++ b/src/mod/languages/mod_lua/mod_lua_wrap.cpp @@ -9720,6 +9720,38 @@ fail: } +static int _wrap_Dbh_query_rows(lua_State* L) { + int SWIG_arg = 0; + LUA::Dbh *arg1 = (LUA::Dbh *) 0 ; + lua_State *arg2 = (lua_State *) 0 ; + char *arg3 = (char *) 0 ; + DbhQueryRowsReturn result; + + arg2 = L; + SWIG_check_num_args("LUA::Dbh::query_rows",2,2) + if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("LUA::Dbh::query_rows",1,"LUA::Dbh *"); + if(!SWIG_lua_isnilstring(L,2)) SWIG_fail_arg("LUA::Dbh::query_rows",2,"char *"); + + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_LUA__Dbh,0))){ + SWIG_fail_ptr("Dbh_query_rows",1,SWIGTYPE_p_LUA__Dbh); + } + + arg3 = (char *)lua_tostring(L, 2); + switch_assert(arg1); + result = (arg1)->query_rows(arg2,arg3); + { + SWIG_arg += result; + } + return SWIG_arg; + + if(0) SWIG_fail; + +fail: + lua_error(L); + return SWIG_arg; +} + + static int _wrap_Dbh_affected_rows(lua_State* L) { int SWIG_arg = 0; LUA::Dbh *arg1 = (LUA::Dbh *) 0 ; @@ -9839,6 +9871,7 @@ static swig_lua_method swig_Dbh_methods[]= { { "connected", _wrap_Dbh_connected}, { "test_reactive", _wrap_Dbh_test_reactive}, { "query", _wrap_Dbh_query}, + { "query_rows", _wrap_Dbh_query_rows}, { "affected_rows", _wrap_Dbh_affected_rows}, { "last_error", _wrap_Dbh_last_error}, { "clear_error", _wrap_Dbh_clear_error}, diff --git a/src/mod/languages/mod_yaml/Makefile.am b/src/mod/languages/mod_yaml/Makefile.am deleted file mode 100644 index 9d02a0fbc1..0000000000 --- a/src/mod/languages/mod_yaml/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -include $(top_srcdir)/build/modmake.rulesam -MODNAME=mod_yaml - -if HAVE_YAML - -mod_LTLIBRARIES = mod_yaml.la -mod_yaml_la_SOURCES = mod_yaml.c -mod_yaml_la_CFLAGS = $(AM_CFLAGS) -mod_yaml_la_CPPFLAGS = $(AM_CPPFLAGS) $(YAML_CFLAGS) -mod_yaml_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(YAML_LIBS) -mod_yaml_la_LDFLAGS = -avoid-version -module -no-undefined -shared - -else -install: error -all: error -error: - $(error You must install libyaml-dev to build mod_yaml) -endif diff --git a/src/mod/languages/mod_yaml/mod_yaml.c b/src/mod/languages/mod_yaml/mod_yaml.c deleted file mode 100644 index 4c824e7137..0000000000 --- a/src/mod/languages/mod_yaml/mod_yaml.c +++ /dev/null @@ -1,529 +0,0 @@ -/* - * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005-2014, 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 - * Anthony Minessale II - * Portions created by the Initial Developer are Copyright (C) - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Anthony Minessale II - - * - * mod_yaml.c -- YAML Module - * - */ -#include -#include - -SWITCH_MODULE_LOAD_FUNCTION(mod_yaml_load); -SWITCH_MODULE_DEFINITION(mod_yaml, mod_yaml_load, NULL, NULL); - -static void print_error(yaml_parser_t *parser) -{ - switch (parser->error) { - case YAML_MEMORY_ERROR: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory error: Not enough memory for parsing\n"); - break; - - case YAML_READER_ERROR: - if (parser->problem_value != -1) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Reader error: %s: #%X at %d\n", parser->problem, - parser->problem_value, (int) parser->problem_offset); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Reader error: %s at %d\n", parser->problem, (int) parser->problem_offset); - } - break; - - case YAML_SCANNER_ERROR: - if (parser->context) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Scanner error: %s at line %d, column %d\n" - "%s at line %d, column %d\n", parser->context, - (int) parser->context_mark.line + 1, (int) parser->context_mark.column + 1, - parser->problem, (int) parser->problem_mark.line + 1, (int) parser->problem_mark.column + 1); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Scanner error: %s at line %d, column %d\n", - parser->problem, (int) parser->problem_mark.line + 1, (int) parser->problem_mark.column + 1); - } - break; - - case YAML_PARSER_ERROR: - if (parser->context) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parser error: %s at line %d, column %d\n" - "%s at line %d, column %d\n", parser->context, - (int) parser->context_mark.line + 1, (int) parser->context_mark.column + 1, - parser->problem, (int) parser->problem_mark.line + 1, (int) parser->problem_mark.column + 1); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parser error: %s at line %d, column %d\n", - parser->problem, (int) parser->problem_mark.line + 1, (int) parser->problem_mark.column + 1); - } - break; - - default: - /* Couldn't happen. */ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Internal error\n"); - break; - } -} - - -static switch_xml_t parse_file(FILE * input, const char *file_name) -{ - yaml_parser_t parser; - yaml_event_t event = { 0 }; - char *scalar_data; - int done = 0; - int depth = 0; - char name[128] = ""; - char value[128] = ""; - char category[128] = ""; - int nv = 0, p_off = 0; - switch_xml_t xml, param, top, current = NULL; - - yaml_parser_initialize(&parser); - yaml_parser_set_input_file(&parser, input); - - - if (!(xml = switch_xml_new("document"))) { - return NULL; - } - - switch_xml_set_attr_d(xml, "type", "freeswitch/xml"); - current = switch_xml_add_child_d(xml, "section", 0); - switch_xml_set_attr_d(current, "name", "configuration"); - - top = switch_xml_add_child_d(current, "configuration", 0); - switch_xml_set_attr_d(top, "name", file_name); - - while (!done) { - if (!yaml_parser_parse(&parser, &event)) { - print_error(&parser); - break; - } else { - switch (event.type) { - case YAML_MAPPING_START_EVENT: - depth++; - break; - case YAML_MAPPING_END_EVENT: - depth--; - break; - case YAML_STREAM_END_EVENT: - done = 1; - break; - case YAML_SCALAR_EVENT: - scalar_data = (char *) event.data.scalar.value; - switch (depth) { - case 1: - if (!(current = switch_xml_add_child_d(top, scalar_data, depth - 1))) { - done = 1; - } - switch_set_string(category, scalar_data); - nv = 0; - p_off = 0; - break; - case 2: - if (current) { - if (nv == 0) { - switch_set_string(name, scalar_data); - nv++; - } else { - switch_set_string(value, scalar_data); - param = switch_xml_add_child_d(current, "param", p_off++); - switch_xml_set_attr_d_buf(param, "name", name); - switch_xml_set_attr_d(param, "value", scalar_data); - nv = 0; - } - } - break; - } - - break; - default: - break; - } - } - - yaml_event_delete(&event); - } - - yaml_parser_delete(&parser); - - if (input) { - fclose(input); - } -#ifdef DEBUG_XML - if (xml) { - char *foo = switch_xml_toxml(xml, SWITCH_FALSE); - printf("%s\n", foo); - free(foo); - } -#endif - - return xml; - -} - -static switch_xml_t yaml_fetch(const char *section, - const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params, void *user_data) -{ - char *path; - FILE *input; - switch_xml_t xml = NULL; - - path = switch_mprintf("%s/yaml/%s.yaml", SWITCH_GLOBAL_dirs.conf_dir, key_value); - if ((input = fopen(path, "r"))) { - xml = parse_file(input, key_value); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "cannot open %s\n", path); - } - - switch_safe_free(path); - return xml; -} - - -static switch_caller_extension_t *parse_dp(FILE * input, switch_core_session_t *session, switch_caller_profile_t *caller_profile) -{ - yaml_parser_t parser; - yaml_event_t event = { 0 }; - char *scalar_data; - int done = 0; - int depth = 0; - char name[128] = ""; - char value[128] = ""; - char category[128] = ""; - char *last_field = NULL; - int nv = 0; - switch_caller_extension_t *extension = NULL; - switch_channel_t *channel = switch_core_session_get_channel(session); - int context_hit = 0; - int proceed = 0; - switch_regex_t *re = NULL; - int ovector[30]; - int parens = 0; - - if (!caller_profile) { - if (!(caller_profile = switch_channel_get_caller_profile(channel))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Obtaining Profile!\n"); - return NULL; - } - } - - if (!caller_profile->context) { - caller_profile->context = "default"; - } - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Processing %s->%s@%s\n", - caller_profile->caller_id_name, caller_profile->destination_number, caller_profile->context); - - yaml_parser_initialize(&parser); - yaml_parser_set_input_file(&parser, input); - - while (!done) { - if (!yaml_parser_parse(&parser, &event)) { - print_error(&parser); - break; - } else { - switch (event.type) { - case YAML_MAPPING_START_EVENT: - depth++; - break; - case YAML_MAPPING_END_EVENT: - depth--; - break; - case YAML_STREAM_END_EVENT: - done = 1; - break; - case YAML_SCALAR_EVENT: - scalar_data = (char *) event.data.scalar.value; - switch (depth) { - case 1: - switch_set_string(category, scalar_data); - context_hit = (!strcasecmp(category, caller_profile->context)); - nv = 0; - break; - case 2: - if (context_hit) { - char *field = switch_core_session_strdup(session, scalar_data); - char *p, *e, *expression = NULL, *field_expanded = NULL, *expression_expanded = NULL; - const char *field_data = NULL; - - parens = 0; - proceed = 0; - switch_regex_safe_free(re); - - if ((p = strstr(field, "=~"))) { - *p = '\0'; - e = p - 1; - while (*e == ' ') { - *e-- = '\0'; - } - e = p + 2; - while (*e == ' ') { - *e++ = '\0'; - } - expression = e; - } - - if (field && expression) { - if ((expression_expanded = switch_channel_expand_variables(channel, expression)) == expression) { - expression_expanded = NULL; - } else { - expression = expression_expanded; - } - - if (strchr(field, '$')) { - if ((field_expanded = switch_channel_expand_variables(channel, field)) == field) { - field_expanded = NULL; - field_data = field; - } else { - field_data = field_expanded; - } - } else { - field_data = switch_caller_get_field_by_name(caller_profile, field); - } - if (!field_data) { - field_data = ""; - } - switch_safe_free(last_field); - last_field = strdup(field_data); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "test conditions %s(%s) =~ /%s/\n", field, field_data, expression); - if (!(proceed = switch_regex_perform(field_data, expression, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Regex mismatch\n"); - } - - if (strchr(expression, '(')) { - parens++; - } - - switch_safe_free(field_expanded); - switch_safe_free(expression_expanded); - } - } - break; - case 3: - if (nv == 0) { - if (!strcasecmp(scalar_data, "exit")) { - yaml_event_delete(&event); - goto end; - } - switch_set_string(name, scalar_data); - nv++; - } else { - switch_set_string(value, scalar_data); - nv = 0; - if (proceed) { - uint32_t len = 0; - char *substituted = NULL; - char *app_data; - - - if (!extension) { - extension = switch_caller_extension_new(session, "YAML", caller_profile->destination_number); - switch_assert(extension); - } - - if (parens) { - len = (uint32_t) (strlen(value) + strlen(last_field) + 10) * proceed; - switch_zmalloc(substituted, len); - switch_perform_substitution(re, proceed, value, last_field, substituted, len, ovector); - app_data = substituted; - } else { - app_data = value; - } - - switch_caller_extension_add_application(session, extension, name, app_data); - switch_safe_free(substituted); - } - } - break; - } - - break; - default: - break; - } - } - - yaml_event_delete(&event); - } - - end: - - switch_safe_free(last_field); - switch_regex_safe_free(re); - yaml_parser_delete(&parser); - - if (input) { - fclose(input); - } -#ifdef DEBUG_XML - if (xml) { - char *foo = switch_xml_toxml(xml, SWITCH_FALSE); - printf("%s\n", foo); - free(foo); - } -#endif - - return extension; - -} - -SWITCH_STANDARD_DIALPLAN(yaml_dialplan_hunt) -{ - switch_caller_extension_t *extension = NULL; - char *alt_path = (char *) arg; - char *path = NULL; - FILE *input; - - if (!zstr(alt_path)) { - path = strdup(alt_path); - } else { - path = switch_mprintf("%s/yaml/extensions.yaml", SWITCH_GLOBAL_dirs.conf_dir); - } - - if ((input = fopen(path, "r"))) { - extension = parse_dp(input, session, caller_profile); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error opening %s\n", path); - } - - switch_safe_free(path); - return extension; -} - - -static switch_status_t do_config(void) -{ - yaml_parser_t parser; - yaml_event_t event = { 0 }; - char *path; - const char *cfg = "mod_yaml.yaml"; - FILE *input; - switch_status_t status = SWITCH_STATUS_FALSE; - char *scalar_data; - int done = 0; - int depth = 0; - char name[128] = ""; - char value[128] = ""; - char category[128] = ""; - int nv = 0; - - path = switch_mprintf("%s/yaml/%s", SWITCH_GLOBAL_dirs.conf_dir, cfg); - - if (!(input = fopen(path, "r"))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error opening %s\n", path); - goto end; - } - - yaml_parser_initialize(&parser); - yaml_parser_set_input_file(&parser, input); - - while (!done) { - if (!yaml_parser_parse(&parser, &event)) { - print_error(&parser); - break; - } else { - switch (event.type) { - case YAML_MAPPING_START_EVENT: - depth++; - break; - case YAML_MAPPING_END_EVENT: - depth--; - break; - case YAML_STREAM_END_EVENT: - done = 1; - break; - case YAML_SCALAR_EVENT: - scalar_data = (char *) event.data.scalar.value; - switch (depth) { - case 1: - switch_set_string(category, scalar_data); - nv = 0; - break; - case 2: - if (nv == 0) { - switch_set_string(name, scalar_data); - nv++; - } else { - switch_set_string(value, scalar_data); - if (!strcasecmp(category, "settings")) { - if (!strcasecmp(name, "bind_config") && switch_true_buf(value)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Binding To XML Config\n"); - switch_xml_bind_search_function(yaml_fetch, switch_xml_parse_section_string("config"), NULL); - } - } - nv = 0; - } - break; - } - - break; - default: - break; - } - } - - yaml_event_delete(&event); - } - - yaml_parser_delete(&parser); - status = SWITCH_STATUS_SUCCESS; - - end: - - if (input) { - fclose(input); - } - - switch_safe_free(path); - - return status; - -} - -SWITCH_MODULE_LOAD_FUNCTION(mod_yaml_load) -{ - switch_dialplan_interface_t *dp_interface; - - /* connect my internal structure to the blank pointer passed to me */ - *module_interface = switch_loadable_module_create_module_interface(pool, modname); - - if (do_config() != SWITCH_STATUS_SUCCESS) { - return SWITCH_STATUS_TERM; - } - - SWITCH_ADD_DIALPLAN(dp_interface, "YAML", yaml_dialplan_hunt); - - /* indicate that the module should continue to be loaded */ - return SWITCH_STATUS_SUCCESS; -} - - -/* For Emacs: - * Local Variables: - * mode:c - * indent-tabs-mode:t - * tab-width:4 - * c-basic-offset:4 - * End: - * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: - */ diff --git a/src/mod/timers/mod_timerfd/mod_timerfd.c b/src/mod/timers/mod_timerfd/mod_timerfd.c index bd07be8cdd..641bfba9c5 100644 --- a/src/mod/timers/mod_timerfd/mod_timerfd.c +++ b/src/mod/timers/mod_timerfd/mod_timerfd.c @@ -31,6 +31,7 @@ */ #include +#include #include #include @@ -228,8 +229,16 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_timerfd_runtime) do { r = epoll_wait(interval_poll_fd, e, sizeof(e) / sizeof(e[0]), 1000); - if (r < 0) + if (r < 0) { + /* if we had an interrupted system call due to process pause via SIGSTOP, do not exit the timer loop */ + if (errno == EINTR) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "epoll_wait interrupted by SIGINT, continue...\n"); + continue; + } + break; + } + for (i = 0; i < r; i++) { it = e[i].data.ptr; if ((e[i].events & EPOLLIN) &&