]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: use stat_inode_unmodified() to detect /etc/hosts changes
authorLennart Poettering <lennart@poettering.net>
Fri, 6 Nov 2020 13:56:16 +0000 (14:56 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 2 Dec 2020 23:58:45 +0000 (08:58 +0900)
src/resolve/resolved-etc-hosts.c
src/resolve/resolved-manager.c
src/resolve/resolved-manager.h

index e784213e91486f7627de1b55323ad342b914f378..dda2014017a4381fa9e7188b32db436b385e537f 100644 (file)
@@ -10,6 +10,7 @@
 #include "resolved-dns-synthesize.h"
 #include "resolved-etc-hosts.h"
 #include "socket-netlink.h"
+#include "stat-util.h"
 #include "string-util.h"
 #include "strv.h"
 #include "time-util.h"
@@ -36,9 +37,7 @@ void etc_hosts_free(EtcHosts *hosts) {
 
 void manager_etc_hosts_flush(Manager *m) {
         etc_hosts_free(&m->etc_hosts);
-        m->etc_hosts_mtime = USEC_INFINITY;
-        m->etc_hosts_ino = 0;
-        m->etc_hosts_dev = 0;
+        m->etc_hosts_stat = (struct stat) {};
 }
 
 static int parse_line(EtcHosts *hosts, unsigned nr, const char *line) {
@@ -214,7 +213,7 @@ static int manager_etc_hosts_read(Manager *m) {
 
         m->etc_hosts_last = ts;
 
-        if (m->etc_hosts_mtime != USEC_INFINITY) {
+        if (m->etc_hosts_stat.st_mode != 0) {
                 if (stat("/etc/hosts", &st) < 0) {
                         if (errno != ENOENT)
                                 return log_error_errno(errno, "Failed to stat /etc/hosts: %m");
@@ -224,8 +223,7 @@ static int manager_etc_hosts_read(Manager *m) {
                 }
 
                 /* Did the mtime or ino/dev change? If not, there's no point in re-reading the file. */
-                if (timespec_load(&st.st_mtim) == m->etc_hosts_mtime &&
-                    st.st_ino == m->etc_hosts_ino && st.st_dev == m->etc_hosts_dev)
+                if (stat_inode_unmodified(&m->etc_hosts_stat, &st))
                         return 0;
         }
 
@@ -248,9 +246,7 @@ static int manager_etc_hosts_read(Manager *m) {
         if (r < 0)
                 return r;
 
-        m->etc_hosts_mtime = timespec_load(&st.st_mtim);
-        m->etc_hosts_ino = st.st_ino;
-        m->etc_hosts_dev = st.st_dev;
+        m->etc_hosts_stat = st;
         m->etc_hosts_last = ts;
 
         return 1;
index d721e767499913951dc7412ad1d565fb14dc6d2d..81d043a3fa0c2a9e395c6cc44d14678df92bbd1d 100644 (file)
@@ -641,9 +641,6 @@ int manager_new(Manager **ret) {
                 .read_resolv_conf = true,
                 .need_builtin_fallbacks = true,
                 .etc_hosts_last = USEC_INFINITY,
-                .etc_hosts_mtime = USEC_INFINITY,
-                .etc_hosts_ino = 0,
-                .etc_hosts_dev = 0,
                 .read_etc_hosts = true,
         };
 
index 120b63dc8c957c8ab38b9de99a17618f20eadbde..5471b20ff9741598d667458f65f62d6d960548db 100644 (file)
@@ -129,9 +129,8 @@ struct Manager {
 
         /* Data from /etc/hosts */
         EtcHosts etc_hosts;
-        usec_t etc_hosts_last, etc_hosts_mtime;
-        ino_t etc_hosts_ino;
-        dev_t etc_hosts_dev;
+        usec_t etc_hosts_last;
+        struct stat etc_hosts_stat;
         bool read_etc_hosts;
 
         OrderedSet *dns_extra_stub_listeners;