diff options
Diffstat (limited to 'include/meta_reader.h')
-rw-r--r-- | include/meta_reader.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/include/meta_reader.h b/include/meta_reader.h index 3085383..78c0db3 100644 --- a/include/meta_reader.h +++ b/include/meta_reader.h @@ -5,32 +5,166 @@ #include "compress.h" #include "squashfs.h" +/** + * @struct meta_reader_t + * + * @brief Abstracts away I/O on SquashFS meta data + */ typedef struct { + /** + * @brief The location of the current block in the file + */ uint64_t block_offset; + + /** + * @brief The location of the next block after the current one + */ uint64_t next_block; + + /** + * @brief A byte offset into the uncompressed data of the current block + */ size_t offset; + + /** + * @brief The underlying file descriptor to read from + */ int fd; + + /** + * @brief A pointer to the compressor to use for extracting data + */ compressor_t *cmp; + + /** + * @brief The raw data read from the input file + */ uint8_t data[SQFS_META_BLOCK_SIZE]; + + /** + * @brief The uncompressed data read from the input file + */ uint8_t scratch[SQFS_META_BLOCK_SIZE]; } meta_reader_t; +/** + * @brief Create a meta data reader + * + * @memberof meta_reader_t + * + * @note This function internally prints error message to stderr on failure + * + * @param fd The underlying file descriptor to read from + * @param cmp A pointer to a compressor to use for extracting the data + * + * @return A pointer to a meta data reader, NULL on failure + */ meta_reader_t *meta_reader_create(int fd, compressor_t *cmp); +/** + * @brief Destroy a meta data reader and free all memory used by it + * + * @memberof meta_reader_t + * + * @param m A pointer to a meta data reader + */ void meta_reader_destroy(meta_reader_t *m); +/** + * @brief Seek to a specific meta data block and offset + * + * @memberof meta_reader_t + * + * @note This function internally prints error message to stderr on failure + * + * @param m A pointer to a meta data reader + * @param block_start The absolute position of the 16 bit header right before + * the compressed data block + * @param offset A byte offset into the data block + * + * @return Zero on success, -1 on failure + */ int meta_reader_seek(meta_reader_t *m, uint64_t block_start, size_t offset); +/** + * @brief Read a chunk of data from a meta data block + * + * @memberof meta_reader_t + * + * @note This function internally prints error message to stderr on failure + * + * If the end of the block is reached, this function transparently tries to + * interpret the data after the current block as a further meta data block, + * i.e. it can transparently read across multiple meta data blocks. + * + * @param m A pointer to a meta data reader + * @param data A pointer to a memory block to write the data to + * @param size The number of bytes to read + * + * @return Zero on success, -1 on failure + */ int meta_reader_read(meta_reader_t *m, void *data, size_t size); +/** + * @brief Read an inode from a meta data block + * + * @memberof meta_reader_t + * + * @note This function internally prints error message to stderr on failure + * + * This function is a conveniance wrapper around @ref meta_reader_read that + * reads and decodes an entire SquashFS inode. It first reads the common inode + * header, interprets it and reads the additional, type dependend data. + * + * @param ir A pointer to a meta data reader + * @param super A pointer to the SquashFS super block + * @param block_start A byte offset relative to the inode table start where + * the meta data containing the inode starts + * @param offset A byte offset into the uncompressed meta data block + * where the inode is stored + * + * @return A pointer to the decoded inode or NULL on failure. Can be freed + * with a single free call. + */ sqfs_inode_generic_t *meta_reader_read_inode(meta_reader_t *ir, sqfs_super_t *super, uint64_t block_start, size_t offset); +/** + * @brief Read a directory header from a meta data block + * + * @memberof meta_reader_t + * + * @note This function internally prints error message to stderr on failure + * + * This function is a conveniance wrapper around @ref meta_reader_read that + * reads and decodes a SquashFS directory header. + * + * @param m A pointer to a meta data reader + * @param hdr A pointer to a directory header structure to write the decoded + * data to + * + * @return Zero on success, -1 on failure + */ int meta_reader_read_dir_header(meta_reader_t *m, sqfs_dir_header_t *hdr); +/** + * @brief Read a directory entry from a meta data block + * + * @memberof meta_reader_t + * + * @note This function internally prints error message to stderr on failure + * + * This function is a conveniance wrapper around @ref meta_reader_read that + * reads and decodes a SquashFS directory entry. + * + * @param m A pointer to a meta data reader + * + * @return A pointer to a directory entry or NULL on failure. Can be freed + * with a single free call. + */ sqfs_dir_entry_t *meta_reader_read_dir_ent(meta_reader_t *m); #endif /* META_READER_H */ |