Annotation of libaitsync/src/zc.c, revision 1.2

1.2     ! misho       1: /*************************************************************************
        !             2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
        !             3: *  by Michael Pounov <misho@openbsd-bg.org>
        !             4: *
        !             5: * $Author: misho $
        !             6: * $Id: zc.c,v 1.1.1.1.2.2 2011/05/09 14:35:56 misho Exp $
        !             7: *
        !             8: **************************************************************************
        !             9: The ELWIX and AITNET software is distributed under the following
        !            10: terms:
        !            11: 
        !            12: All of the documentation and software included in the ELWIX and AITNET
        !            13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
        !            14: 
        !            15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
        !            16:        by Michael Pounov <misho@elwix.org>.  All rights reserved.
        !            17: 
        !            18: Redistribution and use in source and binary forms, with or without
        !            19: modification, are permitted provided that the following conditions
        !            20: are met:
        !            21: 1. Redistributions of source code must retain the above copyright
        !            22:    notice, this list of conditions and the following disclaimer.
        !            23: 2. Redistributions in binary form must reproduce the above copyright
        !            24:    notice, this list of conditions and the following disclaimer in the
        !            25:    documentation and/or other materials provided with the distribution.
        !            26: 3. All advertising materials mentioning features or use of this software
        !            27:    must display the following acknowledgement:
        !            28: This product includes software developed by Michael Pounov <misho@elwix.org>
        !            29: ELWIX - Embedded LightWeight unIX and its contributors.
        !            30: 4. Neither the name of AITNET nor the names of its contributors
        !            31:    may be used to endorse or promote products derived from this software
        !            32:    without specific prior written permission.
        !            33: 
        !            34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
        !            35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            44: SUCH DAMAGE.
        !            45: */
1.1       misho      46: #include "global.h"
                     47: #include "file.h"
                     48: #include "zc.h"
                     49: 
                     50: 
                     51: int sync_Deflate(int inf, int outf, int level)
                     52: {
                     53:        z_stream z;
                     54:        int ret, flush, readed;
                     55:        u_char ibuf[Z_CHUNK], obuf[Z_CHUNK];
                     56: 
                     57:        lseek(outf, 0l, SEEK_SET);
                     58:        if (lseek(inf, 0l, SEEK_SET) == -1) {
                     59:                SETERR;
                     60:                return -1;
                     61:        }
                     62: 
                     63:        // init zlib
                     64:        memset(&z, 0, sizeof z);
                     65:        ret = deflateInit(&z, level);
                     66:        if (ret)
                     67:                return ret;
                     68: 
                     69:        do {
                     70:                // set input buffer for compress
                     71:                readed = read(inf, ibuf, Z_CHUNK);
                     72:                if (-1 == readed) {
                     73:                        SETERR;
                     74:                        break;
                     75:                } else {
                     76:                        z.avail_in = readed;
                     77:                        z.next_in = ibuf;
                     78:                }
                     79: 
                     80:                // check flush flag
                     81:                flush = syncEOF(inf) ? Z_FINISH : Z_NO_FLUSH;
                     82: 
                     83:                do {
                     84:                        // compress and write to file
                     85:                        z.avail_out = readed;
                     86:                        z.next_out = obuf;
                     87:                        ret = deflate(&z, flush);
                     88:                        if (Z_STREAM_ERROR == ret) {
                     89:                                syncSetErr(ENOEXEC, "Error:: can`t deflate !!!\n");
                     90:                                flush = Z_FINISH;
                     91:                                ret = -1;
                     92:                                break;
                     93:                        }
                     94: 
                     95:                        ret = write(outf, obuf, readed - z.avail_out);
                     96:                        if (-1 == ret || ret != readed - z.avail_out) {
                     97:                                SETERR;
                     98:                                flush = Z_FINISH;
                     99:                                ret = -1;
                    100:                                break;
                    101:                        }
                    102:                } while (!z.avail_out);
                    103: 
                    104:                if (z.avail_in) {
                    105:                        syncSetErr(ENOEXEC, "Error:: can`t get all input for deflate !!!\n");
                    106:                        ret = -1;
                    107:                        break;
                    108:                }
                    109:        } while (flush != Z_FINISH);
                    110: 
                    111:        // free zlib
                    112:        deflateEnd(&z);
                    113:        return ret;
                    114: }
                    115: 
                    116: int sync_Inflate(int inf, int outf)
                    117: {
                    118:        z_stream z;
                    119:        int ret, flush;
                    120:        u_char ibuf[Z_CHUNK], obuf[Z_CHUNK];
                    121: 
                    122:        lseek(outf, 0l, SEEK_SET);
                    123:        if (lseek(inf, 0l, SEEK_SET) == -1) {
                    124:                SETERR;
                    125:                return -1;
                    126:        }
                    127: 
                    128:        // init zlib
                    129:        memset(&z, 0, sizeof z);
                    130:        ret = inflateInit(&z);
                    131:        if (ret)
                    132:                return ret;
                    133: 
                    134:        do {
                    135:                // set input buffer for decompress
                    136:                ret = read(inf, ibuf, Z_CHUNK);
                    137:                if (-1 == ret) {
                    138:                        SETERR;
                    139:                        break;
                    140:                }
                    141:                if (!ret)
                    142:                        break;
                    143:                z.avail_in = ret;
                    144:                z.next_in = ibuf;
                    145: 
                    146:                flush = Z_NO_FLUSH;
                    147: 
                    148:                do {
                    149:                        // decompress and write to file
                    150:                        z.avail_out = Z_CHUNK;
                    151:                        z.next_out = obuf;
                    152:                        ret = inflate(&z, flush);
                    153:                        switch (ret) {
                    154:                                case Z_NEED_DICT:
                    155:                                case Z_DATA_ERROR:
                    156:                                case Z_MEM_ERROR:
                    157:                                        syncSetErr(ENOEXEC, "Error:: can`t inflate !!!\n");
                    158:                                        flush = Z_STREAM_END;
                    159:                                        ret = -1;
                    160:                                        break;
                    161:                        }
                    162: 
                    163:                        ret = write(outf, obuf, Z_CHUNK - z.avail_out);
                    164:                        if (-1 == ret || ret != Z_CHUNK - z.avail_out) {
                    165:                                SETERR;
                    166:                                flush = Z_STREAM_END;
                    167:                                ret = -1;
                    168:                                break;
                    169:                        }
                    170:                } while (!z.avail_out);
                    171:        } while (flush != Z_STREAM_END);
                    172: 
                    173:        // free zlib
                    174:        inflateEnd(&z);
                    175:        return ret;
                    176: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>