From 02d27d5e027bde9175745bb971e2a22eb2992cf3 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 13 Jan 2015 13:00:54 -0500 Subject: [PATCH] MT#10583 support b2bua callback to sip proxy address --- daemon/call.c | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 307b9bfe9..9b089af2c 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -60,8 +60,7 @@ struct iterator_helper { struct xmlrpc_helper { enum xmlrpc_format fmt; GStringChunk *c; - char *url; - GSList *tags; + GSList *tags_urls; }; struct streamhandler_io { @@ -1130,18 +1129,22 @@ void xmlrpc_kill_calls(void *p) { int i = 0; int status; str *tag; + const char *url; - while (xh->tags) { - tag = xh->tags->data; + while (xh->tags_urls && xh->tags_urls->next) { + tag = xh->tags_urls->data; + url = xh->tags_urls->next->data; - ilog(LOG_INFO, "Forking child to close call with tag "STR_FORMAT" via XMLRPC", STR_FMT(tag)); + ilog(LOG_INFO, "Forking child to close call with tag "STR_FORMAT" via XMLRPC call to %s", + STR_FMT(tag), url); pid = fork(); if (pid) { retry: pid = waitpid(pid, &status, 0); if ((pid > 0 && WIFEXITED(status) && WEXITSTATUS(status) == 0) || i >= 3) { - xh->tags = g_slist_delete_link(xh->tags, xh->tags); + xh->tags_urls = g_slist_delete_link(xh->tags_urls, xh->tags_urls); + xh->tags_urls = g_slist_delete_link(xh->tags_urls, xh->tags_urls); i = 0; } else { @@ -1181,11 +1184,11 @@ retry: r = NULL; switch (xh->fmt) { case XF_SEMS: - xmlrpc_client_call2f(&e, c, xh->url, "di", &r, "(ssss)", + xmlrpc_client_call2f(&e, c, url, "di", &r, "(ssss)", "sbc", "postControlCmd", tag->s, "teardown"); break; case XF_CALLID: - xmlrpc_client_call2f(&e, c, xh->url, "teardown", &r, "(s)", tag->s); + xmlrpc_client_call2f(&e, c, url, "teardown", &r, "(s)", tag->s); break; } @@ -1195,7 +1198,8 @@ retry: goto fault; xmlrpc_client_destroy(c); - xh->tags = g_slist_delete_link(xh->tags, xh->tags); + xh->tags_urls = g_slist_delete_link(xh->tags_urls, xh->tags_urls); + xh->tags_urls = g_slist_delete_link(xh->tags_urls, xh->tags_urls); xmlrpc_env_clean(&e); _exit(0); @@ -1213,8 +1217,9 @@ void kill_calls_timer(GSList *list, struct callmaster *m) { struct call *ca; GSList *csl; struct call_monologue *cm; - const char *url; + const char *url, *url_prefix, *url_suffix; struct xmlrpc_helper *xh = NULL; + char addr[64], url_buf[128]; if (!list) return; @@ -1224,8 +1229,15 @@ void kill_calls_timer(GSList *list, struct callmaster *m) { if (url) { xh = g_slice_alloc(sizeof(*xh)); xh->c = g_string_chunk_new(64); - xh->url = g_string_chunk_insert(xh->c, url); - xh->tags = NULL; + url_prefix = NULL; + url_suffix = strstr(url, "%%"); + if (url_suffix) { + url_prefix = g_string_chunk_insert_len(xh->c, url, url_suffix - url); + url_suffix = g_string_chunk_insert(xh->c, url_suffix + 2); + } + else + url_suffix = g_string_chunk_insert(xh->c, url); + xh->tags_urls = NULL; xh->fmt = m->conf.fmt; } @@ -1237,17 +1249,27 @@ void kill_calls_timer(GSList *list, struct callmaster *m) { rwlock_lock_r(&ca->master_lock); + if (url_prefix) { + smart_ntop_p(addr, &ca->created_from_addr.sin6_addr, sizeof(addr)); + snprintf(url_buf, sizeof(url_buf), "%s%s%s", + url_prefix, addr, url_suffix); + } + else + snprintf(url_buf, sizeof(url_buf), "%s", url_suffix); + switch (m->conf.fmt) { case XF_SEMS: for (csl = ca->monologues; csl; csl = csl->next) { cm = csl->data; if (cm->tag.s && cm->tag.len) { - xh->tags = g_slist_prepend(xh->tags, str_chunk_insert(xh->c, &cm->tag)); + xh->tags_urls = g_slist_prepend(xh->tags_urls, g_string_chunk_insert(xh->c, url_buf)); + xh->tags_urls = g_slist_prepend(xh->tags_urls, str_chunk_insert(xh->c, &cm->tag)); } } break; case XF_CALLID: - xh->tags = g_slist_prepend(xh->tags, str_chunk_insert(xh->c, &ca->callid)); + xh->tags_urls = g_slist_prepend(xh->tags_urls, g_string_chunk_insert(xh->c, url_buf)); + xh->tags_urls = g_slist_prepend(xh->tags_urls, str_chunk_insert(xh->c, &ca->callid)); break; }