From 1d15ee609baf00459571b8d549bdd467dffa2b02 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Thu, 23 Jan 2020 22:59:59 +0100 Subject: Add a fragment table primitive to libsquashfs Signed-off-by: David Oberhollenzer --- include/sqfs/frag_table.h | 158 ++++++++++++++++++++++++++++++++++++++++++++++ include/sqfs/predef.h | 1 + 2 files changed, 159 insertions(+) create mode 100644 include/sqfs/frag_table.h (limited to 'include') diff --git a/include/sqfs/frag_table.h b/include/sqfs/frag_table.h new file mode 100644 index 0000000..12ddd40 --- /dev/null +++ b/include/sqfs/frag_table.h @@ -0,0 +1,158 @@ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ +/* + * frag_table.h - This file is part of libsquashfs + * + * Copyright (C) 2019 David Oberhollenzer + * + * This program 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 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +#ifndef SQFS_FRAG_TABLE_H +#define SQFS_FRAG_TABLE_H + +#include "sqfs/predef.h" + +/** + * @file frag_table.h + * + * @brief Contains declarations for the @ref sqfs_frag_table_t data structure. + */ + +/** + * @struct sqfs_frag_table_t + * + * @brief Abstracts reading, writing and management of the fragment table. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Create a fragment table. + * + * @memberof sqfs_frag_table_t + * + * @param flags Currently must be set to 0, otherwise this function fails. + * + * @return A pointer to a new fragment table object on success, NULL on failure. + */ +SQFS_API sqfs_frag_table_t *sqfs_frag_table_create(sqfs_u32 flags); + +/** + * @brief Destroy a fragment table and release all associated memory. + * + * @memberof sqfs_frag_table_t + */ +SQFS_API void sqfs_frag_table_destroy(sqfs_frag_table_t *tbl); + +/** + * @brief Load a fragment table from a SquashFS image. + * + * @memberof sqfs_frag_table_t + * + * @param tbl The fragment table object to load into. + * @param file The file to load the table from. + * @param super The super block that describes the location + * and size of the table. + * @param cmp The compressor to use for uncompressing the table. + * + * @return Zero on success, an @ref E_SQFS_ERROR on failure. + */ +SQFS_API int sqfs_frag_table_read(sqfs_frag_table_t *tbl, sqfs_file_t *file, + const sqfs_super_t *super, + sqfs_compressor_t *cmp); + +/** + * @brief Write a fragment table to a SquashFS image. + * + * @memberof sqfs_frag_table_t + * + * The data from the table is compressed and appended to the given file. The + * information about the tables size and location are stored in the given super + * block. Super block flags are updated as well. + * + * @param tbl The fragment table object to store on disk. + * @param file The file to append the table to. + * @param super The super block that should be updated with the location + * and size of the table. + * @param cmp The compressor to use for compressing the table. + * + * @return Zero on success, an @ref E_SQFS_ERROR on failure. + */ +SQFS_API int sqfs_frag_table_write(sqfs_frag_table_t *tbl, sqfs_file_t *file, + sqfs_super_t *super, sqfs_compressor_t *cmp); + +/** + * @brief Resolve a fragment block index to its description. + * + * @memberof sqfs_frag_table_t + * + * @param tbl A pointer to the fragmen table object. + * @param index The index into the table. + * @param out Returns the data from the table on success. + * + * @return Zero on success, an @ref E_SQFS_ERROR on failure (e.g. index is + * out of bounds). + */ +SQFS_API int sqfs_frag_table_lookup(sqfs_frag_table_t *tbl, sqfs_u32 index, + sqfs_fragment_t *out); + +/** + * @brief Append a table entry to a fragment table. + * + * @memberof sqfs_frag_table_t + * + * @param tbl A pointer to the fragmen table object. + * @param location The absolute on-disk location of the new fragment block. + * @param out The size of the block. Has bit 24 set if compressed. + * @param index If not NULL, returns the allocated table index. + * + * @return Zero on success, an @ref E_SQFS_ERROR on failure (e.g. allocation + * failure). + */ +SQFS_API int sqfs_frag_table_append(sqfs_frag_table_t *tbl, sqfs_u64 location, + sqfs_u32 size, sqfs_u32 *index); + +/** + * @brief Modify an existing entry in a fragment table. + * + * @memberof sqfs_frag_table_t + * + * @param tbl A pointer to the fragmen table object. + * @param index The fragment table index. + * @param location The absolute on-disk location of the fragment block. + * @param out The size of the block. Has bit 24 set if compressed. + * + * @return Zero on success, an @ref E_SQFS_ERROR on + * failure (e.g. out of bounds). + */ +SQFS_API int sqfs_frag_table_set(sqfs_frag_table_t *tbl, sqfs_u32 index, + sqfs_u64 location, sqfs_u32 size); + +/** + * @brief Get the number of entries stored in a fragment table. + * + * @memberof sqfs_frag_table_t + * + * @param tbl A pointer to the fragmen table object. + * + * @return The number of entries currently stored in the table. + */ +SQFS_API size_t sqfs_frag_table_get_size(sqfs_frag_table_t *tbl); + +#ifdef __cplusplus +} +#endif + +#endif /* SQFS_FRAG_TABLE_H */ diff --git a/include/sqfs/predef.h b/include/sqfs/predef.h index ac2def9..234b015 100644 --- a/include/sqfs/predef.h +++ b/include/sqfs/predef.h @@ -82,6 +82,7 @@ typedef struct sqfs_tree_node_t sqfs_tree_node_t; typedef struct sqfs_data_reader_t sqfs_data_reader_t; typedef struct sqfs_block_hooks_t sqfs_block_hooks_t; typedef struct sqfs_xattr_writer_t sqfs_xattr_writer_t; +typedef struct sqfs_frag_table_t sqfs_frag_table_t; typedef struct sqfs_fragment_t sqfs_fragment_t; typedef struct sqfs_dir_header_t sqfs_dir_header_t; -- cgit v1.2.3