diff options
Diffstat (limited to 'avahi-daemon')
-rw-r--r-- | avahi-daemon/EntryGroup.introspect | 2 | ||||
-rw-r--r-- | avahi-daemon/Server.introspect | 2 | ||||
-rw-r--r-- | avahi-daemon/dbus-protocol.c | 24 | ||||
-rw-r--r-- | avahi-daemon/main.c | 73 | ||||
-rw-r--r-- | avahi-daemon/main.h | 3 |
5 files changed, 75 insertions, 29 deletions
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 |