summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--avahi-client/client.c25
-rw-r--r--avahi-client/client.h1
-rw-r--r--avahi-common/dbus.c4
-rw-r--r--avahi-common/dbus.h3
-rw-r--r--avahi-common/defs.h6
-rw-r--r--avahi-common/error.h2
-rw-r--r--avahi-compat-howl/compat.c6
-rw-r--r--avahi-compat-libdns_sd/compat.c33
-rw-r--r--avahi-core/entry.c2
-rw-r--r--avahi-daemon/EntryGroup.introspect2
-rw-r--r--avahi-daemon/Server.introspect2
-rw-r--r--avahi-daemon/dbus-protocol.c24
-rw-r--r--avahi-daemon/main.c73
-rw-r--r--avahi-daemon/main.h3
-rw-r--r--docs/TODO2
-rw-r--r--examples/client-publish-service.c85
-rw-r--r--examples/core-publish-service.c116
17 files changed, 268 insertions, 121 deletions
diff --git a/avahi-client/client.c b/avahi-client/client.c
index 8bc515e..915ba31 100644
--- a/avahi-client/client.c
+++ b/avahi-client/client.c
@@ -67,11 +67,12 @@ static void client_set_state (AvahiClient *client, AvahiServerState state) {
dbus_connection_unref(client->bus);
client->bus = NULL;
}
-
+
/* Fall through */
-
+
case AVAHI_CLIENT_S_COLLISION:
case AVAHI_CLIENT_S_REGISTERING:
+ case AVAHI_CLIENT_S_FAILURE:
/* Clear cached strings */
avahi_free(client->host_name);
@@ -139,15 +140,21 @@ static DBusHandlerResult filter_func(DBusConnection *bus, DBusMessage *message,
} else if (dbus_message_is_signal (message, AVAHI_DBUS_INTERFACE_SERVER, "StateChanged")) {
int32_t state;
+ char *e;
+ int c;
if (!(dbus_message_get_args(
message, &error,
DBUS_TYPE_INT32, &state,
+ DBUS_TYPE_STRING, &e,
DBUS_TYPE_INVALID) || dbus_error_is_set (&error))) {
fprintf(stderr, "WARNING: Failed to parse Server.StateChanged signal: %s\n", error.message);
goto fail;
}
-
+
+ if ((c = avahi_error_dbus_to_number(e)) != AVAHI_OK)
+ avahi_client_set_errno(client, c);
+
client_set_state(client, (AvahiClientState) state);
} else if (dbus_message_is_signal (message, AVAHI_DBUS_INTERFACE_ENTRY_GROUP, "StateChanged")) {
@@ -161,11 +168,21 @@ static DBusHandlerResult filter_func(DBusConnection *bus, DBusMessage *message,
if (g) {
int32_t state;
- if (!(dbus_message_get_args (message, &error, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID)) ||
+ char *e;
+ int c;
+
+ if (!(dbus_message_get_args(
+ message, &error,
+ DBUS_TYPE_INT32, &state,
+ DBUS_TYPE_STRING, &e,
+ DBUS_TYPE_INVALID)) ||
dbus_error_is_set(&error)) {
fprintf(stderr, "WARNING: Failed to parse EntryGroup.StateChanged signal: %s\n", error.message);
goto fail;
}
+
+ if ((c = avahi_error_dbus_to_number(e)) != AVAHI_OK)
+ avahi_client_set_errno(client, c);
avahi_entry_group_set_state(g, state);
}
diff --git a/avahi-client/client.h b/avahi-client/client.h
index d00cc8b..ffcc8d7 100644
--- a/avahi-client/client.h
+++ b/avahi-client/client.h
@@ -49,6 +49,7 @@ typedef enum {
AVAHI_CLIENT_S_REGISTERING = AVAHI_SERVER_REGISTERING,
AVAHI_CLIENT_S_RUNNING = AVAHI_SERVER_RUNNING,
AVAHI_CLIENT_S_COLLISION = AVAHI_SERVER_COLLISION,
+ AVAHI_CLIENT_S_FAILURE = AVAHI_SERVER_FAILURE,
AVAHI_CLIENT_DISCONNECTED = 100 /**< Lost DBUS connection to the Avahi daemon */
} AvahiClientState;
diff --git a/avahi-common/dbus.c b/avahi-common/dbus.c
index 179b1ed..058b819 100644
--- a/avahi-common/dbus.c
+++ b/avahi-common/dbus.c
@@ -31,7 +31,7 @@
#include <avahi-common/dbus.h>
static const char * const table[- AVAHI_ERR_MAX] = {
- NULL, /* OK */
+ AVAHI_DBUS_ERR_OK,
AVAHI_DBUS_ERR_FAILURE,
AVAHI_DBUS_ERR_BAD_STATE,
AVAHI_DBUS_ERR_INVALID_HOST_NAME,
@@ -39,7 +39,7 @@ static const char * const table[- AVAHI_ERR_MAX] = {
AVAHI_DBUS_ERR_NO_NETWORK,
AVAHI_DBUS_ERR_INVALID_TTL,
AVAHI_DBUS_ERR_IS_PATTERN,
- AVAHI_DBUS_ERR_LOCAL_COLLISION,
+ AVAHI_DBUS_ERR_COLLISION,
AVAHI_DBUS_ERR_INVALID_RECORD,
AVAHI_DBUS_ERR_INVALID_SERVICE_NAME,
AVAHI_DBUS_ERR_INVALID_SERVICE_TYPE,
diff --git a/avahi-common/dbus.h b/avahi-common/dbus.h
index 9806f58..9cafbde 100644
--- a/avahi-common/dbus.h
+++ b/avahi-common/dbus.h
@@ -42,6 +42,7 @@ AVAHI_C_DECL_BEGIN
#define AVAHI_DBUS_INTERFACE_HOST_NAME_RESOLVER AVAHI_DBUS_NAME".HostNameResolver"
#define AVAHI_DBUS_INTERFACE_SERVICE_RESOLVER AVAHI_DBUS_NAME".ServiceResolver"
+#define AVAHI_DBUS_ERR_OK "org.freedesktop.Avahi.Success"
#define AVAHI_DBUS_ERR_FAILURE "org.freedesktop.Avahi.Failure"
#define AVAHI_DBUS_ERR_BAD_STATE "org.freedesktop.Avahi.BadStateError"
#define AVAHI_DBUS_ERR_INVALID_HOST_NAME "org.freedesktop.Avahi.InvalidHostNameError"
@@ -49,7 +50,7 @@ AVAHI_C_DECL_BEGIN
#define AVAHI_DBUS_ERR_NO_NETWORK "org.freedesktop.Avahi.NoNetworkError"
#define AVAHI_DBUS_ERR_INVALID_TTL "org.freedesktop.Avahi.InvalidTTLError"
#define AVAHI_DBUS_ERR_IS_PATTERN "org.freedesktop.Avahi.IsPatternError"
-#define AVAHI_DBUS_ERR_LOCAL_COLLISION "org.freedesktop.Avahi.LocalCollisionError"
+#define AVAHI_DBUS_ERR_COLLISION "org.freedesktop.Avahi.CollisionError"
#define AVAHI_DBUS_ERR_INVALID_RECORD "org.freedesktop.Avahi.InvalidRecordError"
#define AVAHI_DBUS_ERR_INVALID_SERVICE_NAME "org.freedesktop.Avahi.InvalidServiceNameError"
#define AVAHI_DBUS_ERR_INVALID_SERVICE_TYPE "org.freedesktop.Avahi.InvalidServiceTypeError"
diff --git a/avahi-common/defs.h b/avahi-common/defs.h
index 3b8c2a5..2dcc829 100644
--- a/avahi-common/defs.h
+++ b/avahi-common/defs.h
@@ -139,7 +139,8 @@ typedef enum {
AVAHI_ENTRY_GROUP_UNCOMMITED, /**< The group has not yet been commited, the user must still call avahi_entry_group_commit() */
AVAHI_ENTRY_GROUP_REGISTERING, /**< The entries of the group are currently being registered */
AVAHI_ENTRY_GROUP_ESTABLISHED, /**< The entries have successfully been established */
- AVAHI_ENTRY_GROUP_COLLISION /**< A name collision for one of the entries in the group has been detected, the entries have been withdrawn */
+ AVAHI_ENTRY_GROUP_COLLISION, /**< A name collision for one of the entries in the group has been detected, the entries have been withdrawn */
+ AVAHI_ENTRY_GROUP_FAILURE /**< Some kind of failure happened, the entries have been withdrawn */
} AvahiEntryGroupState;
/** The type of domain to browse for */
@@ -200,7 +201,8 @@ typedef enum {
AVAHI_SERVER_INVALID, /**< Invalid state (initial) */
AVAHI_SERVER_REGISTERING, /**< Host RRs are being registered */
AVAHI_SERVER_RUNNING, /**< All host RRs have been established */
- AVAHI_SERVER_COLLISION /**< There is a collision with a host RR. All host RRs have been withdrawn, the user should set a new host name via avahi_server_set_host_name() */
+ AVAHI_SERVER_COLLISION, /**< There is a collision with a host RR. All host RRs have been withdrawn, the user should set a new host name via avahi_server_set_host_name() */
+ AVAHI_SERVER_FAILURE /**< Some fatal failure happened, the server is unable to proceed */
} AvahiServerState;
/** For every service a special TXT item is implicitly added, which
diff --git a/avahi-common/error.h b/avahi-common/error.h
index 55c388b..270aece 100644
--- a/avahi-common/error.h
+++ b/avahi-common/error.h
@@ -40,7 +40,7 @@ enum {
AVAHI_ERR_NO_NETWORK = -5, /**< No suitable network protocol available */
AVAHI_ERR_INVALID_TTL = -6, /**< Invalid DNS TTL */
AVAHI_ERR_IS_PATTERN = -7, /**< RR key is pattern */
- AVAHI_ERR_LOCAL_COLLISION = -8, /**< Local name collision */
+ AVAHI_ERR_COLLISION = -8, /**< Name collision */
AVAHI_ERR_INVALID_RECORD = -9, /**< Invalid RR */
AVAHI_ERR_INVALID_SERVICE_NAME = -10, /**< Invalid service name */
diff --git a/avahi-compat-howl/compat.c b/avahi-compat-howl/compat.c
index 1663af0..8e8dd06 100644
--- a/avahi-compat-howl/compat.c
+++ b/avahi-compat-howl/compat.c
@@ -694,6 +694,7 @@ static void reg_client_callback(oid_data *data, AvahiClientState state) {
return;
switch (state) {
+ case AVAHI_CLIENT_S_FAILURE:
case AVAHI_CLIENT_DISCONNECTED:
reg_report_status(data, SW_DISCOVERY_PUBLISH_INVALID);
break;
@@ -745,6 +746,11 @@ static void reg_entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState st
case AVAHI_ENTRY_GROUP_UNCOMMITED:
/* Ignore */
break;
+
+ case AVAHI_ENTRY_GROUP_FAILURE:
+ reg_report_status(data, SW_DISCOVERY_PUBLISH_INVALID);
+ break;
+
}
}
diff --git a/avahi-compat-libdns_sd/compat.c b/avahi-compat-libdns_sd/compat.c
index 9fbe731..a06ca68 100644
--- a/avahi-compat-libdns_sd/compat.c
+++ b/avahi-compat-libdns_sd/compat.c
@@ -108,7 +108,7 @@ static DNSServiceErrorType map_error(int error) {
return kDNSServiceErr_BadParam;
- case AVAHI_ERR_LOCAL_COLLISION:
+ case AVAHI_ERR_COLLISION:
return kDNSServiceErr_NameConflict;
case AVAHI_ERR_TOO_MANY_CLIENTS:
@@ -469,23 +469,29 @@ static void service_browser_callback(
static void generic_client_callback(AvahiClient *s, AvahiClientState state, void* userdata) {
DNSServiceRef sdref = userdata;
-
+ int error = kDNSServiceErr_Unknown;
+
assert(s);
assert(sdref);
assert(sdref->n_ref >= 1);
switch (state) {
- case AVAHI_CLIENT_DISCONNECTED: {
+ case AVAHI_CLIENT_S_FAILURE:
+
+ error = map_error(avahi_client_errno(s));
+
+ /* Fall through */
+
+ case AVAHI_CLIENT_DISCONNECTED:
if (sdref->service_browser_callback)
- sdref->service_browser_callback(sdref, 0, 0, kDNSServiceErr_Unknown, NULL, NULL, NULL, sdref->context);
+ sdref->service_browser_callback(sdref, 0, 0, error, NULL, NULL, NULL, sdref->context);
else if (sdref->service_resolver_callback)
- sdref->service_resolver_callback(sdref, 0, 0, kDNSServiceErr_Unknown, NULL, NULL, 0, 0, NULL, sdref->context);
+ sdref->service_resolver_callback(sdref, 0, 0, error, NULL, NULL, 0, 0, NULL, sdref->context);
else if (sdref->domain_browser_callback)
- sdref->domain_browser_callback(sdref, 0, 0, kDNSServiceErr_Unknown, NULL, sdref->context);
+ sdref->domain_browser_callback(sdref, 0, 0, error, NULL, sdref->context);
break;
- }
case AVAHI_CLIENT_S_RUNNING:
case AVAHI_CLIENT_S_COLLISION:
@@ -857,9 +863,12 @@ static void reg_client_callback(AvahiClient *s, AvahiClientState state, void* us
return;
switch (state) {
- case AVAHI_CLIENT_DISCONNECTED:
+ case AVAHI_CLIENT_DISCONNECTED:
+ reg_report_error(sdref, kDNSServiceErr_Unknown);
+ break;
- reg_report_error(sdref, kDNSServiceErr_NoError);
+ case AVAHI_CLIENT_S_FAILURE:
+ reg_report_error(sdref, map_error(avahi_client_errno(s)));
break;
case AVAHI_CLIENT_S_RUNNING: {
@@ -950,6 +959,12 @@ static void reg_entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState st
case AVAHI_ENTRY_GROUP_UNCOMMITED:
/* Ignore */
break;
+
+ case AVAHI_ENTRY_GROUP_FAILURE:
+ /* Inform the user */
+ reg_report_error(sdref, map_error(avahi_client_errno(sdref->client)));
+ break;
+
}
}
diff --git a/avahi-core/entry.c b/avahi-core/entry.c
index 5ef2a67..89f313e 100644
--- a/avahi-core/entry.c
+++ b/avahi-core/entry.c
@@ -224,7 +224,7 @@ static AvahiEntry * server_add_internal(
/* Add a new record */
if (check_record_conflict(s, interface, protocol, r, flags) < 0) {
- avahi_server_set_errno(s, AVAHI_ERR_LOCAL_COLLISION);
+ avahi_server_set_errno(s, AVAHI_ERR_COLLISION);
return NULL;
}
diff --git a/avahi-daemon/EntryGroup.introspect b/avahi-daemon/EntryGroup.introspect
index b5c2382..53fca44 100644
--- a/avahi-daemon/EntryGroup.introspect
+++ b/avahi-daemon/EntryGroup.introspect
@@ -19,8 +19,10 @@
<method name="GetState">
<arg name="state" type="i" direction="out"/>
</method>
+
<signal name="StateChanged">
<arg name="state" type="i"/>
+ <arg name="error" type="s"/>
</signal>
<method name="IsEmpty">
diff --git a/avahi-daemon/Server.introspect b/avahi-daemon/Server.introspect
index 2e36a21..cfced9d 100644
--- a/avahi-daemon/Server.introspect
+++ b/avahi-daemon/Server.introspect
@@ -29,8 +29,10 @@
<method name="GetState">
<arg name="state" type="i" direction="out"/>
</method>
+
<signal name="StateChanged">
<arg name="state" type="i"/>
+ <arg name="error" type="s"/>
</signal>
<method name="GetLocalServiceCookie">
diff --git a/avahi-daemon/dbus-protocol.c b/avahi-daemon/dbus-protocol.c
index 287f62c..b6a4e5d 100644
--- a/avahi-daemon/dbus-protocol.c
+++ b/avahi-daemon/dbus-protocol.c
@@ -686,14 +686,27 @@ static void entry_group_callback(AvahiServer *s, AvahiSEntryGroup *g, AvahiEntry
EntryGroupInfo *i = userdata;
DBusMessage *m;
int32_t t;
+ const char *e;
assert(s);
assert(g);
assert(i);
m = dbus_message_new_signal(i->path, AVAHI_DBUS_INTERFACE_ENTRY_GROUP, "StateChanged");
+
t = (int32_t) state;
- dbus_message_append_args(m, DBUS_TYPE_INT32, &t, DBUS_TYPE_INVALID);
+ if (state == AVAHI_ENTRY_GROUP_FAILURE)
+ e = avahi_error_number_to_dbus(avahi_server_errno(s));
+ else if (state == AVAHI_ENTRY_GROUP_COLLISION)
+ e = AVAHI_DBUS_ERR_COLLISION;
+ else
+ e = AVAHI_DBUS_ERR_OK;
+
+ dbus_message_append_args(
+ m,
+ DBUS_TYPE_INT32, &t,
+ DBUS_TYPE_STRING, &e,
+ DBUS_TYPE_INVALID);
dbus_message_set_destination(m, i->client->name);
dbus_connection_send(server->bus, m, NULL);
dbus_message_unref(m);
@@ -2411,12 +2424,21 @@ fail:
void dbus_protocol_server_state_changed(AvahiServerState state) {
DBusMessage *m;
int32_t t;
+ const char *e;
if (!server)
return;
m = dbus_message_new_signal(AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "StateChanged");
t = (int32_t) state;
+
+ if (state == AVAHI_SERVER_COLLISION)
+ e = AVAHI_DBUS_ERR_COLLISION;
+ else if (state == AVAHI_SERVER_FAILURE)
+ e = avahi_error_number_to_dbus(avahi_server_errno(avahi_server));
+ else
+ e = AVAHI_DBUS_ERR_OK;
+
dbus_message_append_args(m, DBUS_TYPE_INT32, &t, DBUS_TYPE_INVALID);
dbus_connection_send(server->bus, m, NULL);
dbus_message_unref(m);
diff --git a/avahi-daemon/main.c b/avahi-daemon/main.c
index 7bae459..f64524a 100644
--- a/avahi-daemon/main.c
+++ b/avahi-daemon/main.c
@@ -65,6 +65,7 @@
#endif
AvahiServer *avahi_server = NULL;
+AvahiSimplePoll *simple_poll_api = NULL;
typedef enum {
DAEMON_RUN,
@@ -214,7 +215,6 @@ static void update_wide_area_servers(void) {
}
avahi_server_set_wide_area_servers(avahi_server, a, n);
-
}
static void server_callback(AvahiServer *s, AvahiServerState state, void *userdata) {
@@ -223,7 +223,7 @@ static void server_callback(AvahiServer *s, AvahiServerState state, void *userda
assert(s);
assert(c);
- /** This function is possibly called before the global variable
+ /* This function is possibly called before the global variable
* avahi_server has been set, therefore we do it explicitly */
avahi_server = s;
@@ -233,31 +233,46 @@ static void server_callback(AvahiServer *s, AvahiServerState state, void *userda
dbus_protocol_server_state_changed(state);
#endif
- if (state == AVAHI_SERVER_RUNNING) {
- avahi_log_info("Server startup complete. Host name is %s. Local service cookie is %u.", avahi_server_get_host_name_fqdn(s), avahi_server_get_local_service_cookie(s));
- static_service_add_to_server();
-
- remove_dns_server_entry_groups();
-
- if (c->publish_resolv_conf && resolv_conf && resolv_conf[0])
- resolv_conf_entry_group = add_dns_servers(s, resolv_conf_entry_group, resolv_conf);
-
- if (c->publish_dns_servers && c->publish_dns_servers[0])
- dns_servers_entry_group = add_dns_servers(s, dns_servers_entry_group, c->publish_dns_servers);
-
- simple_protocol_restart_queries();
-
- } else if (state == AVAHI_SERVER_COLLISION) {
- char *n;
+ switch (state) {
+ case AVAHI_SERVER_RUNNING:
+ avahi_log_info("Server startup complete. Host name is %s. Local service cookie is %u.", avahi_server_get_host_name_fqdn(s), avahi_server_get_local_service_cookie(s));
+ static_service_add_to_server();
+
+ remove_dns_server_entry_groups();
+
+ if (c->publish_resolv_conf && resolv_conf && resolv_conf[0])
+ resolv_conf_entry_group = add_dns_servers(s, resolv_conf_entry_group, resolv_conf);
+
+ if (c->publish_dns_servers && c->publish_dns_servers[0])
+ dns_servers_entry_group = add_dns_servers(s, dns_servers_entry_group, c->publish_dns_servers);
+
+ simple_protocol_restart_queries();
+ break;
+
+ case AVAHI_SERVER_COLLISION: {
+ char *n;
+
+ static_service_remove_from_server();
+
+ remove_dns_server_entry_groups();
+
+ n = avahi_alternative_host_name(avahi_server_get_host_name(s));
+ avahi_log_warn("Host name conflict, retrying with <%s>", n);
+ avahi_server_set_host_name(s, n);
+ avahi_free(n);
+ break;
+ }
- static_service_remove_from_server();
+ case AVAHI_SERVER_FAILURE:
- remove_dns_server_entry_groups();
+ avahi_log_error("Server error: %s", avahi_strerror(avahi_server_errno(s)));
+ avahi_simple_poll_quit(simple_poll_api);
+ break;
- n = avahi_alternative_host_name(avahi_server_get_host_name(s));
- avahi_log_warn("Host name conflict, retrying with <%s>", n);
- avahi_server_set_host_name(s, n);
- avahi_free(n);
+ case AVAHI_SERVER_REGISTERING:
+ case AVAHI_SERVER_INVALID:
+ break;
+
}
}
@@ -546,7 +561,6 @@ static void dump(const char *text, void* userdata) {
static void signal_callback(AvahiWatch *watch, int fd, AvahiWatchEvent event, void *userdata) {
int sig;
- AvahiSimplePoll *simple_poll_api = userdata;
const AvahiPoll *poll_api;
assert(watch);
@@ -602,7 +616,6 @@ static void signal_callback(AvahiWatch *watch, int fd, AvahiWatchEvent event, vo
static int run_server(DaemonConfig *c) {
int r = -1;
int error;
- AvahiSimplePoll *simple_poll_api;
const AvahiPoll *poll_api;
AvahiWatch *sig_watch;
@@ -684,16 +697,20 @@ finish:
dbus_protocol_shutdown();
#endif
- if (avahi_server)
+ if (avahi_server) {
avahi_server_free(avahi_server);
+ avahi_server = NULL;
+ }
daemon_signal_done();
if (sig_watch)
poll_api->watch_free(sig_watch);
- if (simple_poll_api)
+ if (simple_poll_api) {
avahi_simple_poll_free(simple_poll_api);
+ simple_poll_api = NULL;
+ }
if (r != 0 && c->daemonize)
daemon_retval_send(1);
diff --git a/avahi-daemon/main.h b/avahi-daemon/main.h
index 8db60e4..0c93337 100644
--- a/avahi-daemon/main.h
+++ b/avahi-daemon/main.h
@@ -23,7 +23,10 @@
***/
#include <avahi-core/core.h>
+#include <avahi-common/simple-watch.h>
extern AvahiServer *avahi_server;
+extern AvahiSimplePoll *simple_poll_api;
+
#endif
diff --git a/docs/TODO b/docs/TODO
index a851d33..aaea9a9 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -6,6 +6,8 @@ for 0.6:
* add support for subtypes in static services
* Add static host configuration like static services [lathiat]
* wrap avahi_server_add_record() via DBUS and in avahi-client [lathiat]
+* make sure that all limit definitions end with _MAX
+* unify argument oder of functions returning a string in a user supplied buffer
later:
* add simplification routine for adding services
diff --git a/examples/client-publish-service.c b/examples/client-publish-service.c
index bb895ce..d99c46b 100644
--- a/examples/client-publish-service.c
+++ b/examples/client-publish-service.c
@@ -47,22 +47,36 @@ static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state,
/* Called whenever the entry group state changes */
- if (state == AVAHI_ENTRY_GROUP_ESTABLISHED)
- /* The entry group has been established successfully */
- fprintf(stderr, "Service '%s' successfully established.\n", name);
-
- else if (state == AVAHI_ENTRY_GROUP_COLLISION) {
- char *n;
+ switch (state) {
+ case AVAHI_ENTRY_GROUP_ESTABLISHED :
+ /* The entry group has been established successfully */
+ fprintf(stderr, "Service '%s' successfully established.\n", name);
+ break;
+
+ case AVAHI_ENTRY_GROUP_COLLISION : {
+ char *n;
+
+ /* A service name collision happened. Let's pick a new name */
+ n = avahi_alternative_service_name(name);
+ avahi_free(name);
+ name = n;
+
+ fprintf(stderr, "Service name collision, renaming service to '%s'\n", name);
+
+ /* And recreate the services */
+ create_services(avahi_entry_group_get_client(g));
+ break;
+ }
- /* A service name collision happened. Let's pick a new name */
- n = avahi_alternative_service_name(name);
- avahi_free(name);
- name = n;
+ case AVAHI_ENTRY_GROUP_FAILURE :
- fprintf(stderr, "Service name collision, renaming service to '%s'\n", name);
+ /* Some kind of failure happened while we were registering our services */
+ avahi_simple_poll_quit(simple_poll);
+ break;
- /* And recreate the services */
- create_services(avahi_entry_group_get_client(g));
+ case AVAHI_ENTRY_GROUP_UNCOMMITED:
+ case AVAHI_ENTRY_GROUP_REGISTERING:
+ ;
}
}
@@ -111,7 +125,6 @@ static void create_services(AvahiClient *c) {
fail:
avahi_simple_poll_quit(simple_poll);
- return;
}
static void client_callback(AvahiClient *c, AvahiClientState state, void * userdata) {
@@ -119,25 +132,35 @@ static void client_callback(AvahiClient *c, AvahiClientState state, void * userd
/* Called whenever the client or server state changes */
- if (state == AVAHI_CLIENT_S_RUNNING) {
+ switch (state) {
+ case AVAHI_CLIENT_S_RUNNING:
- /* The server has startup successfully and registered its host
- * name on the network, so it's time to create our services */
- if (group)
- create_services(c);
-
- } else if (state == AVAHI_CLIENT_S_COLLISION) {
-
- /* Let's drop our registered services. When the server is back
- * in AVAHI_SERVER_RUNNING state we will register them
- * again with the new host name. */
- if (group)
- avahi_entry_group_reset(group);
-
- } else if (state == AVAHI_CLIENT_DISCONNECTED) {
+ /* The server has startup successfully and registered its host
+ * name on the network, so it's time to create our services */
+ if (!group)
+ create_services(c);
+ break;
- fprintf(stderr, "Server connection terminated.\n");
- avahi_simple_poll_quit(simple_poll);
+ case AVAHI_CLIENT_S_COLLISION:
+
+ /* Let's drop our registered services. When the server is back
+ * in AVAHI_SERVER_RUNNING state we will register them
+ * again with the new host name. */
+ if (group)
+ avahi_entry_group_reset(group);
+ break;
+
+ case AVAHI_CLIENT_DISCONNECTED:
+
+ fprintf(stderr, "Server connection terminated.\n");
+ avahi_simple_poll_quit(simple_poll);
+
+ break;
+
+ case AVAHI_CLIENT_S_FAILURE:
+ case AVAHI_CLIENT_S_INVALID:
+ case AVAHI_CLIENT_S_REGISTERING:
+ ;
}
}
diff --git a/examples/core-publish-service.c b/examples/core-publish-service.c
index 0d8c04c..dc5170b 100644
--- a/examples/core-publish-service.c
+++ b/examples/core-publish-service.c
@@ -47,22 +47,38 @@ static void entry_group_callback(AvahiServer *s, AvahiSEntryGroup *g, AvahiEntry
/* Called whenever the entry group state changes */
- if (state == AVAHI_ENTRY_GROUP_ESTABLISHED)
- /* The entry group has been established successfully */
- fprintf(stderr, "Service '%s' successfully established.\n", name);
-
- else if (state == AVAHI_ENTRY_GROUP_COLLISION) {
- char *n;
-
- /* A service name collision happened. Let's pick a new name */
- n = avahi_alternative_service_name(name);
- avahi_free(name);
- name = n;
+ switch (state) {
+
+ case AVAHI_ENTRY_GROUP_ESTABLISHED:
+
+ /* The entry group has been established successfully */
+ fprintf(stderr, "Service '%s' successfully established.\n", name);
+ break;
+
+ case AVAHI_ENTRY_GROUP_COLLISION: {
+ char *n;
+
+ /* A service name collision happened. Let's pick a new name */
+ n = avahi_alternative_service_name(name);
+ avahi_free(name);
+ name = n;
+
+ fprintf(stderr, "Service name collision, renaming service to '%s'\n", name);
+
+ /* And recreate the services */
+ create_services(s);
+ break;
+ }
+
+ case AVAHI_ENTRY_GROUP_FAILURE :
- fprintf(stderr, "Service name collision, renaming service to '%s'\n", name);
+ /* Some kind of failure happened while we were registering our services */
+ avahi_simple_poll_quit(simple_poll);
+ break;
- /* And recreate the services */
- create_services(s);
+ case AVAHI_ENTRY_GROUP_UNCOMMITED:
+ case AVAHI_ENTRY_GROUP_REGISTERING:
+ ;
}
}
@@ -111,7 +127,6 @@ static void create_services(AvahiServer *s) {
fail:
avahi_simple_poll_quit(simple_poll);
- return;
}
static void server_callback(AvahiServer *s, AvahiServerState state, void * userdata) {
@@ -119,35 +134,54 @@ static void server_callback(AvahiServer *s, AvahiServerState state, void * userd
/* Called whenever the server state changes */
- if (state == AVAHI_SERVER_RUNNING) {
- /* The serve has startup successfully and registered its host
- * name on the network, so it's time to create our services */
-
- if (group)
- create_services(s);
-
- } else if (state == AVAHI_SERVER_COLLISION) {
- char *n;
- int r;
-
- /* A host name collision happened. Let's pick a new name for the server */
- n = avahi_alternative_host_name(avahi_server_get_host_name(s));
- fprintf(stderr, "Host name collision, retrying with '%s'\n", n);
- r = avahi_server_set_host_name(s, n);
- avahi_free(n);
-
- if (r < 0) {
- fprintf(stderr, "Failed to set new host name: %s\n", avahi_strerror(r));
+ switch (state) {
+
+ case AVAHI_SERVER_RUNNING:
+ /* The serve has startup successfully and registered its host
+ * name on the network, so it's time to create our services */
+
+ if (group)
+ create_services(s);
+
+ break;
+
+ case AVAHI_SERVER_COLLISION: {
+ char *n;
+ int r;
+
+ /* A host name collision happened. Let's pick a new name for the server */
+ n = avahi_alternative_host_name(avahi_server_get_host_name(s));
+ fprintf(stderr, "Host name collision, retrying with '%s'\n", n);
+ r = avahi_server_set_host_name(s, n);
+ avahi_free(n);
+
+ if (r < 0) {
+ fprintf(stderr, "Failed to set new host name: %s\n", avahi_strerror(r));
+
+ avahi_simple_poll_quit(simple_poll);
+ return;
+ }
+
+ /* Let's drop our registered services. When the server is back
+ * in AVAHI_SERVER_RUNNING state we will register them
+ * again with the new host name. */
+ if (group)
+ avahi_s_entry_group_reset(group);
+
+ break;
+ }
+ case AVAHI_SERVER_FAILURE:
+
+ /* Terminate on failure */
+
+ fprintf(stderr, "Server failure: %s\n", avahi_strerror(avahi_server_errno(s)));
avahi_simple_poll_quit(simple_poll);
- return;
- }
+ break;
- /* Let's drop our registered services. When the server is back
- * in AVAHI_SERVER_RUNNING state we will register them
- * again with the new host name. */
- if (group)
- avahi_s_entry_group_reset(group);
+ case AVAHI_SERVER_INVALID:
+ case AVAHI_SERVER_REGISTERING:
+ ;
}
}