sqfs_err sqfs_block_read(sqfs *fs, sqfs_off_t pos, bool compressed, uint32_t size, size_t outsize, sqfs_block **block) { sqfs_err err = SQFS_ERR; if (!(*block = malloc(sizeof(**block)))) return SQFS_ERR; if (!((*block)->data = malloc(size))) goto error; if (sqfs_pread(fs->fd, (*block)->data, size, pos + fs->offset) != size) goto error; if (compressed) { char *decomp = malloc(outsize); if (!decomp) goto error; err = fs->decompressor((*block)->data, size, decomp, &outsize); if (err) { free(decomp); goto error; } free((*block)->data); (*block)->data = decomp; (*block)->size = outsize; } else { (*block)->size = size; } return SQFS_OK; error: sqfs_block_dispose(*block); *block = NULL; return err; }
static void sqfs_block_cache_dispose(void *data) { sqfs_block_cache_entry *entry = (sqfs_block_cache_entry*)data; sqfs_block_dispose(entry->block); }