示例#1
0
static gboolean
open_source_stream (GInputStream **out_source_stream,
                    GCancellable *cancellable,
                    GError **error)
{
  g_autoptr(GInputStream) source_stream = NULL;
  guint n_keyrings = 0;
  gboolean ret = FALSE;

  if (opt_keyrings != NULL)
    n_keyrings = g_strv_length (opt_keyrings);

  if (opt_stdin)
    {
      source_stream = g_unix_input_stream_new (STDIN_FILENO, FALSE);
    }
  else
    {
      g_autoptr(GPtrArray) streams = NULL;
      guint ii;

      streams = g_ptr_array_new_with_free_func (g_object_unref);

      for (ii = 0; ii < n_keyrings; ii++)
        {
          g_autoptr(GFile) file = NULL;
          GFileInputStream *input_stream = NULL;

          file = g_file_new_for_path (opt_keyrings[ii]);
          input_stream = g_file_read (file, cancellable, error);

          if (input_stream == NULL)
            goto out;

          /* Takes ownership. */
          g_ptr_array_add (streams, input_stream);
        }

       /* Chain together all the --keyring options as one long stream. */
       source_stream = (GInputStream *) ostree_chain_input_stream_new (streams);
    }

  *out_source_stream = g_steal_pointer (&source_stream);

  ret = TRUE;

out:
  return ret;
}
示例#2
0
gboolean
ostree_raw_file_to_content_stream (GInputStream       *input,
                                   GFileInfo          *file_info,
                                   GVariant           *xattrs,
                                   GInputStream      **out_input,
                                   guint64            *out_length,
                                   GCancellable       *cancellable,
                                   GError            **error)
{
  gboolean ret = FALSE;
  gpointer header_data;
  gsize header_size;
  ot_lobj GInputStream *ret_input = NULL;
  ot_lvariant GVariant *file_header = NULL;
  ot_lptrarray GPtrArray *streams = NULL;
  ot_lobj GOutputStream *header_out_stream = NULL;
  ot_lobj GInputStream *header_in_stream = NULL;

  file_header = ostree_file_header_new (file_info, xattrs);

  header_out_stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);

  if (!ostree_write_variant_with_size (header_out_stream, file_header, 0, NULL, NULL,
                                       cancellable, error))
    goto out;

  if (!g_output_stream_close (header_out_stream, cancellable, error))
    goto out;

  header_size = g_memory_output_stream_get_data_size ((GMemoryOutputStream*) header_out_stream);
  header_data = g_memory_output_stream_steal_data ((GMemoryOutputStream*) header_out_stream);
  header_in_stream = g_memory_input_stream_new_from_data (header_data, header_size, g_free);

  streams = g_ptr_array_new_with_free_func ((GDestroyNotify)g_object_unref);

  g_ptr_array_add (streams, g_object_ref (header_in_stream));
  if (input)
    g_ptr_array_add (streams, g_object_ref (input));
  
  ret_input = (GInputStream*)ostree_chain_input_stream_new (streams);

  ret = TRUE;
  ot_transfer_out_value (out_input, &ret_input);
  if (out_length)
    *out_length = header_size + g_file_info_get_size (file_info);
 out:
  return ret;
}