Selaa lähdekoodia

carrierroute: updated cr_load_user_carrier() to support any output variable

- third parameter can be any writable
- added fixup-free function for it
Daniel-Constantin Mierla 3 vuotta sitten
vanhempi
commit
e84c1947b3

+ 2 - 1
src/modules/carrierroute/carrierroute.c

@@ -88,7 +88,8 @@ static void mod_destroy(void);
 /************* Module Exports **********************************************/
 static cmd_export_t cmds[]={
 	{"cr_user_carrier",  (cmd_function)cr_load_user_carrier,  3,
-		cr_load_user_carrier_fixup, 0, REQUEST_ROUTE | FAILURE_ROUTE },
+		cr_load_user_carrier_fixup, cr_load_user_carrier_fixup_free,
+		REQUEST_ROUTE | FAILURE_ROUTE },
 	{"cr_route",         (cmd_function)cr_route5,              5,
 		cr_route_fixup,             0, REQUEST_ROUTE | FAILURE_ROUTE },
 	{"cr_route",         (cmd_function)cr_route,              6,

+ 27 - 3
src/modules/carrierroute/cr_fixup.c

@@ -320,12 +320,36 @@ int cr_load_user_carrier_fixup(void ** param, int param_no) {
 		}
 	}
 	else if (param_no == 3) {
-		/* destination avp name */
-		if (avp_name_fixup(param) < 0) {
-			LM_ERR("cannot fixup parameter %d\n", param_no);
+		/* destination var name */
+		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("dst var is not writeble\n");
 			return -1;
 		}
+		return 0;
 	}
 
 	return 0;
 }
+
+/**
+ *
+ */
+int cr_load_user_carrier_fixup_free(void **param, int param_no)
+{
+	if((param_no >= 1) && (param_no <= 2)) {
+		return fixup_free_spve_null(param, 1);
+	}
+
+	if(param_no == 3) {
+		return fixup_free_pvar_null(param, 1);
+	}
+
+	LM_ERR("invalid parameter number <%d>\n", param_no);
+	return -1;
+}
+
+

+ 1 - 0
src/modules/carrierroute/cr_fixup.h

@@ -53,6 +53,7 @@ int cr_route_fixup(void ** param, int param_no);
  */
 int cr_load_user_carrier_fixup(void ** param, int param_no);
 
+int cr_load_user_carrier_fixup_free(void ** param, int param_no);
 
 /**
  * Fixes the module functions' parameters, i.e. it maps

+ 14 - 10
src/modules/carrierroute/cr_func.c

@@ -41,6 +41,7 @@
 #include "../../core/qvalue.h"
 #include "../../core/dset.h"
 #include "../../core/rand/kam_rand.h"
+#include "../../core/lvalue.h"
 #include "cr_map.h"
 #include "cr_rule.h"
 #include "cr_domain.h"
@@ -731,28 +732,31 @@ unlock_and_out:
  *
  * @return 1 on success, -1 on failure
  */
-int cr_load_user_carrier(struct sip_msg * _msg, gparam_t *_user, gparam_t *_domain, gparam_t *_dstavp) {
+int cr_load_user_carrier(struct sip_msg * _msg,
+		char *_user, char *_domain, char *_dstvar) {
 	str user, domain;
-	int_str avp_val;
-	
-	if (fixup_get_svalue(_msg, _user, &user)<0) {
+	pv_spec_t *dst;
+	pv_value_t val = {0};
+
+	if (fixup_get_svalue(_msg, (gparam_t*)_user, &user)<0) {
 		LM_ERR("cannot print the user\n");
 		return -1;
 	}
 
-	if (fixup_get_svalue(_msg, _domain, &domain)<0) {
+	if (fixup_get_svalue(_msg, (gparam_t*)_domain, &domain)<0) {
 		LM_ERR("cannot print the domain\n");
 		return -1;
 	}
 	/* get carrier id */
-	if ((avp_val.n = load_user_carrier(&user, &domain)) < 0) {
+	if ((val.ri = load_user_carrier(&user, &domain)) < 0) {
 		LM_ERR("error in load user carrier");
 		return -1;
 	} else {
-		/* set avp */
-		if (add_avp(_dstavp->v.pve->spec->pvp.pvn.u.isname.type,
-					_dstavp->v.pve->spec->pvp.pvn.u.isname.name, avp_val)<0) {
-			LM_ERR("add AVP failed\n");
+		/* set var */
+		dst = (pv_spec_t *)_dstvar;
+		val.flags = PV_VAL_INT|PV_TYPE_INT;
+		if(dst->setf(_msg, &dst->pvp, (int)EQ_T, &val)<0) {
+			LM_ERR("failed setting dst var\n");
 			return -1;
 		}
 	}

+ 2 - 2
src/modules/carrierroute/cr_func.h

@@ -45,8 +45,8 @@
  *
  * @return 1 on success, -1 on failure
  */
-int cr_load_user_carrier(struct sip_msg * _msg, gparam_t *_user,
-		gparam_t *_domain, gparam_t *_dstavp);
+int cr_load_user_carrier(struct sip_msg * _msg, char *_user,
+		char *_domain, char *_dstavp);
 
 
 /**