Overview
Comment: | OFDNSResolver: Allow specifying the run loop mode |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
7efb3c590ef299f7e1285d224f5894b9 |
User & Date: | js on 2018-10-06 13:52:38 |
Other Links: | manifest | tags |
Context
2018-10-06
| ||
17:44 | OFRunLoop: Fix missing nullable check-in: 3c0d72802a user: js tags: trunk | |
13:52 | OFDNSResolver: Allow specifying the run loop mode check-in: 7efb3c590e user: js tags: trunk | |
2018-09-29
| ||
14:45 | OFUDPSocket: Allow specifying the run loop mode check-in: b90d4055a1 user: js tags: trunk | |
Changes
Modified src/OFDNSResolver.h from [ef34cbb838] to [d24746b59f].
︙ | ︙ | |||
12 13 14 15 16 17 18 | * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" | > | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" #import "OFDNSResourceRecord.h" #import "OFRunLoop.h" #import "OFString.h" OF_ASSUME_NONNULL_BEGIN @class OFArray OF_GENERIC(ObjectType); @class OFDNSResolverQuery; @class OFDate; @class OFDictionary OF_GENERIC(KeyType, ObjectType); |
︙ | ︙ | |||
239 240 241 242 243 244 245 246 247 248 249 250 251 252 | - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType target: (id)target selector: (SEL)selector context: (nullable id)context; /*! * @brief Asynchronously resolves the specified host to socket addresses. * * @param host The host to resolve * @param target The target to call with the result once resolving is done * @param selector The selector to call on the target. The signature must be * the following: | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType target: (id)target selector: (SEL)selector context: (nullable id)context; /*! * @brief Asynchronously resolves the specified host. * * @param host The host to resolve * @param recordClass The desired class of the records to query * @param recordType The desired type of the records to query * @param runLoopMode The run loop mode in which to resolve * @param target The target to call with the result once resolving is done * @param selector The selector to call on the target. The signature must be * the following: * @parblock * * void (OFDNSResolver *resolver, OFString *domainName, * OFArray<OFDictionary<OFString *, * __kindof OFDNSResourceRecord *> *> * *_Nullable answerRecords, * OFArray<OFDictionary<OFString *, * __kindof OFDNSResourceRecord *> *> * *_Nullable authorityRecords, * OFArray<OFDictionary<OFString *, * __kindof OFDNSResourceRecord *> *> * *_Nullable additionalRecords, * id _Nullable context, id _Nullable exception) * * `resolver` is the acting resolver.@n * `domainName` is the fully qualified domain name used to * resolve the host.@n * `answerRecords` are the answer records from the name server, * grouped by domain name. * @n * `authorityRecords` are the authority records from the name * server, grouped by domain name.@n * `additionalRecords` are additional records sent by the name * server, grouped by domain name.@n * `context` is the context object originally passed.@n * `exception` is an exception that happened during resolving, * otherwise nil. * @endparblock * @param context A context object to pass along to the target */ - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType runLoopMode: (of_run_loop_mode_t)runLoopMode target: (id)target selector: (SEL)selector context: (nullable id)context; /*! * @brief Asynchronously resolves the specified host to socket addresses. * * @param host The host to resolve * @param target The target to call with the result once resolving is done * @param selector The selector to call on the target. The signature must be * the following: |
︙ | ︙ | |||
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 | * @endparblock * @param context A context object to pass along to the target */ - (void)asyncResolveSocketAddressesForHost: (OFString *)host addressFamily: (of_socket_address_family_t) addressFamily target: (id)target selector: (SEL)selector context: (nullable id)context; /*! * @brief Closes all sockets and cancels all ongoing requests. */ - (void)close; @end OF_ASSUME_NONNULL_END | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 | * @endparblock * @param context A context object to pass along to the target */ - (void)asyncResolveSocketAddressesForHost: (OFString *)host addressFamily: (of_socket_address_family_t) addressFamily target: (id)target selector: (SEL)selector context: (nullable id)context; /*! * @brief Asynchronously resolves the specified host to socket addresses. * * @param host The host to resolve * @param addressFamily The desired socket address family * @param runLoopMode The run loop mode in which to resolve * @param target The target to call with the result once resolving is done * @param selector The selector to call on the target. The signature must be * the following: * @parblock * * void (OFDNSResolver *resolver, OFString *domainName, * OFData *_Nullable socketAddresses, * id _Nullable context, id _Nullable exception) * * `resolver` is the acting resolver.@n * `domainName` is the fully qualified domain name used to * resolve the host.@n * `socketAddresses` is OFData containing several * of_socket_address_t.@n * `context` is the context object originally passed.@n * `exception` is an exception that happened during resolving, * otherwise nil. * @endparblock * @param context A context object to pass along to the target */ - (void)asyncResolveSocketAddressesForHost: (OFString *)host addressFamily: (of_socket_address_family_t) addressFamily runLoopMode: (of_run_loop_mode_t)runLoopMode target: (id)target selector: (SEL)selector context: (nullable id)context; /*! * @brief Closes all sockets and cancels all ongoing requests. */ - (void)close; @end OF_ASSUME_NONNULL_END |
Modified src/OFDNSResolver.m from [fc6f9bf825] to [3ad875198a].
︙ | ︙ | |||
228 229 230 231 232 233 234 235 236 237 | - (void)of_reloadSystemConfig; - (void)of_resolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType settings: (OFDNSResolverSettings *)settings nameServersIndex: (size_t)nameServersIndex searchDomainsIndex: (size_t)searchDomainsIndex target: (id)target selector: (SEL)selector context: (id)context; | > | > | 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | - (void)of_reloadSystemConfig; - (void)of_resolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType settings: (OFDNSResolverSettings *)settings nameServersIndex: (size_t)nameServersIndex searchDomainsIndex: (size_t)searchDomainsIndex runLoopMode: (of_run_loop_mode_t)runLoopMode target: (id)target selector: (SEL)selector context: (id)context; - (void)of_sendQuery: (OFDNSResolverQuery *)query runLoopMode: (of_run_loop_mode_t)runLoopMode; - (void)of_queryWithIDTimedOut: (OFDNSResolverQuery *)query; - (size_t)of_socket: (OFUDPSocket *)sock didSendBuffer: (void **)buffer bytesSent: (size_t)bytesSent receiver: (of_socket_address_t *)receiver context: (OFDNSResolverQuery *)query exception: (id)exception; |
︙ | ︙ | |||
913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 | additionalRecords: additionalRecords recordType: recordType recursion: recursion - 1 result: result]) found = true; if (!found) { OFNumber *recordTypeNumber = [OFNumber numberWithInt: recordType]; _expectedResponses++; [result addObject: [OFPair pairWithFirstObject: CNAME secondObject: recordTypeNumber]]; [_resolver asyncResolveHost: alias recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: recordType target: self selector: @selector(resolver: didResolveCNAME: answerRecords:authorityRecords: additionalRecords:context: exception:) context: recordTypeNumber]; | > > > > | 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 | additionalRecords: additionalRecords recordType: recordType recursion: recursion - 1 result: result]) found = true; if (!found) { of_run_loop_mode_t runLoopMode = [[OFRunLoop currentRunLoop] currentMode]; OFNumber *recordTypeNumber = [OFNumber numberWithInt: recordType]; _expectedResponses++; [result addObject: [OFPair pairWithFirstObject: CNAME secondObject: recordTypeNumber]]; [_resolver asyncResolveHost: alias recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: recordType runLoopMode: runLoopMode target: self selector: @selector(resolver: didResolveCNAME: answerRecords:authorityRecords: additionalRecords:context: exception:) context: recordTypeNumber]; |
︙ | ︙ | |||
1587 1588 1589 1590 1591 1592 1593 | [_lastConfigReload release]; _lastConfigReload = nil; [self of_obtainSystemConfig]; } | < < < < < < < < < < < < < > | 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 | [_lastConfigReload release]; _lastConfigReload = nil; [self of_obtainSystemConfig]; } - (void)of_resolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType settings: (OFDNSResolverSettings *)settings nameServersIndex: (size_t)nameServersIndex searchDomainsIndex: (size_t)searchDomainsIndex runLoopMode: (of_run_loop_mode_t)runLoopMode target: (id)target selector: (SEL)selector context: (id)context { void *pool = objc_autoreleasePoolPush(); OFNumber *ID; OFString *domainName; |
︙ | ︙ | |||
1653 1654 1655 1656 1657 1658 1659 | searchDomainsIndex: searchDomainsIndex target: target selector: selector context: context] autorelease]; [_queries setObject: query forKey: ID]; | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > | | | | | > > | 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 | searchDomainsIndex: searchDomainsIndex target: target selector: selector context: context] autorelease]; [_queries setObject: query forKey: ID]; [self of_sendQuery: query runLoopMode: runLoopMode]; objc_autoreleasePoolPop(pool); } - (void)asyncResolveHost: (OFString *)host target: (id)target selector: (SEL)selector context: (id)context { [self asyncResolveHost: host recordClass: OF_DNS_RESOURCE_RECORD_CLASS_IN recordType: OF_DNS_RESOURCE_RECORD_TYPE_ALL runLoopMode: of_run_loop_mode_default target: target selector: selector context: context]; } - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType target: (id)target selector: (SEL)selector context: (id)context { [self asyncResolveHost: host recordClass: recordClass recordType: recordType runLoopMode: of_run_loop_mode_default target: target selector: selector context: context]; } - (void)asyncResolveHost: (OFString *)host recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType runLoopMode: (of_run_loop_mode_t)runLoopMode target: (id)target selector: (SEL)selector context: (id)context { void *pool = objc_autoreleasePoolPush(); OFDNSResolverSettings *settings = [[[OFDNSResolverSettings alloc] initWithNameServers: _nameServers searchDomains: _searchDomains timeout: _timeout maxAttempts: _maxAttempts minNumberOfDotsInAbsoluteName: _minNumberOfDotsInAbsoluteName] autorelease]; [self of_resolveHost: host recordClass: recordClass recordType: recordType settings: settings nameServersIndex: 0 searchDomainsIndex: 0 runLoopMode: runLoopMode target: target selector: selector context: context]; objc_autoreleasePoolPop(pool); } - (void)of_sendQuery: (OFDNSResolverQuery *)query runLoopMode: (of_run_loop_mode_t)runLoopMode { OFUDPSocket *sock; OFString *nameServer; [query->_cancelTimer invalidate]; [query->_cancelTimer release]; query->_cancelTimer = nil; query->_cancelTimer = [[OFTimer alloc] initWithFireDate: [OFDate dateWithTimeIntervalSinceNow: query->_settings->_timeout] interval: query->_settings->_timeout target: self selector: @selector(of_queryWithIDTimedOut:) object: query repeats: false]; [[OFRunLoop currentRunLoop] addTimer: query->_cancelTimer forMode: runLoopMode]; nameServer = [query->_settings->_nameServers objectAtIndex: query->_nameServersIndex]; query->_usedNameServer = of_socket_address_parse_ip(nameServer, 53); switch (query->_usedNameServer.family) { #ifdef OF_HAVE_IPV6 |
︙ | ︙ | |||
1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 | default: @throw [OFInvalidArgumentException exception]; } [sock asyncSendBuffer: [query->_queryData items] length: [query->_queryData count] receiver: query->_usedNameServer target: self selector: @selector(of_socket:didSendBuffer:bytesSent: receiver:context:exception:) context: query]; } - (void)of_queryWithIDTimedOut: (OFDNSResolverQuery *)query { OFResolveHostFailedException *exception; if (query == nil) return; if (query->_nameServersIndex + 1 < [query->_settings->_nameServers count]) { query->_nameServersIndex++; | > | > | > | 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 | default: @throw [OFInvalidArgumentException exception]; } [sock asyncSendBuffer: [query->_queryData items] length: [query->_queryData count] receiver: query->_usedNameServer runLoopMode: runLoopMode target: self selector: @selector(of_socket:didSendBuffer:bytesSent: receiver:context:exception:) context: query]; } - (void)of_queryWithIDTimedOut: (OFDNSResolverQuery *)query { OFResolveHostFailedException *exception; if (query == nil) return; if (query->_nameServersIndex + 1 < [query->_settings->_nameServers count]) { query->_nameServersIndex++; [self of_sendQuery: query runLoopMode: [[OFRunLoop currentRunLoop] currentMode]]; return; } if (query->_attempt < query->_settings->_maxAttempts) { query->_attempt++; query->_nameServersIndex = 0; [self of_sendQuery: query runLoopMode: [[OFRunLoop currentRunLoop] currentMode]]; return; } query = [[query retain] autorelease]; [_queries removeObjectForKey: query->_ID]; exception = [OFResolveHostFailedException |
︙ | ︙ | |||
1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 | exception); return 0; } [sock asyncReceiveIntoBuffer: [query allocMemoryWithSize: 512] length: 512 target: self selector: @selector(of_socket:didReceiveIntoBuffer: length:sender:context:exception:) context: nil]; return 0; } | > | 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 | exception); return 0; } [sock asyncReceiveIntoBuffer: [query allocMemoryWithSize: 512] length: 512 runLoopMode: [[OFRunLoop currentRunLoop] currentMode] target: self selector: @selector(of_socket:didReceiveIntoBuffer: length:sender:context:exception:) context: nil]; return 0; } |
︙ | ︙ | |||
1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 | break; case 2: error = OF_DNS_RESOLVER_ERROR_SERVER_FAILURE; break; case 3: if (query->_searchDomainsIndex + 1 < [query->_settings->_searchDomains count]) { query->_searchDomainsIndex++; [self of_resolveHost: query->_host recordClass: query->_recordClass recordType: query->_recordType settings: query->_settings nameServersIndex: query->_nameServersIndex searchDomainsIndex: query->_searchDomainsIndex target: query->_target selector: query->_selector context: query->_context]; return false; } | > > > > | 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 | break; case 2: error = OF_DNS_RESOLVER_ERROR_SERVER_FAILURE; break; case 3: if (query->_searchDomainsIndex + 1 < [query->_settings->_searchDomains count]) { of_run_loop_mode_t runLoopMode = [[OFRunLoop currentRunLoop] currentMode]; query->_searchDomainsIndex++; [self of_resolveHost: query->_host recordClass: query->_recordClass recordType: query->_recordType settings: query->_settings nameServersIndex: query->_nameServersIndex searchDomainsIndex: query->_searchDomainsIndex runLoopMode: runLoopMode target: query->_target selector: query->_selector context: query->_context]; return false; } |
︙ | ︙ | |||
1956 1957 1958 1959 1960 1961 1962 | return false; } - (void)asyncResolveSocketAddressesForHost: (OFString *)host target: (id)target selector: (SEL)selector | | < > > | > > > > > > > | > < > > > > > > > > > > > | 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 | return false; } - (void)asyncResolveSocketAddressesForHost: (OFString *)host target: (id)target selector: (SEL)selector context: (id)context { [self asyncResolveSocketAddressesForHost: host addressFamily: OF_SOCKET_ADDRESS_FAMILY_ANY runLoopMode: of_run_loop_mode_default target: target selector: selector context: context]; } - (void)asyncResolveSocketAddressesForHost: (OFString *)host addressFamily: (of_socket_address_family_t) addressFamily target: (id)target selector: (SEL)selector context: (id)context { [self asyncResolveSocketAddressesForHost: host addressFamily: addressFamily runLoopMode: of_run_loop_mode_default target: target selector: selector context: context]; } - (void)asyncResolveSocketAddressesForHost: (OFString *)host addressFamily: (of_socket_address_family_t) addressFamily runLoopMode: (of_run_loop_mode_t)runLoopMode target: (id)target selector: (SEL)selector context: (id)userContext { void *pool = objc_autoreleasePoolPush(); OFDNSResolver_ResolveSocketAddressContext *context; context = [[[OFDNSResolver_ResolveSocketAddressContext alloc] initWithHost: host target: target selector: selector context: userContext] autorelease]; switch (addressFamily) { case OF_SOCKET_ADDRESS_FAMILY_IPV4: #ifdef OF_HAVE_IPV6 case OF_SOCKET_ADDRESS_FAMILY_IPV6: #endif context->_expectedResponses = 1; break; case OF_SOCKET_ADDRESS_FAMILY_ANY: #ifdef OF_HAVE_IPV6 context->_expectedResponses = 2; #else context->_expectedResponses = 1; #endif break; default: @throw [OFInvalidArgumentException exception]; } #ifdef OF_HAVE_IPV6 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 runLoopMode: runLoopMode target: context selector: @selector(resolver:didResolveDomainName: answerRecords:authorityRecords: additionalRecords:context: exception:) context: [OFNumber numberWithInt: OF_DNS_RESOURCE_RECORD_TYPE_AAAA]]; #endif 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 runLoopMode: runLoopMode target: context selector: @selector(resolver:didResolveDomainName: answerRecords:authorityRecords: additionalRecords:context: exception:) context: [OFNumber numberWithInt: OF_DNS_RESOURCE_RECORD_TYPE_A]]; |
︙ | ︙ |