[Freeswitch-users] Advise on FS core dump
fieldpeak
fieldpeak at gmail.com
Mon Oct 24 13:53:07 MSD 2011
Hi Stephen,
Thanks for your kindly help, however, i changed it as your advise, the core
still dumped.
below is the updated code,
static switch_status_t check_billing_before_routing(switch_core_session_t
*session)
{
//charles, check billing before routing the call
char buf[128];
char cmd[100];
FILE *pp = NULL;
const char* in_username = NULL;
const char* in_calledstation = NULL;
const char* in_uniqueid = NULL;
const char* in_network_addr = NULL;
const char* in_type = "9";
int is_b;
//const char* full_cmd;
int i_continue = 1;
switch_channel_t *channel = NULL;
in_uniqueid = switch_core_session_get_uuid(session);
channel = switch_core_session_get_channel(session);
/*only billing on a leg*/
is_b = channel && switch_channel_get_originator_caller_profile(channel);
printf("is_b is: %d\n", is_b);
if(is_b)
{
return SWITCH_STATUS_SUCCESS;
}
/* Lock this session's data for this module while we tinker with it */
if (globals.mutex) {
switch_mutex_lock(globals.mutex);
}
in_username = switch_channel_get_variable(channel, "caller_id_number");
in_calledstation = switch_channel_get_variable(channel,
"destination_number");
in_network_addr = switch_channel_get_variable(channel, "network_addr");
/* Done checking - release lock */
if (globals.mutex) {
switch_mutex_unlock(globals.mutex);
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
"check_billing_before_routing, in_username: %s, in_calledstation: %s,
in_uniqueid: %s in_type: %s, in_network_addr: %s \n", in_username,
in_calledstation, in_uniqueid, in_type, in_network_addr);
strcpy(cmd,"");
strcat(cmd, "check_billing_before_answer");
strcat(cmd, " ");
strcat(cmd, in_username);
strcat(cmd, " ");
strcat(cmd, in_calledstation);
strcat(cmd, " ");
strcat(cmd, in_uniqueid);
strcat(cmd, " ");
strcat(cmd, in_type);
strcat(cmd, " ");
strcat(cmd, in_network_addr);
printf("excute external cmd: ");
printf(cmd);
printf("\n");
if( (pp = popen(cmd, "r")) == NULL )
{
printf("popen() error!\n");
exit(1);
}
while(fgets(buf, sizeof buf, pp))
{
printf("the result of excuting external cmd: %s", buf);
}
if(pp)
{
pclose(pp);
}
i_continue = atoi(buf);
printf("i_continue: %d", i_continue);
if (!i_continue) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),
SWITCH_LOG_INFO, "call was not authorized to continue \n");
transfer_call(session, globals.nobal_action);
}
return SWITCH_STATUS_SUCCESS;
}
2011/10/24 Stephen Wilde <wstephen80 at gmail.com>
> Can you try to change the allocation of cmd as:
>
> char cmd[100];
>
> ....
>
> strcat(cmd, "check_billing_before_answer ");
>
> strcat(cmd, in_username);
>
> strcat(cmd, " ");
>
>
> ....
>
> On Mon, Oct 24, 2011 at 10:39 AM, fieldpeak <fieldpeak at gmail.com> wrote:
>
>> Hi Friends,
>>
>> i'm using mod_nibblebill for billing on FS, i bundled event processing
>> fucntions when status change,
>> e.g. /* on_routing */ check_billing_before_routing,
>> and * on_hangup */ process_hangup, as below,
>> however, i found if i make a call containing two-legs e.g. user 1001 call
>> user 1002, then the FS core dump. but if i only make one leg call, e.g. call
>> 888 for IVR, then no problem occure, i found the problem within function
>> "check_billing_before_routing" (because once i comment all of lines within
>> this func, the core did not dump). below is the func
>> "check_billing_before_routing", can anyone help advise what's wrong? how
>> should i correct it, thanks.
>>
>> static switch_status_t check_billing_before_routing(switch_core_session_t
>> *session)
>> {
>> //charles, check billing before routing the call
>>
>> char buf[128];
>> char cmd[100] = "check_billing_before_answer";
>> FILE *pp = NULL;
>>
>> const char* in_username = NULL;
>> const char* in_calledstation = NULL;
>> const char* in_uniqueid = NULL;
>> const char* in_network_addr = NULL;
>> const char* in_type = "9";
>> int is_b;
>>
>> //const char* full_cmd;
>> int i_continue = 1;
>> switch_channel_t *channel = NULL;
>>
>>
>> in_uniqueid = switch_core_session_get_uuid(session);
>>
>> channel = switch_core_session_get_channel(session);
>>
>> /*only billing on a leg*/
>> is_b = channel &&
>> switch_channel_get_originator_caller_profile(channel);
>> printf("is_b is: %d\n", is_b);
>> if(is_b)
>> {
>> return SWITCH_STATUS_SUCCESS;
>> }
>>
>> /* Lock this session's data for this module while we tinker with it */
>> if (globals.mutex) {
>> switch_mutex_lock(globals.mutex);
>> }
>>
>>
>> in_username = switch_channel_get_variable(channel,
>> "caller_id_number");
>> in_calledstation = switch_channel_get_variable(channel,
>> "destination_number");
>> in_network_addr = switch_channel_get_variable(channel,
>> "network_addr");
>>
>>
>> /* Done checking - release lock */
>> if (globals.mutex) {
>> switch_mutex_unlock(globals.mutex);
>> }
>>
>>
>> switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
>> "check_billing_before_routing, in_username: %s, in_calledstation: %s,
>> in_uniqueid: %s in_type: %s, in_network_addr: %s \n", in_username,
>> in_calledstation, in_uniqueid, in_type, in_network_addr);
>>
>>
>> strcat(cmd, " ");
>> strcat(cmd, in_username);
>> strcat(cmd, " ");
>> strcat(cmd, in_calledstation);
>> strcat(cmd, " ");
>> strcat(cmd, in_uniqueid);
>> strcat(cmd, " ");
>> strcat(cmd, in_type);
>> strcat(cmd, " ");
>> strcat(cmd, in_network_addr);
>>
>> printf("excute external cmd: ");
>> printf(cmd);
>> printf("\n");
>>
>> if( (pp = popen(cmd, "r")) == NULL )
>> {
>> printf("popen() error!\n");
>> exit(1);
>> }
>>
>> while(fgets(buf, sizeof buf, pp))
>> {
>> printf("the result of excuting external cmd: %s", buf);
>> }
>>
>> if(pp)
>> {
>> pclose(pp);
>> }
>>
>> i_continue = atoi(buf);
>>
>> printf("i_continue: %d", i_continue);
>>
>>
>> if (!i_continue) {
>>
>> switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),
>> SWITCH_LOG_INFO, "call was not authorized to continue \n");
>>
>> transfer_call(session, globals.nobal_action);
>> }
>>
>>
>>
>>
>> return SWITCH_STATUS_SUCCESS;
>>
>> }
>>
>>
>> Core dump logs:
>>
>> freeswitch at freeswitch> 2011-10-24 16:30:26.583369 [NOTICE]
>> mod_xml_rpc.c:969 Starting HTTP Port 8787, DocRoot
>> [/usr/local/freeswitch/htdocs]
>> 2011-10-24 16:30:29.454743 [WARNING] sofia_reg.c:1337 SIP auth challenge
>> (INVITE) on sofia profile 'internal' for [6628 at 224.193.106.204] from ip
>> 223.128.70.10
>> 2011-10-24 16:30:30.254710 [NOTICE] switch_channel.c:897 New Channel
>> sofia/internal/8068 at 224.193.106.204[196a50b8-eaa0-4ef0-a674-18602117f5ec]
>> is_b is: 0
>> excute external cmd: check_billing_before_answer 8068 6628
>> 196a50b8-eaa0-4ef0-a674-18602117f5ec 9 223.128.70.10
>> 2011-10-24 16:30:30.254710 [INFO] mod_nibblebill.c:1017
>> check_billing_before_routing, in_username: 8068, in_calledstation: 6628,
>> in_uniqueid: 196a50b8-eaa0-4ef0-a674-18602117f5ec in_type: 9,
>> in_network_addr: 223.128.70.10
>> the result of excuting external cmd:
>> the result of excuting external cmd: 60
>> Segmentation fault (core dumped)
>> [root at freeswitch bin]#
>>
>> --
>> Regards,
>> Charles
>>
>>
>>
>> FreeSWITCH-users mailing list
>> FreeSWITCH-users at lists.freeswitch.org
>> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
>> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
>> http://www.freeswitch.org
>>
>>
>
>
> FreeSWITCH-users mailing list
> FreeSWITCH-users at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
> http://www.freeswitch.org
>
>
--
Regards,
Charles
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20111024/ed1c33a6/attachment.html
Join us at ClueCon 2011 Aug 9-11, 2011
More information about the FreeSWITCH-users
mailing list