[sr-dev] git:andrei/rve_f_params: core: functions to get a fixup corresp. fixup_free function

Andrei Pelinescu-Onciul andrei at iptel.org
Thu Aug 5 23:17:47 CEST 2010


Module: sip-router
Branch: andrei/rve_f_params
Commit: 0b52bcff633ea5482d6812d9f5a84faa7bbc2738
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0b52bcff633ea5482d6812d9f5a84faa7bbc2738

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date:   Thu Aug  5 23:09:26 2010 +0200

core: functions to get a fixup corresp. fixup_free function

Added functions  that given a known fixup, returns its
corresponding fixup_free function.
The known fixups are the fparam style fixups and the kamailio
style fixups (from mod_fix.h).

---

 mod_fix.c   |   30 ++++++++++++++++++++++++++++++
 mod_fix.h   |    4 ++++
 sr_module.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 sr_module.h |    3 +++
 4 files changed, 87 insertions(+), 2 deletions(-)

diff --git a/mod_fix.c b/mod_fix.c
index 0f4db9c..0182e6f 100644
--- a/mod_fix.c
+++ b/mod_fix.c
@@ -497,3 +497,33 @@ FIXUP_F_SPVE_T(spve_spve, 1, 2, 2, 0)
 FIXUP_F_SPVE_T(spve_uint, 1, 2, 1, FPARAM_INT)
 FIXUP_F_SPVE_T(spve_str, 1, 2, 1, FPARAM_STR)
 FIXUP_F_SPVE_T(spve_null, 1, 1, 1, 0)
+
+/** get the corresp. fixup_free* function.
+ * @param f -fixup function pointer.
+ * @return  - pointer to free_fixup function if known, 0 otherwise.
+ */
+free_fixup_function mod_fix_get_fixup_free(fixup_function f)
+{
+	if (f == fixup_str_null) return fixup_free_str_null;
+	if (f == fixup_str_str) return fixup_free_str_str;
+	/* no free fixup for fixup_uint_* (they overwrite the pointer
+	   value with a number and the original value cannot be recovered) */
+	if (f == fixup_uint_null) return 0;
+	if (f == fixup_uint_uint) return 0;
+	if (f == fixup_regexp_null) return fixup_free_regexp_null;
+	if (f == fixup_pvar_null) return fixup_free_pvar_null;
+	if (f == fixup_pvar_pvar) return fixup_free_pvar_pvar;
+	if (f == fixup_pvar_str) return fixup_free_pvar_str;
+	if (f == fixup_pvar_str_str) return fixup_free_pvar_str_str;
+	if (f == fixup_igp_igp) return fixup_free_igp_igp;
+	if (f == fixup_igp_null) return fixup_free_igp_null;
+	if (f == fixup_igp_pvar) return fixup_free_igp_pvar;
+	if (f == fixup_igp_pvar_pvar) return fixup_free_igp_pvar_pvar;
+	if (f == fixup_spve_spve) return fixup_free_spve_spve;
+	if (f == fixup_spve_null) return fixup_free_spve_null;
+	/* no free fixup, because of the uint part (the uint cannot be freed,
+	   see above fixup_uint_null) */
+	if (f == fixup_spve_uint) return 0;
+	if (f == fixup_spve_str) return fixup_free_spve_str;
+	return 0;
+}
diff --git a/mod_fix.h b/mod_fix.h
index bd5d8a9..ec395b4 100644
--- a/mod_fix.h
+++ b/mod_fix.h
@@ -125,4 +125,8 @@ int fixup_spve_uint(void** param, int param_no);
 int fixup_spve_str(void** param, int param_no);
 int fixup_free_spve_str(void** param, int param_no);
 
+
+/** get the corresp. free fixup function.*/
+free_fixup_function mod_fix_get_fixup_free(fixup_function f);
+
 #endif
diff --git a/sr_module.c b/sr_module.c
index d552318..2628226 100644
--- a/sr_module.c
+++ b/sr_module.c
@@ -49,6 +49,7 @@
  */
 
 #include "sr_module.h"
+#include "mod_fix.h"
 #include "dprint.h"
 #include "error.h"
 #include "mem/mem.h"
@@ -1634,7 +1635,7 @@ int fixup_free_fparam_2(void** param, int param_no)
 
 
 /** returns true if a fixup is a fparam_t* one.
- * Used to automatically detect fparam fixups that can be used with non
+ * Used to automatically detect "pure" fparam fixups that can be used with non
  * contant RVEs.
  * @param f - function pointer
  * @return 1 for fparam fixups, 0 for others.
@@ -1652,7 +1653,54 @@ int is_fparam_rve_fixup(fixup_function f)
 		f == fixup_int_2 ||
 		f == fixup_str_12 ||
 		f == fixup_str_1 ||
-		f == fixup_str_2)
+		f == fixup_str_2 ||
+		f == fixup_regex_12 ||
+		f == fixup_regex_1 ||
+		f == fixup_regex_2
+		)
 		return 1;
 	return 0;
 }
+
+
+
+/** returns the corresponding fixup_free* for various known fixup types.
+ * Used to automatically fill in free_fixup* functions.
+ * @param f - fixup function pointer
+ * @return - free fixup function pointer on success, 0 on failure (unknown
+ *           fixup or no free fixup function).
+ */
+free_fixup_function get_fixup_free(fixup_function f)
+{
+	free_fixup_function ret;
+	/* "pure" fparam, all parameters */
+	if (f == fixup_var_str_12 ||
+		f == fixup_var_int_12 ||
+		f == fixup_int_12 ||
+		f == fixup_str_12 ||
+		f == fixup_regex_12)
+		return fixup_free_fparam_all;
+	
+	/* "pure" fparam, 1st parameter */
+	if (f == fixup_var_str_1 ||
+		f == fixup_var_int_1 ||
+		f == fixup_int_1 ||
+		f == fixup_str_1 ||
+		f == fixup_regex_1)
+		return fixup_free_fparam_1;
+	
+	/* "pure" fparam, 2nd parameters */
+	if (f == fixup_var_str_2 ||
+		f == fixup_var_int_2 ||
+		f == fixup_int_2 ||
+		f == fixup_str_2 ||
+		f == fixup_regex_2)
+		return fixup_free_fparam_2;
+	
+	/* mod_fix.h kamailio style fixups */
+	if ((ret = mod_fix_get_fixup_free(f)) != 0)
+		return ret;
+	
+	/* unknown */
+	return 0;
+}
diff --git a/sr_module.h b/sr_module.h
index 17606ab..7bbc19d 100644
--- a/sr_module.h
+++ b/sr_module.h
@@ -600,4 +600,7 @@ void fparam_free_restore(void** param);
 int fixup_free_fparam_all(void** param, int param_no);
 int fixup_free_fparam_1(void** param, int param_no);
 int fixup_free_fparam_2(void** param, int param_no);
+
+free_fixup_function get_fixup_free(fixup_function f);
+
 #endif /* sr_module_h */




More information about the sr-dev mailing list