Index: src/OFDNSResolver.m ================================================================== --- src/OFDNSResolver.m +++ src/OFDNSResolver.m @@ -55,10 +55,11 @@ * immediately rejecting pointers to itself seems like a fair balance. */ #define MAX_ALLOWED_POINTERS 16 #define TIMEOUT 2 +#define ATTEMPTS 3 /* * TODO: * * - Resolve with each search domain @@ -71,10 +72,11 @@ of_dns_resource_record_class_t _recordClass; of_dns_resource_record_type_t _recordType; OFNumber *_ID; OFArray OF_GENERIC(OFString *) *_nameServers, *_searchDomains; size_t _nameServersIndex, _searchDomainsIndex; + size_t _attempt; id _target; SEL _selector; id _context; OFData *_queryData; OFTimer *_cancelTimer; @@ -86,10 +88,11 @@ @property (readonly, nonatomic) OFNumber *ID; @property (readonly, nonatomic) OFArray OF_GENERIC(OFString *) *nameServers; @property (readonly, nonatomic) OFArray OF_GENERIC(OFString *) *searchDomains; @property (nonatomic) size_t nameServersIndex; @property (nonatomic) size_t searchDomainsIndex; +@property (nonatomic) size_t attempt; @property (readonly, nonatomic) id target; @property (readonly, nonatomic) SEL selector; @property (readonly, nonatomic) id context; @property (readonly, nonatomic) OFData *queryData; @property (retain, nonatomic) OFTimer *cancelTimer; @@ -468,13 +471,13 @@ @implementation OFDNSResolverQuery @synthesize host = _host, recordClass = _recordClass, recordType = _recordType; @synthesize ID = _ID, nameServers = _nameServers; @synthesize searchDomains = _searchDomains; @synthesize nameServersIndex = _nameServersIndex; -@synthesize searchDomainsIndex = _searchDomainsIndex, target = _target; -@synthesize selector = _selector, context = _context, queryData = _queryData; -@synthesize cancelTimer = _cancelTimer; +@synthesize searchDomainsIndex = _searchDomainsIndex, attempt = _attempt; +@synthesize target = _target, selector = _selector, context = _context; +@synthesize queryData = _queryData, cancelTimer = _cancelTimer; - (instancetype)initWithHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType ID: (OFNumber *)ID @@ -1024,10 +1027,17 @@ if ([query nameServersIndex] + 1 < [[query nameServers] count]) { [query setNameServersIndex: [query nameServersIndex] + 1]; [self of_sendQuery: query]; return; } + + if ([query attempt] < ATTEMPTS) { + [query setAttempt: [query attempt] + 1]; + [query setNameServersIndex: 0]; + [self of_sendQuery: query]; + return; + } target = [[[query target] retain] autorelease]; selector = [query selector]; callback = (void (*)(id, SEL, OFArray *, id, id)) [target methodForSelector: selector];