1 // Copyright 2021 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_DNS_DNS_CONFIG_SERVICE_LINUX_H_ 6 #define NET_DNS_DNS_CONFIG_SERVICE_LINUX_H_ 7 8 #include <memory> 9 #include <utility> 10 11 #include "base/check.h" 12 #include "base/gtest_prod_util.h" 13 #include "net/base/net_export.h" 14 #include "net/dns/dns_config_service.h" 15 #include "net/dns/nsswitch_reader.h" 16 #include "net/dns/public/resolv_reader.h" 17 18 namespace net { 19 20 // Use DnsConfigService::CreateSystemService to use it outside of tests. 21 namespace internal { 22 23 // Service for reading and watching Linux DNS settings. 24 // This object is not thread-safe and methods may perform blocking I/O so 25 // methods must be called on a sequence that allows blocking (i.e. 26 // base::MayBlock). It may be constructed on a different sequence than which 27 // it's later called on. WatchConfig() must be called prior to ReadConfig(). 28 class NET_EXPORT_PRIVATE DnsConfigServiceLinux : public DnsConfigService { 29 public: 30 DnsConfigServiceLinux(); 31 ~DnsConfigServiceLinux() override; 32 33 DnsConfigServiceLinux(const DnsConfigServiceLinux&) = delete; 34 DnsConfigServiceLinux& operator=(const DnsConfigServiceLinux&) = delete; 35 set_resolv_reader_for_testing(std::unique_ptr<ResolvReader> resolv_reader)36 void set_resolv_reader_for_testing( 37 std::unique_ptr<ResolvReader> resolv_reader) { 38 DCHECK(!config_reader_); // Need to call before first read. 39 DCHECK(resolv_reader); 40 resolv_reader_ = std::move(resolv_reader); 41 } 42 set_nsswitch_reader_for_testing(std::unique_ptr<NsswitchReader> nsswitch_reader)43 void set_nsswitch_reader_for_testing( 44 std::unique_ptr<NsswitchReader> nsswitch_reader) { 45 DCHECK(!config_reader_); // Need to call before first read. 46 DCHECK(nsswitch_reader); 47 nsswitch_reader_ = std::move(nsswitch_reader); 48 } 49 50 protected: 51 // DnsConfigService: 52 void ReadConfigNow() override; 53 bool StartWatching() override; 54 55 // Create |config_reader_|. 56 void CreateReader(); 57 58 private: 59 FRIEND_TEST_ALL_PREFIXES(DnsConfigServiceLinuxTest, 60 ChangeConfigMultipleTimes); 61 class Watcher; 62 class ConfigReader; 63 64 std::unique_ptr<ResolvReader> resolv_reader_ = 65 std::make_unique<ResolvReader>(); 66 std::unique_ptr<NsswitchReader> nsswitch_reader_ = 67 std::make_unique<NsswitchReader>(); 68 69 std::unique_ptr<Watcher> watcher_; 70 std::unique_ptr<ConfigReader> config_reader_; 71 }; 72 73 } // namespace internal 74 75 } // namespace net 76 77 #endif // NET_DNS_DNS_CONFIG_SERVICE_LINUX_H_ 78