Overview
Comment: | OFDNSResolver: Periodic config reload |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
507d999b53102363bf652dfa83e46b62 |
User & Date: | js on 2018-08-13 00:00:24 |
Other Links: | manifest | tags |
Context
2018-08-13
| ||
21:06 | OFDNSResolver: Reduce code size check-in: 5d169b2f58 user: js tags: trunk | |
00:00 | OFDNSResolver: Periodic config reload check-in: 507d999b53 user: js tags: trunk | |
2018-08-12
| ||
22:21 | OFDNSResolver: Pass the FQDN to the callback check-in: 457f722d18 user: js tags: trunk | |
Changes
Modified src/OFDNSResolver.h from [4f664e02c6] to [8f0a42e843].
︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #import "OFString.h" #import "OFDNSResourceRecord.h" OF_ASSUME_NONNULL_BEGIN @class OFArray OF_GENERIC(ObjectType); @class OFDNSResolverQuery; @class OFDictionary OF_GENERIC(KeyType, ObjectType); @class OFMutableDictionary OF_GENERIC(KeyType, ObjectType); @class OFNumber; @class OFUDPSocket; /*! * @enum of_dns_resolver_error_t OFDNSResolver.h ObjFW/OFDNSResolver.h | > | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #import "OFString.h" #import "OFDNSResourceRecord.h" OF_ASSUME_NONNULL_BEGIN @class OFArray OF_GENERIC(ObjectType); @class OFDNSResolverQuery; @class OFDate; @class OFDictionary OF_GENERIC(KeyType, ObjectType); @class OFMutableDictionary OF_GENERIC(KeyType, ObjectType); @class OFNumber; @class OFUDPSocket; /*! * @enum of_dns_resolver_error_t OFDNSResolver.h ObjFW/OFDNSResolver.h |
︙ | ︙ | |||
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | OF_DNS_RESOLVER_ERROR_SERVER_REFUSED } of_dns_resolver_error_t; /*! * @class OFDNSResolver OFDNSResolver.h ObjFW/OFDNSResolver.h * * @brief A class for resolving DNS names. */ @interface OFDNSResolver: OFObject { OFDictionary OF_GENERIC(OFString *, OFArray OF_GENERIC(OFString *) *) *_staticHosts; OFArray OF_GENERIC(OFString *) *_nameServers; OFString *_Nullable _localDomain; OFArray OF_GENERIC(OFString *) *_searchDomains; size_t _minNumberOfDotsInAbsoluteName; bool _usesTCP; OFUDPSocket *_IPv4Socket; #ifdef OF_HAVE_IPV6 OFUDPSocket *_IPv6Socket; #endif OFMutableDictionary OF_GENERIC(OFNumber *, OFDNSResolverQuery *) *_queries; } | > > > > > > > | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | OF_DNS_RESOLVER_ERROR_SERVER_REFUSED } of_dns_resolver_error_t; /*! * @class OFDNSResolver OFDNSResolver.h ObjFW/OFDNSResolver.h * * @brief A class for resolving DNS names. * * @note If you change any of the properties, make sure to set * @ref configReloadInterval to 0, as otherwise your changes will be * reverted back to the system configuration on the next periodic config * reload. */ @interface OFDNSResolver: OFObject { OFDictionary OF_GENERIC(OFString *, OFArray OF_GENERIC(OFString *) *) *_staticHosts; OFArray OF_GENERIC(OFString *) *_nameServers; OFString *_Nullable _localDomain; OFArray OF_GENERIC(OFString *) *_searchDomains; size_t _minNumberOfDotsInAbsoluteName; bool _usesTCP; of_time_interval_t _configReloadInterval; OFDate *_lastConfigReload; OFUDPSocket *_IPv4Socket; #ifdef OF_HAVE_IPV6 OFUDPSocket *_IPv6Socket; #endif OFMutableDictionary OF_GENERIC(OFNumber *, OFDNSResolverQuery *) *_queries; } |
︙ | ︙ | |||
112 113 114 115 116 117 118 119 120 121 122 123 124 125 | @property (nonatomic) size_t minNumberOfDotsInAbsoluteName; /*! * @brief Whether the resolver uses TCP to talk to a name server. */ @property (nonatomic) bool usesTCP; /*! * @brief Creates a new, autoreleased OFDNSResolver. */ + (instancetype)resolver; /*! * @brief Initializes an already allocated OFDNSResolver. | > > > > > > > | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | @property (nonatomic) size_t minNumberOfDotsInAbsoluteName; /*! * @brief Whether the resolver uses TCP to talk to a name server. */ @property (nonatomic) bool usesTCP; /*! * @brief The interval in seconds in which the config should be reloaded. * * Setting this to 0 disables config reloading. */ @property (nonatomic) of_time_interval_t configReloadInterval; /*! * @brief Creates a new, autoreleased OFDNSResolver. */ + (instancetype)resolver; /*! * @brief Initializes an already allocated OFDNSResolver. |
︙ | ︙ |
Modified src/OFDNSResolver.m from [ec8c7e0a0c] to [221615e7cb].
︙ | ︙ | |||
20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <string.h> #include "unistd_wrapper.h" #import "OFDNSResolver.h" #import "OFArray.h" #import "OFCharacterSet.h" #import "OFData.h" #import "OFDictionary.h" #import "OFFile.h" #import "OFLocale.h" #import "OFNumber.h" #import "OFString.h" #import "OFTimer.h" #import "OFUDPSocket.h" | > | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <string.h> #include "unistd_wrapper.h" #import "OFDNSResolver.h" #import "OFArray.h" #import "OFCharacterSet.h" #import "OFData.h" #import "OFDate.h" #import "OFDictionary.h" #import "OFFile.h" #import "OFLocale.h" #import "OFNumber.h" #import "OFString.h" #import "OFTimer.h" #import "OFUDPSocket.h" |
︙ | ︙ | |||
54 55 56 57 58 59 60 61 62 63 64 65 66 67 | * also want to limit it to avoid DoS. Limiting it to 16 levels of pointers and * immediately rejecting pointers to itself seems like a fair balance. */ #define MAX_ALLOWED_POINTERS 16 #define TIMEOUT 2 #define ATTEMPTS 3 /* * TODO: * * - Resolve with each search domain * - Fallback to TCP */ | > > > > > > > > > > > > > > > > > | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | * also want to limit it to avoid DoS. Limiting it to 16 levels of pointers and * immediately rejecting pointers to itself seems like a fair balance. */ #define MAX_ALLOWED_POINTERS 16 #define TIMEOUT 2 #define ATTEMPTS 3 #if defined(OF_HAIKU) # define HOSTS_PATH @"/system/settings/network/hosts" # define RESOLV_CONF_PATH @"/system/settings/network/resolv.conf" #elif defined(OF_MORPHOS) # define HOSTS_PATH @"ENV:sys/net/hosts" # define RESOLV_CONF_PATH @"ENV:sys/net/resolv.conf" #elif defined(OF_AMIGAOS4) # define HOSTS_PATH @"DEVS:Internet/hosts" # define RESOLV_CONF_PATH @"DEVS:Internet/resolv.conf" #elif defined(OF_AMIGAOS) # define HOSTS_PATH @"AmiTCP:db/hosts" # define RESOLV_CONF_PATH @"AmiTCP:db/resolv.conf" #else # define HOSTS_PATH @"/etc/hosts" # define RESOLV_CONF_PATH @"/etc/resolv.conf" #endif /* * TODO: * * - Resolve with each search domain * - Fallback to TCP */ |
︙ | ︙ | |||
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | searchDomains: (OFArray OF_GENERIC(OFString *) *)searchDomains target: (id)target selector: (SEL)selector context: (id)context; @end @interface OFDNSResolver () #ifdef OF_HAVE_FILES - (void)of_parseHosts: (OFString *)path; # ifndef OF_WINDOWS - (void)of_parseResolvConf: (OFString *)path; - (void)of_parseResolvConfOption: (OFString *)option; # endif #endif #ifdef OF_WINDOWS - (void)of_parseNetworkParams; #endif - (void)of_sendQuery: (OFDNSResolverQuery *)query; - (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 | > > | 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | searchDomains: (OFArray OF_GENERIC(OFString *) *)searchDomains target: (id)target selector: (SEL)selector context: (id)context; @end @interface OFDNSResolver () - (void)of_parseConfig; #ifdef OF_HAVE_FILES - (void)of_parseHosts: (OFString *)path; # ifndef OF_WINDOWS - (void)of_parseResolvConf: (OFString *)path; - (void)of_parseResolvConfOption: (OFString *)option; # endif #endif #ifdef OF_WINDOWS - (void)of_parseNetworkParams; #endif - (void)of_reloadConfig; - (void)of_sendQuery: (OFDNSResolverQuery *)query; - (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 |
︙ | ︙ | |||
631 632 633 634 635 636 637 | } @end @implementation OFDNSResolver @synthesize staticHosts = _staticHosts, nameServers = _nameServers; @synthesize localDomain = _localDomain, searchDomains = _searchDomains; @synthesize minNumberOfDotsInAbsoluteName = _minNumberOfDotsInAbsoluteName; | | < < < < | < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 | } @end @implementation OFDNSResolver @synthesize staticHosts = _staticHosts, nameServers = _nameServers; @synthesize localDomain = _localDomain, searchDomains = _searchDomains; @synthesize minNumberOfDotsInAbsoluteName = _minNumberOfDotsInAbsoluteName; @synthesize usesTCP = _usesTCP, configReloadInterval = _configReloadInterval; + (instancetype)resolver { return [[[self alloc] init] autorelease]; } - (instancetype)init { self = [super init]; @try { _queries = [[OFMutableDictionary alloc] init]; [self of_parseConfig]; } @catch (id e) { [self release]; @throw e; } return self; } - (void)of_parseConfig { void *pool = objc_autoreleasePoolPush(); #ifdef OF_WINDOWS OFString *path; #endif _minNumberOfDotsInAbsoluteName = 1; _usesTCP = false; _configReloadInterval = 2; #if defined(OF_WINDOWS) # ifdef OF_HAVE_FILES path = [[OFWindowsRegistryKey localMachineKey] stringForValue: @"DataBasePath" subKeyPath: @"SYSTEM\\CurrentControlSet\\Services\\" @"Tcpip\\Parameters"]; path = [path stringByAppendingPathComponent: @"hosts"]; if (path != nil) [self of_parseHosts: path]; # endif [self of_parseNetworkParams]; #elif defined(OF_HAVE_FILES) [self of_parseHosts: HOSTS_PATH]; # ifdef OF_OPENBSD [self of_parseHosts: @"/etc/resolv.conf.tail"]; # endif [self of_parseResolvConf: RESOLV_CONF_PATH]; #endif if (_staticHosts == nil) { OFArray *localhost = #ifdef OF_HAVE_IPV6 [OFArray arrayWithObjects: @"::1", @"127.0.0.1", nil]; #else [OFArray arrayWithObject: @"127.0.0.1"]; #endif _staticHosts = [[OFDictionary alloc] initWithObject: localhost forKey: @"localhost"]; } if (_nameServers == nil) #ifdef OF_HAVE_IPV6 _nameServers = [[OFArray alloc] initWithObjects: @"127.0.0.1", @"::1", nil]; #else _nameServers = [[OFArray alloc] initWithObject: @"127.0.0.1"]; #endif if (_localDomain == nil) _localDomain = [domainFromHostname() copy]; if (_searchDomains == nil) { if (_localDomain != nil) _searchDomains = [[OFArray alloc] initWithObject: _localDomain]; else _searchDomains = [[OFArray alloc] init]; } _lastConfigReload = [[OFDate alloc] init]; objc_autoreleasePoolPop(pool); } - (void)dealloc { [self close]; [_staticHosts release]; [_nameServers release]; [_localDomain release]; [_searchDomains release]; [_lastConfigReload release]; [_IPv4Socket release]; #ifdef OF_HAVE_IPV6 [_IPv6Socket release]; #endif [_queries release]; [super dealloc]; } #ifdef OF_HAVE_FILES - (void)of_parseHosts: (OFString *)path { |
︙ | ︙ | |||
954 955 956 957 958 959 960 961 962 963 964 965 966 967 | if ([localDomain length] > 0) _localDomain = [localDomain copy]; objc_autoreleasePoolPop(pool); } #endif - (void)asyncResolveHost: (OFString *)host target: (id)target selector: (SEL)selector context: (id)context { [self asyncResolveHost: host | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 | if ([localDomain length] > 0) _localDomain = [localDomain copy]; objc_autoreleasePoolPop(pool); } #endif - (void)of_reloadConfig { /* * TODO: Rather than reparsing every, check what actually changed * (mtime) and only reset those. */ if (_lastConfigReload != nil && _configReloadInterval > 0 && [_lastConfigReload timeIntervalSinceNow] < _configReloadInterval) return; [_staticHosts release]; _staticHosts = nil; [_nameServers release]; _nameServers = nil; [_localDomain release]; _localDomain = nil; [_searchDomains release]; _searchDomains = nil; _minNumberOfDotsInAbsoluteName = 1; _usesTCP = false; _configReloadInterval = 2; [_lastConfigReload release]; _lastConfigReload = nil; [self of_parseConfig]; } - (void)asyncResolveHost: (OFString *)host target: (id)target selector: (SEL)selector context: (id)context { [self asyncResolveHost: host |
︙ | ︙ | |||
979 980 981 982 983 984 985 986 987 988 989 990 991 992 | selector: (SEL)selector context: (id)context { void *pool = objc_autoreleasePoolPush(); OFNumber *ID; OFString *domainName; OFDNSResolverQuery *query; /* Random, unused ID */ do { ID = [OFNumber numberWithUInt16: (uint16_t)of_random()]; } while ([_queries objectForKey: ID] != nil); if ([host hasSuffix: @"."]) | > > | 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 | selector: (SEL)selector context: (id)context { void *pool = objc_autoreleasePoolPush(); OFNumber *ID; OFString *domainName; OFDNSResolverQuery *query; [self of_reloadConfig]; /* Random, unused ID */ do { ID = [OFNumber numberWithUInt16: (uint16_t)of_random()]; } while ([_queries objectForKey: ID] != nil); if ([host hasSuffix: @"."]) |
︙ | ︙ |
Modified utils/ofdns/OFDNS.m from [f7027f3fe4] to [01d2c2b54d].
︙ | ︙ | |||
73 74 75 76 77 78 79 | recordType = of_dns_resource_record_type_parse( [arguments objectAtIndex: 1]); if ([arguments count] >= 3) recordClass = of_dns_resource_record_class_parse( [arguments objectAtIndex: 2]); | | > > | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | recordType = of_dns_resource_record_type_parse( [arguments objectAtIndex: 1]); if ([arguments count] >= 3) recordClass = of_dns_resource_record_class_parse( [arguments objectAtIndex: 2]); if ([arguments count] >= 4) { [resolver setConfigReloadInterval: 0]; [resolver setNameServers: [OFArray arrayWithObject: [arguments objectAtIndex: 3]]]; } [resolver asyncResolveHost: [arguments objectAtIndex: 0] recordClass: recordClass recordType: recordType target: self selector: @selector(DNSResolver:didResolveDomainName: answerRecords:authorityRecords: additionalRecords:context:exception:) context: nil]; } @end |