[sr-dev] question about module function arguments
Andrei Pelinescu-Onciul
andrei at iptel.org
Mon Oct 11 10:06:29 CEST 2010
On Oct 09, 2010 at 17:25, Juha Heinanen <jh at tutpro.com> wrote:
> i understood that module functions can now have an arbitrary number of
> string, int and pseudo var arguments, where string arguments can
> possibly also contain pseudo variables.
>
> some time ago i asked an example on how this is done, but didn't get any
> reply. so i'll try again. for example, allow_trusted function is
> now defined like this:
>
> {"allow_trusted", (cmd_function)allow_trusted_2, 2, fixup_pvar_pvar,
> fixup_free_pvar_pvar, REQUEST_ROUTE | FAILURE_ROUTE},
>
> how can i add a third argument to the function without needing to define
> yet another fixup_pvar_pvar_something?
You cannot use fixup_pvar_pvar for more then 2 parameters. A lot of the
fixup functions check the number of parameters and return error for
more then 2.
However in the case of fixup_pvar_pvar(), you can replace it with
fixup_pvar_all() (and fixup_free_pvar_all).
In your case replacing 2 with 3 and pvar_pvar with pvar_all should work,
e.g.:
{"allow_trusted3", (cmd_function)allow_trusted_2, 3, fixup_pvar_all,
fixup_free_pvar_all, REQUEST_ROUTE | FAILURE_ROUTE},
You can use this way to define functions that accept up to 6 parameters.
If you don't care about pvar arguments in strings (which IMHO should be
slowly obsoleted), then you can write a normal module function that
accepts strings as parameters (uses directly the char* arguments,
without any get_str_fparam(...)) and set the fixups to 0. The core will
take care and convert the arguments to string before calling your
function.
I you want variable number of parameters, the module function
declaration should look like:
{"foov", (cmd_function)foo_var, VAR_PARAM_NO, 0, 0, REQUEST_ROUTE}
static int foo_var(struct sip_msg* msg, int argc, action_u_t argv[])
{
int i;
for (i = 0; i < argc; i++)
do_something(argv[i].u.string);
return 1;
}
If you want to use fixups and variable number of parameters, the fixups
look the same way as normal fixups (fixup(void** param, int param_no)).
For more examples see modules_s/print/print.c (uses the ser modules
interface without free_fixup, but that's the only difference).
Andrei
More information about the sr-dev
mailing list