8f19d2fe388b2a75699d873618da05a15dd4e2a0
   1/*
   2 * zlib wrappers to make sure we don't silently miss errors
   3 * at init time.
   4 */
   5#include "cache.h"
   6
   7static const char *zerr_to_string(int status)
   8{
   9        switch (status) {
  10        case Z_MEM_ERROR:
  11                return "out of memory";
  12        case Z_VERSION_ERROR:
  13                return "wrong version";
  14        case Z_NEED_DICT:
  15                return "needs dictionary";
  16        case Z_DATA_ERROR:
  17                return "data stream error";
  18        case Z_STREAM_ERROR:
  19                return "stream consistency error";
  20        default:
  21                return "unknown error";
  22        }
  23}
  24
  25void git_inflate_init(z_streamp strm)
  26{
  27        int status = inflateInit(strm);
  28
  29        if (status == Z_OK)
  30                return;
  31        die("inflateInit: %s (%s)", zerr_to_string(status),
  32            strm->msg ? strm->msg : "no message");
  33}
  34
  35void git_inflate_init_gzip_only(z_streamp strm)
  36{
  37        /*
  38         * Use default 15 bits, +16 is to accept only gzip and to
  39         * yield Z_DATA_ERROR when fed zlib format.
  40         */
  41        const int windowBits = 15 + 16;
  42        int status = inflateInit2(strm, windowBits);
  43
  44        if (status == Z_OK)
  45                return;
  46        die("inflateInit2: %s (%s)", zerr_to_string(status),
  47            strm->msg ? strm->msg : "no message");
  48}
  49
  50void git_inflate_end(z_streamp strm)
  51{
  52        int status = inflateEnd(strm);
  53
  54        if (status == Z_OK)
  55                return;
  56        error("inflateEnd: %s (%s)", zerr_to_string(status),
  57              strm->msg ? strm->msg : "no message");
  58}
  59
  60int git_inflate(z_streamp strm, int flush)
  61{
  62        int status = inflate(strm, flush);
  63
  64        switch (status) {
  65        /* Z_BUF_ERROR: normal, needs more space in the output buffer */
  66        case Z_BUF_ERROR:
  67        case Z_OK:
  68        case Z_STREAM_END:
  69                return status;
  70
  71        case Z_MEM_ERROR:
  72                die("inflate: out of memory");
  73        default:
  74                break;
  75        }
  76        error("inflate: %s (%s)", zerr_to_string(status),
  77              strm->msg ? strm->msg : "no message");
  78        return status;
  79}
  80
  81#if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
  82#define deflateBound(c,s)  ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
  83#endif
  84
  85unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
  86{
  87        return deflateBound(strm, size);
  88}
  89
  90void git_deflate_init(z_streamp strm, int level)
  91{
  92        int status = deflateInit(strm, level);
  93
  94        if (status == Z_OK)
  95                return;
  96        die("deflateInit: %s (%s)", zerr_to_string(status),
  97            strm->msg ? strm->msg : "no message");
  98}
  99
 100void git_deflate_init_gzip(z_streamp strm, int level)
 101{
 102        /*
 103         * Use default 15 bits, +16 is to generate gzip header/trailer
 104         * instead of the zlib wrapper.
 105         */
 106        const int windowBits = 15 + 16;
 107        int status = deflateInit2(strm, level,
 108                                  Z_DEFLATED, windowBits,
 109                                  8, Z_DEFAULT_STRATEGY);
 110        if (status == Z_OK)
 111                return;
 112        die("deflateInit2: %s (%s)", zerr_to_string(status),
 113            strm->msg ? strm->msg : "no message");
 114}
 115
 116void git_deflate_end(z_streamp strm)
 117{
 118        int status = deflateEnd(strm);
 119
 120        if (status == Z_OK)
 121                return;
 122        error("deflateEnd: %s (%s)", zerr_to_string(status),
 123              strm->msg ? strm->msg : "no message");
 124}
 125
 126int git_deflate_end_gently(z_streamp strm)
 127{
 128        return deflateEnd(strm);
 129}
 130
 131int git_deflate(z_streamp strm, int flush)
 132{
 133        int status = deflate(strm, flush);
 134
 135        switch (status) {
 136        /* Z_BUF_ERROR: normal, needs more space in the output buffer */
 137        case Z_BUF_ERROR:
 138        case Z_OK:
 139        case Z_STREAM_END:
 140                return status;
 141
 142        case Z_MEM_ERROR:
 143                die("deflate: out of memory");
 144        default:
 145                break;
 146        }
 147        error("deflate: %s (%s)", zerr_to_string(status),
 148              strm->msg ? strm->msg : "no message");
 149        return status;
 150}