[OpenSIPS-Users] function with 6 parameters
Razvan Crainea
razvancrainea at opensips.org
Wed Apr 13 16:28:33 CEST 2011
Hello, Bogdan,
The problem is that the function you are using to fetch the values of
the pseudo variables (fixup_get_svalue) uses static buffers to store the
string values. These buffers are only 5 an they are used circularly.
That's why the first value is the same with the last one.
The best solution is to make sure you don't use more than 5 buffers
concurrently, preferably process the value right after fetching it (in
your example print the value right after getting it). Another solution
is to use the "pv_printf" function where you can specify your buffer. As
a last resort you can increase the buffers number in "pvar.c" (search
PV_PRINT_BUF_NO definition).
Regards,
Razvan
On 04/13/2011 01:58 PM, rad bogdan wrote:
> Hi Razvan,
>
> I've applied the patch you gave me.
> This is the output:
>
> INFO:core:do_action: called test6(0x81b1398, 0x81b144c, 0x81b14b4,
> 0x81b151c, 0x81b1584, 0x81b15ec)
> INFO:test:test6: arg1: [789]
> INFO:test:test6: arg2: [222]
> INFO:test:test6: arg3: [333]
> INFO:test:test6: arg4: [123]
> INFO:test:test6: arg5: [456]
> INFO:test:test6: arg6: [789]
>
> INFO:core:fix_actions: fixed test6[1] 0x81b1398
> INFO:core:fix_actions: fixed test6[2] 0x81b144c
> INFO:core:fix_actions: fixed test6[3] 0x81b14b4
> INFO:core:fix_actions: fixed test6[4] 0x81b151c
> INFO:core:fix_actions: fixed test6[5] 0x81b1584
> INFO:core:fix_actions: fixed test6[6] 0x81b15ec
>
> This is the code from opensips.cfg:
>
> $var(var1) = 111;
> $var(var2) = 222;
> $var(var3) = 333;
>
> $avp(s:avp1) = 123;
> $avp(s:avp2) = 456;
> $avp(s:avp3) = 789;
>
> test6("$var(var1)", "$var(var2)", "$var(var3)", "$avp(s:avp1)",
> "$avp(s:avp2)", "$avp(s:avp3)");
>
> Attached is the module.
>
> Thanks,
> Bogdan
>
> --- On *Mon, 4/11/11, Razvan Crainea /<razvancrainea at opensips.org>/*
> wrote:
>
>
> From: Razvan Crainea <razvancrainea at opensips.org>
> Subject: Re: [OpenSIPS-Users] function with 6 parameters
> To: users at lists.opensips.org
> Date: Monday, April 11, 2011, 1:45 PM
>
> Hello Bogdan,
>
> I implemented a similar test function that takes 6 parameters.
> All values seems to be in the correct order in both fixup function
> and triggered function.
>
> I attached a small patch that prints the value of the parameters
> right after the fixup function and then again before the function
> is called.
>
> Please apply this patch and then check if the parameters values
> and order match between the fixup and triggered function?
>
> Regards,
> Razvan
>
> On 04/06/2011 05:51 PM, rad bogdan wrote:
>> Hi Bogdan,
>>
>> The "inversion" is only in the triggered function.
>> The arguments are passed correctly from left to right to the
>> fixup function.
>>
>> The triggered function is:
>>
>> test_function(struct sip_msg *msg, char *arg1, char *arg2, char*
>> arg3, char* arg4, char* arg5, char* arg6)
>> {
>> str arg1_s = {NULL, 0};
>>
>> if(arg1 == NULL || fixup_get_svalue(msg, (gparam_p)arg1,
>> &arg1_s) != 0)
>> {
>> LM_ERR("Invalid arg1 argument\n");
>> return -1;
>> }
>> .........
>> }
>>
>> arg1_s.s has the value of arg6_s.s while arg6_s.s has the correct
>> value.
>>
>> Thanks,
>> Bogdan
>>
>> --- On *Wed, 4/6/11, Bogdan-Andrei Iancu /<bogdan at opensips.org>
>> </mc/compose?to=bogdan at opensips.org>/* wrote:
>>
>>
>> From: Bogdan-Andrei Iancu <bogdan at opensips.org>
>> </mc/compose?to=bogdan at opensips.org>
>> Subject: Re: [OpenSIPS-Users] function with 6 parameters
>> To: "OpenSIPS users mailling list" <users at lists.opensips.org>
>> </mc/compose?to=users at lists.opensips.org>
>> Cc: "rad bogdan" <bogdan_rad2004 at yahoo.com>
>> </mc/compose?to=bogdan_rad2004 at yahoo.com>
>> Date: Wednesday, April 6, 2011, 5:15 PM
>>
>> Hi Bogdan,
>>
>> This "inversion" is visible in the fixup function or is the
>> triggered function ?
>>
>> Regards,
>> Bogdan
>>
>> On 04/06/2011 02:44 PM, rad bogdan wrote:
>>> Hi everyone,
>>>
>>> I implemented an OpenSIPS custom module that communicates
>>> with an external application. From the routing script I call
>>> a function with 6 parameters:
>>>
>>> test_function('$fU', '$tU', '$ci', '$avp(s:name1)',
>>> '$avp(s:name2)', '$var(name3)')
>>>
>>> The problem is that when the corresponding function is
>>> called in C, the first parameter gets the value of the last one.
>>>
>>> This doesn't happen when the function is made to take 5
>>> parameters.
>>>
>>> The fixup function that I use is this:
>>>
>>> static int pvn_fixup_spve_spve_6(void** param, int param_no)
>>> {
>>> if (!(param_no >= 1 && param_no <= 6))
>>> {
>>> LM_ERR("invalid parameter number %d\n", param_no);
>>> return E_UNSPEC;
>>> }
>>>
>>> return fixup_spve(param);
>>> }
>>>
>>> Is there something wrong with it or the problem is elsewhere ?
>>>
>>> Thanks,
>>> Bogdan
>>>
>>>
>>> _______________________________________________
>>> Users mailing list
>>> Users at lists.opensips.org
>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>
>>
>> --
>> Bogdan-Andrei Iancu
>> OpenSIPS eBootcamp - 2nd of May 2011
>> OpenSIPS solutions and "know-how"
>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.opensips.org </mc/compose?to=Users at lists.opensips.org>
>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
> -----Inline Attachment Follows-----
>
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org </mc/compose?to=Users at lists.opensips.org>
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20110413/4857d0cc/attachment.htm>
More information about the Users
mailing list