Beispiel #1
0
static UDisksBlock *
create_partition (StorageBlock *block,
                  guint64 offset,
                  guint64 size,
                  const gchar *type,
                  GError **error)
{
  UDisksObject *udisks_object =
    (UDisksObject *) g_dbus_interface_get_object (G_DBUS_INTERFACE (block->udisks_block));
  if (udisks_object == NULL)
    {
      g_set_error (error, COCKPIT_ERROR, COCKPIT_ERROR_FAILED,
                   "No object!?");
      return NULL;
    }

  UDisksPartitionTable *table = udisks_object_peek_partition_table (udisks_object);
  if (table == NULL)
    {
      g_set_error (error, COCKPIT_ERROR, COCKPIT_ERROR_FAILED,
                   "Block device has no partition table");
      return NULL;
    }

  gs_free gchar *part_object_path = NULL;

  if (!udisks_partition_table_call_create_partition_sync (table,
                                                          offset,
                                                          size,
                                                          type,
                                                          "",
                                                          g_variant_new ("a{sv}", NULL),
                                                          &part_object_path,
                                                          NULL,
                                                          error))
    return NULL;

  StorageProvider *provider = storage_object_get_provider (block->object);
  UDisksClient *client = storage_provider_get_udisks_client (provider);
  udisks_client_settle (client);

  gs_unref_object UDisksObject *partition_object =
      udisks_client_get_object (client, part_object_path);
  UDisksBlock *partition_block = udisks_object_peek_block (partition_object);
  if (partition_block == NULL)
    {
      g_set_error (error, COCKPIT_ERROR, COCKPIT_ERROR_FAILED,
                   "Partition has no associated block device");
      return NULL;
    }

  return partition_block;
}
const gchar *
storage_provider_translate_path (StorageProvider *provider,
                                 const gchar *udisks_or_lvm_path)
{
  StorageObject *object = NULL;

  if (udisks_or_lvm_path == NULL)
    udisks_or_lvm_path = "/";

  gs_unref_object UDisksObject *udisks_object = udisks_client_get_object (provider->udisks_client,
                                                                          udisks_or_lvm_path);
  if (udisks_object != NULL)
    {

      UDisksDrive *udisks_drive = udisks_object_peek_drive (udisks_object);
      if (udisks_drive != NULL)
        object = storage_provider_lookup_for_udisks_drive (provider, udisks_drive);

      UDisksBlock *udisks_block = udisks_object_peek_block (udisks_object);
      if (udisks_block != NULL)
        object = storage_provider_lookup_for_udisks_block (provider, udisks_block);

      UDisksMDRaid *udisks_raid = udisks_object_peek_mdraid (udisks_object);
      if (udisks_raid != NULL)
        object = storage_provider_lookup_for_udisks_mdraid (provider, udisks_raid);
    }

  gs_unref_object LvmObject *lvm_object = LVM_OBJECT (g_dbus_object_manager_get_object (provider->lvm_objman,
                                                                                        udisks_or_lvm_path));
  if (lvm_object)
    {
      LvmVolumeGroup *lvm_volume_group = lvm_object_peek_volume_group (lvm_object);
      if (lvm_volume_group != NULL)
        object = storage_provider_lookup_for_lvm_volume_group (provider, lvm_volume_group);

      LvmLogicalVolume *lvm_logical_volume = lvm_object_peek_logical_volume (lvm_object);
      if (lvm_logical_volume != NULL)
        object = storage_provider_lookup_for_lvm_logical_volume (provider, lvm_logical_volume);
    }

  if (object != NULL)
    {
      // g_debug ("%s -> %s", udisks_or_lvm_path, g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
      return g_dbus_object_get_object_path (G_DBUS_OBJECT (object));
    }
  else
    {
      // g_debug ("%s -> nothing", udisks_or_lvm_path);
      return "/";
    }
}