@@ -32,10 +32,11 @@ #import "OFNumber.h" #import "OFPair.h" #import "OFString.h" #import "OFTimer.h" #import "OFUDPSocket.h" +#import "OFUDPSocket+Private.h" #ifdef OF_WINDOWS # import "OFWindowsRegistryKey.h" #endif #import "OFInitializationFailedException.h" @@ -1782,24 +1783,28 @@ switch (query->_usedNameServer.family) { #ifdef OF_HAVE_IPV6 case OF_SOCKET_ADDRESS_FAMILY_IPV6: if (_IPv6Socket == nil) { + of_socket_address_t address = + of_socket_address_parse_ip(@"::", 0); + _IPv6Socket = [[OFUDPSocket alloc] init]; - [_IPv6Socket bindToHost: @"::" - port: 0]; + [_IPv6Socket of_bindToAddress: &address]; [_IPv6Socket setBlocking: false]; } sock = _IPv6Socket; break; #endif case OF_SOCKET_ADDRESS_FAMILY_IPV4: if (_IPv4Socket == nil) { + of_socket_address_t address = + of_socket_address_parse_ip(@"0.0.0.0", 0); + _IPv4Socket = [[OFUDPSocket alloc] init]; - [_IPv4Socket bindToHost: @"0.0.0.0" - port: 0]; + [_IPv4Socket of_bindToAddress: &address]; [_IPv4Socket setBlocking: false]; } sock = _IPv4Socket; break; @@ -2071,10 +2076,32 @@ selector: (SEL)selector context: (id)userContext { void *pool = objc_autoreleasePoolPush(); OFDNSResolver_AsyncResolveSocketAddressesContext *context; + + @try { + of_socket_address_t address = + of_socket_address_parse_ip(host, 0); + OFData *addresses; + void (*method)(id, SEL, OFDNSResolver *, OFString *, OFData *, + id, id); + + if (addressFamily != OF_SOCKET_ADDRESS_FAMILY_ANY && + address.family != addressFamily) + @throw [OFInvalidArgumentException exception]; + + addresses = [OFData dataWithItems: &address + itemSize: sizeof(address) + count: 1]; + + method = (void (*)(id, SEL, OFDNSResolver *, OFString *, + OFData *, id, id))[target methodForSelector: selector]; + method(target, selector, self, host, addresses, userContext, + nil); + } @catch (OFInvalidFormatException *e) { + } context = [[[OFDNSResolver_AsyncResolveSocketAddressesContext alloc] initWithHost: host target: target selector: selector