Browse Source

cores: added file_read() and file_write() functions

- file_read(fpath, var) - read content of a text file into a variable
- file_write(fpat, content) - write content of parameter to a text file
Daniel-Constantin Mierla 10 years ago
parent
commit
e62ecdfe5d
1 changed files with 134 additions and 18 deletions
  1. 134 18
      modules/corex/corex_mod.c

+ 134 - 18
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;
+}