... | ... |
@@ -29,6 +29,7 @@ |
29 | 29 |
/* History: |
30 | 30 |
* -------- |
31 | 31 |
* 2006-07-13 created by andrei |
32 |
+ * 2006-10-06 port fix (andrei) |
|
32 | 33 |
*/ |
33 | 34 |
|
34 | 35 |
#ifdef USE_DNS_CACHE |
... | ... |
@@ -2188,69 +2189,73 @@ int dns_sip_resolve(struct dns_srv_handle* h, str* name, |
2188 | 2189 |
if ((h->srv==0) && (h->a==0)){ |
2189 | 2190 |
h->port=(proto==PROTO_TLS)?SIPS_PORT:SIP_PORT; /* just in case we |
2190 | 2191 |
don't find another */ |
2191 |
- if ((port) && (*port==0)){ |
|
2192 |
- /* try SRV if initial call & no port specified |
|
2193 |
- * (draft-ietf-sip-srv-06) */ |
|
2194 |
- *port=h->port; |
|
2195 |
- if ((name->len+SRV_MAX_PREFIX_LEN+1)>MAX_DNS_NAME){ |
|
2196 |
- LOG(L_WARN, "WARNING: dns_sip_resolvehost: domain name too" |
|
2197 |
- " long (%d), unable to perform SRV lookup\n", |
|
2198 |
- name->len); |
|
2199 |
- }else{ |
|
2200 |
- /* check if it's an ip address */ |
|
2201 |
- if ( ((tmp_ip=str2ip(name))!=0) |
|
2192 |
+ if (port){ |
|
2193 |
+ if (*port==0){ |
|
2194 |
+ /* try SRV if initial call & no port specified |
|
2195 |
+ * (draft-ietf-sip-srv-06) */ |
|
2196 |
+ if ((name->len+SRV_MAX_PREFIX_LEN+1)>MAX_DNS_NAME){ |
|
2197 |
+ LOG(L_WARN, "WARNING: dns_sip_resolvehost: domain name too" |
|
2198 |
+ " long (%d), unable to perform SRV lookup\n", |
|
2199 |
+ name->len); |
|
2200 |
+ }else{ |
|
2201 |
+ /* check if it's an ip address */ |
|
2202 |
+ if ( ((tmp_ip=str2ip(name))!=0) |
|
2202 | 2203 |
#ifdef USE_IPV6 |
2203 |
- || ((tmp_ip=str2ip6(name))!=0) |
|
2204 |
+ || ((tmp_ip=str2ip6(name))!=0) |
|
2204 | 2205 |
#endif |
2205 |
- ){ |
|
2206 |
- /* we are lucky, this is an ip address */ |
|
2206 |
+ ){ |
|
2207 |
+ /* we are lucky, this is an ip address */ |
|
2207 | 2208 |
#ifdef USE_IPV6 |
2208 |
- if (((flags&DNS_IPV4_ONLY) && (tmp_ip->af==AF_INET6)) || |
|
2209 |
- ((flags&DNS_IPV6_ONLY) && (tmp_ip->af==AF_INET))){ |
|
2210 |
- return -E_DNS_AF_MISMATCH; |
|
2211 |
- } |
|
2209 |
+ if (((flags&DNS_IPV4_ONLY) && (tmp_ip->af==AF_INET6))|| |
|
2210 |
+ ((flags&DNS_IPV6_ONLY) && (tmp_ip->af==AF_INET))){ |
|
2211 |
+ return -E_DNS_AF_MISMATCH; |
|
2212 |
+ } |
|
2212 | 2213 |
#endif |
2213 |
- *ip=*tmp_ip; |
|
2214 |
- return 0; |
|
2215 |
- } |
|
2216 |
- |
|
2217 |
- switch(proto){ |
|
2218 |
- case PROTO_NONE: /* no proto specified, use udp */ |
|
2219 |
- goto skip_srv; |
|
2220 |
- case PROTO_UDP: |
|
2221 |
- memcpy(tmp, SRV_UDP_PREFIX, SRV_UDP_PREFIX_LEN); |
|
2222 |
- memcpy(tmp+SRV_UDP_PREFIX_LEN, name->s, name->len); |
|
2223 |
- tmp[SRV_UDP_PREFIX_LEN + name->len] = '\0'; |
|
2224 |
- len=SRV_UDP_PREFIX_LEN + name->len; |
|
2225 |
- break; |
|
2226 |
- case PROTO_TCP: |
|
2227 |
- memcpy(tmp, SRV_TCP_PREFIX, SRV_TCP_PREFIX_LEN); |
|
2228 |
- memcpy(tmp+SRV_TCP_PREFIX_LEN, name->s, name->len); |
|
2229 |
- tmp[SRV_TCP_PREFIX_LEN + name->len] = '\0'; |
|
2230 |
- len=SRV_TCP_PREFIX_LEN + name->len; |
|
2231 |
- break; |
|
2232 |
- case PROTO_TLS: |
|
2233 |
- memcpy(tmp, SRV_TLS_PREFIX, SRV_TLS_PREFIX_LEN); |
|
2234 |
- memcpy(tmp+SRV_TLS_PREFIX_LEN, name->s, name->len); |
|
2235 |
- tmp[SRV_TLS_PREFIX_LEN + name->len] = '\0'; |
|
2236 |
- len=SRV_TLS_PREFIX_LEN + name->len; |
|
2237 |
- break; |
|
2238 |
- default: |
|
2239 |
- LOG(L_CRIT, "BUG: sip_resolvehost: unknown proto %d\n", |
|
2240 |
- proto); |
|
2241 |
- return -E_DNS_CRITICAL; |
|
2242 |
- } |
|
2243 |
- srv_name.s=tmp; |
|
2244 |
- srv_name.len=len; |
|
2245 |
- |
|
2246 |
- if ((ret=dns_srv_resolve_ip(h, &srv_name, ip, port, flags))>=0) |
|
2247 |
- { |
|
2248 |
- DBG("dns_sip_resolve(%.*s, %d, %d), srv0, ret=%d\n", |
|
2249 |
- name->len, name->s, h->srv_no, h->ip_no, ret); |
|
2250 |
- return ret; |
|
2214 |
+ *ip=*tmp_ip; |
|
2215 |
+ return 0; |
|
2216 |
+ } |
|
2217 |
+ |
|
2218 |
+ switch(proto){ |
|
2219 |
+ case PROTO_NONE: /* no proto specified, use udp */ |
|
2220 |
+ goto skip_srv; |
|
2221 |
+ case PROTO_UDP: |
|
2222 |
+ memcpy(tmp, SRV_UDP_PREFIX, SRV_UDP_PREFIX_LEN); |
|
2223 |
+ memcpy(tmp+SRV_UDP_PREFIX_LEN, name->s, name->len); |
|
2224 |
+ tmp[SRV_UDP_PREFIX_LEN + name->len] = '\0'; |
|
2225 |
+ len=SRV_UDP_PREFIX_LEN + name->len; |
|
2226 |
+ break; |
|
2227 |
+ case PROTO_TCP: |
|
2228 |
+ memcpy(tmp, SRV_TCP_PREFIX, SRV_TCP_PREFIX_LEN); |
|
2229 |
+ memcpy(tmp+SRV_TCP_PREFIX_LEN, name->s, name->len); |
|
2230 |
+ tmp[SRV_TCP_PREFIX_LEN + name->len] = '\0'; |
|
2231 |
+ len=SRV_TCP_PREFIX_LEN + name->len; |
|
2232 |
+ break; |
|
2233 |
+ case PROTO_TLS: |
|
2234 |
+ memcpy(tmp, SRV_TLS_PREFIX, SRV_TLS_PREFIX_LEN); |
|
2235 |
+ memcpy(tmp+SRV_TLS_PREFIX_LEN, name->s, name->len); |
|
2236 |
+ tmp[SRV_TLS_PREFIX_LEN + name->len] = '\0'; |
|
2237 |
+ len=SRV_TLS_PREFIX_LEN + name->len; |
|
2238 |
+ break; |
|
2239 |
+ default: |
|
2240 |
+ LOG(L_CRIT, "BUG: sip_resolvehost: " |
|
2241 |
+ "unknown proto %d\n", proto); |
|
2242 |
+ return -E_DNS_CRITICAL; |
|
2243 |
+ } |
|
2244 |
+ srv_name.s=tmp; |
|
2245 |
+ srv_name.len=len; |
|
2246 |
+ |
|
2247 |
+ if ((ret=dns_srv_resolve_ip(h, &srv_name, ip, |
|
2248 |
+ port, flags))>=0) |
|
2249 |
+ { |
|
2250 |
+ DBG("dns_sip_resolve(%.*s, %d, %d), srv0, ret=%d\n", |
|
2251 |
+ name->len, name->s, h->srv_no, h->ip_no, ret); |
|
2252 |
+ return ret; |
|
2253 |
+ } |
|
2251 | 2254 |
} |
2255 |
+ }else{ /* if (*port==0) */ |
|
2256 |
+ h->port=*port; /* store initial port */ |
|
2252 | 2257 |
} |
2253 |
- } |
|
2258 |
+ } /* if (port) */ |
|
2254 | 2259 |
}else if (h->srv){ |
2255 | 2260 |
srv_name.s=h->srv->name; |
2256 | 2261 |
srv_name.len=h->srv->name_len; |