Преглед на файлове

- port fix (original port was overwritten with 5060 for non-srv lookups)

Andrei Pelinescu-Onciul преди 19 години
родител
ревизия
8af0841f4e
променени са 1 файла, в които са добавени 62 реда и са изтрити 57 реда
  1. 62 57
      dns_cache.c

+ 62 - 57
dns_cache.c

@@ -29,6 +29,7 @@
 /* History:
 /* History:
  * --------
  * --------
  *  2006-07-13  created by andrei
  *  2006-07-13  created by andrei
+ *  2006-10-06  port fix (andrei)
  */
  */
 
 
 #ifdef USE_DNS_CACHE
 #ifdef USE_DNS_CACHE
@@ -2188,69 +2189,73 @@ int dns_sip_resolve(struct dns_srv_handle* h,  str* name,
 	if ((h->srv==0) && (h->a==0)){
 	if ((h->srv==0) && (h->a==0)){
 		h->port=(proto==PROTO_TLS)?SIPS_PORT:SIP_PORT; /* just in case we
 		h->port=(proto==PROTO_TLS)?SIPS_PORT:SIP_PORT; /* just in case we
 														don't find another */
 														don't find another */
-		if ((port) && (*port==0)){
-			/* try SRV if initial call & no port specified
-			 * (draft-ietf-sip-srv-06) */
-			*port=h->port;
-			if ((name->len+SRV_MAX_PREFIX_LEN+1)>MAX_DNS_NAME){
-				LOG(L_WARN, "WARNING: dns_sip_resolvehost: domain name too"
-							" long (%d), unable to perform SRV lookup\n",
-							name->len);
-			}else{
-				/* check if it's an ip address */
-				if ( ((tmp_ip=str2ip(name))!=0)
+		if (port){
+			if (*port==0){
+				/* try SRV if initial call & no port specified
+				 * (draft-ietf-sip-srv-06) */
+				if ((name->len+SRV_MAX_PREFIX_LEN+1)>MAX_DNS_NAME){
+					LOG(L_WARN, "WARNING: dns_sip_resolvehost: domain name too"
+								" long (%d), unable to perform SRV lookup\n",
+								name->len);
+				}else{
+					/* check if it's an ip address */
+					if ( ((tmp_ip=str2ip(name))!=0)
 #ifdef	USE_IPV6
 #ifdef	USE_IPV6
-					  || ((tmp_ip=str2ip6(name))!=0)
+						  || ((tmp_ip=str2ip6(name))!=0)
 #endif
 #endif
-					){
-					/* we are lucky, this is an ip address */
+						){
+						/* we are lucky, this is an ip address */
 #ifdef	USE_IPV6
 #ifdef	USE_IPV6
-					if (((flags&DNS_IPV4_ONLY) && (tmp_ip->af==AF_INET6)) ||
-						((flags&DNS_IPV6_ONLY) && (tmp_ip->af==AF_INET))){
-						return -E_DNS_AF_MISMATCH;
-					}
+						if (((flags&DNS_IPV4_ONLY) && (tmp_ip->af==AF_INET6))||
+							((flags&DNS_IPV6_ONLY) && (tmp_ip->af==AF_INET))){
+							return -E_DNS_AF_MISMATCH;
+						}
 #endif
 #endif
-					*ip=*tmp_ip;
-					return 0;
-				}
-				
-				switch(proto){
-					case PROTO_NONE: /* no proto specified, use udp */
-						goto skip_srv;
-					case PROTO_UDP:
-						memcpy(tmp, SRV_UDP_PREFIX, SRV_UDP_PREFIX_LEN);
-						memcpy(tmp+SRV_UDP_PREFIX_LEN, name->s, name->len);
-						tmp[SRV_UDP_PREFIX_LEN + name->len] = '\0';
-						len=SRV_UDP_PREFIX_LEN + name->len;
-						break;
-					case PROTO_TCP:
-						memcpy(tmp, SRV_TCP_PREFIX, SRV_TCP_PREFIX_LEN);
-						memcpy(tmp+SRV_TCP_PREFIX_LEN, name->s, name->len);
-						tmp[SRV_TCP_PREFIX_LEN + name->len] = '\0';
-						len=SRV_TCP_PREFIX_LEN + name->len;
-						break;
-					case PROTO_TLS:
-						memcpy(tmp, SRV_TLS_PREFIX, SRV_TLS_PREFIX_LEN);
-						memcpy(tmp+SRV_TLS_PREFIX_LEN, name->s, name->len);
-						tmp[SRV_TLS_PREFIX_LEN + name->len] = '\0';
-						len=SRV_TLS_PREFIX_LEN + name->len;
-						break;
-					default:
-						LOG(L_CRIT, "BUG: sip_resolvehost: unknown proto %d\n",
-									proto);
-						return -E_DNS_CRITICAL;
-				}
-				srv_name.s=tmp;
-				srv_name.len=len;
-				
-				if ((ret=dns_srv_resolve_ip(h, &srv_name, ip, port, flags))>=0)
-				{
-					DBG("dns_sip_resolve(%.*s, %d, %d), srv0, ret=%d\n", 
-						name->len, name->s, h->srv_no, h->ip_no, ret);
-					return ret;
+						*ip=*tmp_ip;
+						return 0;
+					}
+					
+					switch(proto){
+						case PROTO_NONE: /* no proto specified, use udp */
+							goto skip_srv;
+						case PROTO_UDP:
+							memcpy(tmp, SRV_UDP_PREFIX, SRV_UDP_PREFIX_LEN);
+							memcpy(tmp+SRV_UDP_PREFIX_LEN, name->s, name->len);
+							tmp[SRV_UDP_PREFIX_LEN + name->len] = '\0';
+							len=SRV_UDP_PREFIX_LEN + name->len;
+							break;
+						case PROTO_TCP:
+							memcpy(tmp, SRV_TCP_PREFIX, SRV_TCP_PREFIX_LEN);
+							memcpy(tmp+SRV_TCP_PREFIX_LEN, name->s, name->len);
+							tmp[SRV_TCP_PREFIX_LEN + name->len] = '\0';
+							len=SRV_TCP_PREFIX_LEN + name->len;
+							break;
+						case PROTO_TLS:
+							memcpy(tmp, SRV_TLS_PREFIX, SRV_TLS_PREFIX_LEN);
+							memcpy(tmp+SRV_TLS_PREFIX_LEN, name->s, name->len);
+							tmp[SRV_TLS_PREFIX_LEN + name->len] = '\0';
+							len=SRV_TLS_PREFIX_LEN + name->len;
+							break;
+						default:
+							LOG(L_CRIT, "BUG: sip_resolvehost: "
+									"unknown proto %d\n", proto);
+							return -E_DNS_CRITICAL;
+					}
+					srv_name.s=tmp;
+					srv_name.len=len;
+					
+					if ((ret=dns_srv_resolve_ip(h, &srv_name, ip,
+															port, flags))>=0)
+					{
+						DBG("dns_sip_resolve(%.*s, %d, %d), srv0, ret=%d\n", 
+							name->len, name->s, h->srv_no, h->ip_no, ret);
+						return ret;
+					}
 				}
 				}
+			}else{ /* if (*port==0) */
+				h->port=*port; /* store initial port */
 			}
 			}
-		}
+		} /* if (port) */
 	}else if (h->srv){
 	}else if (h->srv){
 			srv_name.s=h->srv->name;
 			srv_name.s=h->srv->name;
 			srv_name.len=h->srv->name_len;
 			srv_name.len=h->srv->name_len;