Diff

core/s2smanager.lua @ 4422:c25dee24623f

s2smanager, net.dns: Fix handling for NXNAME and SRV target of "."
author Florian Zeitz <florob@babelmonkeys.de>
date Wed, 26 Oct 2011 02:03:33 +0200
parent 4421:971a66627f7a
child 4431:bbede0141f7e
line wrap: on
line diff
--- a/core/s2smanager.lua	Sat Oct 22 18:29:23 2011 +0200
+++ b/core/s2smanager.lua	Wed Oct 26 02:03:33 2011 +0200
@@ -246,6 +246,11 @@
 				for _, record in ipairs(answer) do
 					t_insert(srv_hosts, record.srv);
 				end
+				if #srv_hosts == 1 and srv_hosts[1].target == "." then
+					log("debug", to_host.." does not provide a XMPP service");
+					destroy_session(host_session, err); -- Nothing to see here
+					return;
+				end
 				t_sort(srv_hosts, compare_srv_priorities);
 				
 				local srv_choice = srv_hosts[1];
@@ -347,9 +352,19 @@
 			end
 
 			if has_other then
-				rfc3484_dest(host_session.ip_hosts, sources);
-				host_session.ip_choice = 0;
-				try_next_ip(host_session, connect_port);
+				if #IPs > 0 then
+					rfc3484_dest(host_session.ip_hosts, sources);
+					host_session.ip_choice = 0;
+					try_next_ip(host_session, connect_port);
+				else
+					log("debug", "DNS lookup failed to get a response for %s", connect_host);
+					host_session.ip_hosts = nil;
+					if not attempt_connection(host_session, "name resolution failed") then -- Retry if we can
+						log("debug", "No other records to try for %s - destroying", host_session.to_host);
+						err = err and (": "..err) or "";
+						destroy_session(host_session, "DNS resolution failed"..err); -- End of the line, we can't
+					end
+				end
 			else
 				has_other = true;
 			end
@@ -366,9 +381,19 @@
 			end
 
 			if has_other then
-				rfc3484_dest(host_session.ip_hosts, sources);
-				host_session.ip_choice = 0;
-				try_next_ip(host_session, connect_port);
+				if #IPs > 0 then
+					rfc3484_dest(host_session.ip_hosts, sources);
+					host_session.ip_choice = 0;
+					try_next_ip(host_session, connect_port);
+				else
+					log("debug", "DNS lookup failed to get a response for %s", connect_host);
+					host_session.ip_hosts = nil;
+					if not attempt_connection(host_session, "name resolution failed") then -- Retry if we can
+						log("debug", "No other records to try for %s - destroying", host_session.to_host);
+						err = err and (": "..err) or "";
+						destroy_session(host_session, "DNS resolution failed"..err); -- End of the line, we can't
+					end
+				end
 			else
 				has_other = true;
 			end