Commit 4c7a16b7 by Edward Thomson

odb_loose: read_header should use zstream

Make `read_header` use the common zstream implementation.
Remove the now unnecessary zlib wrapper in odb_loose.
parent 6155e06b
...@@ -131,7 +131,10 @@ static int parse_header_packlike( ...@@ -131,7 +131,10 @@ static int parse_header_packlike(
} }
out->size = size; out->size = size;
*out_len = used;
if (out_len)
*out_len = used;
return 0; return 0;
on_error: on_error:
...@@ -192,67 +195,6 @@ on_error: ...@@ -192,67 +195,6 @@ on_error:
return -1; return -1;
} }
/***********************************************************
*
* ZLIB RELATED FUNCTIONS
*
***********************************************************/
static void init_stream(z_stream *s, void *out, size_t len)
{
memset(s, 0, sizeof(*s));
s->next_out = out;
s->avail_out = (uInt)len;
}
static void set_stream_input(z_stream *s, void *in, size_t len)
{
s->next_in = in;
s->avail_in = (uInt)len;
}
static void set_stream_output(z_stream *s, void *out, size_t len)
{
s->next_out = out;
s->avail_out = (uInt)len;
}
static int start_inflate(z_stream *s, git_buf *obj, void *out, size_t len)
{
int status;
init_stream(s, out, len);
set_stream_input(s, obj->ptr, git_buf_len(obj));
if ((status = inflateInit(s)) < Z_OK)
return status;
return inflate(s, 0);
}
static void abort_inflate(z_stream *s)
{
inflateEnd(s);
}
static int finish_inflate(z_stream *s)
{
int status = Z_OK;
while (status == Z_OK)
status = inflate(s, Z_FINISH);
inflateEnd(s);
if ((status != Z_STREAM_END) || (s->avail_in != 0)) {
giterr_set(GITERR_ZLIB, "failed to finish zlib inflation; stream aborted prematurely");
return -1;
}
return 0;
}
static int is_zlib_compressed_data(unsigned char *data) static int is_zlib_compressed_data(unsigned char *data)
{ {
unsigned int w; unsigned int w;
...@@ -423,12 +365,11 @@ done: ...@@ -423,12 +365,11 @@ done:
static int read_header_loose(git_rawobj *out, git_buf *loc) static int read_header_loose(git_rawobj *out, git_buf *loc)
{ {
int error = 0, z_return = Z_ERRNO, read_bytes; git_zstream zs = GIT_ZSTREAM_INIT;
git_file fd; unsigned char obj[1024], inflated[HEADER_LEN];
z_stream zs; size_t inflated_len, header_len;
obj_hdr header_obj; obj_hdr hdr;
size_t header_len; int fd, obj_len, error;
unsigned char raw_buffer[16], inflated_buffer[HEADER_LEN];
assert(out && loc); assert(out && loc);
...@@ -440,30 +381,28 @@ static int read_header_loose(git_rawobj *out, git_buf *loc) ...@@ -440,30 +381,28 @@ static int read_header_loose(git_rawobj *out, git_buf *loc)
if ((fd = git_futils_open_ro(loc->ptr)) < 0) if ((fd = git_futils_open_ro(loc->ptr)) < 0)
return fd; return fd;
init_stream(&zs, inflated_buffer, sizeof(inflated_buffer)); if ((error = obj_len = p_read(fd, obj, sizeof(obj))) < 0)
goto done;
z_return = inflateInit(&zs); inflated_len = sizeof(inflated);
while (z_return == Z_OK) { if ((error = git_zstream_init(&zs, GIT_ZSTREAM_INFLATE)) < 0 ||
if ((read_bytes = p_read(fd, raw_buffer, sizeof(raw_buffer))) > 0) { (error = git_zstream_set_input(&zs, obj, obj_len)) < 0 ||
set_stream_input(&zs, raw_buffer, read_bytes); (error = git_zstream_get_output_chunk(inflated, &inflated_len, &zs)) < 0 ||
z_return = inflate(&zs, 0); (error = parse_header(&hdr, &header_len, inflated, inflated_len)) < 0)
} else goto done;
z_return = Z_STREAM_END;
}
if ((z_return != Z_STREAM_END && z_return != Z_BUF_ERROR) if (!git_object_typeisloose(hdr.type)) {
|| parse_header(&header_obj, &header_len, inflated_buffer, sizeof(inflated_buffer)) < 0
|| git_object_typeisloose(header_obj.type) == 0)
{
giterr_set(GITERR_ZLIB, "failed to read loose object header"); giterr_set(GITERR_ZLIB, "failed to read loose object header");
error = -1; error = -1;
} else { goto done;
out->len = header_obj.size;
out->type = header_obj.type;
} }
finish_inflate(&zs); out->len = hdr.size;
out->type = hdr.type;
done:
git_zstream_free(&zs);
p_close(fd); p_close(fd);
return error; return error;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment