From 79498fa15227d4659489763ed2a9a1e806c11428 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Fri, 20 Sep 2019 22:50:10 +0200 Subject: Integrate the data reader into libsquashfs Signed-off-by: David Oberhollenzer --- include/sqfs/data_reader.h | 152 +++++++++++++++++++++++++++++++++++++++++++++ include/sqfs/predef.h | 1 + 2 files changed, 153 insertions(+) create mode 100644 include/sqfs/data_reader.h (limited to 'include/sqfs') diff --git a/include/sqfs/data_reader.h b/include/sqfs/data_reader.h new file mode 100644 index 0000000..7d0f9d7 --- /dev/null +++ b/include/sqfs/data_reader.h @@ -0,0 +1,152 @@ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ +/* + * data_reader.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_DATA_READER_H +#define SQFS_DATA_READER_H + +#include "sqfs/predef.h" + +/** + * @file data_reader.h + * + * @brief Contains declarations for the @ref sqfs_data_reader_t. + */ + +/** + * @struct sqfs_data_reader_t + * + * @brief Abstracts access to data blocks stored in a SquashFS image. + * + * A SquashFS image can contain a series of file data blocks between the + * super block and the inode table. Blocks may or may not be compressed. + * Data chunks that are smaller than the block size indicated by the super + * block (such as the final chunk of a file or an entire file that is smaller + * than a signle block) can be grouped in a single fragment block. + * + * Regular file inodes referre to the location of the first block and store a + * sequence of block sizes for all consequitve blocks, as well as a fragment + * index and fragment offset which is resolved through a fragment table. + * + * The data reader abstracts all of this away in a simple interface that allows + * reading file data through an inode description and a location in the file. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Create a data reader instance. + * + * @memberof sqfs_data_reader_t + * + * @param file A file interface through which to access the + * underlying filesystem image. + * @param block_size The data block size from the super block. + * @param cmp A compressor to use for uncompressing blocks read from disk. + * + * @return A pointer to a new data reader object. NULL means + * allocation failure. + */ +SQFS_API sqfs_data_reader_t *sqfs_data_reader_create(sqfs_file_t *file, + size_t block_size, + sqfs_compressor_t *cmp); + +/** + * @brief Destroy a data reader instance and free all memory used by it. + * + * @memberof sqfs_data_reader_t + * + * @param data A pointer to a data reader object. + */ +SQFS_API void sqfs_data_reader_destroy(sqfs_data_reader_t *data); + +/** + * @brief Read and decode the fragment table from disk. + * + * @memberof sqfs_data_reader_t + * + * @param data A pointer to a data reader object. + * @param super A pointer to the super block. + * + * @return Zero on succcess, an @ref E_SQFS_ERROR value on failure. + */ +SQFS_API int sqfs_data_reader_load_fragment_table(sqfs_data_reader_t *data, + const sqfs_super_t *super); + +/** + * @brief Get the tail end of a file. + * + * @memberof sqfs_data_reader_t + * + * @param data A pointer to a data reader object. + * @param inode A pointer to the inode describing the file. + * @param out Returns a pointer to the tail block of the file. + * + * @return Zero on succcess, an @ref E_SQFS_ERROR value on failure. + */ +SQFS_API int sqfs_data_reader_get_fragment(sqfs_data_reader_t *data, + const sqfs_inode_generic_t *inode, + sqfs_block_t **out); + +/** + * @brief Get a full sized data block of a file by block index. + * + * @memberof sqfs_data_reader_t + * + * @param data A pointer to a data reader object. + * @param inode A pointer to the inode describing the file. + * @param index The block index in the inodes block list. + * @param out Returns a pointer to the data block. + * + * @return Zero on succcess, an @ref E_SQFS_ERROR value on failure. + */ +SQFS_API int sqfs_data_reader_get_block(sqfs_data_reader_t *data, + const sqfs_inode_generic_t *inode, + size_t index, sqfs_block_t **out); + +/** + * @brief A simple UNIX-read-like function to read data from a file. + * + * @memberof sqfs_data_reader_t + * + * This function acts like the read system call in a Unix-like OS. It takes + * care of reading accross data blocks and fragment internally, using a + * data and fragment block cache. + * + * @param data A pointer to a data reader object. + * @param inode A pointer to the inode describing the file. + * @param offset An arbitrary byte offset into the uncompressed file. + * @param buffer Returns the data read from the file. + * @param size The number of uncompressed bytes to read from the given offset. + * + * @return The number of bytes read on succcess, zero if attempting to read + * past the end of the file and a negative @ref E_SQFS_ERROR value + * on failure. + */ +SQFS_API ssize_t sqfs_data_reader_read(sqfs_data_reader_t *data, + const sqfs_inode_generic_t *inode, + uint64_t offset, void *buffer, + size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* SQFS_DATA_READER_H */ diff --git a/include/sqfs/predef.h b/include/sqfs/predef.h index c25a858..aad4eae 100644 --- a/include/sqfs/predef.h +++ b/include/sqfs/predef.h @@ -71,6 +71,7 @@ typedef struct sqfs_xattr_reader_t sqfs_xattr_reader_t; typedef struct sqfs_file_t sqfs_file_t; typedef struct sqfs_sparse_map_t sqfs_sparse_map_t; typedef struct sqfs_tree_node_t sqfs_tree_node_t; +typedef struct sqfs_data_reader_t sqfs_data_reader_t; typedef struct sqfs_fragment_t sqfs_fragment_t; typedef struct sqfs_dir_header_t sqfs_dir_header_t; -- cgit v1.2.3