Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/contrib/opensolaris/uts/common/zmod/zmod.c
Show All 31 Lines | |||||
/* | /* | ||||
* Uncompress the buffer 'src' into the buffer 'dst'. The caller must store | * Uncompress the buffer 'src' into the buffer 'dst'. The caller must store | ||||
* the expected decompressed data size externally so it can be passed in. | * the expected decompressed data size externally so it can be passed in. | ||||
* The resulting decompressed size is then returned through dstlen. This | * The resulting decompressed size is then returned through dstlen. This | ||||
* function return Z_OK on success, or another error code on failure. | * function return Z_OK on success, or another error code on failure. | ||||
*/ | */ | ||||
int | int | ||||
z_uncompress(void *dst, size_t *dstlen, const void *src, size_t srclen) | zmod_uncompress(void *dst, size_t *dstlen, const void *src, size_t srclen) | ||||
{ | { | ||||
z_stream zs; | z_stream zs; | ||||
int err; | int err; | ||||
bzero(&zs, sizeof (zs)); | bzero(&zs, sizeof (zs)); | ||||
zs.zalloc = zmod_zcalloc; | |||||
zs.zfree = zmod_zcfree; | |||||
zs.next_in = (uchar_t *)src; | zs.next_in = (uchar_t *)src; | ||||
zs.avail_in = srclen; | zs.avail_in = srclen; | ||||
zs.next_out = dst; | zs.next_out = dst; | ||||
zs.avail_out = *dstlen; | zs.avail_out = *dstlen; | ||||
/* | /* | ||||
* Call inflateInit2() specifying a window size of DEF_WBITS | * Call inflateInit2() specifying a window size of DEF_WBITS | ||||
* with the 6th bit set to indicate that the compression format | * with the 6th bit set to indicate that the compression format | ||||
* type (zlib or gzip) should be automatically detected. | * type (zlib or gzip) should be automatically detected. | ||||
*/ | */ | ||||
if ((err = inflateInit2(&zs, DEF_WBITS | 0x20)) != Z_OK) | if ((err = inflateInit2(&zs, DEF_WBITS | 0x20)) != Z_OK) | ||||
return (err); | return (err); | ||||
if ((err = inflate(&zs, Z_FINISH)) != Z_STREAM_END) { | if ((err = inflate(&zs, Z_FINISH)) != Z_STREAM_END) { | ||||
(void) inflateEnd(&zs); | (void) inflateEnd(&zs); | ||||
return (err == Z_OK ? Z_BUF_ERROR : err); | return (err == Z_OK ? Z_BUF_ERROR : err); | ||||
} | } | ||||
*dstlen = zs.total_out; | *dstlen = zs.total_out; | ||||
return (inflateEnd(&zs)); | return (inflateEnd(&zs)); | ||||
} | } | ||||
int | int | ||||
z_compress_level(void *dst, size_t *dstlen, const void *src, size_t srclen, | zmod_compress_level(void *dst, size_t *dstlen, const void *src, size_t srclen, | ||||
int level) | int level) | ||||
{ | { | ||||
z_stream zs; | z_stream zs; | ||||
int err; | int err; | ||||
bzero(&zs, sizeof (zs)); | bzero(&zs, sizeof (zs)); | ||||
zs.zalloc = zmod_zcalloc; | |||||
zs.zfree = zmod_zcfree; | |||||
zs.next_in = (uchar_t *)src; | zs.next_in = (uchar_t *)src; | ||||
zs.avail_in = srclen; | zs.avail_in = srclen; | ||||
zs.next_out = dst; | zs.next_out = dst; | ||||
zs.avail_out = *dstlen; | zs.avail_out = *dstlen; | ||||
if ((err = deflateInit(&zs, level)) != Z_OK) | if ((err = deflateInit(&zs, level)) != Z_OK) | ||||
return (err); | return (err); | ||||
if ((err = deflate(&zs, Z_FINISH)) != Z_STREAM_END) { | if ((err = deflate(&zs, Z_FINISH)) != Z_STREAM_END) { | ||||
(void) deflateEnd(&zs); | (void) deflateEnd(&zs); | ||||
return (err == Z_OK ? Z_BUF_ERROR : err); | return (err == Z_OK ? Z_BUF_ERROR : err); | ||||
} | } | ||||
*dstlen = zs.total_out; | *dstlen = zs.total_out; | ||||
return (deflateEnd(&zs)); | return (deflateEnd(&zs)); | ||||
} | } | ||||
int | int | ||||
z_compress(void *dst, size_t *dstlen, const void *src, size_t srclen) | zmod_compress(void *dst, size_t *dstlen, const void *src, size_t srclen) | ||||
{ | { | ||||
return (z_compress_level(dst, dstlen, src, srclen, | return (zmod_compress_level(dst, dstlen, src, srclen, | ||||
Z_DEFAULT_COMPRESSION)); | Z_DEFAULT_COMPRESSION)); | ||||
} | } | ||||
/* | /* | ||||
* Convert a zlib error code into a string error message. | * Convert a zlib error code into a string error message. | ||||
*/ | */ | ||||
const char * | const char * | ||||
z_strerror(int err) | z_strerror(int err) | ||||
{ | { | ||||
int i = Z_NEED_DICT - err; | int i = Z_NEED_DICT - err; | ||||
if (i < 0 || i > Z_NEED_DICT - Z_VERSION_ERROR) | if (i < 0 || i > Z_NEED_DICT - Z_VERSION_ERROR) | ||||
return ("unknown error"); | return ("unknown error"); | ||||
return (zError(err)); | return (zError(err)); | ||||
} | } |