Browse Source

corex: exported file read/write functions to kemi

Daniel-Constantin Mierla 5 năm trước cách đây
mục cha
commit
2b3c4130e7
1 tập tin đã thay đổi với 98 bổ sung35 xóa
  1. 98 35
      src/modules/corex/corex_mod.c

+ 98 - 35
src/modules/corex/corex_mod.c

@@ -68,6 +68,8 @@ static int w_is_faked_msg(sip_msg_t *msg, char *p1, char *p2);
 
 static int fixup_file_op(void** param, int param_no);
 
+static sr_kemi_xval_t _sr_kemi_corex_xval = {0};
+
 int corex_alias_subdomains_param(modparam_t type, void *val);
 int corex_dns_cache_param(modparam_t type, void *val);
 
@@ -486,60 +488,122 @@ 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 corex_file_read(sip_msg_t *msg, str *fname, str *fdata)
 {
-	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;
+	LM_DBG("reading from file: %.*s\n", fname->len, fname->s);
+
+	fdata->s = NULL;
+	fdata->len = 0;
 
-	f = fopen(fname.s, "r");
+	f = fopen(fname->s, "r");
 	if(f==NULL) {
-		LM_ERR("cannot open file: %.*s\n", fname.len, fname.s);
+		LM_ERR("cannot open file: %.*s\n", fname->len, fname->s);
 		return -1;
 	}
 	fseek(f, 0, SEEK_END);
 	fsize = ftell(f);
 	if(fsize<0) {
-		LM_ERR("ftell failed on file: %.*s\n", fname.len, fname.s);
+		LM_ERR("ftell failed on file: %.*s\n", fname->len, fname->s);
 		fclose(f);
 		return -1;
 	}
 	fseek(f, 0, SEEK_SET);
 
-	content = pkg_malloc(fsize + 1);
-	if(content==NULL) {
+	fdata->s = pkg_malloc(fsize + 1);
+	if(fdata->s==NULL) {
 		LM_ERR("no more pkg memory\n");
 		fclose(f);
 		return -1;
 	}
-	if(fread(content, fsize, 1, f) != fsize) {
+	if(fread(fdata->s, fsize, 1, f) != fsize) {
 		if(ferror(f)) {
 			LM_ERR("error reading from file: %.*s\n",
-				fname.len, fname.s);
+				fname->len, fname->s);
 		}
 	}
 	fclose(f);
-	content[fsize] = 0;
 
+	fdata->s[fsize] = 0;
+	fdata->len = (int)fsize;
+
+	return 1;
+}
+
+/**
+ *
+ */
+static int w_file_read(sip_msg_t *msg, char *fn, char *vn)
+{
+	str fname;
+	pv_spec_t *vp;
+	pv_value_t val;
+
+	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;
+	}
+	vp = (pv_spec_t*)vn;
+
+	if(corex_file_read(msg, &fname, &val.rs) < 0) {
+		return -1;
+	}
 
-	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);
+	pkg_free(val.rs.s);
+
+	return 1;
+}
+
+
+static str _corex_file_read_data = STR_NULL;
+
+/**
+ *
+ */
+static sr_kemi_xval_t* ki_file_read(sip_msg_t *msg, str *fname)
+{
+	memset(&_sr_kemi_corex_xval, 0, sizeof(sr_kemi_xval_t));
+
+	if(_corex_file_read_data.s != NULL) {
+		pkg_free(_corex_file_read_data.s);
+		_corex_file_read_data.s = NULL;
+	}
+
+	if(corex_file_read(msg, fname, &_corex_file_read_data) < 0) {
+		sr_kemi_xval_null(&_sr_kemi_corex_xval, SR_KEMI_XVAL_NULL_EMPTY);
+		return &_sr_kemi_corex_xval;
+	}
+
+	LM_DBG("file content: [[%.*s]]\n", _corex_file_read_data.len,
+			_corex_file_read_data.s);
+
+	_sr_kemi_corex_xval.vtype = SR_KEMIP_STR;
+	_sr_kemi_corex_xval.v.s = _corex_file_read_data;
+	return &_sr_kemi_corex_xval;
+}
+
+/**
+ *
+ */
+static int ki_file_write(sip_msg_t *msg, str *fname, str *fdata)
+{
+	FILE *f;
+
+	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(fdata->s, 1, fdata->len, f);
+	fclose(f);
 
 	return 1;
 }
@@ -551,7 +615,6 @@ 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) {
@@ -563,17 +626,7 @@ static int w_file_write(sip_msg_t *msg, char *fn, char *vn)
 		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;
+	return ki_file_write(msg, &fname, &content);
 }
 
 /**
@@ -1137,6 +1190,16 @@ static sr_kemi_t sr_kemi_corex_exports[] = {
 		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
 			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
 	},
+	{ str_init("corex"), str_init("file_read"),
+		SR_KEMIP_XVAL, ki_file_read,
+		{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
+	{ str_init("corex"), str_init("file_write"),
+		SR_KEMIP_INT, ki_file_write,
+		{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
 
 	{ {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } }
 };