コード例 #1
0
ファイル: fs.c プロジェクト: emiraga/squashfuse
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;
}
コード例 #2
0
ファイル: cache.c プロジェクト: vasi/squashfuse
static void sqfs_block_cache_dispose(void *data) {
	sqfs_block_cache_entry *entry = (sqfs_block_cache_entry*)data;
	sqfs_block_dispose(entry->block);
}