Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/contrib/opensolaris/uts/common/zmod/zmod.c
Show All 19 Lines | |||||
*/ | */ | ||||
/* | /* | ||||
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. | * Copyright 2008 Sun Microsystems, Inc. All rights reserved. | ||||
* Use is subject to license terms. | * Use is subject to license terms. | ||||
*/ | */ | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include <sys/cmn_err.h> | |||||
#include <sys/systm.h> | |||||
#include <sys/kobj.h> | |||||
#include <sys/zmod.h> | #include <sys/zmod.h> | ||||
#include "zlib.h" | #include <contrib/zlib/zlib.h> | ||||
#include "zutil.h" | #include <contrib/zlib/zutil.h> | ||||
struct zchdr { | |||||
uint_t zch_magic; | |||||
uint_t zch_size; | |||||
}; | |||||
#define ZCH_MAGIC 0x3cc13cc1 | |||||
/*ARGSUSED*/ | |||||
static void * | |||||
zfs_zcalloc(void *opaque, uint_t items, uint_t size) | |||||
{ | |||||
size_t nbytes = sizeof (struct zchdr) + items * size; | |||||
struct zchdr *z = kobj_zalloc(nbytes, KM_NOWAIT|KM_TMP); | |||||
if (z == NULL) | |||||
return (NULL); | |||||
z->zch_magic = ZCH_MAGIC; | |||||
z->zch_size = nbytes; | |||||
return (z + 1); | |||||
} | |||||
/*ARGSUSED*/ | |||||
static void | |||||
zfs_zcfree(void *opaque, void *ptr) | |||||
{ | |||||
struct zchdr *z = ((struct zchdr *)ptr) - 1; | |||||
if (z->zch_magic != ZCH_MAGIC) | |||||
panic("zcfree region corrupt: hdr=%p ptr=%p", (void *)z, ptr); | |||||
kobj_free(z, z->zch_size); | |||||
} | |||||
/* | /* | ||||
* 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) | z_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.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; | ||||
zs.zalloc = zfs_zcalloc; | |||||
zs.zfree = zfs_zcfree; | |||||
/* | /* | ||||
* 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); | ||||
Show All 15 Lines | z_compress_level(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.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; | ||||
zs.zalloc = zfs_zcalloc; | |||||
zs.zfree = zfs_zcfree; | |||||
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); | ||||
} | } | ||||
Show All 25 Lines |