chiark / gitweb /
resolved: verify all RRs when we come back from suspend
authorLennart Poettering <lennart@poettering.net>
Wed, 6 Aug 2014 14:59:48 +0000 (16:59 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 11 Aug 2014 13:06:22 +0000 (15:06 +0200)
src/resolve/resolved-bus.c
src/resolve/resolved-dns-zone.c
src/resolve/resolved-dns-zone.h
src/resolve/resolved-manager.c
src/resolve/resolved-manager.h

index 6a3343e0006f680ec8e71ff5d0017cc4cdc96dbe..cfe12d3bed50060c6c315fc5252023efed272e5d 100644 (file)
@@ -638,6 +638,28 @@ static int on_bus_retry(sd_event_source *s, usec_t usec, void *userdata) {
         return 0;
 }
 
+static int match_prepare_for_sleep(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
+        Manager *m = userdata;
+        int b, r;
+
+        assert(bus);
+        assert(bus);
+
+        r = sd_bus_message_read(message, "b", &b);
+        if (r < 0) {
+                log_debug("Failed to parse PrepareForSleep signal: %s", strerror(-r));
+                return 0;
+        }
+
+        if (b)
+                return 0;
+
+        log_debug("Coming back from suspend, verifying all RRs...");
+
+        manager_verify_all(m);
+        return 0;
+}
+
 int manager_connect_bus(Manager *m) {
         int r;
 
@@ -681,5 +703,16 @@ int manager_connect_bus(Manager *m) {
                 return r;
         }
 
+        r = sd_bus_add_match(m->bus, &m->prepare_for_sleep_slot,
+                             "type='signal',"
+                             "sender='org.freedesktop.login1',"
+                             "interface='org.freedesktop.login1.Manager',"
+                             "member='PrepareForSleep',"
+                             "path='/org/freedesktop/login1'",
+                             match_prepare_for_sleep,
+                             m);
+        if (r < 0)
+                log_error("Failed to add match for PrepareForSleep: %s", strerror(-r));
+
         return 0;
 }
index d96ddd270cd9eed82b681c410c92df2865102bf4..5f250e7ca3989f51f6cbc3cb48888eca887b8efa 100644 (file)
@@ -625,3 +625,17 @@ int dns_zone_verify_conflicts(DnsZone *zone, DnsResourceKey *key) {
 
         return c;
 }
+
+void dns_zone_verify_all(DnsZone *zone) {
+        DnsZoneItem *i;
+        Iterator iterator;
+
+        assert(zone);
+
+        HASHMAP_FOREACH(i, zone->by_key, iterator) {
+                DnsZoneItem *j;
+
+                LIST_FOREACH(by_key, j, i)
+                        dns_zone_item_verify(j);
+        }
+}
index 37fdafe040a04733fc556af37fc3f37434e020c7..482df2f15f5b1daf1426ea13af3ce8a11fffd221 100644 (file)
@@ -74,3 +74,5 @@ void dns_zone_item_ready(DnsZoneItem *i);
 
 int dns_zone_check_conflicts(DnsZone *zone, DnsResourceRecord *rr);
 int dns_zone_verify_conflicts(DnsZone *zone, DnsResourceKey *key);
+
+void dns_zone_verify_all(DnsZone *zone);
index a93f4a597f76734e5f82c60fc8b52b21f9009cb4..1d33c2ae19cc473bcd112237c1a263433e161190 100644 (file)
@@ -554,6 +554,7 @@ Manager *manager_free(Manager *m) {
 
         manager_llmnr_stop(m);
 
+        sd_bus_slot_unref(m->prepare_for_sleep_slot);
         sd_event_source_unref(m->bus_retry_event_source);
         sd_bus_unref(m->bus);
 
@@ -1722,6 +1723,15 @@ DnsScope* manager_find_scope(Manager *m, DnsPacket *p) {
         return NULL;
 }
 
+void manager_verify_all(Manager *m) {
+        DnsScope *s;
+
+        assert(m);
+
+        LIST_FOREACH(scopes, s, m->dns_scopes)
+                dns_zone_verify_all(&s->zone);
+}
+
 static const char* const support_table[_SUPPORT_MAX] = {
         [SUPPORT_NO] = "no",
         [SUPPORT_YES] = "yes",
index f960bc2f1e27649431c9bd7a137b0433e4d92550..f8cb91c330baab775d4e77022fc0df606e989751 100644 (file)
@@ -108,6 +108,9 @@ struct Manager {
         /* Watch the system hostname */
         int hostname_fd;
         sd_event_source *hostname_event_source;
+
+        /* Watch for system suspends */
+        sd_bus_slot *prepare_for_sleep_slot;
 };
 
 /* Manager */
@@ -146,6 +149,8 @@ int manager_next_hostname(Manager *m);
 bool manager_our_packet(Manager *m, DnsPacket *p);
 DnsScope* manager_find_scope(Manager *m, DnsPacket *p);
 
+void manager_verify_all(Manager *m);
+
 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
 
 #define EXTRA_CMSG_SPACE 1024