@@ -1342,10 +1342,11 @@ [query->_cancelTimer release]; query->_cancelTimer = nil; [_queries removeObjectForKey: ID]; @try { + bool tryNextNameServer = false; const unsigned char *queryDataBuffer; size_t i; of_dns_resolver_error_t error; uint16_t numQuestions, numAnswers, numAuthorityRecords; uint16_t numAdditionalRecords; @@ -1378,20 +1379,38 @@ case 1: error = OF_DNS_RESOLVER_ERROR_SERVER_INVALID_FORMAT; break; case 2: error = OF_DNS_RESOLVER_ERROR_SERVER_FAILURE; + tryNextNameServer = true; break; case 3: + error = OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR; + break; + case 4: + error = OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED; + tryNextNameServer = true; + break; + case 5: + error = OF_DNS_RESOLVER_ERROR_SERVER_REFUSED; + tryNextNameServer = true; + break; + default: + error = OF_DNS_RESOLVER_ERROR_UNKNOWN; + tryNextNameServer = true; + break; + } + + if (tryNextNameServer) { if (query->_searchDomainsIndex + 1 < query->_settings->_searchDomains.count) { of_run_loop_mode_t runLoopMode = [OFRunLoop currentRunLoop].currentMode; size_t nameServersIndex = - query->_nameServersIndex; + query->_nameServersIndex + 1; size_t searchDomainsIndex = - query->_searchDomainsIndex; + query->_searchDomainsIndex + 1; query->_searchDomainsIndex++; [self of_asyncPerformQuery: query->_query settings: query->_settings @@ -1402,22 +1421,10 @@ selector: query->_selector context: query->_context]; return true; } - - error = OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR; - break; - case 4: - error = OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED; - break; - case 5: - error = OF_DNS_RESOLVER_ERROR_SERVER_REFUSED; - break; - default: - error = OF_DNS_RESOLVER_ERROR_UNKNOWN; - break; } if (buffer[3] & 0x0F) @throw [OFDNSQueryFailedException exceptionWithQuery: query->_query