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
This commit is contained in:
Jörg Krause
2016-11-24 14:51:17 +01:00
parent e5ec3da9da
commit 9e61da91c0
+21 -1
View 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: