]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
bus/driver: Add GetConnectionInstance(), GetInstanceInfo()
authorSimon McVittie <smcv@collabora.com>
Fri, 21 Jul 2017 17:08:40 +0000 (18:08 +0100)
committerSimon McVittie <smcv@collabora.com>
Tue, 12 Dec 2017 16:22:34 +0000 (16:22 +0000)
Signed-off-by: Simon McVittie <smcv@collabora.com>
Reviewed-by: Philip Withnall <withnall@endlessm.com>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=101354

bus/containers.c
bus/containers.h
bus/driver.c

index 8f1f71ff4d0596833d7d7345dc5e579d6d5f8122..2818a3beb9742b8c484395818f4d6cd2ceb1dddb 100644 (file)
@@ -991,6 +991,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)
 {
index 2fb4b3aaf51a54918659cfcd6360bf9c14749980..05ed0e75d7412261c8635318106184f2979f1d92 100644 (file)
@@ -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);
 
index ff14ccabf3eb633341e2b5bc1804c891ab5d3e97..3e42fabc340363dfd4d21e43b5bdc8c2f4f2a9c5 100644 (file)
@@ -2576,6 +2576,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[] = {