[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