summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-repo-static-delta-processing.c
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2016-02-06 13:56:19 +0100
committerColin Walters <walters@verbum.org>2016-02-08 14:46:13 +0100
commit56fc249d08d784ec481b71f2b13e2dbe509b0d9a (patch)
tree0a682f3909e59a36e6714d25f60c7c952066e144 /src/libostree/ostree-repo-static-delta-processing.c
parent8702ec7b3eb9988109ba9ae3a0e801edd9e81885 (diff)
downloadostree-56fc249d08d784ec481b71f2b13e2dbe509b0d9a.tar.gz
lib: Create an internal static delta parsing/opening function
We had code to deal with opening/checksumming/decompressing static deltas in a few places. I'd like to teach `ostree static-delta show` how to display more information, and this will allow it to just use `_ostree_static_delta_part_open()` too.
Diffstat (limited to 'src/libostree/ostree-repo-static-delta-processing.c')
-rw-r--r--src/libostree/ostree-repo-static-delta-processing.c141
1 files changed, 11 insertions, 130 deletions
diff --git a/src/libostree/ostree-repo-static-delta-processing.c b/src/libostree/ostree-repo-static-delta-processing.c
index 10e533c6..74423e7c 100644
--- a/src/libostree/ostree-repo-static-delta-processing.c
+++ b/src/libostree/ostree-repo-static-delta-processing.c
@@ -150,42 +150,12 @@ open_output_target (StaticDeltaExecutionState *state,
}
gboolean
-_ostree_static_delta_part_validate (OstreeRepo *repo,
- GInputStream *in,
- guint part_offset,
- const char *expected_checksum,
- GCancellable *cancellable,
- GError **error)
-{
- gboolean ret = FALSE;
- g_autofree guchar *actual_checksum_bytes = NULL;
- g_autofree char *actual_checksum = NULL;
-
- if (!ot_gio_checksum_stream (in, &actual_checksum_bytes,
- cancellable, error))
- goto out;
-
- actual_checksum = ostree_checksum_from_bytes (actual_checksum_bytes);
- if (strcmp (actual_checksum, expected_checksum) != 0)
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Checksum mismatch in static delta part %u; expected=%s actual=%s",
- part_offset, expected_checksum, actual_checksum);
- goto out;
- }
-
- ret = TRUE;
- out:
- return ret;
-}
-
-gboolean
-_ostree_static_delta_part_execute_raw (OstreeRepo *repo,
- GVariant *objects,
- GVariant *part,
- gboolean trusted,
- GCancellable *cancellable,
- GError **error)
+_ostree_static_delta_part_execute (OstreeRepo *repo,
+ GVariant *objects,
+ GVariant *part,
+ gboolean trusted,
+ GCancellable *cancellable,
+ GError **error)
{
gboolean ret = FALSE;
guint8 *checksums_data;
@@ -280,99 +250,10 @@ _ostree_static_delta_part_execute_raw (OstreeRepo *repo,
return ret;
}
-static gboolean
-decompress_all (GConverter *converter,
- GBytes *data,
- GBytes **out_uncompressed,
- GCancellable *cancellable,
- GError **error)
-{
- gboolean ret = FALSE;
- g_autoptr(GMemoryInputStream) memin = (GMemoryInputStream*)g_memory_input_stream_new_from_bytes (data);
- g_autoptr(GMemoryOutputStream) memout = (GMemoryOutputStream*)g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
- g_autoptr(GInputStream) convin = g_converter_input_stream_new ((GInputStream*)memin, converter);
-
- {
- gssize n_bytes_written = g_output_stream_splice ((GOutputStream*)memout, convin,
- G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE |
- G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
- cancellable, error);
- if (n_bytes_written < 0)
- goto out;
- }
-
- ret = TRUE;
- *out_uncompressed = g_memory_output_stream_steal_as_bytes (memout);
- out:
- return ret;
-}
-
-gboolean
-_ostree_static_delta_part_execute (OstreeRepo *repo,
- GVariant *header,
- GBytes *part_bytes,
- gboolean trusted,
- GCancellable *cancellable,
- GError **error)
-{
- gboolean ret = FALSE;
- gsize partlen;
- const guint8*partdata;
- g_autoptr(GBytes) part_payload_bytes = NULL;
- g_autoptr(GBytes) payload_data = NULL;
- g_autoptr(GVariant) payload = NULL;
- guint8 comptype;
-
- partdata = g_bytes_get_data (part_bytes, &partlen);
-
- if (partlen < 1)
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Corrupted 0 length delta part");
- goto out;
- }
-
- /* First byte is compression type */
- comptype = partdata[0];
- /* Then the rest may be compressed or uncompressed */
- part_payload_bytes = g_bytes_new_from_bytes (part_bytes, 1, partlen - 1);
- switch (comptype)
- {
- case 0:
- /* No compression */
- payload_data = g_bytes_ref (part_payload_bytes);
- break;
- case 'x':
- {
- g_autoptr(GConverter) decomp =
- (GConverter*) _ostree_lzma_decompressor_new ();
-
- if (!decompress_all (decomp, part_payload_bytes, &payload_data,
- cancellable, error))
- goto out;
- }
- break;
- default:
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Invalid compression type '%u'", comptype);
- goto out;
- }
-
- payload = g_variant_new_from_bytes (G_VARIANT_TYPE (OSTREE_STATIC_DELTA_PART_PAYLOAD_FORMAT_V0),
- payload_data, FALSE);
- if (!_ostree_static_delta_part_execute_raw (repo, header, payload, trusted,
- cancellable, error))
- goto out;
-
- ret = TRUE;
- out:
- return ret;
-}
-
typedef struct {
OstreeRepo *repo;
GVariant *header;
- GBytes *partdata;
+ GVariant *part;
GCancellable *cancellable;
GSimpleAsyncResult *result;
gboolean trusted;
@@ -385,7 +266,7 @@ static_delta_part_execute_async_data_free (gpointer user_data)
g_clear_object (&data->repo);
g_variant_unref (data->header);
- g_bytes_unref (data->partdata);
+ g_variant_unref (data->part);
g_clear_object (&data->cancellable);
g_free (data);
}
@@ -401,7 +282,7 @@ static_delta_part_execute_thread (GSimpleAsyncResult *res,
data = g_simple_async_result_get_op_res_gpointer (res);
if (!_ostree_static_delta_part_execute (data->repo,
data->header,
- data->partdata,
+ data->part,
data->trusted,
cancellable, &error))
g_simple_async_result_take_error (res, error);
@@ -410,7 +291,7 @@ static_delta_part_execute_thread (GSimpleAsyncResult *res,
void
_ostree_static_delta_part_execute_async (OstreeRepo *repo,
GVariant *header,
- GBytes *partdata,
+ GVariant *part,
gboolean trusted,
GCancellable *cancellable,
GAsyncReadyCallback callback,
@@ -421,7 +302,7 @@ _ostree_static_delta_part_execute_async (OstreeRepo *repo,
asyncdata = g_new0 (StaticDeltaPartExecuteAsyncData, 1);
asyncdata->repo = g_object_ref (repo);
asyncdata->header = g_variant_ref (header);
- asyncdata->partdata = g_bytes_ref (partdata);
+ asyncdata->part = g_variant_ref (part);
asyncdata->trusted = trusted;
asyncdata->cancellable = cancellable ? g_object_ref (cancellable) : NULL;