Differences From Artifact [f53bdeefa1]:
- File src/OFDNSResolver.m — part of check-in [81674093ac] at 2018-08-25 15:53:58 on branch trunk — OFDNSResolver: Obtain name servers on Nintendo 3DS (user: js, size: 42989) [annotate] [blame] [check-ins using]
To Artifact [8914dd7f51]:
- File
src/OFDNSResolver.m
— part of check-in
[8555d64ee6]
at
2018-09-10 20:44:40
on branch trunk
— OFDNSResolver: Method to resolve host to addresses
This provides more convenience when the goal is to connect a socket and
provides functionality similar to getaddrinfo().No support for resolving CNAMEs yet - this will be the next step. (user: js, size: 48894) [annotate] [blame] [check-ins using]
︙ | |||
152 153 154 155 156 157 158 159 160 161 162 163 164 165 | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | + + + + + + + + + + + + + + + + + + + + + + + + | settings: (OFDNSResolverSettings *)settings nameServersIndex: (size_t)nameServersIndex searchDomainsIndex: (size_t)searchDomainsIndex target: (id)target selector: (SEL)selector context: (id)context; @end @interface OFDNSResolver_ResolveSocketAddressContext: OFObject { OFString *_host; id _target; SEL _selector; id _context; OFMutableArray OF_GENERIC(OF_KINDOF(OFDNSResourceRecord *)) *_records; @public unsigned int _expectedResponses; } - (instancetype)initWithHost: (OFString *)host target: (id)target selector: (SEL)selector context: (id)context; - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName answerRecords: (OFArray *)answerRecords authorityRecords: (OFArray *)authorityRecords additionalRecords: (OFArray *)additionalRecords context: (id)context exception: (id)exception; @end @interface OFDNSResolver () - (void)of_setDefaults; - (void)of_obtainSystemConfig; #if defined(OF_HAVE_FILES) && !defined(OF_NINTENDO_3DS) - (void)of_parseHosts: (OFString *)path; # if !defined(OF_WINDOWS) && !defined(OF_AMIGAOS4) |
︙ | |||
750 751 752 753 754 755 756 757 758 759 760 761 762 763 | 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | [_settings release]; [_target release]; [_context release]; [_queryData release]; [_cancelTimer release]; [super dealloc]; } @end @implementation OFDNSResolver_ResolveSocketAddressContext - (instancetype)initWithHost: (OFString *)host target: (id)target selector: (SEL)selector context: (id)context { self = [super init]; @try { _host = [host copy]; _target = [target retain]; _selector = selector; _context = [context retain]; _records = [[OFMutableArray alloc] init]; } @catch (id e) { [self release]; @throw e; } return self; } - (void)dealloc { [_host release]; [_target release]; [_context release]; [_records release]; [super dealloc]; } - (void)resolver: (OFDNSResolver *)resolver didResolveDomainName: (OFString *)domainName answerRecords: (OFArray *)answerRecords authorityRecords: (OFArray *)authorityRecords additionalRecords: (OFArray *)additionalRecords context: (id)context exception: (id)exception { /* * TODO: Error handling could be improved. Ignore error if there are * responses, otherwise propagate error. */ of_socket_address_family_t addressFamily = [context intValue]; _expectedResponses--; if (exception == nil) { for (OFDNSResourceRecord *record in answerRecords) { if (![[record name] isEqual: domainName]) continue; if ([record recordClass] != OF_DNS_RESOURCE_RECORD_CLASS_IN) continue; switch ([record recordType]) { case OF_DNS_RESOURCE_RECORD_TYPE_A: if (addressFamily == OF_SOCKET_ADDRESS_FAMILY_IPV4 || addressFamily == OF_SOCKET_ADDRESS_FAMILY_ANY) [_records addObject: record]; break; case OF_DNS_RESOURCE_RECORD_TYPE_AAAA: if (addressFamily == OF_SOCKET_ADDRESS_FAMILY_IPV6 || addressFamily == OF_SOCKET_ADDRESS_FAMILY_ANY) [_records addObject: record]; break; /* * TODO: Add CNAMEs and replace them with addresses in * a later stage. */ default: break; } } } if (_expectedResponses == 0) { void (*method)(id, SEL, OFDNSResolver *, OFString *, OFData *, id, id) = (void (*)(id, SEL, OFDNSResolver *, OFString *, OFData *, id, id))[_target methodForSelector: _selector]; OFMutableData *addresses = nil; if ([_records count] > 0) { addresses = [OFMutableData dataWithItemSize: sizeof(of_socket_address_t) capacity: [_records count]]; for (OF_KINDOF(OFDNSResourceRecord *) record in _records) [addresses addItem: [record address]]; [addresses makeImmutable]; method(_target, _selector, resolver, domainName, addresses, _context, nil); } else { OFResolveHostFailedException *e; e = [OFResolveHostFailedException exceptionWithHost: _host recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: 0 error: OF_DNS_RESOLVER_ERROR_UNKNOWN]; method(_target, _selector, resolver, domainName, nil, _context, e); } } } @end @implementation OFDNSResolver @synthesize staticHosts = _staticHosts, nameServers = _nameServers; @synthesize localDomain = _localDomain, searchDomains = _searchDomains; @synthesize timeout = _timeout, maxAttempts = _maxAttempts; |
︙ | |||
1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 | 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | callback(query->_target, query->_selector, self, query->_domainName, answerRecords, authorityRecords, additionalRecords, query->_context, nil); return false; } - (void)asyncResolveSocketAddressesForHost: (OFString *)host target: (id)target selector: (SEL)selector context: (nullable id)context { #ifdef OF_HAVE_IPV6 [self asyncResolveSocketAddressesForHost: host addressFamily: OF_SOCKET_ADDRESS_FAMILY_ANY target: target selector: selector context: context]; #else [self asyncResolveSocketAddressesForHost: host addressFamily: OF_SOCKET_ADDRESS_FAMILY_IPV4 target: target selector: selector context: context]; #endif } - (void)asyncResolveSocketAddressesForHost: (OFString *)host addressFamily: (of_socket_address_family_t) addressFamily target: (id)target selector: (SEL)selector context: (id)userContext { void *pool = objc_autoreleasePoolPush(); OFDNSResolver_ResolveSocketAddressContext *context; OFNumber *addressFamilyNumber; context = [[[OFDNSResolver_ResolveSocketAddressContext alloc] initWithHost: host target: target selector: selector context: userContext] autorelease]; switch (addressFamily) { case OF_SOCKET_ADDRESS_FAMILY_IPV4: case OF_SOCKET_ADDRESS_FAMILY_IPV6: context->_expectedResponses = 1; break; case OF_SOCKET_ADDRESS_FAMILY_ANY: context->_expectedResponses = 2; break; default: @throw [OFInvalidArgumentException exception]; } addressFamilyNumber = [OFNumber numberWithInt: addressFamily]; if (addressFamily == OF_SOCKET_ADDRESS_FAMILY_IPV6 || addressFamily == OF_SOCKET_ADDRESS_FAMILY_ANY) [self asyncResolveHost: host recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: OF_DNS_RESOURCE_RECORD_TYPE_AAAA target: context selector: @selector(resolver:didResolveDomainName: answerRecords:authorityRecords: additionalRecords:context: exception:) context: addressFamilyNumber]; if (addressFamily == OF_SOCKET_ADDRESS_FAMILY_IPV4 || addressFamily == OF_SOCKET_ADDRESS_FAMILY_ANY) [self asyncResolveHost: host recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: OF_DNS_RESOURCE_RECORD_TYPE_A target: context selector: @selector(resolver:didResolveDomainName: answerRecords:authorityRecords: additionalRecords:context: exception:) context: addressFamilyNumber]; objc_autoreleasePoolPop(pool); } - (void)close { void *pool = objc_autoreleasePoolPush(); OFEnumerator OF_GENERIC(OFDNSResolverQuery *) *enumerator; OFDNSResolverQuery *query; |
︙ |