git/zlib.c
Junio C Hamano 55bb5c9147 zlib: wrap deflate side of the API
Wrap deflateInit, deflate, and deflateEnd for everybody, and the sole use
of deflateInit2 in remote-curl.c to tell the library to use gzip header
and trailer in git_deflate_init_gzip().

There is only one caller that cares about the status from deflateEnd().
Introduce git_deflate_end_gently() to let that sole caller retrieve the
status and act on it (i.e. die) for now, but we would probably want to
make inflate_end/deflate_end die when they ran out of memory and get
rid of the _gently() kind.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-06-10 11:10:29 -07:00

142 lines
3 KiB
C

/*
* zlib wrappers to make sure we don't silently miss errors
* at init time.
*/
#include "cache.h"
static const char *zerr_to_string(int status)
{
switch (status) {
case Z_MEM_ERROR:
return "out of memory";
case Z_VERSION_ERROR:
return "wrong version";
case Z_NEED_DICT:
return "needs dictionary";
case Z_DATA_ERROR:
return "data stream error";
case Z_STREAM_ERROR:
return "stream consistency error";
default:
return "unknown error";
}
}
void git_inflate_init(z_streamp strm)
{
int status = inflateInit(strm);
if (status == Z_OK)
return;
die("inflateInit: %s (%s)", zerr_to_string(status),
strm->msg ? strm->msg : "no message");
}
void git_inflate_init_gzip_only(z_streamp strm)
{
/*
* Use default 15 bits, +16 is to accept only gzip and to
* yield Z_DATA_ERROR when fed zlib format.
*/
const int windowBits = 15 + 16;
int status = inflateInit2(strm, windowBits);
if (status == Z_OK)
return;
die("inflateInit2: %s (%s)", zerr_to_string(status),
strm->msg ? strm->msg : "no message");
}
void git_inflate_end(z_streamp strm)
{
int status = inflateEnd(strm);
if (status == Z_OK)
return;
error("inflateEnd: %s (%s)", zerr_to_string(status),
strm->msg ? strm->msg : "no message");
}
int git_inflate(z_streamp strm, int flush)
{
int status = inflate(strm, flush);
switch (status) {
/* Z_BUF_ERROR: normal, needs more space in the output buffer */
case Z_BUF_ERROR:
case Z_OK:
case Z_STREAM_END:
return status;
case Z_MEM_ERROR:
die("inflate: out of memory");
default:
break;
}
error("inflate: %s (%s)", zerr_to_string(status),
strm->msg ? strm->msg : "no message");
return status;
}
void git_deflate_init(z_streamp strm, int level)
{
int status = deflateInit(strm, level);
if (status == Z_OK)
return;
die("deflateInit: %s (%s)", zerr_to_string(status),
strm->msg ? strm->msg : "no message");
}
void git_deflate_init_gzip(z_streamp strm, int level)
{
/*
* Use default 15 bits, +16 is to generate gzip header/trailer
* instead of the zlib wrapper.
*/
const int windowBits = 15 + 16;
int status = deflateInit2(strm, level,
Z_DEFLATED, windowBits,
8, Z_DEFAULT_STRATEGY);
if (status == Z_OK)
return;
die("deflateInit2: %s (%s)", zerr_to_string(status),
strm->msg ? strm->msg : "no message");
}
void git_deflate_end(z_streamp strm)
{
int status = deflateEnd(strm);
if (status == Z_OK)
return;
error("deflateEnd: %s (%s)", zerr_to_string(status),
strm->msg ? strm->msg : "no message");
}
int git_deflate_end_gently(z_streamp strm)
{
return deflateEnd(strm);
}
int git_deflate(z_streamp strm, int flush)
{
int status = deflate(strm, flush);
switch (status) {
/* Z_BUF_ERROR: normal, needs more space in the output buffer */
case Z_BUF_ERROR:
case Z_OK:
case Z_STREAM_END:
return status;
case Z_MEM_ERROR:
die("deflate: out of memory");
default:
break;
}
error("deflate: %s (%s)", zerr_to_string(status),
strm->msg ? strm->msg : "no message");
return status;
}