2005-04-17 02:20:36 +04:00
/*
* uncompress . c
*
* ( C ) Copyright 1999 Linus Torvalds
*
* cramfs interfaces to the uncompression library . There ' s really just
* three entrypoints :
*
* - cramfs_uncompress_init ( ) - called to initialize the thing .
* - cramfs_uncompress_exit ( ) - tell me when you ' re done
* - cramfs_uncompress_block ( ) - uncompress a block .
*
* NOTE NOTE NOTE ! The uncompression is entirely single - threaded . We
* only have one stream , and we ' ll initialize it only once even if it
* then is used by multiple filesystems .
*/
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/vmalloc.h>
# include <linux/zlib.h>
2005-09-10 11:27:20 +04:00
# include <linux/cramfs_fs.h>
2005-04-17 02:20:36 +04:00
static z_stream stream ;
static int initialized ;
/* Returns length of decompressed data. */
int cramfs_uncompress_block ( void * dst , int dstlen , void * src , int srclen )
{
int err ;
stream . next_in = src ;
stream . avail_in = srclen ;
stream . next_out = dst ;
stream . avail_out = dstlen ;
err = zlib_inflateReset ( & stream ) ;
if ( err ! = Z_OK ) {
printk ( " zlib_inflateReset error %d \n " , err ) ;
zlib_inflateEnd ( & stream ) ;
zlib_inflateInit ( & stream ) ;
}
err = zlib_inflate ( & stream , Z_FINISH ) ;
if ( err ! = Z_STREAM_END )
goto err ;
return stream . total_out ;
err :
printk ( " Error %d while decompressing! \n " , err ) ;
printk ( " %p(%d)->%p(%d) \n " , src , srclen , dst , dstlen ) ;
2009-04-03 03:59:15 +04:00
return - EIO ;
2005-04-17 02:20:36 +04:00
}
int cramfs_uncompress_init ( void )
{
if ( ! initialized + + ) {
stream . workspace = vmalloc ( zlib_inflate_workspacesize ( ) ) ;
if ( ! stream . workspace ) {
initialized = 0 ;
return - ENOMEM ;
}
stream . next_in = NULL ;
stream . avail_in = 0 ;
zlib_inflateInit ( & stream ) ;
}
return 0 ;
}
2006-09-29 13:01:05 +04:00
void cramfs_uncompress_exit ( void )
2005-04-17 02:20:36 +04:00
{
if ( ! - - initialized ) {
zlib_inflateEnd ( & stream ) ;
vfree ( stream . workspace ) ;
}
}