[avahi] [PATCH] avahi-browse: retry resolving until success or all records expired from cache

Andreas Fenkart afenkart at gmail.com
Tue Jan 27 03:58:03 PST 2015


A service consists of 3 entries PTR/TXT/SRV. PTR/TXT have 4500s
time to live (AVAHI_DEFAULT_TTL), but SRV (which contains ip/port number)
has only 120s (AVAHI_DEFAULT_TTL_HOST_NAME).
When unplugging the cable, -- shutdown of avahi would flush caches
properly -- , the SRV entry will expire sooner than PTR/TXT. With the SRV
entry missing, resolving will fail and not be restarted. Even if the
network is restored and a new a new SRV entry created in the local cache,
resolving is not retried, nor is the client noticed that resolving should
be retried

Signed-off-by: Andreas Fenkart <afenkart at gmail.com>
---
 avahi-utils/avahi-browse.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/avahi-utils/avahi-browse.c b/avahi-utils/avahi-browse.c
index 4101895..6ab1181 100644
--- a/avahi-utils/avahi-browse.c
+++ b/avahi-utils/avahi-browse.c
@@ -202,6 +202,8 @@ static void service_resolver_callback(
 
     assert(r);
     assert(i);
+    assert(i->resolver == r);
+    i->resolver = NULL;
 
     switch (event) {
         case AVAHI_RESOLVER_FOUND: {
@@ -236,13 +238,21 @@ static void service_resolver_callback(
 
         case AVAHI_RESOLVER_FAILURE:
 
-            fprintf(stderr, _("Failed to resolve service '%s' of type '%s' in domain '%s': %s\n"), name, type, domain, avahi_strerror(avahi_client_errno(client)));
+            if (avahi_client_errno(client) == AVAHI_ERR_TIMEOUT) {
+                if (!(i->resolver = avahi_service_resolver_new(client, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, service_resolver_callback, i))) {
+                    fprintf(stderr, _("Failed to allocate new resolver for service '%s' of type '%s' in domain '%s': %s\n"), name, type, domain, avahi_strerror(avahi_client_errno(client)));
+                }
+
+                n_resolving++;
+                fprintf(stderr, _("Failed to resolve service '%s' of type '%s' in domain '%s': %s retry\n"), name, type, domain, avahi_strerror(avahi_client_errno(client)));
+            } else {
+                fprintf(stderr, _("Failed to resolve service '%s' of type '%s' in domain '%s': %s\n"), name, type, domain, avahi_strerror(avahi_client_errno(client)));
+            }
             break;
     }
 
 
-    avahi_service_resolver_free(i->resolver);
-    i->resolver = NULL;
+    avahi_service_resolver_free(r);
 
     assert(n_resolving > 0);
     n_resolving--;
-- 
2.1.1



More information about the avahi mailing list