| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CROSDNS_HOSTS_MODIFIER_H_ |
| #define CROSDNS_HOSTS_MODIFIER_H_ |
| |
| #include <map> |
| #include <string> |
| |
| #include <base/files/file_path.h> |
| #include <base/macros.h> |
| |
| namespace crosdns { |
| |
| // Class for writing out modifications to a hosts file such as /etc/hosts. |
| class HostsModifier { |
| public: |
| HostsModifier(); |
| HostsModifier(const HostsModifier&) = delete; |
| HostsModifier& operator=(const HostsModifier&) = delete; |
| |
| ~HostsModifier(); |
| |
| // Upon loading, this class will read in the file at the specified path and |
| // use it as a baseline for any modifications it writes out. It will also look |
| // for its marker line in that file and then exclude anything after that line |
| // in case it is recovering from a crash. |
| bool Init(const base::FilePath& hosts_filepath); |
| |
| // Sets a hostname mapping in the /etc/hosts file. Only IPv4 is supported for |
| // now, the |ipv4| parameter must not be empty. The |ipv4| parameter is |
| // currently ignored. Returns true on success. If failure and |err_out| is |
| // not null, it will be set to the error message. The /etc/hosts file will be |
| // automatically written to before this call completes. |
| bool SetHostnameIpMapping(const std::string& hostname, |
| const std::string& ipv4, |
| const std::string& ipv6, |
| std::string* err_out); |
| |
| // Removes a hostname mapping from the /etc/hosts file. Returns true on |
| // success. If there is a failure and |err_out| is not null, |err_out| is set |
| // to the error message. The /etc/hosts file will be automatically written to |
| // before this call completes. |
| bool RemoveHostnameIpMapping(const std::string& hostname, |
| std::string* err_out); |
| |
| private: |
| // Writes out the updated hosts file. |
| bool WriteHostsFile(); |
| |
| // Filepath to the /etc/hosts file so we can override for unit testing. |
| base::FilePath filepath_; |
| |
| // This is what was in the file to start with that we always write out as the |
| // prefix. |
| std::string base_hosts_contents_; |
| |
| // Mapping of hostnames to ipv4 addresses. |
| std::map<std::string, std::string> hostname_ipv4_map_; |
| }; |
| |
| } // namespace crosdns |
| |
| #endif // CROSDNS_HOSTS_MODIFIER_H_ |