@@ -55,13 +55,10 @@ * 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" @@ -91,10 +88,12 @@ of_dns_resource_record_class_t _recordClass; of_dns_resource_record_type_t _recordType; OFNumber *_ID; OFArray OF_GENERIC(OFString *) *_nameServers, *_searchDomains; size_t _nameServersIndex, _searchDomainsIndex; + of_time_interval_t _timeout; + unsigned int _maxRetries; size_t _attempt; id _target; SEL _selector; id _context; OFData *_queryData; @@ -106,16 +105,19 @@ recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType ID: (OFNumber *)ID nameServers: (OFArray OF_GENERIC(OFString *) *)nameServers searchDomains: (OFArray OF_GENERIC(OFString *) *)searchDomains + timeout: (of_time_interval_t)timeout + maxRetries: (unsigned int)maxRetries target: (id)target selector: (SEL)selector context: (id)context; @end @interface OFDNSResolver () +- (void)of_setDefaults; - (void)of_parseConfig; #ifdef OF_HAVE_FILES - (void)of_parseHosts: (OFString *)path; # ifndef OF_WINDOWS - (void)of_parseResolvConf: (OFString *)path; @@ -528,10 +530,12 @@ recordClass: (of_dns_resource_record_class_t)recordClass recordType: (of_dns_resource_record_type_t)recordType ID: (OFNumber *)ID nameServers: (OFArray OF_GENERIC(OFString *) *)nameServers searchDomains: (OFArray OF_GENERIC(OFString *) *)searchDomains + timeout: (of_time_interval_t)timeout + maxRetries: (unsigned int)maxRetries target: (id)target selector: (SEL)selector context: (id)context { self = [super init]; @@ -546,10 +550,12 @@ _recordClass = recordClass; _recordType = recordType; _ID = [ID retain]; _nameServers = [nameServers copy]; _searchDomains = [searchDomains copy]; + _timeout = timeout; + _maxRetries = maxRetries; _target = [target retain]; _selector = selector; _context = [context retain]; queryData = [OFMutableData dataWithCapacity: 512]; @@ -630,10 +636,11 @@ @end @implementation OFDNSResolver @synthesize staticHosts = _staticHosts, nameServers = _nameServers; @synthesize localDomain = _localDomain, searchDomains = _searchDomains; +@synthesize timeout = _timeout, maxRetries = _maxRetries; @synthesize minNumberOfDotsInAbsoluteName = _minNumberOfDotsInAbsoluteName; @synthesize usesTCP = _usesTCP, configReloadInterval = _configReloadInterval; + (instancetype)resolver { @@ -653,22 +660,27 @@ @throw e; } return self; } + +- (void)of_setDefaults +{ + _timeout = 2; + _maxRetries = 3; + _minNumberOfDotsInAbsoluteName = 1; + _usesTCP = false; + _configReloadInterval = 2; +} - (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\\" @@ -974,13 +986,11 @@ _localDomain = nil; [_searchDomains release]; _searchDomains = nil; - _minNumberOfDotsInAbsoluteName = 1; - _usesTCP = false; - _configReloadInterval = 2; + [self of_setDefaults]; [_lastConfigReload release]; _lastConfigReload = nil; [self of_parseConfig]; @@ -1033,10 +1043,12 @@ recordClass: recordClass recordType: recordType ID: ID nameServers: _nameServers searchDomains: _searchDomains + timeout: _timeout + maxRetries: _maxRetries target: target selector: selector context: context] autorelease]; [_queries setObject: query forKey: ID]; @@ -1053,11 +1065,11 @@ [query->_cancelTimer invalidate]; [query->_cancelTimer release]; query->_cancelTimer = nil; query->_cancelTimer = [[OFTimer - scheduledTimerWithTimeInterval: TIMEOUT + scheduledTimerWithTimeInterval: query->_timeout target: self selector: @selector(of_queryWithIDTimedOut:) object: query repeats: false] retain]; @@ -1111,11 +1123,11 @@ query->_nameServersIndex++; [self of_sendQuery: query]; return; } - if (query->_attempt < ATTEMPTS) { + if (query->_attempt < query->_maxRetries) { query->_attempt++; query->_nameServersIndex = 0; [self of_sendQuery: query]; return; }