Index: entry.c =================================================================== --- entry.c (revision 5067) +++ entry.c (working copy) @@ -52,6 +52,8 @@ #include "rr-util.h" #include "domain-util.h" +void avahi_transfer_zone_to_cache(AvahiServer * s); + static void transport_flags_from_domain(AvahiServer *s, AvahiPublishFlags *flags, const char *domain) { assert(flags); assert(domain); @@ -77,6 +79,8 @@ assert(s); assert(e); + avahi_transfer_zone_to_cache(s); + avahi_goodbye_entry(s, e, 1, 1); /* Remove from linked list */ @@ -563,6 +567,25 @@ return avahi_string_list_add_printf(strlst, AVAHI_SERVICE_COOKIE"=%u", s->local_service_cookie); } +void avahi_transfer_zone_to_cache(AvahiServer * s) +{ + /* Major Assumptions: + - The index of the "lo" interface is always 1. + */ + AvahiAddress a; + avahi_address_parse("127.0.0.1", AVAHI_PROTO_INET, &a); + AvahiInterface * i = avahi_interface_monitor_get_interface(s->monitor, 1, AVAHI_PROTO_INET); + + AvahiEntry *e; + avahi_cache_flush(i->cache); + for (e = s->entries; e; e = e->entries_next) { + if (e->dead) { + continue; + } + avahi_cache_update(i->cache, e->record, 1, &a); + } +} + static int server_add_service_strlst_nocopy( AvahiServer *s, AvahiSEntryGroup *g, @@ -665,6 +688,8 @@ goto fail; } + avahi_transfer_zone_to_cache(s); + fail: if (ret != AVAHI_OK && !(flags & AVAHI_PUBLISH_UPDATE)) { if (srv_entry) Index: probe-sched.c =================================================================== --- probe-sched.c (revision 5067) +++ probe-sched.c (working copy) @@ -216,6 +216,8 @@ return 1; } +void avahi_transfer_zone_to_cache(AvahiServer * s); + static void elapse_callback(AVAHI_GCC_UNUSED AvahiTimeEvent *e, void* data) { AvahiProbeJob *pj = data, *next; AvahiProbeScheduler *s; @@ -224,6 +226,8 @@ assert(pj); s = pj->scheduler; + + avahi_transfer_zone_to_cache(s->interface->monitor->server); if (pj->done) { /* Lets remove it from the history */