From 297d02fa6d2d6fd87536f8cc9a5a29699bc5d6e2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 10 Mar 2011 04:10:31 +0100 Subject: [PATCH] connection: hook UnknownObject and UnknownInterface up where appropriate This makes use of UnknownInterface and UnknownObject where appropriate in the D-Bus core. --- bus/driver.c | 5 ++++- dbus/dbus-connection.c | 6 ++++-- dbus/dbus-object-tree.c | 8 ++++++-- dbus/dbus-object-tree.h | 3 ++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/bus/driver.c b/bus/driver.c index 1e9573e..425a3d5 100644 --- a/bus/driver.c +++ b/bus/driver.c @@ -1921,6 +1921,7 @@ bus_driver_handle_message (DBusConnection *connection, const char *name, *sender, *interface; const InterfaceHandler *ih; const MessageHandler *mh; + dbus_bool_t found_interface = FALSE; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -1957,6 +1958,8 @@ bus_driver_handle_message (DBusConnection *connection, if (interface != NULL && strcmp (interface, ih->name) != 0) continue; + found_interface = TRUE; + for (mh = ih->message_handlers; mh->name != NULL; mh++) { if (strcmp (mh->name, name) != 0) @@ -1998,7 +2001,7 @@ bus_driver_handle_message (DBusConnection *connection, _dbus_verbose ("No driver handler for message \"%s\"\n", name); - dbus_set_error (error, DBUS_ERROR_UNKNOWN_METHOD, + dbus_set_error (error, found_interface ? DBUS_ERROR_UNKNOWN_METHOD : DBUS_ERROR_UNKNOWN_INTERFACE, "%s does not understand message %s", DBUS_SERVICE_DBUS, name); diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 526a716..9c98e6a 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -4523,6 +4523,7 @@ dbus_connection_dispatch (DBusConnection *connection) DBusPendingCall *pending; dbus_int32_t reply_serial; DBusDispatchStatus status; + dbus_bool_t found_object; _dbus_return_val_if_fail (connection != NULL, DBUS_DISPATCH_COMPLETE); @@ -4687,7 +4688,8 @@ dbus_connection_dispatch (DBusConnection *connection) HAVE_LOCK_CHECK (connection); result = _dbus_object_tree_dispatch_and_unlock (connection->objects, - message); + message, + &found_object); CONNECTION_LOCK (connection); @@ -4726,7 +4728,7 @@ dbus_connection_dispatch (DBusConnection *connection) } reply = dbus_message_new_error (message, - DBUS_ERROR_UNKNOWN_METHOD, + found_object ? DBUS_ERROR_UNKNOWN_METHOD : DBUS_ERROR_UNKNOWN_OBJECT, _dbus_string_get_const_data (&str)); _dbus_string_free (&str); diff --git a/dbus/dbus-object-tree.c b/dbus/dbus-object-tree.c index 28cfc8b..f907c12 100644 --- a/dbus/dbus-object-tree.c +++ b/dbus/dbus-object-tree.c @@ -745,7 +745,8 @@ handle_default_introspect_and_unlock (DBusObjectTree *tree, */ DBusHandlerResult _dbus_object_tree_dispatch_and_unlock (DBusObjectTree *tree, - DBusMessage *message) + DBusMessage *message, + dbus_bool_t *found_object) { char **path; dbus_bool_t exact_match; @@ -791,6 +792,9 @@ _dbus_object_tree_dispatch_and_unlock (DBusObjectTree *tree, /* Find the deepest path that covers the path in the message */ subtree = find_handler (tree, (const char**) path, &exact_match); + if (found_object) + *found_object = !!subtree; + /* Build a list of all paths that cover the path in the message */ list = NULL; @@ -1382,7 +1386,7 @@ do_test_dispatch (DBusObjectTree *tree, ++j; } - result = _dbus_object_tree_dispatch_and_unlock (tree, message); + result = _dbus_object_tree_dispatch_and_unlock (tree, message, NULL); if (result == DBUS_HANDLER_RESULT_NEED_MEMORY) goto oom; diff --git a/dbus/dbus-object-tree.h b/dbus/dbus-object-tree.h index 022dd93..1cba2a0 100644 --- a/dbus/dbus-object-tree.h +++ b/dbus/dbus-object-tree.h @@ -42,7 +42,8 @@ dbus_bool_t _dbus_object_tree_register (DBusObjectTree void _dbus_object_tree_unregister_and_unlock (DBusObjectTree *tree, const char **path); DBusHandlerResult _dbus_object_tree_dispatch_and_unlock (DBusObjectTree *tree, - DBusMessage *message); + DBusMessage *message, + dbus_bool_t *found_object); void* _dbus_object_tree_get_user_data_unlocked (DBusObjectTree *tree, const char **path); void _dbus_object_tree_free_all_unlocked (DBusObjectTree *tree); -- 1.7.4.1