summaryrefslogtreecommitdiffstats
path: root/avahi-daemon
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-10-24 22:41:39 +0000
committerLennart Poettering <lennart@poettering.net>2005-10-24 22:41:39 +0000
commitf17d2832301b0f2fcd50fdcc6fec77666178158f (patch)
tree1f221330303258df9897b794df536672c9ef3fd0 /avahi-daemon
parent71a48fcf258fbff06507d111b9c790a6d94a95f7 (diff)
* add new entry group state AVAHI_ENTRY_GROUP_FAILURE
* pass error code alongside entry gorup state changes over DBUS * add new server state AVAHI_SERVER_FAILURE * pass error code alongside server state changes over DBUS * fix client-publish-service * rename error code AVAHI_ERR_LOCAL_COLLISION to AVAHI_ERR_COLLISION * update TODO git-svn-id: file:///home/lennart/svn/public/avahi/trunk@854 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-daemon')
-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
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