@@ -161,34 +161,28 @@ } - (instancetype)initWithHost: (OFString *)host delegate: (id)delegate; - (bool)parseRecords: (OFArray *)records - answerRecords: (OFDictionary *)answerRecords - additionalRecords: (OFDictionary *)additionalRecords + response: (OFDNSResponse *)response recordType: (of_dns_resource_record_type_t)recordType recursion: (unsigned int)recursion result: (OFMutableArray *)result; - (void)resolveCNAME: (OFCNAMEDNSResourceRecord *)CNAME - answerRecords: (OFDictionary *)answerRecords - additionalRecords: (OFDictionary *)additionalRecords + response: (OFDNSResponse *)response recordType: (of_dns_resource_record_type_t)recordType recursion: (unsigned int)recursion result: (OFMutableArray *)result; -- (void)resolver: (OFDNSResolver *)resolver - didResolveCNAME: (OFString *)CNAME - answerRecords: (OFDictionary *)answerRecords - authorityRecords: (OFDictionary *)authorityRecords - additionalRecords: (OFDictionary *)additionalRecords - context: (OFNumber *)context - exception: (id)exception; +- (void)resolver: (OFDNSResolver *)resolver + didResolveCNAME: (OFString *)CNAME + response: (OFDNSResponse *)response + context: (OFNumber *)context + exception: (id)exception; - (void)done; - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName - answerRecords: (OFDictionary *)answerRecords - authorityRecords: (OFDictionary *)authorityRecords - additionalRecords: (OFDictionary *)additionalRecords + response: (OFDNSResponse *)response context: (OFNumber *)context exception: (id)exception; @end @interface OFDNSResolverResolveSocketAddressesDelegate: OFObject @@ -657,22 +651,20 @@ [ret makeImmutable]; return ret; } -static void callback(id target, SEL selector, OFDNSResolver *resolver, - OFString *domainName, OFDictionary *answerRecords, - OFDictionary *authorityRecords, OFDictionary *additionalRecords, id context, - id exception) -{ - void (*method)(id, SEL, OFDNSResolver *, OFString *, OFDictionary *, - OFDictionary *, OFDictionary *, id, id) = (void (*)(id, SEL, - OFDNSResolver *, OFString *, OFDictionary *, OFDictionary *, - OFDictionary *, id, id))[target methodForSelector: selector]; - - method(target, selector, resolver, domainName, answerRecords, - authorityRecords, additionalRecords, context, exception); +static void +callback(id target, SEL selector, OFDNSResolver *resolver, OFString *domainName, + OFDNSResponse *response, id context, id exception) +{ + void (*method)(id, SEL, OFDNSResolver *, OFString *, OFDNSResponse *, + id, id) = (void (*)(id, SEL, OFDNSResolver *, OFString *, + OFDNSResponse *, id, id))[target methodForSelector: selector]; + + method(target, selector, resolver, domainName, response, context, + exception); } @implementation OFDNSResolverSettings - (instancetype)initWithNameServers: (OFArray *)nameServers searchDomains: (OFArray *)searchDomains @@ -842,43 +834,40 @@ [super dealloc]; } - (bool)parseRecords: (OFArray *)records - answerRecords: (OFDictionary *)answerRecords - additionalRecords: (OFDictionary *)additionalRecords + response: (OFDNSResponse *)response recordType: (of_dns_resource_record_type_t)recordType recursion: (unsigned int)recursion result: (OFMutableArray *)result { bool found = false; - for (OFDNSResourceRecord *record in records) { - if (record.recordClass != OF_DNS_RESOURCE_RECORD_CLASS_IN) + for (OF_KINDOF(OFDNSResourceRecord *) record in records) { + if ([record recordClass] != OF_DNS_RESOURCE_RECORD_CLASS_IN) continue; - if (record.recordType == recordType) { + if ([record recordType] == recordType) { [result addObject: record]; found = true; - } else if (record.recordType == + } else if ([record recordType] == OF_DNS_RESOURCE_RECORD_TYPE_CNAME) { - [self resolveCNAME: (OFCNAMEDNSResourceRecord *)record - answerRecords: answerRecords - additionalRecords: additionalRecords - recordType: recordType - recursion: recursion - result: result]; + [self resolveCNAME: record + response: response + recordType: recordType + recursion: recursion + result: result]; found = true; } } return found; } - (void)resolveCNAME: (OFCNAMEDNSResourceRecord *)CNAME - answerRecords: (OFDictionary *)answerRecords - additionalRecords: (OFDictionary *)additionalRecords + response: (OFDNSResponse *)response recordType: (of_dns_resource_record_type_t)recordType recursion: (unsigned int)recursion result: (OFMutableArray *)result { OFString *alias = CNAME.alias; @@ -885,21 +874,19 @@ bool found = false; if (recursion == 0) return; - if ([self parseRecords: [answerRecords objectForKey: alias] - answerRecords: answerRecords - additionalRecords: additionalRecords + if ([self parseRecords: [response.answerRecords objectForKey: alias] + response: response recordType: recordType recursion: recursion - 1 result: result]) found = true; - if ([self parseRecords: [additionalRecords objectForKey: alias] - answerRecords: answerRecords - additionalRecords: additionalRecords + if ([self parseRecords: [response.additionalRecords objectForKey: alias] + response: response recordType: recordType recursion: recursion - 1 result: result]) found = true; @@ -919,26 +906,21 @@ recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: recordType runLoopMode: runLoopMode target: self selector: @selector(resolver: - didResolveCNAME: - answerRecords: - authorityRecords: - additionalRecords:context: - exception:) + didResolveCNAME:response: + context:exception:) context: recordTypeNumber]; } } -- (void)resolver: (OFDNSResolver *)resolver - didResolveCNAME: (OFString *)CNAME - answerRecords: (OFDictionary *)answerRecords - authorityRecords: (OFDictionary *)authorityRecords - additionalRecords: (OFDictionary *)additionalRecords - context: (OFNumber *)context - exception: (id)exception +- (void)resolver: (OFDNSResolver *)resolver + didResolveCNAME: (OFString *)CNAME + response: (OFDNSResponse *)response + context: (OFNumber *)context + exception: (id)exception { /* * TODO: Error handling could be improved. Ignore error if there are * responses, otherwise propagate error. */ @@ -959,21 +941,19 @@ return; } records = [OFMutableArray array]; - if ([self parseRecords: [answerRecords objectForKey: CNAME] - answerRecords: answerRecords - additionalRecords: additionalRecords + if ([self parseRecords: [response.answerRecords objectForKey: CNAME] + response: response recordType: recordType recursion: CNAME_RECURSION result: records]) found = true; - if ([self parseRecords: [additionalRecords objectForKey: CNAME] - answerRecords: answerRecords - additionalRecords: additionalRecords + if ([self parseRecords: [response.additionalRecords objectForKey: CNAME] + response: response recordType: recordType recursion: CNAME_RECURSION result: records]) found = true; @@ -1044,13 +1024,11 @@ exception: exception]; } - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName - answerRecords: (OFDictionary *)answerRecords - authorityRecords: (OFDictionary *)authorityRecords - additionalRecords: (OFDictionary *)additionalRecords + response: (OFDNSResponse *)response context: (OFNumber *)context exception: (id)exception { /* * TODO: Error handling could be improved. Ignore error if there are @@ -1078,13 +1056,12 @@ [self done]; return; } - [self parseRecords: [answerRecords objectForKey: _domainName] - answerRecords: answerRecords - additionalRecords: additionalRecords + [self parseRecords: [response.answerRecords objectForKey: _domainName] + response: response recordType: recordType recursion: CNAME_RECURSION result: _records]; if (_expectedResponses == 0) @@ -1652,24 +1629,19 @@ objc_autoreleasePoolPop(pool); } - (void)of_resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName - answerRecords: (of_dns_resolver_records_t)answerRecords - authorityRecords: (of_dns_resolver_records_t)authorityRecords - additionalRecords: (of_dns_resolver_records_t)additionalRecords + response: (OFDNSResponse *)response context: (id)delegate exception: (id)exception { if ([delegate respondsToSelector: @selector(resolver: - didResolveDomainName:answerRecords:authorityRecords: - additionalRecords:exception:)]) + didResolveDomainName:response:exception:)]) [delegate resolver: resolver didResolveDomainName: domainName - answerRecords: answerRecords - authorityRecords: authorityRecords - additionalRecords: additionalRecords + response: response exception: exception]; } - (void)asyncResolveHost: (OFString *)host delegate: (id )delegate @@ -1678,12 +1650,11 @@ recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: OF_DNS_RESOURCE_RECORD_TYPE_ALL runLoopMode: of_run_loop_mode_default target: self selector: @selector(of_resolver:didResolveDomainName: - answerRecords:authorityRecords: - additionalRecords:context:exception:) + response:context:exception:) context: delegate]; } - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass @@ -1694,12 +1665,11 @@ recordClass: recordClass recordType: recordType runLoopMode: of_run_loop_mode_default target: self selector: @selector(of_resolver:didResolveDomainName: - answerRecords:authorityRecords: - additionalRecords:context:exception:) + response:context:exception:) context: delegate]; } - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass @@ -1711,12 +1681,11 @@ recordClass: recordClass recordType: recordType runLoopMode: runLoopMode target: self selector: @selector(of_resolver:didResolveDomainName: - answerRecords:authorityRecords: - additionalRecords:context:exception:) + response:context:exception:) context: delegate]; } - (void)of_asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass @@ -1861,11 +1830,11 @@ recordClass: query->_recordClass recordType: query->_recordType error: OF_DNS_RESOLVER_ERROR_TIMEOUT]; callback(query->_target, query->_selector, self, query->_domainName, - nil, nil, nil, query->_context, exception); + nil, query->_context, exception); } - (bool)socket: (OFUDPSocket *)sock didReceiveIntoBuffer: (void *)buffer_ length: (size_t)length @@ -1873,10 +1842,11 @@ exception: (id)exception { unsigned char *buffer = buffer_; OFDictionary *answerRecords = nil, *authorityRecords = nil; OFDictionary *additionalRecords = nil; + OFDNSResponse *response = nil; OFNumber *ID; OFDNSResolverQuery *query; if (exception != nil) return true; @@ -2000,19 +1970,22 @@ answerRecords = parseSection(buffer, length, &i, numAnswers); authorityRecords = parseSection(buffer, length, &i, numAuthorityRecords); additionalRecords = parseSection(buffer, length, &i, numAdditionalRecords); + response = [OFDNSResponse + responseWithAnswerRecords: answerRecords + authorityRecords: authorityRecords + additionalRecords: additionalRecords]; } @catch (id e) { callback(query->_target, query->_selector, self, - query->_domainName, nil, nil, nil, query->_context, e); + query->_domainName, nil, query->_context, e); return true; } callback(query->_target, query->_selector, self, query->_domainName, - answerRecords, authorityRecords, additionalRecords, - query->_context, nil); + response, query->_context, nil); return true; } - (void)asyncResolveSocketAddressesForHost: (OFString *)host @@ -2195,13 +2168,11 @@ recordType: OF_DNS_RESOURCE_RECORD_TYPE_AAAA runLoopMode: runLoopMode target: context selector: @selector(resolver: didResolveDomainName: - answerRecords:authorityRecords: - additionalRecords:context: - exception:) + response:context:exception:) context: recordTypeNumber]; } #endif if (addressFamily == OF_SOCKET_ADDRESS_FAMILY_IPV4 || @@ -2211,13 +2182,11 @@ recordType: OF_DNS_RESOURCE_RECORD_TYPE_A runLoopMode: runLoopMode target: context selector: @selector(resolver: didResolveDomainName: - answerRecords:authorityRecords: - additionalRecords:context: - exception:) + response:context:exception:) context: [OFNumber numberWithInt: OF_DNS_RESOURCE_RECORD_TYPE_A]]; objc_autoreleasePoolPop(pool); } @@ -2282,14 +2251,13 @@ recordClass: query->_recordClass recordType: query->_recordType error: OF_DNS_RESOLVER_ERROR_CANCELED]; callback(query->_target, query->_selector, self, - query->_domainName, nil, nil, nil, query->_context, - exception); + query->_domainName, nil, query->_context, exception); } [_queries removeAllObjects]; objc_autoreleasePoolPop(pool); } @end