... | ... |
@@ -40,7 +40,7 @@ export makefile_defs |
40 | 40 |
VERSION = 0 |
41 | 41 |
PATCHLEVEL = 8 |
42 | 42 |
SUBLEVEL = 12 |
43 |
-EXTRAVERSION = dev-t03 |
|
43 |
+EXTRAVERSION = dev-t04 |
|
44 | 44 |
|
45 | 45 |
RELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) |
46 | 46 |
OS = $(shell uname -s | sed -e s/SunOS/solaris/ | tr "[A-Z]" "[a-z]") |
... | ... |
@@ -163,11 +163,22 @@ int do_action(struct action* a, struct sip_msg* msg) |
163 | 163 |
proto=u->proto; |
164 | 164 |
break; |
165 | 165 |
default: |
166 |
- LOG(L_ERR,"ERROR: do action: forward: bad uri protocol" |
|
167 |
- " %d\n", u->proto); |
|
166 |
+ LOG(L_ERR,"ERROR: do action: forward: bad uri" |
|
167 |
+ " transport %d\n", u->proto); |
|
168 | 168 |
ret=E_BAD_PROTO; |
169 | 169 |
goto error_fwd_uri; |
170 | 170 |
} |
171 |
+#ifdef USE_TLS |
|
172 |
+ if (u->secure){ |
|
173 |
+ if (u->proto==PROTO_UDP){ |
|
174 |
+ LOG(L_ERR, "ERROR: do_action: forward: secure uri" |
|
175 |
+ " incompatible with transport %d\n", u->proto); |
|
176 |
+ ret=E_BAD_PROTO; |
|
177 |
+ goto error_fwd_uri; |
|
178 |
+ } |
|
179 |
+ proto=PROTO_TLS; |
|
180 |
+ } |
|
181 |
+#endif |
|
171 | 182 |
/* create a temporary proxy*/ |
172 | 183 |
p=mk_proxy(&u->host, port, proto); |
173 | 184 |
if (p==0){ |
... | ... |
@@ -42,7 +42,7 @@ |
42 | 42 |
#define E_BAD_TUPEL -9 |
43 | 43 |
/* script programming error */ |
44 | 44 |
#define E_SCRIPT -10 |
45 |
-/* error in exceution of external tools */ |
|
45 |
+/* error in excecution of external tools */ |
|
46 | 46 |
#define E_EXEC -11 |
47 | 47 |
/* too many branches demanded */ |
48 | 48 |
#define E_TOO_MANY_BRANCHES -12 |
... | ... |
@@ -124,6 +124,7 @@ struct sip_uri { |
124 | 124 |
str headers; |
125 | 125 |
unsigned short port_no; |
126 | 126 |
unsigned short proto; /* from transport */ |
127 |
+ int secure; /* 1 if is a sips, 0 otherwise */ |
|
127 | 128 |
/* parameters */ |
128 | 129 |
str transport; |
129 | 130 |
str ttl; |
... | ... |
@@ -131,12 +132,15 @@ struct sip_uri { |
131 | 132 |
str maddr; |
132 | 133 |
str method; |
133 | 134 |
str lr; |
135 |
+ str r2; /* ser specific rr parameter */ |
|
134 | 136 |
/* values */ |
135 | 137 |
str transport_val; |
136 | 138 |
str ttl_val; |
137 | 139 |
str user_param_val; |
138 | 140 |
str maddr_val; |
139 | 141 |
str method_val; |
142 |
+ str lr_val; /* lr value placeholder for lr=on a.s.o*/ |
|
143 |
+ str r2_val; |
|
140 | 144 |
}; |
141 | 145 |
|
142 | 146 |
|
... | ... |
@@ -32,6 +32,7 @@ |
32 | 32 |
* works in one pass) (andrei) |
33 | 33 |
* 2003-04-11 ser_error is now set in parse_uri (andrei) |
34 | 34 |
* 2003-04-26 ZSW (jiri) |
35 |
+ * 2003-07-03 sips:, r2, lr=on support added (andrei) |
|
35 | 36 |
*/ |
36 | 37 |
|
37 | 38 |
|
... | ... |
@@ -67,7 +68,10 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) |
67 | 68 |
/* maddr */ |
68 | 69 |
PMA_A, PMA_D, PMA_D2, PMA_R, PMA_eq, |
69 | 70 |
/* lr */ |
70 |
- PLR_L, PLR_R_FIN, |
|
71 |
+ PLR_L, PLR_R_FIN, PLR_eq, |
|
72 |
+ /* r2 */ |
|
73 |
+ PR2_R, PR2_2_FIN, PR2_eq, |
|
74 |
+ |
|
71 | 75 |
/* transport values */ |
72 | 76 |
/* udp */ |
73 | 77 |
VU_U, VU_D, VU_P_FIN, |
... | ... |
@@ -312,9 +316,14 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) |
312 | 316 |
state=URI_INIT; |
313 | 317 |
memset(uri, 0, sizeof(struct sip_uri)); /* zero it all, just to be sure*/ |
314 | 318 |
/*look for sip:*/ |
315 |
- if (len<4) goto error_too_short; |
|
316 |
- if (! ( ((buf[0]|0x20)=='s')&&((buf[1]|0x20)=='i')&&((buf[2]|0x20)=='p')&& |
|
317 |
- (buf[3]==':') ) ) goto error_bad_uri; |
|
319 |
+ if (len<5) goto error_too_short; |
|
320 |
+ if (! ( ((buf[0]|0x20)=='s')&&((buf[1]|0x20)=='i')&&((buf[2]|0x20)=='p'))) |
|
321 |
+ goto error_bad_uri; |
|
322 |
+ if (buf[3]!=':'){ |
|
323 |
+ /* parse also sips: */ |
|
324 |
+ if (((buf[3]|0x20)=='s')&&(buf[4]==':')) {p++; uri->secure=1;} |
|
325 |
+ else goto error_bad_uri; |
|
326 |
+ } |
|
318 | 327 |
|
319 | 328 |
s=p; |
320 | 329 |
for(;p<end; p++){ |
... | ... |
@@ -549,13 +558,17 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) |
549 | 558 |
b=p; |
550 | 559 |
state=PLR_L; |
551 | 560 |
break; |
561 |
+ case 'r': |
|
562 |
+ case 'R': |
|
563 |
+ b=p; |
|
564 |
+ state=PR2_R; |
|
552 | 565 |
default: |
553 | 566 |
state=URI_PARAM_P; |
554 | 567 |
} |
555 | 568 |
break; |
556 | 569 |
case URI_PARAM_P: /* ignore current param */ |
557 | 570 |
/* supported params: |
558 |
- * maddr, transport, ttl, lr, user, method */ |
|
571 |
+ * maddr, transport, ttl, lr, user, method, r2 */ |
|
559 | 572 |
switch(*p){ |
560 | 573 |
param_common_cases; |
561 | 574 |
}; |
... | ... |
@@ -691,6 +704,9 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) |
691 | 704 |
case '@': |
692 | 705 |
still_at_user; |
693 | 706 |
break; |
707 |
+ case '=': |
|
708 |
+ state=PLR_eq; |
|
709 |
+ break; |
|
694 | 710 |
semicolon_case; |
695 | 711 |
uri->lr.s=b; |
696 | 712 |
uri->lr.len=(p-b); |
... | ... |
@@ -705,7 +721,52 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) |
705 | 721 |
state=URI_PARAM_P; |
706 | 722 |
} |
707 | 723 |
break; |
708 |
- |
|
724 |
+ /* handle lr=something case */ |
|
725 |
+ case PLR_eq: |
|
726 |
+ param=&uri->lr; |
|
727 |
+ param_val=&uri->lr_val; |
|
728 |
+ switch(*p){ |
|
729 |
+ param_common_cases; |
|
730 |
+ default: |
|
731 |
+ v=p; |
|
732 |
+ state=URI_VAL_P; |
|
733 |
+ } |
|
734 |
+ break; |
|
735 |
+ /* r2 */ |
|
736 |
+ param_switch1(PR2_R, '2', PR2_2_FIN); |
|
737 |
+ case PR2_2_FIN: |
|
738 |
+ switch(*p){ |
|
739 |
+ case '@': |
|
740 |
+ still_at_user; |
|
741 |
+ break; |
|
742 |
+ case '=': |
|
743 |
+ state=PR2_eq; |
|
744 |
+ break; |
|
745 |
+ semicolon_case; |
|
746 |
+ uri->r2.s=b; |
|
747 |
+ uri->r2.len=(p-b); |
|
748 |
+ break; |
|
749 |
+ question_case; |
|
750 |
+ uri->r2.s=b; |
|
751 |
+ uri->r2.len=(p-b); |
|
752 |
+ break; |
|
753 |
+ colon_case; |
|
754 |
+ break; |
|
755 |
+ default: |
|
756 |
+ state=URI_PARAM_P; |
|
757 |
+ } |
|
758 |
+ break; |
|
759 |
+ /* handle lr=something case */ |
|
760 |
+ case PR2_eq: |
|
761 |
+ param=&uri->r2; |
|
762 |
+ param_val=&uri->r2_val; |
|
763 |
+ switch(*p){ |
|
764 |
+ param_common_cases; |
|
765 |
+ default: |
|
766 |
+ v=p; |
|
767 |
+ state=URI_VAL_P; |
|
768 |
+ } |
|
769 |
+ break; |
|
709 | 770 |
|
710 | 771 |
|
711 | 772 |
case URI_HEADERS: |
... | ... |
@@ -814,16 +875,25 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) |
814 | 875 |
case PM_D: |
815 | 876 |
case PM_eq: |
816 | 877 |
case PLR_L: /* lr */ |
878 |
+ case PR2_R: /* r2 */ |
|
817 | 879 |
uri->params.s=s; |
818 | 880 |
uri->params.len=p-s; |
819 | 881 |
break; |
820 | 882 |
/* fin param states */ |
821 | 883 |
case PLR_R_FIN: |
884 |
+ case PLR_eq: |
|
822 | 885 |
uri->params.s=s; |
823 | 886 |
uri->params.len=p-s; |
824 | 887 |
uri->lr.s=b; |
825 | 888 |
uri->lr.len=p-b; |
826 | 889 |
break; |
890 |
+ case PR2_2_FIN: |
|
891 |
+ case PR2_eq: |
|
892 |
+ uri->params.s=s; |
|
893 |
+ uri->params.len=p-s; |
|
894 |
+ uri->r2.s=b; |
|
895 |
+ uri->r2.len=p-b; |
|
896 |
+ break; |
|
827 | 897 |
case URI_VAL_P: |
828 | 898 |
/* intermediate value states */ |
829 | 899 |
case VU_U: |
... | ... |
@@ -28,6 +28,7 @@ |
28 | 28 |
* History: |
29 | 29 |
* ------- |
30 | 30 |
* 2003-02-13 added proto to sip_resolvehost, for SRV lookups (andrei) |
31 |
+ * 2003-07-03 default port value set according to proto (andrei) |
|
31 | 32 |
*/ |
32 | 33 |
|
33 | 34 |
|
... | ... |
@@ -469,7 +470,8 @@ struct hostent* sip_resolvehost(str* name, unsigned short* port, int proto) |
469 | 470 |
|
470 | 471 |
/* try SRV if no port specified (draft-ietf-sip-srv-06) */ |
471 | 472 |
if ((port)&&(*port==0)){ |
472 |
- *port=SIP_PORT; /* just in case we don't find another */ |
|
473 |
+ *port=(proto==PROTO_TLS)?SIPS_PORT:SIP_PORT; /* just in case we don't |
|
474 |
+ find another */ |
|
473 | 475 |
if ((name->len+SRV_PREFIX_LEN+1)>MAX_DNS_NAME){ |
474 | 476 |
LOG(L_WARN, "WARNING: sip_resolvehost: domain name too long (%d)," |
475 | 477 |
" unable to perform SRV lookup\n", name->len); |