libostree: Make the format of file objects private

It's now isolated almost entirely to ostree-core.c, except
ostree-repo.c needs to know how to create archive-z2 file headers.  So
give it a private API for that.
This commit is contained in:
Colin Walters 2013-09-03 18:42:02 -04:00
parent 356de33b49
commit 0d72168961
5 changed files with 114 additions and 78 deletions

View File

@ -5,11 +5,9 @@ OSTREE_MAX_RECURSION
OstreeObjectType OstreeObjectType
OSTREE_OBJECT_TYPE_IS_META OSTREE_OBJECT_TYPE_IS_META
OSTREE_OBJECT_TYPE_LAST OSTREE_OBJECT_TYPE_LAST
OSTREE_FILE_HEADER_GVARIANT_FORMAT
OSTREE_DIRMETA_GVARIANT_FORMAT OSTREE_DIRMETA_GVARIANT_FORMAT
OSTREE_TREE_GVARIANT_FORMAT OSTREE_TREE_GVARIANT_FORMAT
OSTREE_COMMIT_GVARIANT_FORMAT OSTREE_COMMIT_GVARIANT_FORMAT
OSTREE_ZLIB_FILE_HEADER_GVARIANT_FORMAT
ostree_metadata_variant_type ostree_metadata_variant_type
ostree_validate_checksum_string ostree_validate_checksum_string
ostree_checksum_to_bytes ostree_checksum_to_bytes
@ -35,10 +33,6 @@ ostree_get_xattrs_for_file
ostree_set_xattrs ostree_set_xattrs
ostree_map_metadata_file ostree_map_metadata_file
ostree_write_variant_with_size ostree_write_variant_with_size
ostree_file_header_new
ostree_zlib_file_header_new
ostree_file_header_parse
ostree_zlib_file_header_parse
ostree_content_stream_parse ostree_content_stream_parse
ostree_content_file_parse ostree_content_file_parse
ostree_write_file_header_update_checksum ostree_write_file_header_update_checksum

View File

@ -0,0 +1,70 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2013 Colin Walters <walters@verbum.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#pragma once
#include "ostree-core.h"
G_BEGIN_DECLS
/* This file contains private implementation data format definitions
* read by multiple implementation .c files.
*/
/*
* File objects are stored as a stream, with one #GVariant header,
* followed by content.
*
* The file header is of the following form:
*
* &lt;BE guint32 containing variant length&gt;
* u - uid
* u - gid
* u - mode
* u - rdev
* s - symlink target
* a(ayay) - xattrs
*
* Then the rest of the stream is data.
*/
#define _OSTREE_FILE_HEADER_GVARIANT_FORMAT G_VARIANT_TYPE ("(uuuusa(ayay))")
/*
* A variation on %OSTREE_FILE_HEADER_GVARIANT_FORMAT, used for
* storing zlib-compressed content objects.
*
* &lt;BE guint32 containing variant length&gt;
* t - size
* u - uid
* u - gid
* u - mode
* u - rdev
* s - symlink target
* a(ayay) - xattrs
* ---
* zlib-compressed data
*/
#define _OSTREE_ZLIB_FILE_HEADER_GVARIANT_FORMAT G_VARIANT_TYPE ("(tuuuusa(ayay))")
GVariant *_ostree_zlib_file_header_new (GFileInfo *file_info,
GVariant *xattrs);
G_END_DECLS

View File

@ -28,6 +28,7 @@
#include <gio/gfiledescriptorbased.h> #include <gio/gfiledescriptorbased.h>
#include <attr/xattr.h> #include <attr/xattr.h>
#include "ostree.h" #include "ostree.h"
#include "ostree-core-private.h"
#include "ostree-chain-input-stream.h" #include "ostree-chain-input-stream.h"
#include "otutil.h" #include "otutil.h"
#include "libgsystem.h" #include "libgsystem.h"
@ -35,6 +36,17 @@
#define ALIGN_VALUE(this, boundary) \ #define ALIGN_VALUE(this, boundary) \
(( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1))) (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))
static gboolean
file_header_parse (GVariant *metadata,
GFileInfo **out_file_info,
GVariant **out_xattrs,
GError **error);
static gboolean
zlib_file_header_parse (GVariant *metadata,
GFileInfo **out_file_info,
GVariant **out_xattrs,
GError **error);
/** /**
* SECTION:libostree-core * SECTION:libostree-core
* @title: Core repository-independent functions * @title: Core repository-independent functions
@ -334,8 +346,8 @@ ostree_get_xattrs_for_file (GFile *f,
return ret; return ret;
} }
GVariant * static GVariant *
ostree_file_header_new (GFileInfo *file_info, file_header_new (GFileInfo *file_info,
GVariant *xattrs) GVariant *xattrs)
{ {
guint32 uid; guint32 uid;
@ -366,7 +378,7 @@ ostree_file_header_new (GFileInfo *file_info,
return ret; return ret;
} }
/** /*
* ostree_zlib_file_header_new: * ostree_zlib_file_header_new:
* @file_info: a #GFileInfo * @file_info: a #GFileInfo
* @xattrs: (allow-none): Optional extended attribute array * @xattrs: (allow-none): Optional extended attribute array
@ -374,7 +386,7 @@ ostree_file_header_new (GFileInfo *file_info,
* Returns: (transfer full): A new #GVariant containing file header for an archive-z2 repository * Returns: (transfer full): A new #GVariant containing file header for an archive-z2 repository
*/ */
GVariant * GVariant *
ostree_zlib_file_header_new (GFileInfo *file_info, _ostree_zlib_file_header_new (GFileInfo *file_info,
GVariant *xattrs) GVariant *xattrs)
{ {
guint64 size; guint64 size;
@ -567,7 +579,7 @@ ostree_raw_file_to_content_stream (GInputStream *input,
gs_unref_object GOutputStream *header_out_stream = NULL; gs_unref_object GOutputStream *header_out_stream = NULL;
gs_unref_object GInputStream *header_in_stream = NULL; gs_unref_object GInputStream *header_in_stream = NULL;
file_header = ostree_file_header_new (file_info, xattrs); file_header = file_header_new (file_info, xattrs);
header_out_stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); header_out_stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
@ -663,14 +675,14 @@ ostree_content_stream_parse (gboolean compressed,
if (!g_input_stream_read_all (input, buf, archive_header_size, &bytes_read, if (!g_input_stream_read_all (input, buf, archive_header_size, &bytes_read,
cancellable, error)) cancellable, error))
goto out; goto out;
file_header = g_variant_new_from_data (compressed ? OSTREE_ZLIB_FILE_HEADER_GVARIANT_FORMAT : OSTREE_FILE_HEADER_GVARIANT_FORMAT, file_header = g_variant_new_from_data (compressed ? _OSTREE_ZLIB_FILE_HEADER_GVARIANT_FORMAT : _OSTREE_FILE_HEADER_GVARIANT_FORMAT,
buf, archive_header_size, trusted, buf, archive_header_size, trusted,
g_free, buf); g_free, buf);
buf = NULL; buf = NULL;
if (compressed) if (compressed)
{ {
if (!ostree_zlib_file_header_parse (file_header, if (!zlib_file_header_parse (file_header,
out_file_info ? &ret_file_info : NULL, out_file_info ? &ret_file_info : NULL,
out_xattrs ? &ret_xattrs : NULL, out_xattrs ? &ret_xattrs : NULL,
error)) error))
@ -678,7 +690,7 @@ ostree_content_stream_parse (gboolean compressed,
} }
else else
{ {
if (!ostree_file_header_parse (file_header, if (!file_header_parse (file_header,
out_file_info ? &ret_file_info : NULL, out_file_info ? &ret_file_info : NULL,
out_xattrs ? &ret_xattrs : NULL, out_xattrs ? &ret_xattrs : NULL,
error)) error))
@ -827,7 +839,7 @@ ostree_checksum_file_from_input (GFileInfo *file_info,
{ {
gs_unref_variant GVariant *file_header = NULL; gs_unref_variant GVariant *file_header = NULL;
file_header = ostree_file_header_new (file_info, xattrs); file_header = file_header_new (file_info, xattrs);
if (!ostree_write_file_header_update_checksum (NULL, file_header, checksum, if (!ostree_write_file_header_update_checksum (NULL, file_header, checksum,
cancellable, error)) cancellable, error))
@ -1376,7 +1388,7 @@ ostree_get_relative_object_path (const char *checksum,
return g_string_free (path, FALSE); return g_string_free (path, FALSE);
} }
/** /*
* ostree_file_header_parse: * ostree_file_header_parse:
* @metadata: A metadata variant of type %OSTREE_FILE_HEADER_GVARIANT_FORMAT * @metadata: A metadata variant of type %OSTREE_FILE_HEADER_GVARIANT_FORMAT
* @out_file_info: (out): Parsed file information * @out_file_info: (out): Parsed file information
@ -1386,8 +1398,8 @@ ostree_get_relative_object_path (const char *checksum,
* Load file header information into standard Gio #GFileInfo object, * Load file header information into standard Gio #GFileInfo object,
* along with extended attributes tored in @out_xattrs. * along with extended attributes tored in @out_xattrs.
*/ */
gboolean static gboolean
ostree_file_header_parse (GVariant *metadata, file_header_parse (GVariant *metadata,
GFileInfo **out_file_info, GFileInfo **out_file_info,
GVariant **out_xattrs, GVariant **out_xattrs,
GError **error) GError **error)
@ -1436,8 +1448,8 @@ ostree_file_header_parse (GVariant *metadata,
return ret; return ret;
} }
/** /*
* ostree_zlib_file_header_parse: * zlib_file_header_parse:
* @metadata: A metadata variant of type %OSTREE_FILE_HEADER_GVARIANT_FORMAT * @metadata: A metadata variant of type %OSTREE_FILE_HEADER_GVARIANT_FORMAT
* @out_file_info: (out): Parsed file information * @out_file_info: (out): Parsed file information
* @out_xattrs: (out): Parsed extended attribute set * @out_xattrs: (out): Parsed extended attribute set
@ -1446,8 +1458,8 @@ ostree_file_header_parse (GVariant *metadata,
* Like ostree_file_header_parse(), but operates on zlib-compressed * Like ostree_file_header_parse(), but operates on zlib-compressed
* content. * content.
*/ */
gboolean static gboolean
ostree_zlib_file_header_parse (GVariant *metadata, zlib_file_header_parse (GVariant *metadata,
GFileInfo **out_file_info, GFileInfo **out_file_info,
GVariant **out_xattrs, GVariant **out_xattrs,
GError **error) GError **error)

View File

@ -72,26 +72,6 @@ typedef enum {
*/ */
#define OSTREE_OBJECT_TYPE_LAST OSTREE_OBJECT_TYPE_COMMIT #define OSTREE_OBJECT_TYPE_LAST OSTREE_OBJECT_TYPE_COMMIT
/**
* OSTREE_FILE_HEADER_GVARIANT_FORMAT:
*
* File objects are stored as a stream, with one #GVariant header,
* followed by content.
*
* The file header is of the following form:
*
* &lt;BE guint32 containing variant length&gt;
* u - uid
* u - gid
* u - mode
* u - rdev
* s - symlink target
* a(ayay) - xattrs
*
* Then the rest of the stream is data.
*/
#define OSTREE_FILE_HEADER_GVARIANT_FORMAT G_VARIANT_TYPE ("(uuuusa(ayay))")
/** /**
* OSTREE_DIRMETA_GVARIANT_FORMAT: * OSTREE_DIRMETA_GVARIANT_FORMAT:
* *
@ -124,25 +104,6 @@ typedef enum {
*/ */
#define OSTREE_COMMIT_GVARIANT_FORMAT G_VARIANT_TYPE ("(a{sv}aya(say)sstayay)") #define OSTREE_COMMIT_GVARIANT_FORMAT G_VARIANT_TYPE ("(a{sv}aya(say)sstayay)")
/**
* OSTREE_ZLIB_FILE_HEADER_GVARIANT_FORMAT:
*
* This is a variation on %OSTREE_FILE_HEADER_GVARIANT_FORMAT, used for
* storing zlib-compressed content objects.
*
* &lt;BE guint32 containing variant length&gt;
* t - size
* u - uid
* u - gid
* u - mode
* u - rdev
* s - symlink target
* a(ayay) - xattrs
* ---
* zlib-compressed data
*/
#define OSTREE_ZLIB_FILE_HEADER_GVARIANT_FORMAT G_VARIANT_TYPE ("(tuuuusa(ayay))")
const GVariantType *ostree_metadata_variant_type (OstreeObjectType objtype); const GVariantType *ostree_metadata_variant_type (OstreeObjectType objtype);
gboolean ostree_validate_checksum_string (const char *sha256, gboolean ostree_validate_checksum_string (const char *sha256,
@ -220,8 +181,6 @@ gboolean ostree_write_variant_with_size (GOutputStream *output,
GVariant *ostree_file_header_new (GFileInfo *file_info, GVariant *ostree_file_header_new (GFileInfo *file_info,
GVariant *xattrs); GVariant *xattrs);
GVariant *ostree_zlib_file_header_new (GFileInfo *file_info,
GVariant *xattrs);
gboolean ostree_file_header_parse (GVariant *metadata, gboolean ostree_file_header_parse (GVariant *metadata,
GFileInfo **out_file_info, GFileInfo **out_file_info,

View File

@ -30,6 +30,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "ostree-repo-private.h" #include "ostree-repo-private.h"
#include "ostree-core-private.h"
#include "ostree-mutable-tree.h" #include "ostree-mutable-tree.h"
#include "ostree-checksum-input-stream.h" #include "ostree-checksum-input-stream.h"
#include "otutil.h" #include "otutil.h"
@ -707,7 +708,7 @@ stage_object (OstreeRepo *self,
goto out; goto out;
temp_file_is_regular = TRUE; temp_file_is_regular = TRUE;
file_meta = ostree_zlib_file_header_new (file_info, xattrs); file_meta = _ostree_zlib_file_header_new (file_info, xattrs);
if (!ostree_write_variant_with_size (temp_out, file_meta, 0, NULL, NULL, if (!ostree_write_variant_with_size (temp_out, file_meta, 0, NULL, NULL,
cancellable, error)) cancellable, error))