Index: src/OFDNSResolver.h ================================================================== --- src/OFDNSResolver.h +++ src/OFDNSResolver.h @@ -63,11 +63,13 @@ /*! The server returned an error that the domain does not exist */ OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR, /*! The server does not have support for the requested query */ OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED, /*! The server refused the query */ - OF_DNS_RESOLVER_ERROR_SERVER_REFUSED + OF_DNS_RESOLVER_ERROR_SERVER_REFUSED, + /*! There was no name server to query */ + OF_DNS_RESOLVER_ERROR_NO_NAME_SERVER } of_dns_resolver_error_t; /*! * @protocol OFDNSResolverQueryDelegate OFDNSResolver.h ObjFW/OFDNSResolver.h * Index: src/OFDNSResolver.m ================================================================== --- src/OFDNSResolver.m +++ src/OFDNSResolver.m @@ -816,10 +816,21 @@ ID = [OFNumber numberWithUInt16: (uint16_t)of_random()]; } while ([_queries objectForKey: ID] != nil); if (query.domainName.UTF8StringLength > 253) @throw [OFOutOfRangeException exception]; + + if (_settings->_nameServers.count == 0) { + id exception = [OFDNSQueryFailedException + exceptionWithQuery: query + error: OF_DNS_RESOLVER_ERROR_NO_NAME_SERVER]; + [delegate resolver: self + didPerformQuery: query + response: nil + exception: exception]; + return; + } context = [[[OFDNSResolverContext alloc] initWithQuery: query ID: ID settings: _settings @@ -878,16 +889,14 @@ exception = [OFDNSQueryFailedException exceptionWithQuery: context->_query error: OF_DNS_RESOLVER_ERROR_TIMEOUT]; - if ([context->_delegate respondsToSelector: - @selector(resolver:didPerformQuery:response:exception:)]) - [context->_delegate resolver: self - didPerformQuery: context->_query - response: nil - exception: exception]; + [context->_delegate resolver: self + didPerformQuery: context->_query + response: nil + exception: exception]; } - (bool)of_handleResponseBuffer: (unsigned char *)buffer length: (size_t)length sender: (const of_socket_address_t *)sender @@ -1039,16 +1048,14 @@ } if (exception != nil) response = nil; - if ([context->_delegate respondsToSelector: - @selector(resolver:didPerformQuery:response:exception:)]) - [context->_delegate resolver: self - didPerformQuery: context->_query - response: response - exception: exception]; + [context->_delegate resolver: self + didPerformQuery: context->_query + response: response + exception: exception]; return false; } - (bool)socket: (OFDatagramSocket *)sock @@ -1273,18 +1280,16 @@ exception = [OFDNSQueryFailedException exceptionWithQuery: context->_query error: OF_DNS_RESOLVER_ERROR_CANCELED]; - if ([context->_delegate respondsToSelector: - @selector(resolver:didPerformQuery:response:exception:)]) - [context->_delegate resolver: self - didPerformQuery: context->_query - response: nil - exception: exception]; + [context->_delegate resolver: self + didPerformQuery: context->_query + response: nil + exception: exception]; } [_queries removeAllObjects]; objc_autoreleasePoolPop(pool); } @end Index: src/exceptions/OFDNSQueryFailedException.m ================================================================== --- src/exceptions/OFDNSQueryFailedException.m +++ src/exceptions/OFDNSQueryFailedException.m @@ -42,10 +42,12 @@ case OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED: return @"The server does not have support for the requested " @"query."; case OF_DNS_RESOLVER_ERROR_SERVER_REFUSED: return @"The server refused the query."; + case OF_DNS_RESOLVER_ERROR_NO_NAME_SERVER: + return @"There was no name server to query."; default: return @"Unknown error."; } }