summaryrefslogtreecommitdiff
path: root/Userland/Services
diff options
context:
space:
mode:
authorMax Wipfli <mail@maxwipfli.ch>2021-06-07 20:26:09 +0200
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2021-06-09 17:43:32 +0430
commit4efccbd030b06753aa97993571180dba9b4e6a12 (patch)
tree43aa2ba605a258d7f1a7b60a97d52bc79c691afc /Userland/Services
parent7b39db3bf401bb067a3fd239e9341830f3185bad (diff)
downloadserenity-4efccbd030b06753aa97993571180dba9b4e6a12.zip
LookupServer: Watch /etc/hosts for changes during runtime
This adds a FileWatcher to the LookupServer which watches '/etc/hosts' for changes during runtime and reloads its contents. If the file is deleted, m_etc_hosts will be cleared. Since we now need to access '/etc/hosts' later during runtime, it needs to be unveiled with read permissions.
Diffstat (limited to 'Userland/Services')
-rw-r--r--Userland/Services/LookupServer/LookupServer.cpp24
-rw-r--r--Userland/Services/LookupServer/LookupServer.h2
-rw-r--r--Userland/Services/LookupServer/main.cpp5
3 files changed, 31 insertions, 0 deletions
diff --git a/Userland/Services/LookupServer/LookupServer.cpp b/Userland/Services/LookupServer/LookupServer.cpp
index 692b885d9a..f0e294e908 100644
--- a/Userland/Services/LookupServer/LookupServer.cpp
+++ b/Userland/Services/LookupServer/LookupServer.cpp
@@ -45,6 +45,29 @@ LookupServer::LookupServer()
load_etc_hosts();
+ auto maybe_file_watcher = Core::FileWatcher::create();
+ // NOTE: If this happens during startup, something is very wrong.
+ if (maybe_file_watcher.is_error()) {
+ dbgln("Core::FileWatcher::create(): {}", maybe_file_watcher.error());
+ VERIFY_NOT_REACHED();
+ }
+ m_file_watcher = maybe_file_watcher.release_value();
+
+ m_file_watcher->on_change = [this](auto&) {
+ dbgln("Reloading '/etc/hosts' because it was changed.");
+ load_etc_hosts();
+ };
+
+ auto result = m_file_watcher->add_watch("/etc/hosts", Core::FileWatcherEvent::Type::ContentModified | Core::FileWatcherEvent::Type::Deleted);
+ // NOTE: If this happens during startup, something is very wrong.
+ if (result.is_error()) {
+ dbgln("Core::FileWatcher::add_watch(): {}", result.error());
+ VERIFY_NOT_REACHED();
+ } else if (!result.value()) {
+ dbgln("Core::FileWatcher::add_watch(): {}", result.value());
+ VERIFY_NOT_REACHED();
+ }
+
if (config->read_bool_entry("DNS", "EnableServer")) {
m_dns_server = DNSServer::construct(this);
// TODO: drop root privileges here.
@@ -68,6 +91,7 @@ LookupServer::LookupServer()
void LookupServer::load_etc_hosts()
{
+ m_etc_hosts.clear();
auto add_answer = [this](const DNSName& name, DNSRecordType record_type, String data) {
auto it = m_etc_hosts.find(name);
if (it == m_etc_hosts.end()) {
diff --git a/Userland/Services/LookupServer/LookupServer.h b/Userland/Services/LookupServer/LookupServer.h
index c948f2aa07..2e42d5e290 100644
--- a/Userland/Services/LookupServer/LookupServer.h
+++ b/Userland/Services/LookupServer/LookupServer.h
@@ -10,6 +10,7 @@
#include "DNSPacket.h"
#include "DNSServer.h"
#include "MulticastDNS.h"
+#include <LibCore/FileWatcher.h>
#include <LibCore/Object.h>
namespace LookupServer {
@@ -35,6 +36,7 @@ private:
RefPtr<DNSServer> m_dns_server;
RefPtr<MulticastDNS> m_mdns;
Vector<String> m_nameservers;
+ RefPtr<Core::FileWatcher> m_file_watcher;
HashMap<DNSName, Vector<DNSAnswer>, DNSName::Traits> m_etc_hosts;
HashMap<DNSName, Vector<DNSAnswer>, DNSName::Traits> m_lookup_cache;
};
diff --git a/Userland/Services/LookupServer/main.cpp b/Userland/Services/LookupServer/main.cpp
index d4f0a89bc4..574b441b9d 100644
--- a/Userland/Services/LookupServer/main.cpp
+++ b/Userland/Services/LookupServer/main.cpp
@@ -30,6 +30,11 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)
return 1;
}
+ if (unveil("/etc/hosts", "r") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
if (unveil(nullptr, nullptr) < 0) {
perror("unveil");
return 1;