diff --git a/modules/corex/corex_mod.c b/modules/corex/corex_mod.c index 3d28c0ec556..b8b047f4c05 100644 --- a/modules/corex/corex_mod.c +++ b/modules/corex/corex_mod.c @@ -1,6 +1,4 @@ /** - * $Id$ - * * Copyright (C) 2011 Daniel-Constantin Mierla (asipto.com) * * This file is part of Kamailio, a free SIP server. @@ -27,6 +25,8 @@ #include "../../sr_module.h" #include "../../dprint.h" #include "../../ut.h" +#include "../../lvalue.h" +#include "../../pvar.h" #include "corex_lib.h" #include "corex_rpc.h" @@ -43,6 +43,10 @@ static int w_send_data(sip_msg_t *msg, char *suri, char *sdata); static int w_msg_iflag_set(sip_msg_t *msg, char *pflag, char *p2); static int w_msg_iflag_reset(sip_msg_t *msg, char *pflag, char *p2); static int w_msg_iflag_is_set(sip_msg_t *msg, char *pflag, char *p2); +static int w_file_read(sip_msg_t *msg, char *fn, char *vn); +static int w_file_write(sip_msg_t *msg, char *fn, char *vn); + +static int fixup_file_op(void** param, int param_no); int corex_alias_subdomains_param(modparam_t type, void *val); @@ -59,39 +63,43 @@ static pv_export_t mod_pvs[] = { static cmd_export_t cmds[]={ {"append_branch", (cmd_function)w_append_branch, 0, 0, - 0, REQUEST_ROUTE | FAILURE_ROUTE }, + 0, REQUEST_ROUTE | FAILURE_ROUTE }, {"append_branch", (cmd_function)w_append_branch, 1, fixup_spve_null, - 0, REQUEST_ROUTE | FAILURE_ROUTE }, + 0, REQUEST_ROUTE | FAILURE_ROUTE }, {"append_branch", (cmd_function)w_append_branch, 2, fixup_spve_spve, - 0, REQUEST_ROUTE | FAILURE_ROUTE }, + 0, REQUEST_ROUTE | FAILURE_ROUTE }, {"send", (cmd_function)w_send, 0, 0, - 0, REQUEST_ROUTE | FAILURE_ROUTE }, + 0, REQUEST_ROUTE | FAILURE_ROUTE }, {"send", (cmd_function)w_send, 1, fixup_spve_spve, - 0, REQUEST_ROUTE | FAILURE_ROUTE }, + 0, REQUEST_ROUTE | FAILURE_ROUTE }, {"send_tcp", (cmd_function)w_send_tcp, 0, 0, - 0, REQUEST_ROUTE | FAILURE_ROUTE }, + 0, REQUEST_ROUTE | FAILURE_ROUTE }, {"send_tcp", (cmd_function)w_send_tcp, 1, fixup_spve_null, - 0, REQUEST_ROUTE | FAILURE_ROUTE }, + 0, REQUEST_ROUTE | FAILURE_ROUTE }, {"send_data", (cmd_function)w_send_data, 2, fixup_spve_spve, - 0, ANY_ROUTE }, + 0, ANY_ROUTE }, {"is_incoming", (cmd_function)nio_check_incoming, 0, 0, - 0, ANY_ROUTE }, + 0, ANY_ROUTE }, {"msg_iflag_set", (cmd_function)w_msg_iflag_set, 1, fixup_spve_null, - 0, ANY_ROUTE }, + 0, ANY_ROUTE }, {"msg_iflag_reset", (cmd_function)w_msg_iflag_reset, 1, fixup_spve_null, - 0, ANY_ROUTE }, + 0, ANY_ROUTE }, {"msg_iflag_is_set", (cmd_function)w_msg_iflag_is_set, 1, fixup_spve_null, - 0, ANY_ROUTE }, + 0, ANY_ROUTE }, + {"file_read", (cmd_function)w_file_read, 2, fixup_file_op, + 0, ANY_ROUTE }, + {"file_write", (cmd_function)w_file_write, 2, fixup_spve_spve, + 0, ANY_ROUTE }, {0, 0, 0, 0, 0, 0} }; static param_export_t params[]={ {"alias_subdomains", STR_PARAM|USE_FUNC_PARAM, - (void*)corex_alias_subdomains_param}, - {"network_io_intercept", INT_PARAM, &nio_intercept}, - {"min_msg_len", INT_PARAM, &nio_min_msg_len}, - {"msg_avp", PARAM_STR, &nio_msg_avp_param}, + (void*)corex_alias_subdomains_param}, + {"network_io_intercept", INT_PARAM, &nio_intercept}, + {"min_msg_len", INT_PARAM, &nio_min_msg_len}, + {"msg_avp", PARAM_STR, &nio_msg_avp_param}, {0, 0, 0} }; @@ -304,3 +312,111 @@ static int w_msg_iflag_is_set(sip_msg_t *msg, char *pflag, char *p2) return 1; return -2; } + +/** + * + */ +static int w_file_read(sip_msg_t *msg, char *fn, char *vn) +{ + str fname; + pv_spec_t *vp; + pv_value_t val; + + FILE *f; + long fsize; + char *content; + + fname.len = 0; + if (fixup_get_svalue(msg, (gparam_p)fn, &fname) != 0 || fname.len<=0) { + LM_ERR("cannot get file path\n"); + return -1; + } + LM_DBG("reading from file: %.*s\n", fname.len, fname.s); + vp = (pv_spec_t*)vn; + + f = fopen(fname.s, "r"); + if(f==NULL) { + LM_ERR("cannot open file: %.*s\n", fname.len, fname.s); + return -1; + } + fseek(f, 0, SEEK_END); + fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + content = pkg_malloc(fsize + 1); + if(content==NULL) { + LM_ERR("no more pkg memory\n"); + fclose(f); + return -1; + } + fread(content, fsize, 1, f); + fclose(f); + content[fsize] = 0; + + + val.rs.s = content; + val.rs.len = fsize; + LM_DBG("file content: [[%.*s]]\n", val.rs.len, val.rs.s); + val.flags = PV_VAL_STR; + vp->setf(msg, &vp->pvp, (int)EQ_T, &val); + pkg_free(content); + + return 1; +} + +/** + * + */ +static int w_file_write(sip_msg_t *msg, char *fn, char *vn) +{ + str fname; + str content; + FILE *f; + + fname.len = 0; + if (fixup_get_svalue(msg, (gparam_p)fn, &fname) != 0 || fname.len<=0) { + LM_ERR("cannot get file path\n"); + return -1; + } + content.len = 0; + if (fixup_get_svalue(msg, (gparam_p)vn, &content) != 0 || content.len<=0) { + LM_ERR("cannot get the content\n"); + return -1; + } + + LM_DBG("writing to file: %.*s\n", fname.len, fname.s); + f = fopen(fname.s, "w"); + if(f==NULL) { + LM_ERR("cannot open file: %.*s\n", fname.len, fname.s); + return -1; + } + fwrite(content.s, 1, content.len, f); + fclose(f); + + return 1; +} + +/** + * + */ +static int fixup_file_op(void** param, int param_no) +{ + if (param_no == 1) { + return fixup_spve_null(param, 1); + } + + if (param_no == 2) { + if (fixup_pvar_null(param, 1) != 0) { + LM_ERR("failed to fixup result pvar\n"); + return -1; + } + if (((pv_spec_t *)(*param))->setf == NULL) { + LM_ERR("result pvar is not writeble\n"); + return -1; + } + return 0; + } + + LM_ERR("invalid parameter number <%d>\n", param_no); + return -1; +}