]> git.meshlink.io Git - catta/blobdiff - avahi-daemon/dbus-protocol.c
* Improve and reorganise DBus error handling, see avahi-common/dbus.h
[catta] / avahi-daemon / dbus-protocol.c
index 772756b8a3ede585bc1e06cb57a561e1b2fa472c..b28b09f0952ca3c20378f82745d16dff48782c81 100644 (file)
@@ -36,6 +36,7 @@
 
 #include <dbus/dbus.h>
 
+#include <avahi-common/dbus.h>
 #include <avahi-common/llist.h>
 #include <avahi-common/malloc.h>
 #include <avahi-common/dbus.h>
@@ -328,40 +329,10 @@ static Client *client_get(const char *name, int create) {
 static DBusHandlerResult respond_error(DBusConnection *c, DBusMessage *m, int error, const char *text) {
     DBusMessage *reply;
 
-    const char * const table[- AVAHI_ERR_MAX] = {
-        NULL, /* OK */
-        AVAHI_DBUS_ERR_FAILURE,
-        AVAHI_DBUS_ERR_BAD_STATE,
-        AVAHI_DBUS_ERR_INVALID_HOST_NAME,
-        AVAHI_DBUS_ERR_INVALID_DOMAIN_NAME,
-        AVAHI_DBUS_ERR_NO_NETWORK,
-        AVAHI_DBUS_ERR_INVALID_TTL,
-        AVAHI_DBUS_ERR_IS_PATTERN,
-        AVAHI_DBUS_ERR_LOCAL_COLLISION,
-        AVAHI_DBUS_ERR_INVALID_RECORD,
-        AVAHI_DBUS_ERR_INVALID_SERVICE_NAME,
-        AVAHI_DBUS_ERR_INVALID_SERVICE_TYPE,
-        AVAHI_DBUS_ERR_INVALID_PORT,
-        AVAHI_DBUS_ERR_INVALID_KEY,
-        AVAHI_DBUS_ERR_INVALID_ADDRESS,
-        AVAHI_DBUS_ERR_TIMEOUT,
-        AVAHI_DBUS_ERR_TOO_MANY_CLIENTS,
-        AVAHI_DBUS_ERR_TOO_MANY_OBJECTS,
-        AVAHI_DBUS_ERR_TOO_MANY_ENTRIES,
-        AVAHI_DBUS_ERR_OS,
-        AVAHI_DBUS_ERR_ACCESS_DENIED,
-        AVAHI_DBUS_ERR_INVALID_OPERATION,
-        AVAHI_DBUS_ERR_DBUS_ERROR,
-        AVAHI_DBUS_ERR_NOT_CONNECTED,
-        AVAHI_DBUS_ERR_NO_MEMORY,
-        AVAHI_DBUS_ERR_INVALID_OBJECT,
-        AVAHI_DBUS_ERR_NO_DAEMON
-    };
-
     assert(-error > -AVAHI_OK);
     assert(-error < -AVAHI_ERR_MAX);
     
-    reply = dbus_message_new_error(m, table[-error], text ? text : avahi_strerror(error));
+    reply = dbus_message_new_error(m, avahi_error_number_to_dbus (error), text ? text : avahi_strerror(error));
     dbus_connection_send(c, reply, NULL);
     dbus_message_unref(reply);
     
@@ -1665,7 +1636,6 @@ int dbus_protocol_setup(const AvahiPoll *poll_api) {
         NULL
     };
 
-
     dbus_error_init(&error);
 
     server = avahi_new(Server, 1);
@@ -1673,23 +1643,43 @@ int dbus_protocol_setup(const AvahiPoll *poll_api) {
     server->current_id = 0;
     server->n_clients = 0;
 
-    server->bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
-    if (dbus_error_is_set(&error)) {
-        avahi_log_warn("dbus_bus_get(): %s", error.message);
+    if (!(server->bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error))) {
+        assert(dbus_error_is_set(&error));
+        avahi_log_error("dbus_bus_get(): %s", error.message);
         goto fail;
     }
 
-    avahi_dbus_connection_glue(server->bus, poll_api);
+    if (avahi_dbus_connection_glue(server->bus, poll_api) < 0) {
+        avahi_log_error("avahi_dbus_connection_glue() failed");
+        goto fail;
+    }
 
-    dbus_bus_request_name(server->bus, AVAHI_DBUS_NAME, 0, &error);
-    if (dbus_error_is_set(&error)) {
-        avahi_log_warn("dbus_bus_request_name(): %s", error.message);
+    if (dbus_bus_request_name(server->bus, AVAHI_DBUS_NAME, DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT, &error) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
+        if (dbus_error_is_set(&error)) {
+            avahi_log_error("dbus_bus_request_name(): %s", error.message);
+            goto fail;
+        }
+
+        avahi_log_error("Failed to acquire DBUS name '"AVAHI_DBUS_NAME"'");
         goto fail;
     }
 
-    dbus_connection_add_filter(server->bus, msg_signal_filter_impl, (void*) poll_api, NULL);
+    if (!(dbus_connection_add_filter(server->bus, msg_signal_filter_impl, (void*) poll_api, NULL))) {
+        avahi_log_error("dbus_connection_add_filter() failed");
+        goto fail;
+    }
+    
     dbus_bus_add_match(server->bus, "type='signal',""interface='" DBUS_INTERFACE_DBUS  "'", &error);
-    dbus_connection_register_object_path(server->bus, AVAHI_DBUS_PATH_SERVER, &server_vtable, NULL);
+
+    if (dbus_error_is_set(&error)) {
+        avahi_log_error("dbus_bus_add_match(): %s", error.message);
+        goto fail;
+    }
+    
+    if (!(dbus_connection_register_object_path(server->bus, AVAHI_DBUS_PATH_SERVER, &server_vtable, NULL))) {
+        avahi_log_error("dbus_connection_register_object_path() failed");
+        goto fail;
+    }
 
     return 0;
 
@@ -1698,8 +1688,10 @@ fail:
         dbus_connection_disconnect(server->bus);
         dbus_connection_unref(server->bus);
     }
-    
-    dbus_error_free (&error);
+
+    if (dbus_error_is_set(&error))
+        dbus_error_free(&error);
+        
     avahi_free(server);
     server = NULL;
     return -1;