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 "/"; } }