Beispiel #1
0
static void
start_format_and_configure_block (StorageProvider *provider,
                                  UDisksBlock *block,
                                  GDBusMethodInvocation *invocation,
                                  const gchar *type,
                                  const gchar *erase,
                                  const gchar *label,
                                  const gchar *passphrase,
                                  const gchar *mount_point,
                                  const gchar *mount_options,
                                  const gchar *crypto_passphrase,
                                  const gchar *crypto_options)
{
  GError *error = NULL;

  if (!storage_cleanup_block (provider,
                              block,
                              &error))
    {
      g_dbus_error_strip_remote_error (error);
      g_dbus_method_invocation_return_error (invocation,
                                             COCKPIT_ERROR,
                                             COCKPIT_ERROR_FAILED,
                                             "%s", error->message);
      g_error_free (error);
      return;
    }

  FormatData *data = g_new0(FormatData, 1);
  data->block = g_object_ref (block);
  data->invocation = g_object_ref (invocation);
  data->mount_point = g_strdup (mount_point);
  data->mount_options = g_strdup (mount_options);
  data->crypto_passphrase = g_strdup (crypto_passphrase);
  data->crypto_options = g_strdup (crypto_options);
  data->udisks_object_manager = udisks_client_get_object_manager (storage_provider_get_udisks_client (provider));

  data->object_added_handler_id = g_signal_connect (data->udisks_object_manager,
                                                    "object-added",
                                                    G_CALLBACK (on_udisks_object_added),
                                                    data);

  GVariantBuilder options;
  g_variant_builder_init (&options, G_VARIANT_TYPE("a{sv}"));

  if (erase && strcmp (erase, "no") != 0)
    g_variant_builder_add (&options, "{sv}", "erase", g_variant_new_string (erase));
  if (label && *label)
    g_variant_builder_add (&options, "{sv}", "label", g_variant_new_string (label));
  if (passphrase && *passphrase)
    g_variant_builder_add (&options, "{sv}", "encrypt.passphrase", g_variant_new_string (passphrase));

  udisks_block_call_format (block,
                            type,
                            g_variant_builder_end (&options),
                            NULL,
                            on_format_done,
                            data);
}
static void
ensure_unused_cb (UDisksClient  *client,
                  GAsyncResult  *res,
                  gpointer       user_data)
{
  FormatVolumeData *data = user_data;
  GVariantBuilder options_builder;
  const gchar *erase_type;
  const gchar *fstype;
  const gchar *name;
  const gchar *passphrase;

  if (!gdu_utils_ensure_unused_finish (client, res, NULL))
    {
      format_volume_data_free (data);
      goto out;
    }

  erase_type = gdu_create_filesystem_widget_get_erase (GDU_CREATE_FILESYSTEM_WIDGET (data->create_filesystem_widget));
  fstype = gdu_create_filesystem_widget_get_fstype (GDU_CREATE_FILESYSTEM_WIDGET (data->create_filesystem_widget));
  name = gdu_create_filesystem_widget_get_name (GDU_CREATE_FILESYSTEM_WIDGET (data->create_filesystem_widget));
  passphrase = gdu_create_filesystem_widget_get_passphrase (GDU_CREATE_FILESYSTEM_WIDGET (data->create_filesystem_widget));

  g_variant_builder_init (&options_builder, G_VARIANT_TYPE_VARDICT);
  if (name != NULL && strlen (name) > 0)
    g_variant_builder_add (&options_builder, "{sv}", "label", g_variant_new_string (name));
  if (!(g_strcmp0 (fstype, "vfat") == 0 || g_strcmp0 (fstype, "ntfs") == 0))
    {
      /* TODO: need a better way to determine if this should be TRUE */
      g_variant_builder_add (&options_builder, "{sv}", "take-ownership", g_variant_new_boolean (TRUE));
    }
  if (passphrase != NULL && strlen (passphrase) > 0)
    g_variant_builder_add (&options_builder, "{sv}", "encrypt.passphrase", g_variant_new_string (passphrase));

  if (erase_type != NULL)
    g_variant_builder_add (&options_builder, "{sv}", "erase", g_variant_new_string (erase_type));

  g_variant_builder_add (&options_builder, "{sv}", "update-partition-type", g_variant_new_boolean (TRUE));

  udisks_block_call_format (data->block,
                            fstype,
                            g_variant_builder_end (&options_builder),
                            NULL, /* GCancellable */
                            format_cb,
                            data);

 out:
  ;
}