Index: src/OFDNSResolver.m ================================================================== --- src/OFDNSResolver.m +++ src/OFDNSResolver.m @@ -66,10 +66,11 @@ @interface OFDNSResolver_context: OFObject { OFString *_host; OFArray OF_GENERIC(OFString *) *_nameServers, *_searchDomains; size_t _nameServersIndex, _searchDomainsIndex; + OFNumber *_ID; OFMutableData *_queryData; id _target; SEL _selector; id _userContext; } @@ -77,18 +78,20 @@ @property (readonly, nonatomic) OFString *host; @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 (readonly, nonatomic) OFNumber *ID; @property (readonly, nonatomic) OFMutableData *queryData; @property (readonly, nonatomic) id target; @property (readonly, nonatomic) SEL selector; @property (readonly, nonatomic) id userContext; - (instancetype)initWithHost: (OFString *)host nameServers: (OFArray OF_GENERIC(OFString *) *)nameServers searchDomains: (OFArray OF_GENERIC(OFString *) *)searchDomains + ID: (OFNumber *)ID queryData: (OFMutableData *)queryData target: (id)target selector: (SEL)selector userContext: (id)userContext; @end @@ -488,16 +491,18 @@ @implementation OFDNSResolver_context @synthesize host = _host, nameServers = _nameServers; @synthesize searchDomains = _searchDomains; @synthesize nameServersIndex = _nameServersIndex; -@synthesize searchDomainsIndex = _searchDomainsIndex, queryData = _queryData; -@synthesize target = _target, selector = _selector, userContext = _userContext; +@synthesize searchDomainsIndex = _searchDomainsIndex, ID = _ID; +@synthesize queryData = _queryData, target = _target, selector = _selector; +@synthesize userContext = _userContext; - (instancetype)initWithHost: (OFString *)host nameServers: (OFArray OF_GENERIC(OFString *) *)nameServers searchDomains: (OFArray OF_GENERIC(OFString *) *)searchDomains + ID: (OFNumber *)ID queryData: (OFMutableData *)queryData target: (id)target selector: (SEL)selector userContext: (id)userContext { @@ -505,10 +510,11 @@ @try { _host = [host copy]; _nameServers = [nameServers copy]; _searchDomains = [searchDomains copy]; + _ID = [ID retain]; _queryData = [queryData retain]; _target = [target retain]; _selector = selector; _userContext = [userContext retain]; } @catch (id e) { @@ -522,10 +528,11 @@ - (void)dealloc { [_host release]; [_nameServers release]; [_searchDomains release]; + [_ID release]; [_queryData release]; [_target release]; [_userContext release]; [super dealloc]; @@ -997,15 +1004,27 @@ - (size_t)of_socket: (OFUDPSocket *)sock didSendBuffer: (void **)buffer bytesSent: (size_t)bytesSent receiver: (of_socket_address_t *)receiver - context: (id)context + context: (id)DNSResolverContext exception: (id)exception { - if (exception != nil) + if (exception != nil) { + id target = [[[DNSResolverContext target] retain] autorelease]; + SEL selector = [DNSResolverContext selector]; + void (*callback)(id, SEL, OFArray *, id, id) = + (void (*)(id, SEL, OFArray *, id, id)) + [target methodForSelector: selector]; + + [_queries removeObjectForKey: [DNSResolverContext ID]]; + + callback(target, selector, nil, + [DNSResolverContext userContext], exception); + return 0; + } [sock asyncReceiveIntoBuffer: [self allocMemoryWithSize: 512] length: 512 target: self selector: @selector(of_socket:didReceiveIntoBuffer: @@ -1102,10 +1121,11 @@ DNSResolverContext = [[[OFDNSResolver_context alloc] initWithHost: host nameServers: _nameServers searchDomains: _searchDomains + ID: ID queryData: data target: target selector: selector userContext: context] autorelease]; [_queries setObject: DNSResolverContext @@ -1118,19 +1138,21 @@ if (address.address.ss_family == AF_INET6) { if (_IPv6Socket == nil) { _IPv6Socket = [[OFUDPSocket alloc] init]; [_IPv6Socket bindToHost: @"::" port: 0]; + [_IPv6Socket setBlocking: false]; } sock = _IPv6Socket; } else { #endif if (_IPv4Socket == nil) { _IPv4Socket = [[OFUDPSocket alloc] init]; [_IPv4Socket bindToHost: @"0.0.0.0" port: 0]; + [_IPv4Socket setBlocking: false]; } sock = _IPv4Socket; #ifdef OF_HAVE_IPV6 } @@ -1140,11 +1162,11 @@ length: [data count] receiver: address target: self selector: @selector(of_socket:didSendBuffer:bytesSent: receiver:context:exception:) - context: nil]; + context: DNSResolverContext]; objc_autoreleasePoolPop(pool); } - (void)close