mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-23 13:56:20 +00:00
include/u-boot, lib/zlib: add sources for zlib decompression
Add zlib (v1.2.11) uncompr() function to U-Boot. SquashFS depends on this function to decompress data from a raw disk image. The actual support for zlib into SquashFS sources will be added in a follow-up commit. Signed-off-by: Joao Marcos Costa <joaomarcos.costa@bootlin.com>
This commit is contained in:
parent
bba604b65e
commit
81014f73f0
5 changed files with 140 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
||||||
config FS_SQUASHFS
|
config FS_SQUASHFS
|
||||||
bool "Enable SquashFS filesystem support"
|
bool "Enable SquashFS filesystem support"
|
||||||
|
select ZLIB_UNCOMPRESS
|
||||||
help
|
help
|
||||||
This provides support for reading images from SquashFS filesystem.
|
This provides support for reading images from SquashFS filesystem.
|
||||||
Squashfs is a compressed read-only filesystem for Linux.
|
Squashfs is a compressed read-only filesystem for Linux.
|
||||||
|
|
|
@ -110,6 +110,12 @@ extern "C" {
|
||||||
# define voidp z_voidp
|
# define voidp z_voidp
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(ZLIB_CONST) && !defined(z_const)
|
||||||
|
# define z_const const
|
||||||
|
#else
|
||||||
|
# define z_const
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__MSDOS__) && !defined(MSDOS)
|
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||||
# define MSDOS
|
# define MSDOS
|
||||||
#endif
|
#endif
|
||||||
|
@ -710,6 +716,32 @@ ZEXTERN uInt ZEXPORT crc32 OF((uInt crc, const Bytef *buf, uInt len));
|
||||||
if (crc != original_crc) error();
|
if (crc != original_crc) error();
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
|
||||||
|
const Bytef *source, uLong sourceLen));
|
||||||
|
/*
|
||||||
|
Decompresses the source buffer into the destination buffer. sourceLen is
|
||||||
|
the byte length of the source buffer. Upon entry, destLen is the total size
|
||||||
|
of the destination buffer, which must be large enough to hold the entire
|
||||||
|
uncompressed data. (The size of the uncompressed data must have been saved
|
||||||
|
previously by the compressor and transmitted to the decompressor by some
|
||||||
|
mechanism outside the scope of this compression library.) Upon exit, destLen
|
||||||
|
is the actual size of the uncompressed data.
|
||||||
|
|
||||||
|
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
|
||||||
|
enough memory, Z_BUF_ERROR if there was not enough room in the output
|
||||||
|
buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In
|
||||||
|
the case where there is not enough room, uncompress() will fill the output
|
||||||
|
buffer with the uncompressed data up to that point.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen,
|
||||||
|
const Bytef *source, uLong *sourceLen));
|
||||||
|
/*
|
||||||
|
Same as uncompress, except that sourceLen is a pointer, where the
|
||||||
|
length of the source is *sourceLen. On return, *sourceLen is the number of
|
||||||
|
source bytes consumed.
|
||||||
|
*/
|
||||||
|
|
||||||
ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
|
ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
|
||||||
const char *version, int stream_size));
|
const char *version, int stream_size));
|
||||||
#define inflateInit(strm) \
|
#define inflateInit(strm) \
|
||||||
|
|
|
@ -460,6 +460,13 @@ config GZIP
|
||||||
help
|
help
|
||||||
This enables support for GZIP compression algorithm.
|
This enables support for GZIP compression algorithm.
|
||||||
|
|
||||||
|
config ZLIB_UNCOMPRESS
|
||||||
|
bool "Enables zlib's uncompress() functionality"
|
||||||
|
help
|
||||||
|
This enables an extra zlib functionality: the uncompress() function,
|
||||||
|
which decompresses data from a buffer into another, knowing their
|
||||||
|
sizes. Unlike gunzip(), there is no header parsing.
|
||||||
|
|
||||||
config GZIP_COMPRESSED
|
config GZIP_COMPRESSED
|
||||||
bool
|
bool
|
||||||
select ZLIB
|
select ZLIB
|
||||||
|
|
97
lib/zlib/uncompr.c
Normal file
97
lib/zlib/uncompr.c
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/* uncompr.c -- decompress a memory buffer
|
||||||
|
* Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#define ZLIB_INTERNAL
|
||||||
|
#include "zlib.h"
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Decompresses the source buffer into the destination buffer. *sourceLen is
|
||||||
|
the byte length of the source buffer. Upon entry, *destLen is the total size
|
||||||
|
of the destination buffer, which must be large enough to hold the entire
|
||||||
|
uncompressed data. (The size of the uncompressed data must have been saved
|
||||||
|
previously by the compressor and transmitted to the decompressor by some
|
||||||
|
mechanism outside the scope of this compression library.) Upon exit,
|
||||||
|
*destLen is the size of the decompressed data and *sourceLen is the number
|
||||||
|
of source bytes consumed. Upon return, source + *sourceLen points to the
|
||||||
|
first unused input byte.
|
||||||
|
|
||||||
|
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
|
memory, Z_BUF_ERROR if there was not enough room in the output buffer, or
|
||||||
|
Z_DATA_ERROR if the input data was corrupted, including if the input data is
|
||||||
|
an incomplete zlib stream.
|
||||||
|
*/
|
||||||
|
int ZEXPORT uncompress2(dest, destLen, source, sourceLen)
|
||||||
|
Bytef *dest;
|
||||||
|
uLongf *destLen;
|
||||||
|
const Bytef *source;
|
||||||
|
uLong *sourceLen;
|
||||||
|
|
||||||
|
{
|
||||||
|
z_stream stream;
|
||||||
|
int err;
|
||||||
|
const uInt max = (uInt)-1;
|
||||||
|
uLong len, left;
|
||||||
|
/* for detection of incomplete stream when *destLen == 0 */
|
||||||
|
Byte buf[1];
|
||||||
|
|
||||||
|
len = *sourceLen;
|
||||||
|
if (*destLen) {
|
||||||
|
left = *destLen;
|
||||||
|
*destLen = 0;
|
||||||
|
} else {
|
||||||
|
left = 1;
|
||||||
|
dest = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.next_in = (z_const Bytef *)source;
|
||||||
|
stream.avail_in = 0;
|
||||||
|
stream.zalloc = (alloc_func)0;
|
||||||
|
stream.zfree = (free_func)0;
|
||||||
|
stream.opaque = (voidpf)0;
|
||||||
|
|
||||||
|
err = inflateInit(&stream);
|
||||||
|
if (err != Z_OK)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
stream.next_out = dest;
|
||||||
|
stream.avail_out = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (stream.avail_out == 0) {
|
||||||
|
stream.avail_out = left > (uLong)max ? max : (uInt)left;
|
||||||
|
left -= stream.avail_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stream.avail_in == 0) {
|
||||||
|
stream.avail_in = len > (uLong)max ? max : (uInt)len;
|
||||||
|
len -= stream.avail_in;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = inflate(&stream, Z_NO_FLUSH);
|
||||||
|
} while (err == Z_OK);
|
||||||
|
|
||||||
|
*sourceLen -= len + stream.avail_in;
|
||||||
|
if (dest != buf)
|
||||||
|
*destLen = stream.total_out;
|
||||||
|
else if (stream.total_out && err == Z_BUF_ERROR)
|
||||||
|
left = 1;
|
||||||
|
|
||||||
|
inflateEnd(&stream);
|
||||||
|
return err == Z_STREAM_END ? Z_OK :
|
||||||
|
err == Z_NEED_DICT ? Z_DATA_ERROR :
|
||||||
|
err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
|
||||||
|
err;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZEXPORT uncompress(dest, destLen, source, sourceLen)
|
||||||
|
Bytef *dest;
|
||||||
|
uLongf *destLen;
|
||||||
|
const Bytef *source;
|
||||||
|
uLong sourceLen;
|
||||||
|
{
|
||||||
|
return uncompress2(dest, destLen, source, &sourceLen);
|
||||||
|
}
|
|
@ -30,3 +30,6 @@
|
||||||
#include "inflate.c"
|
#include "inflate.c"
|
||||||
#include "zutil.c"
|
#include "zutil.c"
|
||||||
#include "adler32.c"
|
#include "adler32.c"
|
||||||
|
#if IS_ENABLED(CONFIG_ZLIB_UNCOMPRESS)
|
||||||
|
#include "uncompr.c"
|
||||||
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue