]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
mdns: avahi: handle avahi client failure 428/head
authorJörg Krause <joerg.krause@embedded.rocks>
Thu, 24 Nov 2016 13:48:03 +0000 (14:48 +0100)
committerJörg Krause <joerg.krause@embedded.rocks>
Thu, 24 Nov 2016 13:51:17 +0000 (14:51 +0100)
Handle the avahi client failure so that in case of a restart of the avahi
daemon the shairport-sync daemon has not to be restarted, too.

The handling is based on the error handling of avahi-publish [1].

[1]
https://github.com/lathiat/avahi/blob/master/avahi-utils/avahi-publish.c#L156-L179

mdns_avahi.c

index 7fe6c1874252b43fae32d536b9585ec2cf937b97..b96646743b58380d9ae108314931eae024e089f5 100644 (file)
@@ -234,6 +234,8 @@ static void register_service(AvahiClient *c) {
 
 static void client_callback(AvahiClient *c, AvahiClientState state,
                             AVAHI_GCC_UNUSED void *userdata) {
+  int err;
+
   switch (state) {
   case AVAHI_CLIENT_S_REGISTERING:
     if (group)
@@ -245,7 +247,25 @@ static void client_callback(AvahiClient *c, AvahiClientState state,
     break;
 
   case AVAHI_CLIENT_FAILURE:
-    debug(1, "avahi: client failure");
+    err = avahi_client_errno(c);
+    debug(1, "avahi: client failure: %s", avahi_strerror(err));
+
+    if (err == AVAHI_ERR_DISCONNECTED) {
+      /* We have been disconnected, so lets reconnect */
+      avahi_client_free(c);
+      c = NULL;
+      group = NULL;
+
+      if (!(client = avahi_client_new(avahi_threaded_poll_get(tpoll),
+                                      AVAHI_CLIENT_NO_FAIL, client_callback,
+                                      userdata, &err))) {
+        warn("avahi: failed to create client object: %s", avahi_strerror(err));
+        avahi_threaded_poll_quit(tpoll);
+      }
+    } else {
+      warn("avahi: client failure: %s", avahi_strerror(err));
+      avahi_threaded_poll_quit(tpoll);
+    }
     break;
 
   case AVAHI_CLIENT_S_COLLISION: