| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- diff --git a/Makefile.am b/Makefile.am
- index 258de5e..a61bc57 100644
- --- a/Makefile.am
- +++ b/Makefile.am
- @@ -5,7 +5,7 @@ rtpproxy_SOURCES=main.c rtp.h rtp_server.c rtp_server.h \
- rtpp_command.c rtpp_command.h rtpp_log.c rtpp_network.h rtpp_network.c \
- rtpp_syslog_async.c rtpp_syslog_async.h rtpp_notify.c rtpp_notify.h \
- rtpp_command_async.h rtpp_command_async.c
- -rtpproxy_LDADD=-lm -lpthread
- +rtpproxy_LDADD=-lm -lpthread @LIBS_XMLRPC@
- dist_man_MANS=rtpproxy.8
- makeann_SOURCES=makeann.c rtp.h g711.h
- makeann_LDADD=@LIBS_G729@ @LIBS_GSM@
- diff --git a/Makefile.in b/Makefile.in
- index 47c14fd..cdb5e43 100644
- --- a/Makefile.in
- +++ b/Makefile.in
- @@ -217,7 +217,7 @@ rtpproxy_SOURCES = main.c rtp.h rtp_server.c rtp_server.h \
- rtpp_syslog_async.c rtpp_syslog_async.h rtpp_notify.c rtpp_notify.h \
- rtpp_command_async.h rtpp_command_async.c
-
- -rtpproxy_LDADD = -lm -lpthread
- +rtpproxy_LDADD = -lm -lpthread @LIBS_XMLRPC@
- dist_man_MANS = rtpproxy.8
- makeann_SOURCES = makeann.c rtp.h g711.h
- makeann_LDADD = @LIBS_G729@ @LIBS_GSM@
- diff --git a/aclocal.m4 b/aclocal.m4
- index b36bc80..0970c41 100644
- --- a/aclocal.m4
- +++ b/aclocal.m4
- @@ -13,8 +13,8 @@
-
- m4_ifndef([AC_AUTOCONF_VERSION],
- [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
- -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
- -[m4_warning([this file was generated for autoconf 2.68.
- +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],,
- +[m4_warning([this file was generated for autoconf 2.67.
- You have another version of autoconf. It may work, but is not guaranteed to.
- If you have problems, you may need to regenerate the build system entirely.
- To do so, use the procedure documented by the package, typically `autoreconf'.])])
- diff --git a/config.h.in b/config.h.in
- index cd0c23a..87491e3 100644
- --- a/config.h.in
- +++ b/config.h.in
- @@ -14,6 +14,9 @@
- /* Define if you have libgsm library installed */
- #undef ENABLE_GSM
-
- +/* Define if you have xmlrpc library installed */
- +#undef ENABLE_XMLRPC
- +
- /* Define to 1 if you have `alloca', as a function or macro. */
- #undef HAVE_ALLOCA
-
- diff --git a/configure.ac b/configure.ac
- index 54c1a60..1c88b99 100644
- --- a/configure.ac
- +++ b/configure.ac
- @@ -53,6 +53,17 @@ then
- AC_DEFINE([ENABLE_G729], 1, [Define if you have libg729 library installed])
- )
- fi
- +
- +# XML-RPC-Libs:
- +AC_CHECK_HEADERS(xmlrpc_client.h xmlrpc.h, found_xmlrpc=yes)
- +if test "$found_xmlrpc" = yes
- +then
- + AC_CHECK_LIB(curl, curl_version,
- + LIBS_XMLRPC="-lcurl -lxmlrpc_client -lxmlrpc -lxmlrpc_util -lxmlrpc_xmlparse -lxmlrpc_xmltok"
- + AC_DEFINE([ENABLE_XMLRPC], 1, [Define if you have XML-RPC-Client library installed])
- + )
- +fi
- +
- ##if test -z "$G729_SUPPORT"
- ##then
- ## echo "*************************************************************************** $ECHO_C" 1>&6
- @@ -94,4 +105,5 @@ AC_CONFIG_FILES([Makefile])
- AC_SUBST(AM_CFLAGS)
- AC_SUBST(LIBS_GSM)
- AC_SUBST(LIBS_G729)
- +AC_SUBST(LIBS_XMLRPC)
- AC_OUTPUT
- diff --git a/rtpp_command.c b/rtpp_command.c
- index c5734ae..d6072de 100644
- --- a/rtpp_command.c
- +++ b/rtpp_command.c
- @@ -69,6 +69,9 @@ struct proto_cap proto_caps[] = {
- { "20081102", "Support for setting codecs in the update/lookup command" },
- { "20081224", "Support for session timeout notifications" },
- { "20090810", "Support for automatic bridging" },
- +#ifdef ENABLE_XMLRPC
- + { "20100819", "Support for timeout notifications using XML-RPC towards Kamailio/sip-router.org" },
- +#endif
- { NULL, NULL }
- };
-
- @@ -269,6 +272,7 @@ handle_command(struct cfg *cf, int controlfd, double dtime)
- char *socket_name_u, *notify_tag;
- struct sockaddr *local_addr;
- char c;
- + struct rtpp_timeout_handler * my_timeout_h;
-
- requested_nsamples = -1;
- ia[0] = ia[1] = NULL;
- @@ -468,7 +472,7 @@ handle_command(struct cfg *cf, int controlfd, double dtime)
- }
- call_id = argv[1];
- if (op == UPDATE || op == LOOKUP || op == PLAY) {
- - max_argc = (op == UPDATE ? 8 : 6);
- + max_argc = (op == PLAY ? 6 : 8);
- if (argc < 5 || argc > max_argc) {
- rtpp_log_write(RTPP_LOG_ERR, cf->stable.glog, "command syntax error");
- reply_error(&cf->stable, controlfd, &raddr, rlen, cookie, 4);
- @@ -478,7 +482,7 @@ handle_command(struct cfg *cf, int controlfd, double dtime)
- to_tag = argv[5];
- if (op == PLAY && argv[0][1] != '\0')
- playcount = atoi(argv[0] + 1);
- - if (op == UPDATE && argc > 6) {
- + if (op != PLAY && argc > 6) {
- socket_name_u = argv[6];
- if (strncmp("unix:", socket_name_u, 5) == 0)
- socket_name_u += 5;
- @@ -965,25 +969,39 @@ handle_command(struct cfg *cf, int controlfd, double dtime)
- }
-
- pthread_mutex_lock(&cf->glock);
- - if (op == UPDATE) {
- - if (cf->timeout_handler->socket_name == NULL && socket_name_u != NULL)
- - rtpp_log_write(RTPP_LOG_ERR, spa->log, "must permit notification socket with -n");
- +
- + if ((op == UPDATE) || (op == LOOKUP)){
- if (spa->timeout_data.notify_tag != NULL) {
- free(spa->timeout_data.notify_tag);
- spa->timeout_data.notify_tag = NULL;
- }
- - if (cf->timeout_handler->socket_name != NULL && socket_name_u != NULL) {
- - if (strcmp(cf->timeout_handler->socket_name, socket_name_u) != 0) {
- - rtpp_log_write(RTPP_LOG_ERR, spa->log, "invalid socket name %s", socket_name_u);
- - socket_name_u = NULL;
- - } else {
- + spa->timeout_data.handler = NULL;
- + if (socket_name_u != NULL) {
- + if (cf->timeout_handler != NULL && cf->timeout_handler->socket_name != NULL
- + && strlen(cf->timeout_handler->socket_name) == strlen(socket_name_u)
- + && strcmp(cf->timeout_handler->socket_name, socket_name_u) != 0) {
- rtpp_log_write(RTPP_LOG_INFO, spa->log, "setting timeout handler");
- spa->timeout_data.handler = cf->timeout_handler;
- spa->timeout_data.notify_tag = strdup(notify_tag);
- + } else {
- + rtpp_log_write(RTPP_LOG_INFO, spa->log, "setting custom timeout handler (%s)", socket_name_u);
- + my_timeout_h = malloc(sizeof(struct rtpp_timeout_handler));
- + if (my_timeout_h == NULL) {
- + rtpp_log_write(RTPP_LOG_ERR, spa->log, "Unable to allocate memory");
- + } else {
- + memset(my_timeout_h, 0, sizeof(struct rtpp_timeout_handler));
- + my_timeout_h->socket_name = (char *)malloc(strlen(socket_name_u) + 1);
- + if(my_timeout_h->socket_name != NULL) {
- + strcpy(my_timeout_h->socket_name, socket_name_u);
- + spa->timeout_data.handler = my_timeout_h;
- + if (notify_tag != NULL) spa->timeout_data.notify_tag = strdup(notify_tag);
- + else spa->timeout_data.notify_tag = NULL;
- + } else {
- + rtpp_log_write(RTPP_LOG_ERR, spa->log, "Unable to allocate memory");
- + free(my_timeout_h);
- + }
- + }
- }
- - } else if (socket_name_u == NULL && spa->timeout_data.handler != NULL) {
- - spa->timeout_data.handler = NULL;
- - rtpp_log_write(RTPP_LOG_INFO, spa->log, "disabling timeout handler");
- }
- }
-
- diff --git a/rtpp_notify.c b/rtpp_notify.c
- index e92c9ec..e6b30e4 100644
- --- a/rtpp_notify.c
- +++ b/rtpp_notify.c
- @@ -42,10 +42,24 @@
- #include "rtpp_session.h"
- #include "rtpp_util.h"
-
- +#ifdef ENABLE_XMLRPC
- +#include <xmlrpc.h>
- +#include <xmlrpc_client.h>
- +#define XMLRPC_CLIENT_NAME "XML-RPC RTPProxy Client"
- +#define XMLRPC_CLIENT_VERSION "0.2"
- +#endif
- +
- struct rtpp_notify_wi
- {
- char *notify_buf;
- int len;
- +#ifdef ENABLE_XMLRPC
- + char *call_id;
- + int call_id_len;
- + char *param;
- + int param_len;
- + int custom_handler;
- +#endif
- struct rtpp_timeout_handler *th;
- rtpp_log_t glog;
- struct rtpp_notify_wi *next;
- @@ -258,6 +272,13 @@ rtpp_notify_schedule(struct cfg *cf, struct rtpp_session *sp)
- if (wi == NULL)
- return -1;
-
- +#ifdef ENABLE_XMLRPC
- + if (th != cf->timeout_handler)
- + wi->custom_handler = 1;
- + else
- + wi->custom_handler = 0;
- +#endif
- +
- wi->th = th;
- if (sp->timeout_data.notify_tag == NULL) {
- /* two 5-digit numbers, space, \0 and \n */
- @@ -289,6 +310,59 @@ rtpp_notify_schedule(struct cfg *cf, struct rtpp_session *sp)
- len = snprintf(wi->notify_buf, len, "%s\n",
- sp->timeout_data.notify_tag);
- }
- +#ifdef ENABLE_XMLRPC
- +
- + // rtpp_log_write(RTPP_LOG_ERR, wi->glog, "Timeout socket is: %s (%p)\n", wi->th->socket_name, wi->th->socket_name);
- +
- + if (strncmp("xmlrpc:", wi->th->socket_name, 7) == 0) {
- + // Copy the Socket-Name
- + len = strlen(wi->th->socket_name)+1;
- + if (wi->param == NULL) {
- + wi->param = malloc(len);
- + if (wi->param == NULL) {
- + rtpp_notify_queue_return_free_item(wi);
- + return -1;
- + }
- + } else {
- + notify_buf = realloc(wi->param, len);
- + if (notify_buf == NULL) {
- + rtpp_notify_queue_return_free_item(wi);
- + return -1;
- + }
- + wi->param = notify_buf;
- + }
- + memset(wi->param, '\0', len);
- + len = snprintf(wi->param, len, "%s",
- + wi->th->socket_name);
- + wi->param_len = len;
- +
- + // rtpp_log_write(RTPP_LOG_ERR, wi->glog, "wi->param %s (%p)\n", wi->param, wi->param);
- +
- + // Copy the Call-ID:
- + len = strlen(sp->call_id)+1;
- + if (wi->call_id == NULL) {
- + wi->call_id = malloc(len);
- + if (wi->call_id == NULL) {
- + rtpp_notify_queue_return_free_item(wi);
- + return -1;
- + }
- + } else {
- + notify_buf = realloc(wi->call_id, len);
- + if (notify_buf == NULL) {
- + rtpp_notify_queue_return_free_item(wi);
- + return -1;
- + }
- + wi->call_id = notify_buf;
- + }
- + memset(wi->call_id, '\0', len);
- + len = snprintf(wi->call_id, len, "%s",
- + sp->call_id);
- + wi->call_id_len = len;
- +
- + // rtpp_log_write(RTPP_LOG_ERR, wi->glog, "wi->call_id %s (%p)\n", wi->call_id, wi->call_id);
- +
- + }
- +#endif
-
- wi->glog = cf->stable.glog;
-
- @@ -345,29 +419,72 @@ reconnect_timeout_handler(rtpp_log_t log, struct rtpp_timeout_handler *th)
- }
- }
-
- +#ifdef ENABLE_XMLRPC
- +static int
- +do_xmlrpc_timeout_notification(rtpp_log_t log, struct rtpp_notify_wi *wi) {
- + xmlrpc_env env;
- + xmlrpc_value *result;
- +
- + /* Start up our XML-RPC client library. */
- + xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, XMLRPC_CLIENT_NAME, XMLRPC_CLIENT_VERSION);
- + xmlrpc_env_init(&env);
- +
- + /* Get the dialog-Info: */
- + result = xmlrpc_client_call(&env, wi->param+7,
- + "dlg_terminate_dlg", "(s)",
- + wi->call_id);
- + if (env.fault_occurred) {
- + rtpp_log_write(RTPP_LOG_ERR, wi->glog, "%s: XML-RPC Fault: %s (%d)\n", wi->call_id, env.fault_string, env.fault_code);
- + return -1;
- + }
- +
- + /* Dispose of our result value. */
- + xmlrpc_DECREF(result);
- +
- + /* Shutdown our XML-RPC client library. */
- + xmlrpc_env_clean(&env);
- + xmlrpc_client_cleanup();
- +
- + return 0;
- +}
- +#endif
- +
- static void
- do_timeout_notification(struct rtpp_notify_wi *wi, int retries)
- {
- int result;
-
- - if (wi->th->connected == 0) {
- - reconnect_timeout_handler(wi->glog, wi->th);
- -
- - /* If connect fails, no notification will be sent */
- - if (wi->th->connected == 0) {
- - rtpp_log_write(RTPP_LOG_ERR, wi->glog, "unable to send timeout notification");
- - return;
- - }
- + if (strncmp("xmlrpc:", wi->th->socket_name, 7) == 0) {
- + result = do_xmlrpc_timeout_notification(wi->glog, wi);
- + } else {
- + if (wi->th->connected == 0) {
- + reconnect_timeout_handler(wi->glog, wi->th);
- +
- + /* If connect fails, no notification will be sent */
- + if (wi->th->connected == 0) {
- + rtpp_log_write(RTPP_LOG_ERR, wi->glog, "unable to send timeout notification");
- + return;
- + }
- + }
- +
- + do {
- + result = send(wi->th->fd, wi->notify_buf, wi->len - 1, 0);
- + } while (result == -1 && errno == EINTR);
- }
-
- - do {
- - result = send(wi->th->fd, wi->notify_buf, wi->len - 1, 0);
- - } while (result == -1 && errno == EINTR);
- -
- if (result < 0) {
- wi->th->connected = 0;
- rtpp_log_ewrite(RTPP_LOG_ERR, wi->glog, "failed to send timeout notification");
- if (retries > 0)
- do_timeout_notification(wi, retries - 1);
- }
- +#ifdef ENABLE_XMLRPC
- + // In case we use a custom timeout handler, we have to free it.
- + if (wi->th && (wi->custom_handler == 1)) {
- + free(wi->th->socket_name);
- + free(wi->th);
- + wi->th = 0;
- + }
- +#endif
- +
- }
- diff --git a/rtpp_session.c b/rtpp_session.c
- index 03e3d8a..51b3319 100644
- --- a/rtpp_session.c
- +++ b/rtpp_session.c
- @@ -41,6 +41,7 @@
- #include "rtpp_record.h"
- #include "rtpp_session.h"
- #include "rtpp_util.h"
- +#include "rtpp_notify.h"
-
- void
- init_hash_table(struct cfg_stable *cf)
|