18f8cb840SMaxim Sobolev /* 28f8cb840SMaxim Sobolev * Copyright (c) 2004-2016 Maxim Sobolev <sobomax@FreeBSD.org> 38f8cb840SMaxim Sobolev * All rights reserved. 48f8cb840SMaxim Sobolev * 58f8cb840SMaxim Sobolev * Redistribution and use in source and binary forms, with or without 68f8cb840SMaxim Sobolev * modification, are permitted provided that the following conditions 78f8cb840SMaxim Sobolev * are met: 88f8cb840SMaxim Sobolev * 1. Redistributions of source code must retain the above copyright 98f8cb840SMaxim Sobolev * notice, this list of conditions and the following disclaimer. 108f8cb840SMaxim Sobolev * 2. Redistributions in binary form must reproduce the above copyright 118f8cb840SMaxim Sobolev * notice, this list of conditions and the following disclaimer in the 128f8cb840SMaxim Sobolev * documentation and/or other materials provided with the distribution. 138f8cb840SMaxim Sobolev * 148f8cb840SMaxim Sobolev * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 158f8cb840SMaxim Sobolev * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 168f8cb840SMaxim Sobolev * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 178f8cb840SMaxim Sobolev * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 188f8cb840SMaxim Sobolev * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 198f8cb840SMaxim Sobolev * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 208f8cb840SMaxim Sobolev * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 218f8cb840SMaxim Sobolev * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 228f8cb840SMaxim Sobolev * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 238f8cb840SMaxim Sobolev * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 248f8cb840SMaxim Sobolev * SUCH DAMAGE. 258f8cb840SMaxim Sobolev */ 268f8cb840SMaxim Sobolev 278f8cb840SMaxim Sobolev #include <sys/cdefs.h> 288f8cb840SMaxim Sobolev __FBSDID("$FreeBSD$"); 298f8cb840SMaxim Sobolev 308f8cb840SMaxim Sobolev #include <sys/param.h> 318f8cb840SMaxim Sobolev #include <err.h> 328f8cb840SMaxim Sobolev #include <stdint.h> 338f8cb840SMaxim Sobolev 348f8cb840SMaxim Sobolev #include <zlib.h> 358f8cb840SMaxim Sobolev 368f8cb840SMaxim Sobolev #include "mkuzip.h" 374fc55e3eSMaxim Sobolev #include "mkuz_blk.h" 38*eefd8f96SConrad Meyer #include "mkuz_zlib.h" 398f8cb840SMaxim Sobolev 408f8cb840SMaxim Sobolev struct mkuz_zlib { 41*eefd8f96SConrad Meyer int comp_level; 428f8cb840SMaxim Sobolev }; 438f8cb840SMaxim Sobolev 44*eefd8f96SConrad Meyer size_t 45*eefd8f96SConrad Meyer mkuz_zlib_cbound(size_t blksz) 46*eefd8f96SConrad Meyer { 47*eefd8f96SConrad Meyer return (compressBound(blksz)); 48*eefd8f96SConrad Meyer } 49*eefd8f96SConrad Meyer 508f8cb840SMaxim Sobolev void * 51*eefd8f96SConrad Meyer mkuz_zlib_init(int *comp_level) 528f8cb840SMaxim Sobolev { 534fc55e3eSMaxim Sobolev struct mkuz_zlib *zp; 544fc55e3eSMaxim Sobolev 55*eefd8f96SConrad Meyer if (*comp_level == USE_DEFAULT_LEVEL) 56*eefd8f96SConrad Meyer *comp_level = Z_BEST_COMPRESSION; 57*eefd8f96SConrad Meyer if (*comp_level < Z_BEST_SPEED || *comp_level > Z_BEST_COMPRESSION) 58*eefd8f96SConrad Meyer errx(1, "provided compression level %d is invalid", 59*eefd8f96SConrad Meyer *comp_level); 608f8cb840SMaxim Sobolev /* Not reached */ 61*eefd8f96SConrad Meyer 624fc55e3eSMaxim Sobolev zp = mkuz_safe_zmalloc(sizeof(struct mkuz_zlib)); 63*eefd8f96SConrad Meyer zp->comp_level = *comp_level; 648f8cb840SMaxim Sobolev 65*eefd8f96SConrad Meyer return (zp); 668f8cb840SMaxim Sobolev } 678f8cb840SMaxim Sobolev 68*eefd8f96SConrad Meyer void 69*eefd8f96SConrad Meyer mkuz_zlib_compress(void *p, const struct mkuz_blk *iblk, struct mkuz_blk *oblk) 708f8cb840SMaxim Sobolev { 718f8cb840SMaxim Sobolev uLongf destlen_z; 724fc55e3eSMaxim Sobolev struct mkuz_zlib *zp; 738f8cb840SMaxim Sobolev 744fc55e3eSMaxim Sobolev zp = (struct mkuz_zlib *)p; 754fc55e3eSMaxim Sobolev 76*eefd8f96SConrad Meyer destlen_z = oblk->alen; 77*eefd8f96SConrad Meyer if (compress2(oblk->data, &destlen_z, iblk->data, iblk->info.len, 78*eefd8f96SConrad Meyer zp->comp_level) != Z_OK) { 79*eefd8f96SConrad Meyer errx(1, "can't compress data: compress2() failed"); 808f8cb840SMaxim Sobolev /* Not reached */ 818f8cb840SMaxim Sobolev } 828f8cb840SMaxim Sobolev 83*eefd8f96SConrad Meyer oblk->info.len = (uint32_t)destlen_z; 848f8cb840SMaxim Sobolev } 85