Browse Source

acc: allow pseudo-variables as first parameter for functions.

Victor Seva 11 years ago
parent
commit
81c6e0bc10
4 changed files with 65 additions and 14 deletions
  1. 1 0
      modules/acc/acc_api.h
  2. 48 4
      modules/acc/acc_logic.c
  3. 1 1
      modules/acc/acc_logic.h
  4. 15 9
      modules/acc/acc_mod.c

+ 1 - 0
modules/acc/acc_api.h

@@ -48,6 +48,7 @@ typedef struct acc_param {
 	int code;
 	int code;
 	str code_s;
 	str code_s;
 	str reason;
 	str reason;
+	pv_elem_p  elem;
 } acc_param_t;
 } acc_param_t;
 
 
 /* various acc variables */
 /* various acc variables */

+ 48 - 4
modules/acc/acc_logic.c

@@ -166,14 +166,49 @@ static inline int acc_preparse_req(struct sip_msg *req)
 	return 0;
 	return 0;
 }
 }
 
 
+int acc_parse_code(char *p, struct acc_param *param)
+{
+	if (p==NULL||param==NULL)
+		return -1;
 
 
+	/* any code? */
+	if (param->reason.len>=3 && isdigit((int)p[0])
+	&& isdigit((int)p[1]) && isdigit((int)p[2]) ) {
+		param->code = (p[0]-'0')*100 + (p[1]-'0')*10 + (p[2]-'0');
+		param->code_s.s = p;
+		param->code_s.len = 3;
+		param->reason.s += 3;
+		for( ; isspace((int)param->reason.s[0]) ; param->reason.s++ );
+		param->reason.len = strlen(param->reason.s);
+	}
+	return 0;
+}
+
+int acc_get_param_value(struct sip_msg *rq, struct acc_param *param)
+{
+	if(param->elem!=NULL) {
+		if(pv_printf_s(rq, param->elem, &param->reason)==-1) {
+			LM_ERR("Can't get value for %.*s\n", param->reason.len, param->reason.s);
+			return -1;
+		}
+		if(acc_parse_code(param->reason.s, param)<0)
+		{
+			LM_ERR("Can't parse code\n");
+			return -1;
+		}
+	}
+	return 0;
+}
 
 
 int w_acc_log_request(struct sip_msg *rq, char *comment, char *foo)
 int w_acc_log_request(struct sip_msg *rq, char *comment, char *foo)
 {
 {
+	struct acc_param *param = (struct acc_param*)comment;
 	if (acc_preparse_req(rq)<0)
 	if (acc_preparse_req(rq)<0)
 		return -1;
 		return -1;
+	if(acc_get_param_value(rq, param)<0)
+		return -1;
 	env_set_to( rq->to );
 	env_set_to( rq->to );
-	env_set_comment((struct acc_param*)comment);
+	env_set_comment(param);
 	env_set_text( ACC_REQUEST, ACC_REQUEST_LEN);
 	env_set_text( ACC_REQUEST, ACC_REQUEST_LEN);
 	return acc_log_request(rq);
 	return acc_log_request(rq);
 }
 }
@@ -212,6 +247,7 @@ int acc_db_set_table_name(struct sip_msg *msg, void *param, str *table)
 
 
 int w_acc_db_request(struct sip_msg *rq, char *comment, char *table)
 int w_acc_db_request(struct sip_msg *rq, char *comment, char *table)
 {
 {
+	struct acc_param *param = (struct acc_param*)comment;
 	if (!table) {
 	if (!table) {
 		LM_ERR("db support not configured\n");
 		LM_ERR("db support not configured\n");
 		return -1;
 		return -1;
@@ -222,8 +258,10 @@ int w_acc_db_request(struct sip_msg *rq, char *comment, char *table)
 		LM_ERR("cannot set table name\n");
 		LM_ERR("cannot set table name\n");
 		return -1;
 		return -1;
 	}
 	}
+	if(acc_get_param_value(rq, param)<0)
+		return -1;
 	env_set_to( rq->to );
 	env_set_to( rq->to );
-	env_set_comment((struct acc_param*)comment);
+	env_set_comment(param);
 	return acc_db_request(rq);
 	return acc_db_request(rq);
 }
 }
 #endif
 #endif
@@ -232,10 +270,13 @@ int w_acc_db_request(struct sip_msg *rq, char *comment, char *table)
 #ifdef RAD_ACC
 #ifdef RAD_ACC
 int w_acc_rad_request(struct sip_msg *rq, char *comment, char *foo)
 int w_acc_rad_request(struct sip_msg *rq, char *comment, char *foo)
 {
 {
+	struct acc_param *param = (struct acc_param*)comment;
 	if (acc_preparse_req(rq)<0)
 	if (acc_preparse_req(rq)<0)
 		return -1;
 		return -1;
+	if(acc_get_param_value(rq, param)<0)
+		return -1;
 	env_set_to( rq->to );
 	env_set_to( rq->to );
-	env_set_comment((struct acc_param*)comment);
+	env_set_comment(param);
 	return acc_rad_request(rq);
 	return acc_rad_request(rq);
 }
 }
 #endif
 #endif
@@ -244,10 +285,13 @@ int w_acc_rad_request(struct sip_msg *rq, char *comment, char *foo)
 #ifdef DIAM_ACC
 #ifdef DIAM_ACC
 int w_acc_diam_request(struct sip_msg *rq, char *comment, char *foo)
 int w_acc_diam_request(struct sip_msg *rq, char *comment, char *foo)
 {
 {
+	struct acc_param *param = (struct acc_param*)comment;
 	if (acc_preparse_req(rq)<0)
 	if (acc_preparse_req(rq)<0)
 		return -1;
 		return -1;
+	if(acc_get_param_value(rq, param)<0)
+		return -1;
 	env_set_to( rq->to );
 	env_set_to( rq->to );
-	env_set_comment((struct acc_param*)comment);
+	env_set_comment(param);
 	return acc_diam_request(rq);
 	return acc_diam_request(rq);
 }
 }
 #endif
 #endif

+ 1 - 1
modules/acc/acc_logic.h

@@ -41,7 +41,7 @@
 #include "../../modules/tm/t_hooks.h"
 #include "../../modules/tm/t_hooks.h"
 #include "acc_api.h"
 #include "acc_api.h"
 
 
-
+int acc_parse_code(char *p, struct acc_param *param);
 void acc_onreq( struct cell* t, int type, struct tmcb_params *ps );
 void acc_onreq( struct cell* t, int type, struct tmcb_params *ps );
 
 
 int w_acc_log_request(struct sip_msg *rq, char *comment, char *foo);
 int w_acc_log_request(struct sip_msg *rq, char *comment, char *foo);

+ 15 - 9
modules/acc/acc_mod.c

@@ -355,15 +355,21 @@ static int acc_fixup(void** param, int param_no)
 		memset( accp, 0, sizeof(struct acc_param));
 		memset( accp, 0, sizeof(struct acc_param));
 		accp->reason.s = p;
 		accp->reason.s = p;
 		accp->reason.len = strlen(p);
 		accp->reason.len = strlen(p);
-		/* any code? */
-		if (accp->reason.len>=3 && isdigit((int)p[0])
-		&& isdigit((int)p[1]) && isdigit((int)p[2]) ) {
-			accp->code = (p[0]-'0')*100 + (p[1]-'0')*10 + (p[2]-'0');
-			accp->code_s.s = p;
-			accp->code_s.len = 3;
-			accp->reason.s += 3;
-			for( ; isspace((int)accp->reason.s[0]) ; accp->reason.s++ );
-			accp->reason.len = strlen(accp->reason.s);
+		if (strchr(p,PV_MARKER)!=NULL) { /* is a variable $xxxxx */
+			if (pv_parse_format(&accp->reason, &accp->elem)<0)
+			{
+				LM_ERR("bad param 1; "
+					"parse format error [%.*s]\n", accp->reason.len, accp->reason.s);
+				return E_UNSPEC;
+			}
+		}
+		else {
+			if(acc_parse_code(p,accp)<0)
+			{
+				LM_ERR("bad param 1;"
+					"parse code error\n");
+				return E_UNSPEC;
+			}
 		}
 		}
 		*param = (void*)accp;
 		*param = (void*)accp;
 #ifdef SQL_ACC
 #ifdef SQL_ACC