aboutsummaryrefslogtreecommitdiff
path: root/lib/sqfs/frag_reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqfs/frag_reader.c')
-rw-r--r--lib/sqfs/frag_reader.c134
1 files changed, 0 insertions, 134 deletions
diff --git a/lib/sqfs/frag_reader.c b/lib/sqfs/frag_reader.c
deleted file mode 100644
index 0436a17..0000000
--- a/lib/sqfs/frag_reader.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-#include "config.h"
-
-#include "frag_reader.h"
-#include "highlevel.h"
-#include "util.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-struct frag_reader_t {
- sqfs_fragment_t *tbl;
- size_t num_fragments;
-
- int fd;
- compressor_t *cmp;
- size_t block_size;
- size_t used;
- size_t current_index;
- uint8_t buffer[];
-};
-
-static int precache_block(frag_reader_t *f, size_t i)
-{
- bool compressed;
- size_t size;
- ssize_t ret;
-
- if (i == f->current_index)
- return 0;
-
- compressed = (f->tbl[i].size & (1 << 24)) == 0;
- size = f->tbl[i].size & ((1 << 24) - 1);
-
- if (size > f->block_size) {
- fputs("found fragment block larger than block size\n", stderr);
- return -1;
- }
-
- if (read_data_at("reading fragment", f->tbl[i].start_offset,
- f->fd, f->buffer, size)) {
- return -1;
- }
-
- if (compressed) {
- ret = f->cmp->do_block(f->cmp, f->buffer, size,
- f->buffer + f->block_size, f->block_size);
-
- if (ret <= 0) {
- fputs("extracting fragment failed\n", stderr);
- return -1;
- }
-
- size = ret;
- memmove(f->buffer, f->buffer + f->block_size, ret);
- }
-
- f->current_index = i;
- f->used = size;
- return 0;
-}
-
-
-frag_reader_t *frag_reader_create(sqfs_super_t *super, int fd,
- compressor_t *cmp)
-{
- frag_reader_t *f = NULL;
- size_t i;
-
- f = calloc(1, sizeof(*f) + super->block_size * 2);
- if (f == NULL) {
- perror("creating fragment table");
- return NULL;
- }
-
- f->block_size = super->block_size;
- f->num_fragments = super->fragment_entry_count;
- f->current_index = f->num_fragments;
- f->cmp = cmp;
- f->fd = fd;
-
- f->tbl = sqfs_read_table(fd, cmp, sizeof(f->tbl[0]) * f->num_fragments,
- super->fragment_table_start);
- if (f->tbl == NULL) {
- free(f);
- return NULL;
- }
-
- for (i = 0; i < f->num_fragments; ++i) {
- f->tbl[i].start_offset = le64toh(f->tbl[i].start_offset);
- f->tbl[i].size = le32toh(f->tbl[i].size);
- }
-
- return f;
-}
-
-void frag_reader_destroy(frag_reader_t *f)
-{
- free(f->tbl);
- free(f);
-}
-
-int frag_reader_read(frag_reader_t *f, size_t index, size_t offset,
- void *buffer, size_t size)
-{
- if (precache_block(f, index))
- return -1;
-
- if (offset >= f->used)
- goto fail_range;
-
- if (size == 0)
- return 0;
-
- if ((offset + size - 1) >= f->used)
- goto fail_range;
-
- memcpy(buffer, f->buffer + offset, size);
- return 0;
-fail_range:
- fputs("attempted to read past fragment block limits\n", stderr);
- return -1;
-}
-
-const sqfs_fragment_t *frag_reader_get_table(const frag_reader_t *f)
-{
- return f->tbl;
-}
-
-size_t frag_reader_get_fragment_count(const frag_reader_t *f)
-{
- return f->num_fragments;
-}