scratchpad removed, textops changed to skip the first line wo_sp
authorJiri Kuthan <jiri@iptel.org>
Wed, 29 Jan 2003 19:24:10 +0000 (19:24 +0000)
committerJiri Kuthan <jiri@iptel.org>
Wed, 29 Jan 2003 19:24:10 +0000 (19:24 +0000)
28 files changed:
action.c
cfg.lex
cfg.y
comp_defs.h
config.h
data_lump.h
fifo_server.c
fifo_server.h
globals.h
main.c
modules/tm/sip_msg.c
modules/tm/t_lookup.c
modules/tm/uac.c
msg_translator.c
parser/msg_parser.c
parser/msg_parser.h
parser/parse_fline.c
parser/parse_fline.h
parser/parse_hostport.c
parser/parse_uri.c
parser/parse_via.c
receive.c
route.c
route_struct.c
route_struct.h
tcp_conn.h
udp_server.c
ut.h

index 4f3b083..e51023b 100644 (file)
--- a/action.c
+++ b/action.c
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * History:
+ * ---------
+ * 2003-01-29 removed scratchpad (jiri)
  */
 
 
-
+#include "comp_defs.h"
 
 #include "action.h"
 #include "config.h"
@@ -180,7 +184,11 @@ int do_action(struct action* a, struct sip_msg* msg)
                                        /*udp*/
                                        send_sock=get_send_socket(to, PROTO_UDP);
                                        if (send_sock!=0){
+#ifdef SCRATCH
                                                ret=udp_send(send_sock, msg->orig, msg->len, to);
+#else
+                                               ret=udp_send(send_sock, msg->buf, msg->len, to);
+#endif
                                        }else{
                                                ret=-1;
                                        }
@@ -188,7 +196,11 @@ int do_action(struct action* a, struct sip_msg* msg)
 #ifdef USE_TCP
                                        else{
                                        /*tcp*/
+#ifdef SCRATCH
                                        ret=tcp_send(msg->orig, msg->len, to, 0);
+#else
+                                       ret=tcp_send(msg->buf, msg->len, to, 0);
+#endif
                                }
 #endif
                        }
diff --git a/cfg.lex b/cfg.lex
index 3599558..601702f 100644 (file)
--- a/cfg.lex
+++ b/cfg.lex
@@ -28,6 +28,7 @@
  *
  * History:
  * -------
+ * 2001-01-29 src_port added (jiri)
  * 2001-01-23 mhomed added (jiri)
  */
 
@@ -106,6 +107,7 @@ MAX_LEN                     "max_len"
 METHOD method
 URI            uri
 SRCIP  src_ip
+SRCPORT        src_port
 DSTIP  dst_ip
 MYSELF myself
 /* operators */
@@ -218,6 +220,7 @@ EAT_ABLE    [\ \t\b\r]
 <INITIAL>{METHOD}      { count(); yylval.strval=yytext; return METHOD; }
 <INITIAL>{URI} { count(); yylval.strval=yytext; return URI; }
 <INITIAL>{SRCIP}       { count(); yylval.strval=yytext; return SRCIP; }
+<INITIAL>{SRCPORT}     { count(); yylval.strval=yytext; return SRCPORT; }
 <INITIAL>{DSTIP}       { count(); yylval.strval=yytext; return DSTIP; }
 <INITIAL>{MYSELF}      { count(); yylval.strval=yytext; return MYSELF; }
 
diff --git a/cfg.y b/cfg.y
index d4790b9..7843653 100644 (file)
--- a/cfg.y
+++ b/cfg.y
@@ -28,6 +28,7 @@
  *
  * History:
  * ---------
+ * 2003-01-29 src_port added (jiri)
  * 2003-01-23 mhomed added (jiri)
  */
 
@@ -123,6 +124,7 @@ struct id_list* lst_tmp;
 %token METHOD
 %token URI
 %token SRCIP
+%token SRCPORT
 %token DSTIP
 %token MYSELF
 
@@ -524,6 +526,10 @@ exp_elem:  METHOD EQUAL_T STRING   {$$= mk_elem(   EQUAL_OP, STRING_ST,
                | URI error     { $$=0; yyerror("invalid operator,"
                                                                        " == or =~ expected");
                                        }
+               | SRCPORT EQUAL_T NUMBER        { $$=mk_elem(   EQUAL_OP, NUMBER_ST,
+                                                                                               SRCPORT_O, (void *) $3 ); }
+               | SRCPORT EQUAL_T error { $$=0; yyerror("number expected"); }
+               | SRCPORT error { $$=0; yyerror("equation operator expected"); }
                | SRCIP EQUAL_T ipnet   { $$=mk_elem(   EQUAL_OP, NET_ST,
                                                                                                SRCIP_O, $3);
                                                                }
index 77203d1..8a4978f 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/* compatibility defs for emergency roll-back if things do not work */
+/* compatibility defs for emergency roll-back if things do not work ;
+ * if that happens:
+ * a) define PRESERVE_ZT (affects most of parser)
+ * b) define DONT_REMOVE_ZT (affects first line)
+ * c) define SCRATCH
+ * d) undefine REMOVE_ALL_ZT (affects via)
+ */
 
 
 #ifndef _COMP_DEFS_H
  */
 #undef PRESERVE_ZT
 
+/* go one step further and remove ZT from first line too */
+#undef DONT_REMOVE_ZT
+
+/* make it all -- move ZT away (Via) */
+#define REMOVE_ALL_ZT
+
+/* don't use scratchpad  anymore */
+#undef SCRATCH
+
 
 /* ------------------------------------------------------ */
 /* don't touch this -- that's helper macros depending on
 #      define SET_ZT(_ch)
 #endif
 
+#ifdef REMOVE_ALL_ZT
+#      define VIA_ZT(_ch)
+#else
+#      define VIA_ZT(ch) (_ch)='\0'
+#endif
+
 #endif
index 4a72d79..bfbabd1 100644 (file)
--- a/config.h
+++ b/config.h
 #define MAX_BRANCH_PARAM_LEN  (MCOOKIE_LEN+48)
 
 
+/* maximum path length */
+#define PATH_MAX_GUESS 1024
+
+
 #endif
index 1b57cd3..7e4cccd 100644 (file)
@@ -25,6 +25,8 @@
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * 2003-01-29 s/int/enum ... more convenient for gdb (jiri)
  */
 
 
 #define data_lump_h
 
 
-enum { LUMP_NOP=0, LUMP_DEL, LUMP_ADD };
-enum { LUMPFLAG_NONE=0, LUMPFLAG_DUPED=1, LUMPFLAG_SHMEM=2 };
+enum lump_op { LUMP_NOP=0, LUMP_DEL, LUMP_ADD };
+enum lump_flag { LUMPFLAG_NONE=0, LUMPFLAG_DUPED=1, LUMPFLAG_SHMEM=2 };
 
 struct lump{
        int type; /* VIA, OTHER, UNSPEC(=0), ... */
-       int op;   /* DEL, ADD, NOP, UNSPEC(=0) */
+       enum lump_op op;   /* DEL, ADD, NOP, UNSPEC(=0) */
        
        union{
                int offset; /* used for DEL, MODIFY */
@@ -53,7 +55,7 @@ struct lump{
        
        struct lump* next;
 
-       int flags; /* additional hints for use from TM's shmem */
+       enum lump_flag flags; /* additional hints for use from TM's shmem */
 };
 
 /*
index d7ed646..d9708a7 100644 (file)
  *
  * File test/transaction.fifo illustrates example of use
  * of t_uac command (part of TM module).
+ *
+ * History:
+ * --------
+ * 2003-01-29 new built-in fifo commands: arg and pwd (jiri)
  */
 
 
+#include <limits.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <unistd.h>
@@ -574,10 +579,63 @@ static int print_version_cmd( FILE *stream, char *response_file )
        if (response_file) {
                fifo_reply(response_file, "200 ok\n" SERVER_HDR CRLF );
        } else {
-               LOG(L_ERR, "ERROR: no file for print_version_cmd\n");
+               LOG(L_ERR, "ERROR: no file for %s\n", "print_version_cmd" );
+       }
+       return 1;
+}
+
+static int pwd_cmd( FILE *stream, char *response_file )
+{
+       char *cwd_buf;
+       int max_len;
+
+       if (!response_file) {
+               LOG(L_ERR, "ERROR: no file for %s\n", "pwd_cmd" );
+               return 1;
+       }
+
+       max_len=pathmax();
+       cwd_buf=pkg_malloc(max_len);
+       if (!cwd_buf) {
+               LOG(L_ERR, "ERROR: pwd_cmd: no cwd pkg mem\n");
+               fifo_reply(response_file, "500 no memory\n");
+               return 1;
+       }
+
+       if (getcwd(cwd_buf, max_len)) {
+               fifo_reply(response_file, "200 ok\n%s\n", cwd_buf );
+       } else {
+               fifo_reply(response_file, "500 getcwd failed\n" );
+       }
+
+       pkg_free(cwd_buf);
+       return 1;
+}
+
+static int arg_cmd( FILE *stream, char *response_file )
+{
+       FILE *reply_pipe;
+       int p;
+
+       if (response_file==0 || *response_file==0 ) {
+                LOG(L_ERR, "ERROR: ps_fifo_cmd: null file\n");
+               return -1;
+       }
+       reply_pipe=open_reply_pipe(response_file);
+       if (reply_pipe==NULL) {
+               LOG(L_ERR, "ERROR: ps_fifo_cmd: opening reply pipe (%s) failed\n",
+                       response_file );
+               return -1;
        }
+
+       fputs( "200 ok\n", reply_pipe);
+       for (p=0; p<my_argc;p++) 
+                       fprintf( reply_pipe, "%s\n", my_argv[p] );
+                       
+       fclose(reply_pipe);
        return 1;
 }
+
        
 
 /* diagnostic and hello-world FIFO command */
@@ -688,6 +746,14 @@ int register_core_fifo()
                LOG(L_CRIT, "unable to register '%s' FIFO cmd\n", FIFO_VERSION);
                return -1;
        }
+       if (register_fifo_cmd(pwd_cmd, FIFO_PWD, 0)<0) {
+               LOG(L_CRIT, "unable to register '%s' FIFO cmd\n", FIFO_PWD);
+               return -1;
+       }
+       if (register_fifo_cmd(arg_cmd, FIFO_ARG, 0)<0) {
+               LOG(L_CRIT, "unable to register '%s' FIFO cmd\n", FIFO_ARG);
+               return -1;
+       }
        if (register_fifo_cmd(which_fifo_cmd, FIFO_WHICH, 0)<0) {
                LOG(L_CRIT, "unable to register '%s' FIFO cmd\n", FIFO_WHICH);
                return -1;
index 1016424..43540d2 100644 (file)
 #define FIFO_WHICH "which"
 /* print server's process table */
 #define FIFO_PS "ps"
+/* print server's command line arguments */
+#define FIFO_ARG "arg"
+/* print server's working directory */
+#define FIFO_PWD "pwd"
 
 #define MAX_CTIME_LEN 128
 
index 748aace..d898c74 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -116,4 +116,8 @@ extern int memlog;
 /* looking up outbound interface ? */
 extern int mhomed;
 
+/* command-line arguments */
+extern int my_argc;
+extern char **my_argv;
+
 #endif
diff --git a/main.c b/main.c
index 312d9ae..75158c0 100644 (file)
--- a/main.c
+++ b/main.c
@@ -26,6 +26,7 @@
  *
  * History:
  * -------
+ * 2002-01-29 argc/argv globalized via my_{argc|argv} (jiri)
  * 2001-01-23 mhomed added (jiri)
  *
  */
@@ -323,6 +324,10 @@ int cfg_errors=0;
 /* shared memory (in MB) */
 unsigned int shm_mem_size=SHM_MEM_SIZE * 1024 * 1024;
 
+/* export command-line to anywhere else */
+int my_argc;
+char **my_argv;
+
 #define MAX_FD 32 /* maximum number of inherited open file descriptors,
                    (normally it shouldn't  be bigger  than 3) */
 
@@ -1059,6 +1064,7 @@ int main(int argc, char** argv)
        /*init*/
        port_no_str_len=0;
        ret=-1;
+       my_argc=argc; my_argv=argv;
        
        /* added by jku: add exit handler */
        if (signal(SIGINT, sig_usr) == SIG_ERR ) {
index 8477e67..007fd31 100644 (file)
@@ -37,6 +37,7 @@
  *
  * History:
  * --------
+ * 2003-01-29 - scratchpad removed (jiri)
  * 2003-01-23 - msg_cloner clones msg->from->parsed too (janakj)
  */
 
@@ -276,10 +277,17 @@ struct sip_msg*  sip_msg_cloner( struct sip_msg *org_msg )
                p += ROUND4(org_msg->new_uri.len);
        }
        /* message buffers(org and scratch pad) */
+#ifdef SCRATCH
        memcpy( p , org_msg->orig , org_msg->len);
        /* ZT to be safer */
        *(p+org_msg->len)=0;
        new_msg->orig = new_msg->buf = p;
+#else
+       memcpy( p , org_msg->buf, org_msg->len);
+       /* ZT to be safer */
+       *(p+org_msg->len)=0;
+       new_msg->buf = p;
+#endif
        p += ROUND4(new_msg->len+1);
        /* unparsed and eoh pointer */
        new_msg->unparsed = translate_pointer(new_msg->buf ,org_msg->buf,
index 6828714..57cad82 100644 (file)
@@ -51,6 +51,7 @@
  *
  * History:
  * ----------
+ * 2003-01-28 scratchpad removed (jiri)
  * 2003-01-27 next baby-step to removing ZT - PRESERVE_ZT (jiri)
  * 2003-01-23 options for disabling r-uri matching introduced (jiri)
  */
 #include "t_hooks.h"
 #include "t_lookup.h"
 
+#define EQ_VIA_LEN(_via)\
+       ( (p_msg->via1->bsize-(p_msg->_via->name.s-(p_msg->_via->hdr.s+p_msg->_via->hdr.len)))==\
+               (t_msg->via1->bsize-(t_msg->_via->name.s-(t_msg->_via->hdr.s+t_msg->_via->hdr.len))) )
+
+
 
 #define EQ_LEN(_hf) (t_msg->_hf->body.len==p_msg->_hf->body.len)
+#define EQ_REQ_URI_LEN\
+       (p_msg->first_line.u.request.uri.len==t_msg->first_line.u.request.uri.len)
+
+#ifdef SCRATCH
 #define EQ_STR(_hf) (memcmp(t_msg->_hf->body.s,\
        translate_pointer(p_msg->orig,p_msg->buf,p_msg->_hf->body.s), \
        p_msg->_hf->body.len)==0)
-#define EQ_REQ_URI_LEN\
-       (p_msg->first_line.u.request.uri.len==t_msg->first_line.u.request.uri.len)
 #define EQ_REQ_URI_STR\
        ( memcmp( t_msg->first_line.u.request.uri.s,\
        translate_pointer(p_msg->orig,p_msg->buf,p_msg->first_line.u.request.uri.s),\
        p_msg->first_line.u.request.uri.len)==0)
-#define EQ_VIA_LEN(_via)\
-       ( (p_msg->via1->bsize-(p_msg->_via->name.s-(p_msg->_via->hdr.s+p_msg->_via->hdr.len)))==\
-       (t_msg->via1->bsize-(t_msg->_via->name.s-(t_msg->_via->hdr.s+t_msg->_via->hdr.len))) )
-
 #define EQ_VIA_STR(_via)\
        ( memcmp( t_msg->_via->name.s,\
         translate_pointer(p_msg->orig,p_msg->buf,p_msg->_via->name.s),\
         (t_msg->via1->bsize-(t_msg->_via->name.s-(t_msg->_via->hdr.s+t_msg->_via->hdr.len)))\
        )==0 )
+#else /* SCRATCH */
+#define EQ_STR(_hf) (memcmp(t_msg->_hf->body.s,\
+       p_msg->_hf->body.s, \
+       p_msg->_hf->body.len)==0)
+#define EQ_REQ_URI_STR\
+       ( memcmp( t_msg->first_line.u.request.uri.s,\
+       p_msg->first_line.u.request.uri.s,\
+       p_msg->first_line.u.request.uri.len)==0)
+#define EQ_VIA_STR(_via)\
+       ( memcmp( t_msg->_via->name.s,\
+        p_msg->_via->name.s,\
+        (t_msg->via1->bsize-(t_msg->_via->name.s-(t_msg->_via->hdr.s+t_msg->_via->hdr.len)))\
+       )==0 )
+#endif /* SCRATCH */
+
+
 
 #ifdef PRESERVE_ZT
 #define HF_LEN(_hf) ((_hf)->body.s+(_hf)->body.len-(_hf)->name.s)
index 1e64bca..d534d71 100644 (file)
  *
  * History:
  * --------
+ * 2003-01-29 scratchpad removed (jiri)
  * 2003-01-27 fifo:t_uac_dlg completed (jiri)
  * 2003-01-23 t_uac_dlg now uses get_out_socket (jiri)
  */
 
 
+#include "../../comp_defs.h"
 #include "defs.h"
 
 
@@ -1051,7 +1053,10 @@ int fifo_uac_dlg( FILE *stream, char *response_file )
        /* use SIP parser to look at what is in the FIFO request */
        memset(&faked_msg, 0, sizeof(struct sip_msg));
        faked_msg.len=header.len; 
-       faked_msg.buf=faked_msg.orig=faked_msg.unparsed=header_buf;
+       faked_msg.buf=faked_msg.unparsed=header_buf;
+#ifdef SCRATCH
+       faked_msg.orig=faked_msg.buf;
+#endif
        if (parse_headers(&faked_msg, HDR_EOH, 0)==-1 ) {
                        DBG("DEBUG: fifo_uac: parse_headers failed\n");
                        fifo_uac_error(response_file, 400, "HFs unparseable");
index 152bc78..1bb833b 100644 (file)
@@ -36,6 +36,7 @@
  *             modified via_builder params (andrei)
  * 2003-01-27 more rport fixes (make use of new via_param->start)  (andrei)
  * 2003-01-27 next baby-step to removing ZT - PRESERVE_ZT (jiri)
+ * 2003-01-29 scrathcpad removed (jiri)
  *
  */
 
                (_dest) += (_len) ;\
        }while(0);
 
+#ifdef SCRATCH
 #define append_str_trans(_dest,_src,_len,_msg) \
        append_str( (_dest), (_msg)->orig+((_src)-(_msg)->buf) , (_len) );
+#else
+#define append_str_trans(_dest,_src,_len,_msg) \
+       append_str( (_dest), (_src), (_len) );
+#endif
 
 extern char version[];
 extern int version_len;
 
 
 
+#ifndef REMOVE_ALL_ZT
 /* checks if ip is in host(name) and ?host(ip)=name?
  * ip must be in network byte order!
  *  resolver = DO_DNS | DO_REV_DNS; if 0 no dns check is made
  * return 0 if equal */
-int check_address(struct ip_addr* ip, char *name, int resolver)
+static int check_address(struct ip_addr* ip, char *name, int resolver)
 {
        struct hostent* he;
        int i;
@@ -90,19 +97,22 @@ int check_address(struct ip_addr* ip, char *name, int resolver)
        /* maybe we are lucky and name it's an ip */
        s=ip_addr2a(ip);
        if (s){
-               DBG("check_address(%s, %s, %d)\n", s, name, resolver);
+               DBG("check_address(%s, %.*s, %d)\n", 
+                       s, name->len, name->s, resolver);
+
        #ifdef USE_IPV6
                if ((ip->af==AF_INET6) && (strcasecmp(name, s)==0))
                                return 0;
                else
        #endif
-                       if (strcmp(name, s)==0)
+
+                       if (strcmp(name, s)==0) 
                                return 0;
        }else{
                LOG(L_CRIT, "check_address: BUG: could not convert ip address\n");
                return -1;
        }
-               
+
        if (resolver&DO_DNS){
                DBG("check_address: doing dns lookup\n");
                /* try all names ips */
@@ -127,6 +137,65 @@ int check_address(struct ip_addr* ip, char *name, int resolver)
        }
        return -1;
 }
+#endif
+
+
+
+/* checks if ip is in host(name) and ?host(ip)=name?
+ * ip must be in network byte order!
+ *  resolver = DO_DNS | DO_REV_DNS; if 0 no dns check is made
+ * return 0 if equal */
+static int check_via_address(struct ip_addr* ip, str *name, 
+                               unsigned short port, int resolver)
+{
+       struct hostent* he;
+       int i;
+       char* s;
+
+       /* maybe we are lucky and name it's an ip */
+       s=ip_addr2a(ip);
+       if (s){
+               DBG("check_address(%s, %.*s, %d)\n", 
+                       s, name->len, name->s, resolver);
+
+       #ifdef USE_IPV6
+               if ((ip->af==AF_INET6) && (strncasecmp(name->s, s, name->len)==0))
+                       return 0;
+               else
+       #endif
+
+                       if (strncmp(name->s, s, name->len)==0) 
+                               return 0;
+       }else{
+               LOG(L_CRIT, "check_address: BUG: could not convert ip address\n");
+               return -1;
+       }
+
+       if (port==0) port=SIP_PORT;
+       if (resolver&DO_DNS){
+               DBG("check_address: doing dns lookup\n");
+               /* try all names ips */
+               he=sip_resolvehost(name, &port);
+               if (he && ip->af==he->h_addrtype){
+                       for(i=0;he && he->h_addr_list[i];i++){
+                               if ( memcmp(&he->h_addr_list[i], ip->u.addr, ip->len)==0)
+                                       return 0;
+                       }
+               }
+       }
+       if (resolver&DO_REV_DNS){
+               DBG("check_address: doing rev. dns lookup\n");
+               /* try reverse dns */
+               he=rev_resolvehost(ip);
+               if (he && (strncmp(he->h_name, name->s, name->len)==0))
+                       return 0;
+               for (i=0; he && he->h_aliases[i];i++){
+                       if (strncmp(he->h_aliases[i],name->s, name->len)==0)
+                               return 0;
+               }
+       }
+       return -1;
+}
 
 
 static char * warning_builder( struct sip_msg *msg, unsigned int *returned_len)
@@ -463,9 +532,13 @@ char * build_req_buf_from_sip_req( struct sip_msg* msg,
        char* received_buf;
        char* rport_buf;
        char* new_buf;
+#ifdef SCRATCH
        char* orig;
+#endif
        char* buf;
+#ifndef REMOVE_ALL_ZT
        char  backup;
+#endif
        unsigned int offset, s_offset, size;
        struct lump* anchor;
        int r;
@@ -483,7 +556,9 @@ char * build_req_buf_from_sip_req( struct sip_msg* msg,
        extra_params.len=0;
        extra_params.s=0;
        uri_len=0;
+#ifdef SCRATCH
        orig=msg->orig;
+#endif
        buf=msg->buf;
        len=msg->len;
        received_len=0;
@@ -515,10 +590,15 @@ char * build_req_buf_from_sip_req( struct sip_msg* msg,
                goto error00;
        }
        /* check if received needs to be added */
+#ifdef REMOVE_ALL_ZT
+       r=check_via_address(&msg->rcv.src_ip, &msg->via1->host, 
+               msg->via1->port, received_dns);
+#else
        backup = msg->via1->host.s[msg->via1->host.len];
        msg->via1->host.s[msg->via1->host.len] = 0;
        r=check_address(&msg->rcv.src_ip, msg->via1->host.s, received_dns);
        msg->via1->host.s[msg->via1->host.len] = backup;
+#endif
        if (r!=0){
                if ((received_buf=received_builder(msg,&received_len))==0){
                        LOG(L_ERR, "ERROR: build_req_buf_from_sip_req:"
@@ -591,7 +671,11 @@ char * build_req_buf_from_sip_req( struct sip_msg* msg,
        if (msg->new_uri.s){
                /* copy message up to uri */
                size=msg->first_line.u.request.uri.s-buf;
+#ifdef SCRATCH
                memcpy(new_buf, orig, size);
+#else
+               memcpy(new_buf, buf, size);
+#endif
                offset+=size;
                s_offset+=size;
                /* add our uri */
@@ -600,10 +684,17 @@ char * build_req_buf_from_sip_req( struct sip_msg* msg,
                s_offset+=msg->first_line.u.request.uri.len; /* skip original uri */
        }
        new_buf[new_len]=0;
+#ifdef SCRATCH
        /* copy msg adding/removing lumps */
        process_lumps(msg->add_rm, new_buf, &offset, orig, &s_offset);
        /* copy the rest of the message */
        memcpy(new_buf+offset, orig+s_offset, len-s_offset);
+#else
+       /* copy msg adding/removing lumps */
+       process_lumps(msg->add_rm, new_buf, &offset, buf, &s_offset);
+       /* copy the rest of the message */
+       memcpy(new_buf+offset, buf+s_offset, len-s_offset);
+#endif
        new_buf[new_len]=0;
 
 #ifdef DBG_MSG_QA
@@ -637,11 +728,15 @@ char * build_res_buf_from_sip_res( struct sip_msg* msg,
        unsigned int new_len, via_len;
        char* new_buf;
        unsigned offset, s_offset, via_offset;
+#ifdef SCRATCH
        char* orig;
+#endif
        char* buf;
        unsigned int len;
 
+#ifdef SCRATCH
        orig=msg->orig;
+#endif
        buf=msg->buf;
        len=msg->len;
        new_buf=0;
@@ -685,9 +780,21 @@ char * build_res_buf_from_sip_res( struct sip_msg* msg,
        }
        new_buf[new_len]=0; /* debug: print the message */
        offset=s_offset=0;
-       process_lumps(msg->repl_add_rm, new_buf, &offset, orig, &s_offset);
+       process_lumps(msg->repl_add_rm, new_buf, &offset, 
+#ifdef SCRATCH
+               orig, 
+#else
+               buf,
+#endif
+               &s_offset);
        /* copy the rest of the message */
-       memcpy(new_buf+offset,orig+s_offset, len-s_offset);
+       memcpy(new_buf+offset,
+#ifdef SCRATCH
+               orig+s_offset, 
+#else
+               buf+s_offset, 
+#endif
+               len-s_offset);
         /* send it! */
        DBG(" copied size: orig:%d, new: %d, rest: %d\n",
                        s_offset, offset,
@@ -721,6 +828,7 @@ char * build_res_buf_from_sip_req( unsigned int code, char *text,
        unsigned int      delete_len;
        char              *warning;
        unsigned int      warning_len;
+       unsigned int      text_len;
        int r;
 #ifndef PRESERVE_ZT
        char *after_body;
@@ -736,6 +844,8 @@ char * build_res_buf_from_sip_req( unsigned int code, char *text,
        /* make -Wall happy */
        warning=0;
 
+       text_len=strlen(text);
+
        /* force parsing all headers -- we want to return all
        Via's in the reply and they may be scattered down to the
        end of header (non-block Vias are a really poor property
@@ -749,7 +859,12 @@ char * build_res_buf_from_sip_req( unsigned int code, char *text,
        /* check if received needs to be added */
        backup = msg->via1->host.s[msg->via1->host.len];
        msg->via1->host.s[msg->via1->host.len] = 0;
+#ifdef REMOVE_ALL_ZT
+       r=check_via_address(&msg->rcv.src_ip, &msg->via1->host, 
+               msg->via1->port, received_dns);
+#else
        r=check_address(&msg->rcv.src_ip, msg->via1->host.s, received_dns);
+#endif
        msg->via1->host.s[msg->via1->host.len] = backup;
        if (r!=0) {
                if ((received_buf=received_builder(msg,&received_len))==0) {
@@ -772,7 +887,7 @@ char * build_res_buf_from_sip_req( unsigned int code, char *text,
        len = 0;
        /* first line */
        len += SIP_VERSION_LEN + 1/*space*/ + 3/*code*/ + 1/*space*/ +
-               strlen(text) + CRLF_LEN/*new line*/;
+               text_len + CRLF_LEN/*new line*/;
        /*headers that will be copied (TO, FROM, CSEQ,CALLID,VIA)*/
        for ( hdr=msg->headers ; hdr ; hdr=hdr->next ) {
                if (hdr->type==HDR_TO) {
@@ -843,8 +958,8 @@ char * build_res_buf_from_sip_req( unsigned int code, char *text,
                *(p+i) = '0' + foo - ( foo/10 )*10;
        p += 3;
        *(p++) = ' ' ;
-       memcpy( p , text , strlen(text) );
-       p += strlen(text);
+       memcpy( p , text , text_len );
+       p += text_len;
        memcpy( p, CRLF, CRLF_LEN );
        p+=CRLF_LEN;
        /* headers*/
index 985e3c6..bc21d02 100644 (file)
@@ -29,6 +29,7 @@
  *
  * History:
  * ---------
+ * 2003-01-29 scrathcpad removed (jiri)
  * 2003-01-27 next baby-step to removing ZT - PRESERVE_ZT (jiri)
  */
 
@@ -404,8 +405,10 @@ int parse_headers(struct sip_msg* msg, int flags, int next)
                        msg->last_header=hf;
                }
 #ifdef EXTRA_DEBUG
-               DBG("header field type %d, name=<%s>, body=<%s>\n",
-                       hf->type, hf->name.s, hf->body.s);
+               DBG("header field type %d, name=<%.*s>, body=<%.*s>\n",
+                       hf->type, 
+                       hf->name.len, hf->name.s, 
+                       hf->body.len, hf->body.s);
 #endif
                tmp=rest;
        }
@@ -454,16 +457,22 @@ int parse_msg(char* buf, unsigned int len, struct sip_msg* msg)
                        break;
                case SIP_REQUEST:
                        DBG("SIP Request:\n");
-                       DBG(" method:  <%s>\n",fl->u.request.method.s);
-                       DBG(" uri:     <%s>\n",fl->u.request.uri.s);
-                       DBG(" version: <%s>\n",fl->u.request.version.s);
+                       DBG(" method:  <%.*s>\n",fl->u.request.method.len,
+                               fl->u.request.method.s);
+                       DBG(" uri:     <%.*s>\n",fl->u.request.uri.len,
+                               fl->u.request.uri.s);
+                       DBG(" version: <%.*s>\n",fl->u.request.version.len,
+                               fl->u.request.version.s);
                        flags=HDR_VIA;
                        break;
                case SIP_REPLY:
                        DBG("SIP Reply  (status):\n");
-                       DBG(" version: <%s>\n",fl->u.reply.version.s);
-                       DBG(" status:  <%s>\n",fl->u.reply.status.s);
-                       DBG(" reason:  <%s>\n",fl->u.reply.reason.s);
+                       DBG(" version: <%.*s>\n",fl->u.reply.version.len,
+                                       fl->u.reply.version.s);
+                       DBG(" status:  <%.*s>\n", fl->u.reply.status.len,
+                                       fl->u.reply.status.s);
+                       DBG(" reason:  <%.*s>\n", fl->u.reply.reason.len,
+                                       fl->u.reply.reason.s);
                        /* flags=HDR_VIA | HDR_VIA2; */
                        /* we don't try to parse VIA2 for local messages; -Jiri */
                        flags=HDR_VIA;
@@ -481,21 +490,42 @@ int parse_msg(char* buf, unsigned int len, struct sip_msg* msg)
 #ifdef EXTRA_DEBUG
        /* dump parsed data */
        if (msg->via1){
-               DBG(" first  via: <%s/%s/%s> <%s:%s(%d)>",
-                       msg->via1->name.s, msg->via1->version.s,
-                       msg->via1->transport.s, msg->via1->host.s,
-                       msg->via1->port_str.s, msg->via1->port);
-               if (msg->via1->params.s)  DBG(";<%s>", msg->via1->params.s);
-               if (msg->via1->comment.s) DBG(" <%s>", msg->via1->comment.s);
+               DBG(" first  via: <%.*s/%.*s/%.*s> <%.*s:%.*s(%d)>",
+                       msg->via1->name.len, 
+                       msg->via1->name.s, 
+                       msg->via1->version.len,
+                       msg->via1->version.s,
+                       msg->via1->transport.len 
+                       msg->via1->transport.s, 
+                       msg->via1->host.len,
+                       msg->via1->host.s,
+                       msg->via1->port_str.len, 
+                       msg->via1->port_str.s, 
+                       msg->via1->port);
+               if (msg->via1->params.s)  DBG(";<%.*s>", 
+                               msg->via1->params.len, msg->via1->params.s);
+               if (msg->via1->comment.s) 
+                               DBG(" <%.*s>", 
+                                       msg->via1->comment.len, msg->via1->comment.s);
                DBG ("\n");
        }
        if (msg->via2){
-               DBG(" first  via: <%s/%s/%s> <%s:%s(%d)>",
-                       msg->via2->name.s, msg->via2->version.s,
-                       msg->via2->transport.s, msg->via2->host.s,
-                       msg->via2->port_str.s, msg->via2->port);
-               if (msg->via2->params.s)  DBG(";<%s>", msg->via2->params.s);
-               if (msg->via2->comment.s) DBG(" <%s>", msg->via2->comment.s);
+               DBG(" first  via: <%.*s/%.*s/%.*s> <%.*s:%.*s(%d)>",
+                       msg->via2->name.len, 
+                       msg->via2->name.s, 
+                       msg->via2->version.len,
+                       msg->via2->version.s,
+                       msg->via2->transport.len, 
+                       msg->via2->transport.s, 
+                       msg->via2->host.len,
+                       msg->via2->host.s,
+                       msg->via2->port_str.len, 
+                       msg->via2->port_str.s, 
+                       msg->via2->port);
+               if (msg->via2->params.s)  DBG(";<%.*s>", 
+                               msg->via2->params.len, msg->via2->params.s);
+               if (msg->via2->comment.s) DBG(" <%.*s>", 
+                               msg->via2->comment.len, msg->via2->comment.s);
                DBG ("\n");
        }
 #endif
@@ -509,7 +539,11 @@ int parse_msg(char* buf, unsigned int len, struct sip_msg* msg)
        
 error:
        /* more debugging, msg->orig is/should be null terminated*/
+#ifdef SCRATCH
        LOG(L_ERR, "ERROR: parse_msg: message=<%.*s>\n", (int)msg->len, msg->orig);
+#else
+       LOG(L_ERR, "ERROR: parse_msg: message=<%.*s>\n", (int)msg->len, msg->buf);
+#endif
        return -1;
 }
 
@@ -535,7 +569,9 @@ void free_sip_msg(struct sip_msg* msg)
        if (msg->add_rm)      free_lump_list(msg->add_rm);
        if (msg->repl_add_rm) free_lump_list(msg->repl_add_rm);
        if (msg->reply_lump)   free_reply_lump(msg->reply_lump);
+#ifdef SCRATCH
        pkg_free(msg->orig);
+#endif
        /* don't free anymore -- now a pointer to a static buffer */
 #      ifdef DYN_BUF
        pkg_free(msg->buf); 
index 4eec596..0777de4 100644 (file)
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * 2003-01-28 removed scratchpad (jiri)
  */
 
 
 #ifndef msg_parser_h
 #define msg_parser_h
 
+#include "../comp_defs.h"
 #include "../str.h"
 #include "../data_lump.h"
 #include "../flags.h"
@@ -119,8 +122,10 @@ struct sip_msg {
        char* unparsed;   /* here we stopped parsing*/
        
        struct receive_info rcv; /* source & dest ip, ports, proto a.s.o*/
-       
+
+#ifdef SCRATCH 
        char* orig;       /* original message copy */
+#endif
        char* buf;        /* scratch pad, holds a modfied message,
                                           *  via, etc. point into it */
        unsigned int len; /* message len (orig) */
index fcb830e..7e81bf1 100644 (file)
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * History:
+ * ---------
+ * 2003-01-28: removed 0-terminators from first line (jiri)
  */
 
 
+#include "../comp_defs.h"
 #include "../dprint.h"
 #include "msg_parser.h"
 #include "parser_f.h"
@@ -56,7 +61,7 @@ enum { START,
 };
 
 
-
+#ifdef _CURRENTLY_UNUSED
 char* parse_fline(char* buffer, char* end, struct msg_start* fl)
 {
        char* tmp;
@@ -1120,6 +1125,7 @@ char* parse_fline(char* buffer, char* end, struct msg_start* fl)
                }
        }
 skip:
+       fl->len=tmp-buf;
        if (fl->type==SIP_REPLY){
                fl->u.reply.statuscode=stat;
                /* fl->u.reply.statusclass=stat/100; */
@@ -1132,7 +1138,7 @@ error:
        return tmp;
 }
 
-
+#endif /* currently unused */
 
 /* parses the first line, returns pointer to  next line  & fills fl;
    also  modifies buffer (to avoid extra copy ops) */
@@ -1212,7 +1218,9 @@ char* parse_first_line(char* buffer, unsigned int len, struct msg_start * fl)
           tmp points at space after; go ahead */
 
        fl->u.request.method.s=buffer;  /* store ptr to first token */
+#ifdef DONT_REMOVE_ZT
        (*tmp)=0;                       /* mark the 1st token end */
+#endif
        second=tmp+1;                   /* jump to second token */
        offset=second-buffer;
 
@@ -1229,15 +1237,17 @@ char* parse_first_line(char* buffer, unsigned int len, struct msg_start * fl)
        if ((third==tmp)||(tmp>=end)){
                goto error;
        }
+#ifdef DONT_REMOVE_ZT
        *tmp=0; /* mark the end of the token */
+#endif
        fl->u.request.uri.s=second;
        fl->u.request.uri.len=tmp-second;
 
        /* jku: parse status code */
        if (fl->type==SIP_REPLY) {
                if (fl->u.request.uri.len!=3) {
-                       LOG(L_INFO, "ERROR:parse_first_line: len(status code)!=3: %s\n",
-                               second );
+                       LOG(L_INFO, "ERROR:parse_first_line: len(status code)!=3: %.*s\n",
+                               fl->u.request.uri.len, second );
                        goto error;
                }
                s1=*second; s2=*(second+1);s3=*(second+2);
@@ -1246,8 +1256,8 @@ char* parse_first_line(char* buffer, unsigned int len, struct msg_start * fl)
                    s3>='0' && s3<='9' ) {
                        fl->u.reply.statuscode=(s1-'0')*100+10*(s2-'0')+(s3-'0');
                } else {
-                       LOG(L_INFO, "ERROR:parse_first_line: status_code non-numerical: %s\n",
-                               second );
+                       LOG(L_INFO, "ERROR:parse_first_line: status_code non-numerical: %.*s\n",
+                               fl->u.request.uri.len, second );
                        goto error;
                }
        }
@@ -1277,9 +1287,12 @@ char* parse_first_line(char* buffer, unsigned int len, struct msg_start * fl)
        if (nl>=end){ /* no crlf in packet or only 1 line > invalid */
                goto error;
        }
+#ifdef DONT_REMOVE_ZT
        *tmp=0;
+#endif
        fl->u.request.version.s=third;
        fl->u.request.version.len=tmp-third;
+       fl->len=nl-buffer;
 
        return nl;
 
index 138f82b..a11e125 100644 (file)
@@ -55,6 +55,7 @@
 
 struct msg_start {
        int type;                         /* Type of the Message - Request/Response */
+       int len;                                                /* length including delimiter */
        union {
                struct {
                        str method;       /* Method string */
index da85d08..40c8a5f 100644 (file)
@@ -25,6 +25,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#ifdef _OBSOLETED
 
 #include "parse_hostport.h"
 #include <string.h>    /* strlen */
@@ -54,3 +55,5 @@ char* parse_hostport(char* buf, str* host, short int* port)
 
        return host->s;
 }
+
+#endif
index b3858d2..b4adfaa 100644 (file)
@@ -163,8 +163,8 @@ int parse_uri(char *buf, int len, struct sip_uri* uri)
        err=0;
        if (uri->port.s) uri->port_no=str2s(uri->port.s, uri->port.len, &err);
        if (err){
-               LOG(L_DBG, "ERROR: parse_uri: bad port number in sip uri: %s\n",
-                               uri->port.s);
+               LOG(L_DBG, "ERROR: parse_uri: bad port number in sip uri: %.*s\n",
+                               uri->port.len, uri->port.s);
                ser_error=ret=E_BAD_URI;
                return ret;
        }
index b3addd9..675ccec 100644 (file)
  *               by andrei
  *  2003-01-27  modified parse_via to set new via_param->start member and
  *               via->params.s (andrei)
+ *  2003-01-28  zero-terminations replaced with VIA_ZT (jiri)
  */
 
 
 
+#include "../comp_defs.h"
 #include <stdlib.h>
 #include <string.h>
 #include "../dprint.h"
@@ -127,7 +129,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                        case '\t':
                                switch(state){
                                        case FIN_HIDDEN:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                state=L_PARAM;
@@ -138,7 +140,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                        case FIN_RECEIVED:
                                        case FIN_RPORT:
                                        case FIN_I:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                state=L_VALUE;
@@ -152,7 +154,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                break;
                                        case GEN_PARAM:
                                        default:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=GEN_PARAM;
                                                param->name.len=tmp-param->name.s;
                                                state=L_VALUE;
@@ -163,7 +165,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                        case '\n':
                                switch(state){
                                        case FIN_HIDDEN:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                param->size=tmp-param->start; 
@@ -176,7 +178,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                        case FIN_RECEIVED:
                                        case FIN_I:
                                        case FIN_RPORT:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                param->size=tmp-param->start; 
@@ -196,7 +198,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                break;
                                        case GEN_PARAM:
                                        default:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=GEN_PARAM;
                                                saved_state=L_VALUE;
                                                param->name.len=tmp-param->name.s;
@@ -208,7 +210,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                        case '\r':
                                switch(state){
                                        case FIN_HIDDEN:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                param->size=tmp-param->start; 
@@ -221,7 +223,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                        case FIN_RECEIVED:
                                        case FIN_I:
                                        case FIN_RPORT:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                param->size=tmp-param->start; 
@@ -238,7 +240,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                goto end_via;
                                        case GEN_PARAM:
                                        default:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=GEN_PARAM;
                                                param->name.len=tmp-param->name.s;
                                                param->size=tmp-param->start; 
@@ -256,7 +258,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                        case FIN_RECEIVED:
                                        case FIN_RPORT:
                                        case FIN_I:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                state=F_VALUE;
@@ -273,7 +275,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                goto end_via;
                                        case GEN_PARAM:
                                        default:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=GEN_PARAM;
                                                param->name.len=tmp-param->name.s;
                                                state=F_VALUE;
@@ -284,7 +286,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                switch(state){
                                        case FIN_HIDDEN:
                                        case FIN_RPORT: /* rport can appear w/o a value */
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                state=F_PARAM;
@@ -304,7 +306,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                goto end_via;
                                        case GEN_PARAM:
                                        default:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=GEN_PARAM;
                                                param->name.len=tmp-param->name.s;
                                                state=F_PARAM;
@@ -315,7 +317,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                switch(state){
                                        case FIN_HIDDEN:
                                        case FIN_RPORT:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=state;
                                                param->name.len=tmp-param->name.s;
                                                state=F_VIA;
@@ -336,7 +338,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                goto end_via;
                                        case GEN_PARAM:
                                        default:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->type=GEN_PARAM;
                                                param->name.len=tmp-param->name.s;
                                                state=F_VIA;
@@ -719,7 +721,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                        case F_VALUE: /*eat space*/
                                                break; 
                                        case P_VALUE:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                state=L_PARAM;
                                                param->value.len=tmp-param->value.s;
                                                goto endofvalue;
@@ -746,7 +748,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                state=F_LF;
                                                break;
                                        case P_VALUE:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                saved_state=L_PARAM;
                                                state=F_LF;
                                                param->value.len=tmp-param->value.s;
@@ -774,7 +776,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                state=F_CR;
                                                break;
                                        case P_VALUE:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->value.len=tmp-param->value.s;
                                                saved_state=L_PARAM;
                                                state=F_CR;
@@ -812,12 +814,12 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                        case ';':
                                switch(state){
                                        case P_VALUE:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->value.len=tmp-param->value.s;
                                                state=F_PARAM;
                                                goto endofvalue;
                                        case F_VALUE:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->value.len=0;
                                                state=F_PARAM;
                                                goto endofvalue;
@@ -845,7 +847,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                        case ',':
                                switch(state){
                                        case P_VALUE:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                param->value.len=tmp-param->value.s;
                                                state=F_VIA;
                                                goto endofvalue;
@@ -876,7 +878,7 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
                                                param->value.s=tmp+1;
                                                break;
                                        case P_STRING:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                state=L_PARAM;
                                                param->value.len=tmp-param->value.s;
                                                goto endofvalue;
@@ -924,8 +926,8 @@ static /*inline*/ char* parse_via_param(char* p, char* end,
 normal_exit:
        *pstate=state;
        *psaved_state=saved_state;
-       DBG("Found param type %d, <%s> = <%s>; state=%d\n", param->type,
-                       param->name.s, param->value.s, state);
+       DBG("Found param type %d, <%.*s> = <%.*s>; state=%d\n", param->type,
+                       param->name.len, param->name.s, param->value.len, param->value.s, state);
        return tmp;
        
  end_via:
@@ -941,8 +943,8 @@ normal_exit:
        }
        *pstate=state;
        *psaved_state=saved_state;
-       DBG("Error on  param type %d, <%s>, state=%d, saved_state=%d\n",
-               param->type, param->name.s, state, saved_state);
+       DBG("Error on  param type %d, <%.*s>, state=%d, saved_state=%d\n",
+               param->type, param->name.len, param->name.s, state, saved_state);
 
  error:
        LOG(L_ERR, "error: parse_via_param\n");
@@ -982,24 +984,24 @@ parse_again:
                                        case F_PROTO:
                                                break;
                                        case FIN_UDP:
-                                               *tmp=0;  /* finished proto parsing */
+                                               VIA_ZT(*tmp); /* finished proto parsing */
                                                vb->transport.len=tmp-vb->transport.s;
                                                vb->proto=PROTO_UDP;
                                                state=F_HOST; /* start looking for host*/
                                                goto main_via;
                                        case FIN_TCP:
-                                               *tmp=0;  /* finished proto parsing */
+                                               VIA_ZT(*tmp); /* finished proto parsing */
                                                vb->transport.len=tmp-vb->transport.s;
                                                vb->proto=PROTO_TCP;
                                                state=F_HOST; /* start looking for host*/
                                                goto main_via;
                                        case FIN_SIP:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->name.len=tmp-vb->name.s;
                                                state=L_VER;
                                                break;
                                        case FIN_VER:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->version.len=tmp-vb->version.s;
                                                state=L_PROTO;
                                                break;
@@ -1025,27 +1027,27 @@ parse_again:
                                                state=F_LF;
                                                break;
                                        case FIN_UDP:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->transport.len=tmp-vb->transport.s;
                                                vb->proto=PROTO_UDP;
                                                state=F_LF;
                                                saved_state=F_HOST; /* start looking for host*/
                                                goto main_via;
                                        case FIN_TCP:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->transport.len=tmp-vb->transport.s;
                                                vb->proto=PROTO_TCP;
                                                state=F_LF;
                                                saved_state=F_HOST; /* start looking for host*/
                                                goto main_via;
                                        case FIN_SIP:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->name.len=tmp-vb->name.s;
                                                state=F_LF;
                                                saved_state=L_VER;
                                                break;
                                        case FIN_VER:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->version.len=tmp-vb->version.s;
                                                state=F_LF;
                                                saved_state=L_PROTO;
@@ -1074,27 +1076,27 @@ parse_again:
                                                state=F_CR;
                                                break;
                                        case FIN_UDP:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->transport.len=tmp-vb->transport.s;
                                                vb->proto=PROTO_UDP;
                                                state=F_CR;
                                                saved_state=F_HOST;
                                                goto main_via;
                                        case FIN_TCP:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->transport.len=tmp-vb->transport.s;
                                                vb->proto=PROTO_TCP;
                                                state=F_CR;
                                                saved_state=F_HOST;
                                                goto main_via;
                                        case FIN_SIP:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->name.len=tmp-vb->name.s;
                                                state=F_CR;
                                                saved_state=L_VER;
                                                break;
                                        case FIN_VER:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->version.len=tmp-vb->version.s;
                                                state=F_CR;
                                                saved_state=L_PROTO;
@@ -1114,12 +1116,12 @@ parse_again:
                        case '/':
                                switch(state){
                                        case FIN_SIP:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->name.len=tmp-vb->name.s;
                                                state=F_VER;
                                                break;
                                        case FIN_VER:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->version.len=tmp-vb->version.s;
                                                state=F_PROTO;
                                                break;
@@ -1292,7 +1294,7 @@ parse_again:
                                        case F_HOST:/*eat the spaces*/
                                                break;
                                        case P_HOST:
-                                                *tmp=0;/*mark end of host*/
+                                                VIA_ZT(*tmp);/*mark end of host*/
                                                 vb->host.len=tmp-vb->host.s;
                                                 state=L_PORT;
                                                 break;
@@ -1300,7 +1302,7 @@ parse_again:
                                        case F_PORT:
                                                break;
                                        case P_PORT:
-                                               *tmp=0; /*end of port */
+                                               VIA_ZT(*tmp); /*end of port */
                                                vb->port_str.len=tmp-vb->port_str.s;
                                                state=L_PARAM;
                                                break;
@@ -1320,7 +1322,7 @@ parse_again:
                                        case F_IP6HOST: /*eat the spaces*/
                                                break;
                                        case P_IP6HOST:
-                                               *tmp=0; /*mark end of host*/
+                                               VIA_ZT(*tmp); /*mark end of host*/
                                                vb->host.len=tmp-vb->host.s;
                                                state=L_PORT; 
                                                break;
@@ -1353,13 +1355,13 @@ parse_again:
                                                state=F_LF;
                                                break;
                                        case P_HOST:
-                                                *tmp=0;/*mark end of host*/
+                                                VIA_ZT(*tmp);/*mark end of host*/
                                                 vb->host.len=tmp-vb->host.s;
                                                 saved_state=L_PORT;
                                                 state=F_LF;
                                                 break;
                                        case P_PORT:
-                                               *tmp=0; /*end of port */
+                                               VIA_ZT(*tmp); /*end of port */
                                                vb->port_str.len=tmp-vb->port_str.s;
                                                saved_state=L_PARAM;
                                                state=F_LF;
@@ -1399,13 +1401,13 @@ parse_again:
                                                state=F_CR;
                                                break;
                                        case P_HOST:
-                                                *tmp=0;/*mark end of host*/
+                                                VIA_ZT(*tmp);/*mark end of host*/
                                                 vb->host.len=tmp-vb->host.s;
                                                 saved_state=L_PORT;
                                                 state=F_CR;
                                                 break;
                                        case P_PORT:
-                                               *tmp=0; /*end of port */
+                                               VIA_ZT(*tmp); /*end of port */
                                                vb->port_str.len=tmp-vb->port_str.s;
                                                saved_state=L_PARAM;
                                                state=F_CR;
@@ -1437,7 +1439,7 @@ parse_again:
                                        case P_IP6HOST:
                                                break;
                                        case P_HOST:
-                                               *tmp=0; /*mark  end of host*/
+                                               VIA_ZT(*tmp); /*mark  end of host*/
                                                vb->host.len=tmp-vb->host.s;
                                                state=F_PORT;
                                                break;
@@ -1489,13 +1491,13 @@ parse_again:
                                                LOG(L_ERR, "ERROR:parse_via: bad ipv6 reference\n");
                                                goto error;
                                        case P_HOST:
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                vb->host.len=tmp-vb->host.s;
                                                state=F_PARAM;
                                                param_start=tmp+1;
                                                break;
                                        case P_PORT:
-                                               *tmp=0; /*mark the end*/
+                                               VIA_ZT(*tmp); /*mark the end*/
                                                vb->port_str.len=tmp-vb->port_str.s;
                                        case L_PORT:
                                        case L_PARAM:
@@ -1552,12 +1554,12 @@ parse_again:
                                                LOG(L_ERR, "ERROR:parse_via: bad ipv6 reference\n");
                                                goto error;
                                        case P_HOST:
-                                               *tmp=0; /*mark the end*/
+                                               VIA_ZT(*tmp); /*mark the end*/
                                                vb->host.len=tmp-vb->host.s;
                                                state=F_VIA;
                                                break;
                                        case P_PORT:
-                                               *tmp=0; /*mark the end*/
+                                               VIA_ZT(*tmp); /*mark the end*/
                                                vb->port_str.len=tmp-vb->port_str.s;
                                                state=F_VIA;
                                                break;
@@ -1607,19 +1609,19 @@ parse_again:
                                                        *tmp, state);
                                                goto  error;
                                        case P_HOST:
-                                               *tmp=0; /*mark the end*/
+                                               VIA_ZT(*tmp); /*mark the end*/
                                                vb->host.len=tmp-vb->host.s;
                                                state=F_COMMENT;
                                                c_nest++;
                                                break;
                                        case P_PORT:
-                                               *tmp=0; /*mark the end*/
+                                               VIA_ZT(*tmp); /*mark the end*/
                                                vb->port_str.len=tmp-vb->port_str.s;
                                                state=F_COMMENT;
                                                c_nest++;
                                                break;
                                        case P_PARAM:
-                                               *tmp=0; /*mark the end*/
+                                               VIA_ZT(*tmp); /*mark the end*/
                                                vb->params.len=tmp-vb->params.s;
                                                state=F_COMMENT;
                                                c_nest++;
@@ -1630,7 +1632,7 @@ parse_again:
                                                state=F_COMMENT;
                                                vb->params.len=tmp-vb->params.s;
                                                c_nest++;
-                                               *tmp=0;
+                                               VIA_ZT(*tmp);
                                                break;
                                        case P_COMMENT:
                                        case F_COMMENT:
@@ -1656,7 +1658,7 @@ parse_again:
                                                        c_nest--;
                                                        if(c_nest==0){
                                                                state=L_VIA;
-                                                               *tmp=0;
+                                                               VIA_ZT(*tmp);
                                                                vb->comment.len=tmp-vb->comment.s;
                                                                break;
                                                        }
@@ -1723,7 +1725,7 @@ parse_again:
                        case ']':
                                switch(state){
                                        case P_IP6HOST:
-                                               *tmp=0; /*mark the end*/
+                                               VIA_ZT(*tmp); /*mark the end*/
                                                vb->host.len=tmp-vb->host.s;
                                                state=L_PORT;
                                                break;
@@ -1785,7 +1787,7 @@ parse_again:
                                                        case F_VIA:
                                                                vb->params.len=param->start+param->size
                                                                                                -vb->params.s;
-                                                               *tmp=0;
+                                                               VIA_ZT(*tmp);
                                                                break;
                                                        case END_OF_HEADER:
                                                                vb->params.len=param->start+param->size
@@ -1901,8 +1903,8 @@ endofpacket:
        if (vb->port_str.s){
                vb->port=str2s((unsigned char*)vb->port_str.s, vb->port_str.len, &err);
                if (err){
-                                       LOG(L_ERR, "ERROR: parse_via: invalid port number <%s>\n",
-                                               vb->port_str.s);
+                                       LOG(L_ERR, "ERROR: parse_via: invalid port number <%.*s>\n",
+                                               vb->port_str.len, vb->port_str.s);
                                        goto error;
                }
        }
@@ -1914,8 +1916,8 @@ nextvia:
        if (vb->port_str.s){
                vb->port=str2s((unsigned char*)vb->port_str.s, vb->port_str.len, &err);
                if (err){
-                                       LOG(L_ERR, "ERROR: parse_via: invalid port number <%s>\n",
-                                               vb->port_str.s);
+                                       LOG(L_ERR, "ERROR: parse_via: invalid port number <%.*s>\n",
+                                               vb->port_str.len, vb->port_str.s);
                                        goto error;
                }
        }
index 8c7112e..dc0c142 100644 (file)
--- a/receive.c
+++ b/receive.c
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * History:
+ * ---------
+ * 2003-01-29 transport-independent message zero-termination in
+ *            receive_msg (jiri)
  */
 
 
@@ -76,8 +81,10 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info)
        /* zero termination (termination of orig message bellow not that
           useful as most of the work is done with scrath-pad; -jiri  */
        /* buf[len]=0; */ /* WARNING: zero term removed! */
+       buf[len]=0; /* transport-independent zero-termination */
        msg->rcv=*rcv_info;
        msg->id=msg_no;
+#ifdef SCRATCH
        /* make a copy of the message */
        msg->orig=(char*) pkg_malloc(len+1);
        if (msg->orig==0){
@@ -88,6 +95,7 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info)
        /* WARNING: zero term removed! */
        /* msg->orig[len]=0; */ /* null terminate it,good for using str* functions
                                                 on it*/
+#endif
        
        if (parse_msg(buf,len, msg)!=0){
                LOG(L_ERR, "ERROR: receive_msg: parse_msg failed\n");
@@ -185,7 +193,9 @@ error:
        exec_post_cb(msg);
 error02:
        free_sip_msg(msg);
+#ifdef SCRATCH
 error01:
+#endif
        pkg_free(msg);
 error00:
        STATS_RX_DROPS;
diff --git a/route.c b/route.c
index 709c442..69b78c1 100644 (file)
--- a/route.c
+++ b/route.c
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * History:
+ * --------
+ * 2003-01-28 scratchpad removed, src_port introduced (jiri)
  */
 
  
@@ -235,6 +239,64 @@ static int fix_actions(struct action* a)
 }
 
 
+static int comp_port( int port, void *param, int op, int subtype )
+{
+       if (op!=EQUAL_OP) {
+               LOG(L_CRIT, "BUG: comp_port: '=' expected: %d\n", op );
+               return E_BUG;
+       }
+       if (subtype!=NUMBER_ST) {
+               LOG(L_CRIT, "BUG: comp_port: number expected: %d\n", subtype );
+               return E_BUG;
+       }
+       return port==(int)param;
+}
+
+/* eval_elem helping function, returns str op param */
+static int comp_strstr(str* str, void* param, int op, int subtype)
+{
+       int ret;
+       char backup;
+       
+       ret=-1;
+       if (op==EQUAL_OP){
+               if (subtype!=STRING_ST){
+                       LOG(L_CRIT, "BUG: comp_str: bad type %d, "
+                                       "string expected\n", subtype);
+                       goto error;
+               }
+               ret=(strncasecmp(str->s, (char*)param, str->len)==0);
+       }else if (op==MATCH_OP){
+               if (subtype!=RE_ST){
+                       LOG(L_CRIT, "BUG: comp_str: bad type %d, "
+                                       " RE expected\n", subtype);
+                       goto error;
+               }
+               /* this is really ugly -- we put a temporary zero-terminating
+                * character in the original string; that's because regexps
+         * take 0-terminated strings and our messages are not
+         * zero-terminated; it should not hurt as long as this function
+                * is applied to content of pkg mem, which is always the case
+                * with calls from route{}; the same goes for fline in reply_route{};
+         *
+         * also, the received function should always give us an extra
+         * character, into which we can put the 0-terminator now;
+         * an alternative would be allocating a new piece of memory,
+         * which might be too slow
+         * -jiri
+         */
+               backup=str->s[str->len];str->s[str->len]=0;
+               ret=(regexec((regex_t*)param, str->s, 0, 0, 0)==0);
+               str->s[str->len]=backup;
+       }else{
+               LOG(L_CRIT, "BUG: comp_str: unknown op %d\n", op);
+               goto error;
+       }
+       return ret;
+       
+error:
+       return -1;
+}
 
 /* eval_elem helping function, returns str op param */
 static int comp_str(char* str, void* param, int op, int subtype)
@@ -337,8 +399,13 @@ static int eval_elem(struct expr* e, struct sip_msg* msg)
        }
        switch(e->l.operand){
                case METHOD_O:
+#ifdef DONT_REMOVE_ZT
                                ret=comp_str(msg->first_line.u.request.method.s, e->r.param,
                                                                e->op, e->subtype);
+#else
+                               ret=comp_strstr(&msg->first_line.u.request.method, e->r.param,
+                                                               e->op, e->subtype);
+#endif
                                break;
                case URI_O:
                                if(msg->new_uri.s){
@@ -348,8 +415,13 @@ static int eval_elem(struct expr* e, struct sip_msg* msg)
                                                                        msg->parsed_uri.port_no?
                                                                        msg->parsed_uri.port_no:SIP_PORT);
                                        }else{
+#ifdef DONT_REMOVE_ZT
                                                ret=comp_str(msg->new_uri.s, e->r.param,
                                                                                e->op, e->subtype);
+#else
+                                               ret=comp_strstr(&msg->new_uri, e->r.param,
+                                                                               e->op, e->subtype);
+#endif
                                        }
                                }else{
                                        if (e->subtype==MYSELF_ST){
@@ -358,8 +430,13 @@ static int eval_elem(struct expr* e, struct sip_msg* msg)
                                                                        msg->parsed_uri.port_no?
                                                                        msg->parsed_uri.port_no:SIP_PORT);
                                        }else{
+#ifdef DONT_REMOVE_ZT
                                                ret=comp_str(msg->first_line.u.request.uri.s,
                                                                                 e->r.param, e->op, e->subtype);
+#else
+                                               ret=comp_strstr(&msg->first_line.u.request.uri,
+                                                                                e->r.param, e->op, e->subtype);
+#endif
                                        }
                                }
                                break;
@@ -377,6 +454,12 @@ static int eval_elem(struct expr* e, struct sip_msg* msg)
                                if (ret<=0) ret=(ret==0)?EXPR_DROP:0;
                                else ret=1;
                                break;
+               case SRCPORT_O:
+                               ret=comp_port(ntohs(msg->rcv.src_port), 
+                                       e->r.param, /* e.g., 5060 */
+                                       e->op, /* e.g. == */
+                                       e->subtype /* 5060 is number */);
+                               break;
                default:
                                LOG(L_CRIT, "BUG: eval_elem: invalid operand %d\n",
                                                        e->l.operand);
index f76d65f..cadf0c3 100644 (file)
@@ -25,6 +25,8 @@
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * 2003-01-29 src_port introduced (jiri)
  */
 
 
@@ -143,6 +145,9 @@ void print_expr(struct expr* exp)
                        case SRCIP_O:
                                DBG("srcip");
                                break;
+                       case SRCPORT_O:
+                               DBG("srcport");
+                               break;
                        case DSTIP_O:
                                DBG("dstip");
                                break;
index b752fd7..f236c5f 100644 (file)
@@ -46,7 +46,8 @@
 enum { EXP_T=1, ELEM_T };
 enum { AND_OP=1, OR_OP, NOT_OP };
 enum { EQUAL_OP=10, MATCH_OP, NO_OP };
-enum { METHOD_O=1, URI_O, SRCIP_O, DSTIP_O, DEFAULT_O, ACTION_O, NUMBER_O};
+enum { METHOD_O=1, URI_O, SRCIP_O, SRCPORT_O,
+       DSTIP_O, DEFAULT_O, ACTION_O, NUMBER_O};
 
 enum { FORWARD_T=1, SEND_T, DROP_T, LOG_T, ERROR_T, ROUTE_T, EXEC_T,
                SET_HOST_T, SET_HOSTPORT_T, SET_USER_T, SET_USERPASS_T, 
index 6fd7c96..a334f0c 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *
+ * history:
+ * --------
+ * 2003-01-29 tcp buffer size ++-ed to allow for 0-terminator
  */
 
 
@@ -57,7 +62,7 @@ enum conn_cmds { CONN_DESTROY=-3, CONN_ERROR=-2, CONN_EOF=-1, CONN_RELEASE,
 struct tcp_req{
        struct tcp_req* next;
        /* sockaddr ? */
-       char buf[TCP_BUF_SIZE]; /* bytes read so far*/
+       char buf[TCP_BUF_SIZE+1]; /* bytes read so far (+0-terminator)*/
        char* start; /* where the message starts, after alll the empty lines are
                                        skipped*/
        char* pos; /* current position in buf */
index cd27e65..3f4d96e 100644 (file)
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * History
+ * --------
+ * 2003-01-28 packet zero-termination moved to receive_msg (jiri)
  */
 
 
@@ -314,7 +318,7 @@ int udp_rcv_loop()
                        else goto error;
                }
                /*debugging, make print* msg work */
-               buf[len+1]=0;
+               /* buf[len+1]=0; */ /* zero-termination moved to receive_msg */
 
 #ifndef NO_ZERO_CHECKS
                if (len==0) {
diff --git a/ut.h b/ut.h
index 98a4655..e1365ac 100644 (file)
--- a/ut.h
+++ b/ut.h
@@ -28,6 +28,8 @@
  *
  * History
  * ------
+ * 2003-01-29 pathmax added (jiri)
+ * 2003-01-28 scratchpad removed (jiri)
  * 2003-01-18 un_escape function introduced for convenience of code needing
  *            the complex&slow feature of unescaping
  */
 #ifndef ut_h
 #define ut_h
 
+#include "comp_defs.h"
 
 #include <sys/types.h>
 #include <sys/time.h>
+#include <limits.h>
 #include <unistd.h>
 
-
+#include "config.h"
 #include "dprint.h"
 #include "str.h"
 
@@ -78,8 +82,10 @@ struct sip_msg;
        ((_via)->bsize-((_via)->name.s-\
                ((_via)->hdr.s+(_via)->hdr.len)))
 
+#ifdef SCRATCH
 #define via_s(_via,_p_msg) \
        translate_pointer((_p_msg)->orig,(_p_msg)->buf,(_via)->name.s)
+#endif
 
 
 /* char to hex conversion table */
@@ -253,6 +259,22 @@ inline static void sleep_us( unsigned int nusecs )
        select(0, NULL, NULL, NULL, &tval );
 }
 
+
+/* portable determination of max_path */
+inline static int pathmax()
+{
+#ifdef PATH_MAX
+       static int pathmax=PATH_MAX;
+#else
+       static int pathmax=0;
+#endif
+       if (pathmax==0) { /* init */
+               pathmax=pathconf("/", _PC_PATH_MAX);
+               pathmax=(pathmax<=0)?PATH_MAX_GUESS:pathmax+1;
+       }
+       return pathmax;
+}
+
 inline static int hex2int(char hex_digit)
 {
        if (hex_digit>='0' && hex_digit<='9')