From eb655066cc9565be2ee1812c07a02447ea7e9d71 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 21 Jul 2017 18:08:40 +0100 Subject: [PATCH] bus/driver: Add GetConnectionInstance(), GetInstanceInfo() Signed-off-by: Simon McVittie --- Use dbus_clear_message(). bus_containers_handle_get_connection_instance() isn't lined up with the other methods in the header because it's too long for that to be convenient. https://bugs.freedesktop.org/show_bug.cgi?id=101354 --- bus/containers.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ bus/containers.h | 8 ++++ bus/driver.c | 5 ++ 3 files changed, 155 insertions(+) diff --git a/bus/containers.c b/bus/containers.c index 412fe531..19aa524c 100644 --- a/bus/containers.c +++ b/bus/containers.c @@ -989,6 +989,148 @@ failed: return FALSE; } +dbus_bool_t +bus_containers_handle_get_connection_instance (DBusConnection *caller, + BusTransaction *transaction, + DBusMessage *message, + DBusError *error) +{ + BusContainerInstance *instance; + BusDriverFound found; + DBusConnection *subject; + DBusMessage *reply = NULL; + DBusMessageIter writer; + const char *bus_name; + + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + + found = bus_driver_get_conn_helper (caller, message, "container instance", + &bus_name, &subject, error); + + switch (found) + { + case BUS_DRIVER_FOUND_SELF: + dbus_set_error (error, DBUS_ERROR_NOT_CONTAINER, + "The message bus is not in a container"); + goto failed; + + case BUS_DRIVER_FOUND_PEER: + break; + + case BUS_DRIVER_FOUND_ERROR: + /* fall through */ + default: + goto failed; + } + + instance = dbus_connection_get_data (subject, contained_data_slot); + + if (instance == NULL) + { + dbus_set_error (error, DBUS_ERROR_NOT_CONTAINER, + "Connection '%s' is not in a container", bus_name); + goto failed; + } + + reply = dbus_message_new_method_return (message); + + if (reply == NULL) + goto oom; + + if (!dbus_message_append_args (reply, + DBUS_TYPE_OBJECT_PATH, &instance->path, + DBUS_TYPE_STRING, &instance->type, + DBUS_TYPE_STRING, &instance->name, + DBUS_TYPE_INVALID)) + goto oom; + + dbus_message_iter_init_append (reply, &writer); + + if (!_dbus_variant_write (instance->metadata, &writer)) + goto oom; + + if (!bus_transaction_send_from_driver (transaction, caller, reply)) + goto oom; + + dbus_message_unref (reply); + return TRUE; + +oom: + BUS_SET_OOM (error); + /* fall through */ +failed: + _DBUS_ASSERT_ERROR_IS_SET (error); + + dbus_clear_message (&reply); + return FALSE; +} + +dbus_bool_t +bus_containers_handle_get_instance_info (DBusConnection *connection, + BusTransaction *transaction, + DBusMessage *message, + DBusError *error) +{ + BusContext *context; + BusContainers *containers; + BusContainerInstance *instance = NULL; + DBusMessage *reply = NULL; + DBusMessageIter writer; + const char *path; + + if (!dbus_message_get_args (message, error, + DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_INVALID)) + goto failed; + + context = bus_transaction_get_context (transaction); + containers = bus_context_get_containers (context); + + if (containers->instances_by_path != NULL) + { + instance = _dbus_hash_table_lookup_string (containers->instances_by_path, + path); + } + + if (instance == NULL) + { + dbus_set_error (error, DBUS_ERROR_NOT_CONTAINER, + "There is no container with path '%s'", path); + goto failed; + } + + reply = dbus_message_new_method_return (message); + + if (reply == NULL) + goto oom; + + if (!dbus_message_append_args (reply, + DBUS_TYPE_STRING, &instance->type, + DBUS_TYPE_STRING, &instance->name, + DBUS_TYPE_INVALID)) + goto oom; + + dbus_message_iter_init_append (reply, &writer); + + if (!_dbus_variant_write (instance->metadata, &writer)) + goto oom; + + if (!bus_transaction_send_from_driver (transaction, connection, reply)) + goto oom; + + dbus_message_unref (reply); + return TRUE; + +oom: + BUS_SET_OOM (error); + /* fall through */ +failed: + _DBUS_ASSERT_ERROR_IS_SET (error); + + dbus_clear_message (&reply); + return FALSE; +} + void bus_containers_stop_listening (BusContainers *self) { diff --git a/bus/containers.h b/bus/containers.h index 2fb4b3aa..05ed0e75 100644 --- a/bus/containers.h +++ b/bus/containers.h @@ -44,6 +44,14 @@ dbus_bool_t bus_containers_handle_stop_listening (DBusConnection *connecti BusTransaction *transaction, DBusMessage *message, DBusError *error); +dbus_bool_t bus_containers_handle_get_instance_info (DBusConnection *connection, + BusTransaction *transaction, + DBusMessage *message, + DBusError *error); +dbus_bool_t bus_containers_handle_get_connection_instance (DBusConnection *connection, + BusTransaction *transaction, + DBusMessage *message, + DBusError *error); dbus_bool_t bus_containers_supported_arguments_getter (BusContext *context, DBusMessageIter *var_iter); diff --git a/bus/driver.c b/bus/driver.c index 5ecbc31c..12a95c87 100644 --- a/bus/driver.c +++ b/bus/driver.c @@ -2577,6 +2577,11 @@ static const MessageHandler containers_message_handlers[] = { METHOD_FLAG_PRIVILEGED }, { "StopListening", "o", "", bus_containers_handle_stop_listening, METHOD_FLAG_PRIVILEGED }, + { "GetConnectionInstance", "s", "ossa{sv}", + bus_containers_handle_get_connection_instance, + METHOD_FLAG_NONE }, + { "GetInstanceInfo", "o", "ssa{sv}", bus_containers_handle_get_instance_info, + METHOD_FLAG_NONE }, { NULL, NULL, NULL, NULL } }; static const PropertyHandler containers_property_handlers[] = { -- 2.13.3