From 0da8dfaba73c67a907567ecee5d483c0a51baec4 Mon Sep 17 00:00:00 2001 From: Leon de Rooij Date: Tue, 21 Apr 2009 14:56:58 +0200 Subject: [PATCH] freeswitch plugin: Re-added esl header files and libesl.a, also aadded -L. to Makefile.am and added error detection for sock conn errors to esl in freeswitch.c --- src/Makefile.am | 2 +- src/esl.h | 372 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/esl_config.h | 178 ++++++++++++++++++++++++ src/esl_event.h | 293 +++++++++++++++++++++++++++++++++++++++ src/esl_oop.h | 105 ++++++++++++++ src/esl_threadmutex.h | 58 ++++++++ src/freeswitch.c | 7 +- src/libesl.a | Bin 0 -> 194860 bytes 8 files changed, 1011 insertions(+), 4 deletions(-) create mode 100644 src/esl.h create mode 100644 src/esl_config.h create mode 100644 src/esl_event.h create mode 100644 src/esl_oop.h create mode 100644 src/esl_threadmutex.h create mode 100644 src/libesl.a diff --git a/src/Makefile.am b/src/Makefile.am index 71bc509a..f9189a71 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -329,7 +329,7 @@ if BUILD_PLUGIN_FREESWITCH pkglib_LTLIBRARIES += freeswitch.la freeswitch_la_SOURCES = freeswitch.c freeswitch_la_LDFLAGS = -module -avoid-version -freeswitch_la_LIBADD = -lesl +freeswitch_la_LIBADD = -lesl -L. collectd_LDADD += "-dlopen" freeswitch.la collectd_DEPENDENCIES += freeswitch.la endif diff --git a/src/esl.h b/src/esl.h new file mode 100644 index 00000000..ecca1908 --- /dev/null +++ b/src/esl.h @@ -0,0 +1,372 @@ +/* + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ESL_H_ +#define _ESL_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + +#define esl_copy_string(_x, _y, _z) strncpy(_x, _y, _z - 1) +#define esl_set_string(_x, _y) esl_copy_string(_x, _y, sizeof(_x)) + +typedef struct esl_event_header esl_event_header_t; +typedef struct esl_event esl_event_t; + + +typedef enum { + ESL_EVENT_TYPE_PLAIN, + ESL_EVENT_TYPE_XML +} esl_event_type_t; + +#ifdef WIN32 +#define ESL_SEQ_FWHITE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY +#define ESL_SEQ_FRED FOREGROUND_RED | FOREGROUND_INTENSITY +#define ESL_SEQ_FMAGEN FOREGROUND_BLUE | FOREGROUND_RED +#define ESL_SEQ_FCYAN FOREGROUND_GREEN | FOREGROUND_BLUE +#define ESL_SEQ_FGREEN FOREGROUND_GREEN +#define ESL_SEQ_FYELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY +#define ESL_SEQ_DEFAULT_COLOR ESL_SEQ_FWHITE +#else +#define ESL_SEQ_ESC "\033[" +/* Ansi Control character suffixes */ +#define ESL_SEQ_HOME_CHAR 'H' +#define ESL_SEQ_HOME_CHAR_STR "H" +#define ESL_SEQ_CLEARLINE_CHAR '1' +#define ESL_SEQ_CLEARLINE_CHAR_STR "1" +#define ESL_SEQ_CLEARLINEEND_CHAR "K" +#define ESL_SEQ_CLEARSCR_CHAR0 '2' +#define ESL_SEQ_CLEARSCR_CHAR1 'J' +#define ESL_SEQ_CLEARSCR_CHAR "2J" +#define ESL_SEQ_DEFAULT_COLOR ESL_SEQ_ESC ESL_SEQ_END_COLOR /* Reset to Default fg/bg color */ +#define ESL_SEQ_AND_COLOR ";" /* To add multiple color definitions */ +#define ESL_SEQ_END_COLOR "m" /* To end color definitions */ +/* Foreground colors values */ +#define ESL_SEQ_F_BLACK "30" +#define ESL_SEQ_F_RED "31" +#define ESL_SEQ_F_GREEN "32" +#define ESL_SEQ_F_YELLOW "33" +#define ESL_SEQ_F_BLUE "34" +#define ESL_SEQ_F_MAGEN "35" +#define ESL_SEQ_F_CYAN "36" +#define ESL_SEQ_F_WHITE "37" +/* Background colors values */ +#define ESL_SEQ_B_BLACK "40" +#define ESL_SEQ_B_RED "41" +#define ESL_SEQ_B_GREEN "42" +#define ESL_SEQ_B_YELLOW "43" +#define ESL_SEQ_B_BLUE "44" +#define ESL_SEQ_B_MAGEN "45" +#define ESL_SEQ_B_CYAN "46" +#define ESL_SEQ_B_WHITE "47" +/* Preset escape sequences - Change foreground colors only */ +#define ESL_SEQ_FBLACK ESL_SEQ_ESC ESL_SEQ_F_BLACK ESL_SEQ_END_COLOR +#define ESL_SEQ_FRED ESL_SEQ_ESC ESL_SEQ_F_RED ESL_SEQ_END_COLOR +#define ESL_SEQ_FGREEN ESL_SEQ_ESC ESL_SEQ_F_GREEN ESL_SEQ_END_COLOR +#define ESL_SEQ_FYELLOW ESL_SEQ_ESC ESL_SEQ_F_YELLOW ESL_SEQ_END_COLOR +#define ESL_SEQ_FBLUE ESL_SEQ_ESC ESL_SEQ_F_BLUE ESL_SEQ_END_COLOR +#define ESL_SEQ_FMAGEN ESL_SEQ_ESC ESL_SEQ_F_MAGEN ESL_SEQ_END_COLOR +#define ESL_SEQ_FCYAN ESL_SEQ_ESC ESL_SEQ_F_CYAN ESL_SEQ_END_COLOR +#define ESL_SEQ_FWHITE ESL_SEQ_ESC ESL_SEQ_F_WHITE ESL_SEQ_END_COLOR +#define ESL_SEQ_BBLACK ESL_SEQ_ESC ESL_SEQ_B_BLACK ESL_SEQ_END_COLOR +#define ESL_SEQ_BRED ESL_SEQ_ESC ESL_SEQ_B_RED ESL_SEQ_END_COLOR +#define ESL_SEQ_BGREEN ESL_SEQ_ESC ESL_SEQ_B_GREEN ESL_SEQ_END_COLOR +#define ESL_SEQ_BYELLOW ESL_SEQ_ESC ESL_SEQ_B_YELLOW ESL_SEQ_END_COLOR +#define ESL_SEQ_BBLUE ESL_SEQ_ESC ESL_SEQ_B_BLUE ESL_SEQ_END_COLOR +#define ESL_SEQ_BMAGEN ESL_SEQ_ESC ESL_SEQ_B_MAGEN ESL_SEQ_END_COLOR +#define ESL_SEQ_BCYAN ESL_SEQ_ESC ESL_SEQ_B_CYAN ESL_SEQ_END_COLOR +#define ESL_SEQ_BWHITE ESL_SEQ_ESC ESL_SEQ_B_WHITE ESL_SEQ_END_COLOR +/* Preset escape sequences */ +#define ESL_SEQ_HOME ESL_SEQ_ESC ESL_SEQ_HOME_CHAR_STR +#define ESL_SEQ_CLEARLINE ESL_SEQ_ESC ESL_SEQ_CLEARLINE_CHAR_STR +#define ESL_SEQ_CLEARLINEEND ESL_SEQ_ESC ESL_SEQ_CLEARLINEEND_CHAR +#define ESL_SEQ_CLEARSCR ESL_SEQ_ESC ESL_SEQ_CLEARSCR_CHAR ESL_SEQ_HOME +#endif + +#if !defined(_XOPEN_SOURCE) && !defined(__FreeBSD__) && !defined(__NetBSD__) +#define _XOPEN_SOURCE 600 +#endif + +#ifndef HAVE_STRINGS_H +#define HAVE_STRINGS_H 1 +#endif +#ifndef HAVE_SYS_SOCKET_H +#define HAVE_SYS_SOCKET_H 1 +#endif + +#ifndef __WINDOWS__ +#if defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32) +#define __WINDOWS__ +#endif +#endif + +#ifdef _MSC_VER +#ifndef __inline__ +#define __inline__ __inline +#endif +#if (_MSC_VER >= 1400) /* VC8+ */ +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE +#endif +#endif +#ifndef strcasecmp +#define strcasecmp(s1, s2) _stricmp(s1, s2) +#endif +#ifndef strncasecmp +#define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n) +#endif +#ifndef snprintf +#define snprintf _snprintf +#endif +#ifndef S_IRUSR +#define S_IRUSR _S_IREAD +#endif +#ifndef S_IWUSR +#define S_IWUSR _S_IWRITE +#endif +#undef HAVE_STRINGS_H +#undef HAVE_SYS_SOCKET_H +#endif + +#include +#ifndef WIN32 +#include +#endif + +#include +#include +#include +#include +#ifndef WIN32 +#include +#include +#include +#include +#endif + +#ifdef HAVE_STRINGS_H +#include +#endif +#include + +#if (_MSC_VER >= 1400) // VC8+ +#define esl_assert(expr) assert(expr);__analysis_assume( expr ) +#endif + +#ifndef esl_assert +#define esl_assert(_x) assert(_x) +#endif + +#define esl_safe_free(_x) if (_x) free(_x); _x = NULL +#define esl_strlen_zero(s) (!s || *(s) == '\0') +#define esl_strlen_zero_buf(s) (*(s) == '\0') + +#ifdef WIN32 +#include +#include +typedef SOCKET esl_socket_t; +typedef unsigned __int64 uint64_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int8 uint8_t; +typedef __int64 int64_t; +typedef __int32 int32_t; +typedef __int16 int16_t; +typedef __int8 int8_t; +typedef intptr_t esl_ssize_t; +typedef int esl_filehandle_t; +#define ESL_SOCK_INVALID INVALID_SOCKET +#define strerror_r(num, buf, size) strerror_s(buf, size, num) +#if defined(ESL_DECLARE_STATIC) +#define ESL_DECLARE(type) type __stdcall +#define ESL_DECLARE_NONSTD(type) type __cdecl +#define ESL_DECLARE_DATA +#elif defined(ESL_EXPORTS) +#define ESL_DECLARE(type) __declspec(dllexport) type __stdcall +#define ESL_DECLARE_NONSTD(type) __declspec(dllexport) type __cdecl +#define ESL_DECLARE_DATA __declspec(dllexport) +#else +#define ESL_DECLARE(type) __declspec(dllimport) type __stdcall +#define ESL_DECLARE_NONSTD(type) __declspec(dllimport) type __cdecl +#define ESL_DECLARE_DATA __declspec(dllimport) +#endif +#else +#define ESL_DECLARE(type) type +#define ESL_DECLARE_NONSTD(type) type +#define ESL_DECLARE_DATA +#include +#include +#include +#include +#include +#include +#include +#define ESL_SOCK_INVALID -1 +typedef int esl_socket_t; +typedef ssize_t esl_ssize_t; +typedef int esl_filehandle_t; +#endif + +typedef int16_t esl_port_t; + +typedef enum { + ESL_SUCCESS, + ESL_FAIL, + ESL_BREAK, + ESL_DISCONNECTED +} esl_status_t; + +#include + +typedef struct { + struct sockaddr_in sockaddr; + struct hostent hostent; + char hostbuf[256]; + esl_socket_t sock; + char err[256]; + int errnum; + char header_buf[4196]; + char last_reply[1024]; + char last_sr_reply[1024]; + esl_event_t *last_event; + esl_event_t *last_sr_event; + esl_event_t *race_event; + esl_event_t *last_ievent; + esl_event_t *info_event; + int connected; + struct sockaddr_in addr; + esl_mutex_t *mutex; + int async_execute; + int event_lock; +} esl_handle_t; + +typedef enum { + ESL_TRUE = 1, + ESL_FALSE = 0 +} esl_bool_t; + +#ifndef __FUNCTION__ +#define __FUNCTION__ (const char *)__func__ +#endif + +#define ESL_PRE __FILE__, __FUNCTION__, __LINE__ +#define ESL_LOG_LEVEL_DEBUG 7 +#define ESL_LOG_LEVEL_INFO 6 +#define ESL_LOG_LEVEL_NOTICE 5 +#define ESL_LOG_LEVEL_WARNING 4 +#define ESL_LOG_LEVEL_ERROR 3 +#define ESL_LOG_LEVEL_CRIT 2 +#define ESL_LOG_LEVEL_ALERT 1 +#define ESL_LOG_LEVEL_EMERG 0 + +#define ESL_LOG_DEBUG ESL_PRE, ESL_LOG_LEVEL_DEBUG +#define ESL_LOG_INFO ESL_PRE, ESL_LOG_LEVEL_INFO +#define ESL_LOG_NOTICE ESL_PRE, ESL_LOG_LEVEL_NOTICE +#define ESL_LOG_WARNING ESL_PRE, ESL_LOG_LEVEL_WARNING +#define ESL_LOG_ERROR ESL_PRE, ESL_LOG_LEVEL_ERROR +#define ESL_LOG_CRIT ESL_PRE, ESL_LOG_LEVEL_CRIT +#define ESL_LOG_ALERT ESL_PRE, ESL_LOG_LEVEL_ALERT +#define ESL_LOG_EMERG ESL_PRE, ESL_LOG_LEVEL_EMERG +typedef void (*esl_logger_t)(const char *file, const char *func, int line, int level, const char *fmt, ...); + + +ESL_DECLARE(int) esl_vasprintf(char **ret, const char *fmt, va_list ap); + +ESL_DECLARE_DATA extern esl_logger_t esl_log; + +ESL_DECLARE(void) esl_global_set_logger(esl_logger_t logger); +ESL_DECLARE(void) esl_global_set_default_logger(int level); + +#include "esl_event.h" +#include "esl_threadmutex.h" +#include "esl_config.h" + +ESL_DECLARE(size_t) esl_url_encode(const char *url, char *buf, size_t len); +ESL_DECLARE(char *)esl_url_decode(char *s); +ESL_DECLARE(const char *)esl_stristr(const char *instr, const char *str); +ESL_DECLARE(int) esl_toupper(int c); +ESL_DECLARE(int) esl_tolower(int c); +ESL_DECLARE(int) esl_snprintf(char *buffer, size_t count, const char *fmt, ...); + + +typedef void (*esl_listen_callback_t)(esl_socket_t server_sock, esl_socket_t client_sock, struct sockaddr_in *addr); + +ESL_DECLARE(esl_status_t) esl_attach_handle(esl_handle_t *handle, esl_socket_t socket, struct sockaddr_in *addr); +ESL_DECLARE(esl_status_t) esl_listen(const char *host, esl_port_t port, esl_listen_callback_t callback); +ESL_DECLARE(esl_status_t) esl_execute(esl_handle_t *handle, const char *app, const char *arg, const char *uuid); +ESL_DECLARE(esl_status_t) esl_sendevent(esl_handle_t *handle, esl_event_t *event); + +ESL_DECLARE(esl_status_t) esl_connect(esl_handle_t *handle, const char *host, esl_port_t port, const char *password); +ESL_DECLARE(esl_status_t) esl_disconnect(esl_handle_t *handle); +ESL_DECLARE(esl_status_t) esl_send(esl_handle_t *handle, const char *cmd); +ESL_DECLARE(esl_status_t) esl_recv_event(esl_handle_t *handle, int check_q, esl_event_t **save_event); +ESL_DECLARE(esl_status_t) esl_recv_event_timed(esl_handle_t *handle, uint32_t ms, int check_q, esl_event_t **save_event); +ESL_DECLARE(esl_status_t) esl_send_recv(esl_handle_t *handle, const char *cmd); +ESL_DECLARE(esl_status_t) esl_filter(esl_handle_t *handle, const char *header, const char *value); +ESL_DECLARE(esl_status_t) esl_events(esl_handle_t *handle, esl_event_type_t etype, const char *value); + +#define esl_recv(_h) esl_recv_event(_h, 0, NULL) +#define esl_recv_timed(_h, _ms) esl_recv_event_timed(_h, _ms, 0, NULL) + +static __inline__ int esl_safe_strcasecmp(const char *s1, const char *s2) +{ + if (!(s1 && s2)) { + return 1; + } + + return strcasecmp(s1, s2); +} + +#ifdef __cplusplus +} +#endif /* defined(__cplusplus) */ + + +#endif /* defined(_ESL_H_) */ + +/* 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 expandtab: + */ diff --git a/src/esl_config.h b/src/esl_config.h new file mode 100644 index 00000000..6763cdb7 --- /dev/null +++ b/src/esl_config.h @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @defgroup config Config File Parser + * @ingroup config + * This module implements a basic interface and file format parser + * + *
+ *
+ * EXAMPLE 
+ * 
+ * [category1]
+ * var1 => val1
+ * var2 => val2
+ * \# lines that begin with \# are comments
+ * \#var3 => val3
+ * 
+ * @{ + */ + +#ifndef ESL_CONFIG_H +#define ESL_CONFIG_H + +#include "esl.h" + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + + +#define ESL_URL_SEPARATOR "://" + + +#ifdef WIN32 +#define ESL_PATH_SEPARATOR "\\" +#ifndef ESL_CONFIG_DIR +#define ESL_CONFIG_DIR "c:\\openesl" +#endif +#define esl_is_file_path(file) (*(file +1) == ':' || *file == '/' || strstr(file, SWITCH_URL_SEPARATOR)) +#else +#define ESL_PATH_SEPARATOR "/" +#ifndef ESL_CONFIG_DIR +#define ESL_CONFIG_DIR "/etc/openesl" +#endif +#define esl_is_file_path(file) ((*file == '/') || strstr(file, SWITCH_URL_SEPARATOR)) +#endif + +/*! + \brief Evaluate the truthfullness of a string expression + \param expr a string expression + \return true or false +*/ +#define esl_true(expr)\ +(expr && ( !strcasecmp(expr, "yes") ||\ +!strcasecmp(expr, "on") ||\ +!strcasecmp(expr, "true") ||\ +!strcasecmp(expr, "enabled") ||\ +!strcasecmp(expr, "active") ||\ +!strcasecmp(expr, "allow") ||\ +atoi(expr))) ? 1 : 0 + +/*! + \brief Evaluate the falsefullness of a string expression + \param expr a string expression + \return true or false +*/ +#define esl_false(expr)\ +(expr && ( !strcasecmp(expr, "no") ||\ +!strcasecmp(expr, "off") ||\ +!strcasecmp(expr, "false") ||\ +!strcasecmp(expr, "disabled") ||\ +!strcasecmp(expr, "inactive") ||\ +!strcasecmp(expr, "disallow") ||\ +!atoi(expr))) ? 1 : 0 + +typedef struct esl_config esl_config_t; + +/*! \brief A simple file handle representing an open configuration file **/ +struct esl_config { + /*! FILE stream buffer to the opened file */ + FILE *file; + /*! path to the file */ + char path[512]; + /*! current category */ + char category[256]; + /*! current section */ + char section[256]; + /*! buffer of current line being read */ + char buf[1024]; + /*! current line number in file */ + int lineno; + /*! current category number in file */ + int catno; + /*! current section number in file */ + int sectno; + + int lockto; +}; + +/*! + \brief Open a configuration file + \param cfg (esl_config_t *) config handle to use + \param file_path path to the file + \return 1 (true) on success 0 (false) on failure +*/ +ESL_DECLARE(int) esl_config_open_file(esl_config_t * cfg, const char *file_path); + +/*! + \brief Close a previously opened configuration file + \param cfg (esl_config_t *) config handle to use +*/ +ESL_DECLARE(void) esl_config_close_file(esl_config_t * cfg); + +/*! + \brief Retrieve next name/value pair from configuration file + \param cfg (esl_config_t *) config handle to use + \param var pointer to aim at the new variable name + \param val pointer to aim at the new value +*/ +ESL_DECLARE(int) esl_config_next_pair(esl_config_t * cfg, char **var, char **val); + +/*! + \brief Retrieve the CAS bits from a configuration string value + \param strvalue pointer to the configuration string value (expected to be in format whatever:xxxx) + \param outbits pointer to aim at the CAS bits +*/ +ESL_DECLARE(int) esl_config_get_cas_bits(char *strvalue, unsigned char *outbits); + + +/** @} */ + +#ifdef __cplusplus +} +#endif /* defined(__cplusplus) */ + +#endif /* defined(ESL_CONFIG_H) */ + +/* 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 expandtab: + */ diff --git a/src/esl_event.h b/src/esl_event.h new file mode 100644 index 00000000..d9e7a3e4 --- /dev/null +++ b/src/esl_event.h @@ -0,0 +1,293 @@ +/* + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ESL_EVENT_H +#define ESL_EVENT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + +typedef enum { + ESL_STACK_BOTTOM, + ESL_STACK_TOP +} esl_stack_t; + +typedef enum { + ESL_EVENT_CUSTOM, + ESL_EVENT_CLONE, + ESL_EVENT_CHANNEL_CREATE, + ESL_EVENT_CHANNEL_DESTROY, + ESL_EVENT_CHANNEL_STATE, + ESL_EVENT_CHANNEL_ANSWER, + ESL_EVENT_CHANNEL_HANGUP, + ESL_EVENT_CHANNEL_EXECUTE, + ESL_EVENT_CHANNEL_EXECUTE_COMPLETE, + ESL_EVENT_CHANNEL_BRIDGE, + ESL_EVENT_CHANNEL_UNBRIDGE, + ESL_EVENT_CHANNEL_PROGRESS, + ESL_EVENT_CHANNEL_PROGRESS_MEDIA, + ESL_EVENT_CHANNEL_OUTGOING, + ESL_EVENT_CHANNEL_PARK, + ESL_EVENT_CHANNEL_UNPARK, + ESL_EVENT_CHANNEL_APPLICATION, + ESL_EVENT_CHANNEL_ORIGINATE, + ESL_EVENT_CHANNEL_UUID, + ESL_EVENT_API, + ESL_EVENT_LOG, + ESL_EVENT_INBOUND_CHAN, + ESL_EVENT_OUTBOUND_CHAN, + ESL_EVENT_STARTUP, + ESL_EVENT_SHUTDOWN, + ESL_EVENT_PUBLISH, + ESL_EVENT_UNPUBLISH, + ESL_EVENT_TALK, + ESL_EVENT_NOTALK, + ESL_EVENT_SESSION_CRASH, + ESL_EVENT_MODULE_LOAD, + ESL_EVENT_MODULE_UNLOAD, + ESL_EVENT_DTMF, + ESL_EVENT_MESSAGE, + ESL_EVENT_PRESENCE_IN, + ESL_EVENT_NOTIFY_IN, + ESL_EVENT_PRESENCE_OUT, + ESL_EVENT_PRESENCE_PROBE, + ESL_EVENT_MESSAGE_WAITING, + ESL_EVENT_MESSAGE_QUERY, + ESL_EVENT_ROSTER, + ESL_EVENT_CODEC, + ESL_EVENT_BACKGROUND_JOB, + ESL_EVENT_DETECTED_SPEECH, + ESL_EVENT_DETECTED_TONE, + ESL_EVENT_PRIVATE_COMMAND, + ESL_EVENT_HEARTBEAT, + ESL_EVENT_TRAP, + ESL_EVENT_ADD_SCHEDULE, + ESL_EVENT_DEL_SCHEDULE, + ESL_EVENT_EXE_SCHEDULE, + ESL_EVENT_RE_SCHEDULE, + ESL_EVENT_RELOADXML, + ESL_EVENT_NOTIFY, + ESL_EVENT_SEND_MESSAGE, + ESL_EVENT_RECV_MESSAGE, + ESL_EVENT_REQUEST_PARAMS, + ESL_EVENT_CHANNEL_DATA, + ESL_EVENT_GENERAL, + ESL_EVENT_COMMAND, + ESL_EVENT_SESSION_HEARTBEAT, + ESL_EVENT_CLIENT_DISCONNECTED, + ESL_EVENT_SERVER_DISCONNECTED, + ESL_EVENT_ALL +} esl_event_types_t; + +typedef enum { + ESL_PRIORITY_NORMAL, + ESL_PRIORITY_LOW, + ESL_PRIORITY_HIGH +} esl_priority_t; + +/*! \brief An event Header */ + struct esl_event_header { + /*! the header name */ + char *name; + /*! the header value */ + char *value; + /*! hash of the header name */ + unsigned long hash; + struct esl_event_header *next; +}; + + +/*! \brief Representation of an event */ +struct esl_event { + /*! the event id (descriptor) */ + esl_event_types_t event_id; + /*! the priority of the event */ + esl_priority_t priority; + /*! the owner of the event */ + char *owner; + /*! the subclass of the event */ + char *subclass_name; + /*! the event headers */ + esl_event_header_t *headers; + /*! the event headers tail pointer */ + esl_event_header_t *last_header; + /*! the body of the event */ + char *body; + /*! user data from the subclass provider */ + void *bind_user_data; + /*! user data from the event sender */ + void *event_user_data; + /*! unique key */ + unsigned long key; + struct esl_event *next; +}; + + + +#define ESL_EVENT_SUBCLASS_ANY NULL + +/*! + \brief Create an event + \param event a NULL pointer on which to create the event + \param event_id the event id enumeration of the desired event + \param subclass_name the subclass name for custom event (only valid when event_id is ESL_EVENT_CUSTOM) + \return ESL_STATUS_SUCCESS on success +*/ +ESL_DECLARE(esl_status_t) esl_event_create_subclass(esl_event_t **event, esl_event_types_t event_id, const char *subclass_name); + +/*! + \brief Set the priority of an event + \param event the event to set the priority on + \param priority the event priority + \return ESL_STATUS_SUCCESS +*/ +ESL_DECLARE(esl_status_t) esl_event_set_priority(esl_event_t *event, esl_priority_t priority); + +/*! + \brief Retrieve a header value from an event + \param event the event to read the header from + \param header_name the name of the header to read + \return the value of the requested header +*/ +ESL_DECLARE(char *)esl_event_get_header(esl_event_t *event, const char *header_name); + +/*! + \brief Retrieve the body value from an event + \param event the event to read the body from + \return the value of the body or NULL +*/ +ESL_DECLARE(char *)esl_event_get_body(esl_event_t *event); + +/*! + \brief Add a header to an event + \param event the event to add the header to + \param stack the stack sense (stack it on the top or on the bottom) + \param header_name the name of the header to add + \param fmt the value of the header (varargs see standard sprintf family) + \return ESL_STATUS_SUCCESS if the header was added +*/ +ESL_DECLARE(esl_status_t) esl_event_add_header(esl_event_t *event, esl_stack_t stack, + const char *header_name, const char *fmt, ...); //PRINTF_FUNCTION(4, 5); + +/*! + \brief Add a string header to an event + \param event the event to add the header to + \param stack the stack sense (stack it on the top or on the bottom) + \param header_name the name of the header to add + \param data the value of the header + \return ESL_STATUS_SUCCESS if the header was added +*/ +ESL_DECLARE(esl_status_t) esl_event_add_header_string(esl_event_t *event, esl_stack_t stack, const char *header_name, const char *data); + +ESL_DECLARE(esl_status_t) esl_event_del_header(esl_event_t *event, const char *header_name); + +/*! + \brief Destroy an event + \param event pointer to the pointer to event to destroy +*/ +ESL_DECLARE(void) esl_event_destroy(esl_event_t **event); +#define esl_event_safe_destroy(_event) if (_event) esl_event_destroy(_event) + +/*! + \brief Duplicate an event + \param event a NULL pointer on which to duplicate the event + \param todup an event to duplicate + \return ESL_STATUS_SUCCESS if the event was duplicated +*/ +ESL_DECLARE(esl_status_t) esl_event_dup(esl_event_t **event, esl_event_t *todup); + +/*! + \brief Render the name of an event id enumeration + \param event the event id to render the name of + \return the rendered name +*/ +ESL_DECLARE(const char *)esl_event_name(esl_event_types_t event); + +/*! + \brief return the event id that matches a given event name + \param name the name of the event + \param type the event id to return + \return ESL_STATUS_SUCCESS if there was a match +*/ +ESL_DECLARE(esl_status_t) esl_name_event(const char *name, esl_event_types_t *type); + +/*! + \brief Render a string representation of an event sutable for printing or network transport + \param event the event to render + \param str a string pointer to point at the allocated data + \param encode url encode the headers + \return ESL_STATUS_SUCCESS if the operation was successful + \note you must free the resulting string when you are finished with it +*/ +ESL_DECLARE(esl_status_t) esl_event_serialize(esl_event_t *event, char **str, esl_bool_t encode); + +/*! + \brief Add a body to an event + \param event the event to add to body to + \param fmt optional body of the event (varargs see standard sprintf family) + \return ESL_STATUS_SUCCESS if the body was added to the event + \note the body parameter can be shadowed by the esl_event_reserve_subclass_detailed function +*/ +ESL_DECLARE(esl_status_t) esl_event_add_body(esl_event_t *event, const char *fmt, ...); + +/*! + \brief Create a new event assuming it will not be custom event and therefore hiding the unused parameters + \param event a NULL pointer on which to create the event + \param id the event id enumeration of the desired event + \return ESL_STATUS_SUCCESS on success +*/ +#define esl_event_create(event, id) esl_event_create_subclass(event, id, ESL_EVENT_SUBCLASS_ANY) + +ESL_DECLARE(const char *)esl_priority_name(esl_priority_t priority); + +///\} + +#ifdef __cplusplus +} +#endif /* defined(__cplusplus) */ + +#endif /* defined(ESL_EVENT_H) */ + +/* 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: + */ diff --git a/src/esl_oop.h b/src/esl_oop.h new file mode 100644 index 00000000..840b0ef9 --- /dev/null +++ b/src/esl_oop.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the original author; nor the names of any contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ESL_OOP_H_ +#define _ESL_OOP_H_ +#include +#ifdef __cplusplus +extern "C" { +#endif + +#define this_check(x) do { if (!this) { esl_log(ESL_LOG_ERROR, "object is not initalized\n"); return x;}} while(0) +#define this_check_void() do { if (!this) { esl_log(ESL_LOG_ERROR, "object is not initalized\n"); return;}} while(0) + + +class ESLevent { + private: + esl_event_header_t *hp; + public: + esl_event_t *event; + char *serialized_string; + int mine; + + ESLevent(const char *type, const char *subclass_name = NULL); + ESLevent(esl_event_t *wrap_me, int free_me = 0); + ESLevent(ESLevent *me); + virtual ~ESLevent(); + const char *serialize(const char *format = NULL); + bool setPriority(esl_priority_t priority = ESL_PRIORITY_NORMAL); + const char *getHeader(const char *header_name); + char *getBody(void); + const char *getType(void); + bool addBody(const char *value); + bool addHeader(const char *header_name, const char *value); + bool delHeader(const char *header_name); + const char *firstHeader(void); + const char *nextHeader(void); +}; + + + +class ESLconnection { + private: + esl_handle_t handle; + ESLevent *last_event_obj; + public: + ESLconnection(const char *host, const char *port, const char *password); + ESLconnection(int socket); + virtual ~ESLconnection(); + int connected(); + ESLevent *getInfo(); + int send(const char *cmd); + ESLevent *sendRecv(const char *cmd); + ESLevent *api(const char *cmd, const char *arg = NULL); + ESLevent *bgapi(const char *cmd, const char *arg = NULL); + int sendEvent(ESLevent *send_me); + ESLevent *recvEvent(); + ESLevent *recvEventTimed(int ms); + ESLevent *filter(const char *header, const char *value); + int events(const char *etype, const char *value); + int execute(const char *app, const char *arg = NULL, const char *uuid = NULL); + int executeAsync(const char *app, const char *arg = NULL, const char *uuid = NULL); + int setAsyncExecute(const char *val); + int setEventLock(const char *val); + int disconnect(void); +}; + +void eslSetLogLevel(int level); + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/esl_threadmutex.h b/src/esl_threadmutex.h new file mode 100644 index 00000000..e8373ef0 --- /dev/null +++ b/src/esl_threadmutex.h @@ -0,0 +1,58 @@ +/* + * Cross Platform Thread/Mutex abstraction + * Copyright(C) 2007 Michael Jerris + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so. + * + * This work is provided under this license on an "as is" basis, without warranty of any kind, + * either expressed or implied, including, without limitation, warranties that the covered code + * is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire + * risk as to the quality and performance of the covered code is with you. Should any covered + * code prove defective in any respect, you (not the initial developer or any other contributor) + * assume the cost of any necessary servicing, repair or correction. This disclaimer of warranty + * constitutes an essential part of this license. No use of any covered code is authorized hereunder + * except under this disclaimer. + * + */ + + +#ifndef _ESL_THREADMUTEX_H +#define _ESL_THREADMUTEX_H + +#include "esl.h" + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + +typedef struct esl_mutex esl_mutex_t; +typedef struct esl_thread esl_thread_t; +typedef void *(*esl_thread_function_t) (esl_thread_t *, void *); + +ESL_DECLARE(esl_status_t) esl_thread_create_detached(esl_thread_function_t func, void *data); +esl_status_t esl_thread_create_detached_ex(esl_thread_function_t func, void *data, size_t stack_size); +void esl_thread_override_default_stacksize(size_t size); +ESL_DECLARE(esl_status_t) esl_mutex_create(esl_mutex_t **mutex); +ESL_DECLARE(esl_status_t) esl_mutex_destroy(esl_mutex_t **mutex); +ESL_DECLARE(esl_status_t) esl_mutex_lock(esl_mutex_t *mutex); +ESL_DECLARE(esl_status_t) esl_mutex_trylock(esl_mutex_t *mutex); +ESL_DECLARE(esl_status_t) esl_mutex_unlock(esl_mutex_t *mutex); + +#ifdef __cplusplus +} +#endif /* defined(__cplusplus) */ + +#endif /* defined(_ESL_THREADMUTEX_H) */ + +/* 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 expandtab: + */ diff --git a/src/freeswitch.c b/src/freeswitch.c index 87811614..aa5595ae 100644 --- a/src/freeswitch.c +++ b/src/freeswitch.c @@ -88,7 +88,10 @@ static int freeswitch_read (void) password = FREESWITCH_DEF_PASSWORD; esl_handle_t handle = {{0}}; - esl_connect(&handle, host, atoi(port), password); + if (esl_connect(&handle, host, atoi(port), password)) { + DEBUG ("Error connecting to FreeSWITCH ESL interface [%s]\n", handle.err); + return -1; + } esl_send_recv(&handle, "api show channels\n\n"); @@ -96,8 +99,6 @@ static int freeswitch_read (void) esl_disconnect(&handle); -DEBUG ("XFreeSWITCH SUBMIT: res-public fs_channels 3 5"); - freeswitch_submit ("res-public", "fs_channels", 3, 5); return (0); diff --git a/src/libesl.a b/src/libesl.a new file mode 100644 index 0000000000000000000000000000000000000000..d4c84bf347f85203b00421cda0e8da43cbc972da GIT binary patch literal 194860 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�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