summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-01-23 22:59:59 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-01-24 16:15:47 +0100
commit1d15ee609baf00459571b8d549bdd467dffa2b02 (patch)
treed1838cef04129353fd19152554aa927f18e818de /include
parentb4c822960aaf5b4349895cc480e959b502f6855e (diff)
Add a fragment table primitive to libsquashfs
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'include')
-rw-r--r--include/sqfs/frag_table.h158
-rw-r--r--include/sqfs/predef.h1
2 files changed, 159 insertions, 0 deletions
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 <goliath@infraroot.at>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+#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;