From 34831ab12417ae2271d7e65576613c74e6354512 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Fri, 3 Aug 2007 15:41:39 +0000 Subject: [PATCH] fix for MODAPP-11 git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5560 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c | 107 ++++++++++++++-------- 1 file changed, 67 insertions(+), 40 deletions(-) diff --git a/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c b/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c index aa519e2f76..b07f673d8d 100644 --- a/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c +++ b/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c @@ -40,11 +40,22 @@ static struct { char *errLogDir; uint32_t delay; uint32_t retries; + uint32_t shutdown; } globals; SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load); +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_cdr_shutdown); SWITCH_MODULE_DEFINITION(mod_xml_cdr, mod_xml_cdr_load, NULL, NULL); +/* this function would have access to the HTML returned by the webserver, we dont need it + * and the default curl activity is to print to stdout, something not as desirable + * so we have a dummy function here + */ +static void httpCallBack() +{ + return; +} + static switch_status_t my_on_hangup(switch_core_session_t *session) { switch_xml_t cdr; @@ -57,6 +68,7 @@ static switch_status_t my_on_hangup(switch_core_session_t *session) char *curl_xml_text; char *logdir; switch_channel_t *channel = switch_core_session_get_channel(session); + int i; if (switch_ivr_generate_xml_cdr(session, &cdr) == SWITCH_STATUS_SUCCESS) { @@ -110,6 +122,7 @@ static switch_status_t my_on_hangup(switch_core_session_t *session) curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, curl_xml_text); curl_easy_setopt(curl_handle, CURLOPT_URL, globals.url); curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "freeswitch-xml/1.0"); + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, httpCallBack); /* these were used for testing, optionally they may be enabled if someone desires curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 120); // tcp timeout @@ -120,7 +133,6 @@ static switch_status_t my_on_hangup(switch_core_session_t *session) curl_easy_perform(curl_handle); curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE,&httpRes); if(httpRes==200) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG XXX success posting\n"); curl_easy_cleanup(curl_handle); free(curl_xml_text); free(xml_text); @@ -129,33 +141,40 @@ static switch_status_t my_on_hangup(switch_core_session_t *session) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Got error [%ld] posting to web server\n",httpRes); } - /* bug? feature? we sleep even on the last failure before writing the file */ - switch_sleep(globals.delay * 1000); + /* make sure we dont sleep on the last try */ + for(i=0;i -1) { - write(fd, xml_text, (unsigned) strlen(xml_text)); - close(fd); - fd = -1; - } else { - char ebuf[512] = { 0 }; + if ((path = switch_mprintf("%s/%s.cdr.xml", globals.errLogDir, switch_core_session_get_uuid(session)))) { + if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) { + write(fd, xml_text, (unsigned) strlen(xml_text)); + close(fd); + fd = -1; + } else { + char ebuf[512] = { 0 }; #ifdef WIN32 - strerror_s(ebuf, sizeof(ebuf), errno); + strerror_s(ebuf, sizeof(ebuf), errno); #else - strerror_r(errno, ebuf, sizeof(ebuf)); + strerror_r(errno, ebuf, sizeof(ebuf)); #endif - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error![%s]\n", ebuf); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error![%s]\n", ebuf); + } + free(path); } - free(path); } - free(xml_text); switch_xml_free(cdr); } else { @@ -165,11 +184,30 @@ static switch_status_t my_on_hangup(switch_core_session_t *session) return SWITCH_STATUS_SUCCESS; } -static switch_status_t do_config(void) + +static switch_state_handler_table_t state_handlers = { + /*.on_init */ NULL, + /*.on_ring */ NULL, + /*.on_execute */ NULL, + /*.on_hangup */ my_on_hangup, + /*.on_loopback */ NULL, + /*.on_transmit */ NULL +}; + +SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load) { char *cf = "xml_cdr.conf"; switch_xml_t cfg, xml, settings, param; + + /* test global state handlers */ + switch_core_add_state_handler(&state_handlers); + + *module_interface = switch_loadable_module_create_module_interface(pool, modname); + + memset(&globals,0,sizeof(globals)); + + /* parse the config */ if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); return SWITCH_STATUS_TERM; @@ -218,32 +256,21 @@ static switch_status_t do_config(void) } } - return SWITCH_STATUS_SUCCESS; -} - -static switch_state_handler_table_t state_handlers = { - /*.on_init */ NULL, - /*.on_ring */ NULL, - /*.on_execute */ NULL, - /*.on_hangup */ my_on_hangup, - /*.on_loopback */ NULL, - /*.on_transmit */ NULL -}; - -SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load) -{ - /* test global state handlers */ - switch_core_add_state_handler(&state_handlers); - - *module_interface = switch_loadable_module_create_module_interface(pool, modname); - - memset(&globals,0,sizeof(globals)); - do_config(); /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_SUCCESS; } + +SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_cdr_shutdown) +{ + + globals.shutdown=1; + return SWITCH_STATUS_SUCCESS; +} + + + /* For Emacs: * Local Variables: * mode:c