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

Maxim Sobolev sobomax at portaone.com
Tue May 4 17:41:34 UTC 2004


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
-------------- next part --------------
--- 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);
+}


More information about the Serdev mailing list