From 9e61da91c08d3c705746b3293ba7047f8423f1aa Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B6rg=20Krause?= Date: Thu, 24 Nov 2016 14:48:03 +0100 Subject: [PATCH] mdns: avahi: handle avahi client failure 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 | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/mdns_avahi.c b/mdns_avahi.c index 7fe6c187..b9664674 100644 --- a/mdns_avahi.c +++ b/mdns_avahi.c @@ -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: -- 2.47.2