[Serdev] Simplifying ext (and other URI-rewriting modules)

Bogdan-Andrei IANCU iancu at fokus.fraunhofer.de
Wed May 5 10:03:50 UTC 2004


Hi Maxim,

I will take a look these days and everything ok, I will commit it to 
CVS. As principal, I agree with your idea.

Bogdan

Maxim Sobolev wrote:

> Hi,
>
> Please review/approve attached patch, which removes great deal of code 
> from ext module by utilising rewrite*() pseudo-functions from action.c.
>
> The same idea could be utilised for other modules as well.
>
> -Maxim
>
>------------------------------------------------------------------------
>
>--- modules/ext/ext.c.orig	Sun Apr  6 23:25:51 2003
>+++ modules/ext/ext.c	Tue May  4 19:11:40 2004
>@@ -37,6 +37,7 @@
> #include <unistd.h>
> #include <fcntl.h>
> 
>+#include "../../action.h"
> #include "../../sr_module.h"
> #include "../../error.h"
> #include "../../dprint.h"
>@@ -180,10 +184,10 @@
> static int ext_rewriteuser(struct sip_msg *msg, char *cmd, char *foo_str )
> {
> 	struct sip_uri parsed_uri;
>+	struct action act;
> 	str *uri;
> 	str buf;
> 	str user;
>-	str new_uri;
> 	char *p;
> 	int  i;
> 
>@@ -221,77 +225,29 @@
> 
> 	i = 0;
> 	user.s = buf.s;
>-	while (user.s!=buf.s+buf.len) {
>-		/* jump over space, tab, \n and \r */
>-		while ( user.s<buf.s+buf.len && ( *(user.s)==' '
>-		|| *(user.s)=='\t' || *(user.s)=='\n' || *(user.s)=='\r') )
>-			user.s++;
>-		/* go to the end of user */
>-		user.len = 0;
>-		while ( (p=user.s+user.len)<buf.s+buf.len && *p!=' '
>-		&& *p!='\t' && *p!='\n' && *p!='\r')
>-			user.len++;
>-		if (!user.len) {
>-			LOG(L_ERR,"ERROR:ext_rewriteuser:error parsing external prog "
>-			"output: <%.*s> at char[%c]\n",buf.len,buf.s,user.s[0]);
>-			goto error;
>-		}
>-
>-		/* compose the new uri */
>-		DBG("DEBUG:ext_rewriteuser: processing user <%.*s> [%d]\n",user.len,
>-			user.s,user.len);
>-		new_uri.len = 4/*sip:*/+user.len+1/*@*/+parsed_uri.host.len+
>-			+(parsed_uri.port.len!=0)+parsed_uri.port.len
>-			+(parsed_uri.params.len!=0)+parsed_uri.params.len
>-			+(parsed_uri.headers.len!=0)+parsed_uri.headers.len;
>-		new_uri.s = (char*)pkg_malloc(new_uri.len);
>-		if (!new_uri.s) {
>-			LOG(L_ERR,"ERROR:ext_rewriteuri: no more free pkg memory\n");
>-			goto error;
>-		}
>-		p = new_uri.s;
>-		memcpy(p,"sip:",4);
>-		p += 4;
>-		memcpy(p,user.s,user.len);
>-		p += user.len;
>-		*(p++) = '@';
>-		memcpy(p,parsed_uri.host.s,parsed_uri.host.len);
>-		p += parsed_uri.host.len;
>-		if (parsed_uri.port.len) {
>-			*(p++) = ':';
>-			memcpy(p,parsed_uri.port.s,parsed_uri.port.len);
>-			p += parsed_uri.port.len;
>-		}
>-		if (parsed_uri.params.len) {
>-			*(p++) = ';';
>-			memcpy(p,parsed_uri.params.s,parsed_uri.params.len);
>-			p += parsed_uri.params.len;
>-		}
>-		if (parsed_uri.headers.len) {
>-			*(p++) = '?';
>-			memcpy(p,parsed_uri.headers.s,parsed_uri.headers.len);
>-			p += parsed_uri.headers.len;
>-		}
> 
>-		/* now, use it! */
>-		DBG("DEBUG:ext_rewriteuser: setting uri <%.*s> [%d]\n",new_uri.len,
>-			new_uri.s,new_uri.len);
>-		if (i==0) {
>-			/* set in sip_msg the new uri */
>-			if (msg->new_uri.s && msg->new_uri.len)
>-				pkg_free(msg->new_uri.s);
>-			msg->new_uri.s = new_uri.s;
>-			msg->new_uri.len = new_uri.len;
>-		} else {
>-			LOG(L_WARN,"WARNING:ext_rewriteuser: fork not supported -> dumping"
>-				" uri %d <%.*s>\n",i,new_uri.len,new_uri.s);
>-			pkg_free(new_uri.s);
>-		}
>-
>-		i++;
>-		user.s += user.len;
>+	/* jump over space, tab, \n and \r */
>+	while ( user.s<buf.s+buf.len && ( *(user.s)==' '
>+	|| *(user.s)=='\t' || *(user.s)=='\n' || *(user.s)=='\r') )
>+		user.s++;
>+	/* go to the end of user */
>+	user.len = 0;
>+	while ( (p=user.s+user.len)<buf.s+buf.len && *p!=' '
>+	&& *p!='\t' && *p!='\n' && *p!='\r')
>+		user.len++;
>+	if (!user.len) {
>+		LOG(L_ERR,"ERROR:ext_rewriteuser:error parsing external prog "
>+		"output: <%.*s> at char[%c]\n",buf.len,buf.s,user.s[0]);
>+		goto error;
> 	}
> 
>+	user.s[user.len] = '\0';
>+
>+	memset(&act, 0, sizeof(act));
>+	act.type = SET_USER_T;
>+	act.p1_type = STRING_ST;
>+	act.p1.string = user.s;
>+	return do_action(&act, msg);
> done:
> 	return 1;
> error:
>@@ -303,6 +259,7 @@
> 
> static int ext_rewriteuri(struct sip_msg *msg, char *cmd, char *foo_str )
> {
>+	struct action act;
> 	str  *uri;
> 	str  buf;
> 	str  new_uri;
>@@ -330,45 +287,30 @@
> 
> 	i = 0;
> 	new_uri.s = buf.s;
>-	while (new_uri.s!=buf.s+buf.len) {
>-		/* jump over space, tab, \n and \r */
>-		while ( new_uri.s<buf.s+buf.len && ( *(new_uri.s)==' '
>-		|| *(new_uri.s)=='\t' || *(new_uri.s)=='\n' || *(new_uri.s)=='\r') )
>-			new_uri.s++;
>-		/* go to the end of uri */
>-		new_uri.len = 0;
>-		while ( (c=new_uri.s+new_uri.len)<buf.s+buf.len && *c!=' '
>-		&& *c!='\t' && *c!='\n' && *c!='\r')
>-			new_uri.len++;
>-		if (!new_uri.len) {
>-			LOG(L_ERR,"ERROR:ext_rewriteuri:error parsing external prog output"
>-			": <%.*s> at char[%c]\n",buf.len,buf.s,new_uri.s[0]);
>-			return -1;
>-		}
>-
>-		/* now, use it! */
>-		DBG("DEBUG:ext_rewriteuri: setting <%.*s> [%d]\n",new_uri.len,
>-			new_uri.s,new_uri.len);
>-		if (i==0) {
>-			if (msg->new_uri.s && msg->new_uri.len)
>-				pkg_free(msg->new_uri.s);
>-			msg->new_uri.s = (char*)pkg_malloc(new_uri.len);
>-			if (!msg->new_uri.s) {
>-				LOG(L_ERR,"ERROR:ext_rewriteuri: no more free pkg memory\n");
>-				return -1;
>-			}
>-			msg->new_uri.len = new_uri.len;
>-			memcpy(msg->new_uri.s,new_uri.s,new_uri.len);
>-		} else {
>-			LOG(L_WARN,"WARNING:ext_rewriteuri: fork not supported -> dumping"
>-				" uri %d <%.*s>\n",i,new_uri.len,new_uri.s);
>-		}
>-
>-		i++;
>-		new_uri.s += new_uri.len;
>+	/* jump over space, tab, \n and \r */
>+	while ( new_uri.s<buf.s+buf.len && ( *(new_uri.s)==' '
>+	|| *(new_uri.s)=='\t' || *(new_uri.s)=='\n' || *(new_uri.s)=='\r') )
>+		new_uri.s++;
>+	/* go to the end of uri */
>+	new_uri.len = 0;
>+	while ( (c=new_uri.s+new_uri.len)<buf.s+buf.len && *c!=' '
>+	&& *c!='\t' && *c!='\n' && *c!='\r')
>+		new_uri.len++;
>+	if (!new_uri.len) {
>+		LOG(L_ERR,"ERROR:ext_rewriteuri:error parsing external prog output"
>+		": <%.*s> at char[%c]\n",buf.len,buf.s,new_uri.s[0]);
>+		return -1;
> 	}
> 
>-	return 1;
>-}
>+	/* now, use it! */
>+	DBG("DEBUG:ext_rewriteuri: setting <%.*s> [%d]\n",new_uri.len,
>+		new_uri.s,new_uri.len);
> 
>+	new_uri.s[new_uri.len] = '\0';
> 
>+	memset(&act, 0, sizeof(act));
>+	act.type = SET_URI_T;
>+	act.p1_type = STRING_ST;
>+	act.p1.string = new_uri.s;
>+	return do_action(&act, msg);
>+}
>  
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Serdev mailing list
>serdev at lists.iptel.org
>http://lists.iptel.org/mailman/listinfo/serdev
>  
>




More information about the Serdev mailing list