[sr-dev] git:master: dispatcher: fix ds_mark_dst parameter parsing

Daniel-Constantin Mierla miconda at gmail.com
Tue Aug 26 13:04:22 CEST 2014


Module: sip-router
Branch: master
Commit: 499fb7b7d58c812dd8c867adbbed27e0c61f26d0
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=499fb7b7d58c812dd8c867adbbed27e0c61f26d0

Author: Alekzander Spiridonov <sipidronov at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Mon Aug 25 04:05:48 2014 -0700

dispatcher: fix ds_mark_dst parameter parsing

---

 modules/dispatcher/dispatcher.c |   72 +++++++++++++++++++++-----------------
 1 files changed, 40 insertions(+), 32 deletions(-)

diff --git a/modules/dispatcher/dispatcher.c b/modules/dispatcher/dispatcher.c
index 0ec3338..fedde7c 100644
--- a/modules/dispatcher/dispatcher.c
+++ b/modules/dispatcher/dispatcher.c
@@ -529,6 +529,36 @@ static void destroy(void)
 	} \
 }while(0)
 
+/*! \brief
+ * parses string to dispatcher dst flags set
+ * returns <0 on failure or int with flag on success.
+ */
+int ds_parse_flags( char* flag_str, int flag_len )
+{
+  int flag = 0;
+  int i;
+
+  for ( i=0; i<flag_len; i++)
+  {
+    if(flag_str[i]=='a' || flag_str[i]=='A') {
+      flag &= ~(DS_STATES_ALL);
+    } else if(flag_str[i]=='i' || flag_str[i]=='I') {
+      flag |= DS_INACTIVE_DST;
+    } else if(flag_str[i]=='d' || flag_str[i]=='D') {
+      flag |= DS_DISABLED_DST;
+    } else if(flag_str[i]=='t' || flag_str[i]=='T') {
+      flag |= DS_TRYING_DST;
+    } else if(flag_str[i]=='p' || flag_str[i]=='P') {
+      flag |= DS_PROBING_DST;
+    } else {
+      flag = -1;
+      break;
+    }
+  }
+
+  return flag;
+}
+
 /**
  *
  */
@@ -642,24 +672,18 @@ static int w_ds_mark_dst0(struct sip_msg *msg, char *str1, char *str2)
 static int w_ds_mark_dst1(struct sip_msg *msg, char *str1, char *str2)
 {
 	int state;
-	int len;
 
 	if(str1==NULL)
 		return w_ds_mark_dst0(msg, NULL, NULL);
 
-	len = strlen(str1);
-	state = 0;
-	if (len>1 && (str1[1]=='p' || str1[1]=='P'))
-		state |= DS_PROBING_DST;
+	state = ds_parse_flags( str1, strlen(str1) );
+
+	if ( state < 0 )
+	{
+	  LM_WARN("Failed to parse flag: %s", str1 );
+	  return -1;
+	}
 
-	if(str1[0]=='i' || str1[0]=='I')
-		state |= DS_INACTIVE_DST;
-	else if(str1[0]=='t' || str1[0]=='T')
-		state |= DS_TRYING_DST;
-	else if(str1[0]=='d' || str1[0]=='D')
-		state = DS_DISABLED_DST;
-	else if(str1[0]=='p' || str1[0]=='P')
-		state =  DS_INACTIVE_DST|DS_PROBING_DST;
 	return ds_mark_dst(msg, state);
 }
 
@@ -716,25 +740,9 @@ static struct mi_root* ds_mi_set(struct mi_root* cmd_tree, void* param)
 		return init_mi_tree(500, "bad state value", 15);
 	}
 
-	state = 0;
-	if(sp.s[0]=='0' || sp.s[0]=='I' || sp.s[0]=='i') {
-		/* set inactive */
-		state |= DS_INACTIVE_DST;
-		if((sp.len>1) && (sp.s[1]=='P' || sp.s[1]=='p'))
-			state |= DS_PROBING_DST;
-	} else if(sp.s[0]=='1' || sp.s[0]=='A' || sp.s[0]=='a') {
-		/* set active */
-		if((sp.len>1) && (sp.s[1]=='P' || sp.s[1]=='p'))
-			state |= DS_PROBING_DST;
-	} else if(sp.s[0]=='2' || sp.s[0]=='D' || sp.s[0]=='d') {
-		/* set disabled */
-		state |= DS_DISABLED_DST;
-	} else if(sp.s[0]=='3' || sp.s[0]=='T' || sp.s[0]=='t') {
-		/* set trying */
-		state |= DS_TRYING_DST;
-		if((sp.len>1) && (sp.s[1]=='P' || sp.s[1]=='p'))
-			state |= DS_PROBING_DST;
-	} else {
+	state = ds_parse_flags(sp.s, sp.len);
+	if( state < 0 )
+	{
 		LM_ERR("unknow state value\n");
 		return init_mi_tree(500, "unknown state value", 19);
 	}




More information about the sr-dev mailing list