[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