commit - baa9fea074326a73792e66efbca9746a1bccc596
commit + 3ab5e33ce18309779415bf4e5e2464cbf01b06ac
blob - 90304d53d37a65e9e7ed2a7006e82d694b650c1a
blob + d8d1ad0afb7092c9dbd63eb106bf5bdf1aed6b19
--- lib/got_lib_inflate.h
+++ lib/got_lib_inflate.h
const struct got_error *got_inflate_read(struct got_inflate_buf *, FILE *,
size_t *, size_t *);
const struct got_error *got_inflate_read_fd(struct got_inflate_buf *, int,
- size_t *);
+ size_t *, size_t *);
const struct got_error *got_inflate_read_mmap(struct got_inflate_buf *,
uint8_t *, size_t, size_t, size_t *, size_t *);
void got_inflate_end(struct got_inflate_buf *);
const struct got_error *got_inflate_to_mem(uint8_t **, size_t *, size_t *,
FILE *);
-const struct got_error *got_inflate_to_mem_fd(uint8_t **, size_t *, int);
+const struct got_error *got_inflate_to_mem_fd(uint8_t **, size_t *, size_t *,
+ int);
const struct got_error *got_inflate_to_mem_mmap(uint8_t **, size_t *, uint8_t *,
size_t, size_t);
const struct got_error *got_inflate_to_file(size_t *, FILE *, FILE *);
blob - 02b01b5e5827923af47d173a9b3c62a8eab8922f
blob + 75a81b01b8a5d3d012375c8636e429982efe65c1
--- lib/inflate.c
+++ lib/inflate.c
}
const struct got_error *
-got_inflate_read_fd(struct got_inflate_buf *zb, int fd, size_t *outlenp)
+got_inflate_read_fd(struct got_inflate_buf *zb, int fd, size_t *outlenp,
+ size_t *consumed)
{
size_t last_total_out = zb->z.total_out;
+ size_t last_total_in = zb->z.total_in;
z_stream *z = &zb->z;
int ret = Z_ERRNO;
z->avail_out = zb->outlen;
*outlenp = 0;
+ if (consumed)
+ *consumed = 0;
do {
if (z->avail_in == 0) {
ssize_t n = read(fd, zb->inbuf, zb->inlen);
}
*outlenp = z->total_out - last_total_out;
+ if (consumed)
+ *consumed += z->total_in - last_total_in;
return NULL;
}
}
const struct got_error *
-got_inflate_to_mem_fd(uint8_t **outbuf, size_t *outlen, int infd)
+got_inflate_to_mem_fd(uint8_t **outbuf, size_t *outlen,
+ size_t *consumed_total, int infd)
{
const struct got_error *err;
- size_t avail;
+ size_t avail, consumed;
struct got_inflate_buf zb;
void *newbuf;
int nbuf = 1;
goto done;
*outlen = 0;
+ if (consumed_total)
+ *consumed_total = 0;
do {
- err = got_inflate_read_fd(&zb, infd, &avail);
+ err = got_inflate_read_fd(&zb, infd, &avail, &consumed);
if (err)
goto done;
*outlen += avail;
+ if (consumed_total)
+ *consumed_total += consumed;
if (zb.flags & GOT_INFLATE_F_HAVE_MORE) {
newbuf = reallocarray(*outbuf, ++nbuf,
GOT_INFLATE_BUFSIZE);
*outlen = 0;
do {
- err = got_inflate_read_fd(&zb, infd, &avail);
+ err = got_inflate_read_fd(&zb, infd, &avail, NULL);
if (err)
goto done;
if (avail > 0) {
blob - d3584125c591dde528f7c8eb8d1eb44dd9728c86
blob + a4a82ed4280ba51077e164cd2fed73eeb6bba742
--- lib/object_parse.c
+++ lib/object_parse.c
totlen = 0;
do {
- err = got_inflate_read_fd(&zb, fd, &outlen);
+ err = got_inflate_read_fd(&zb, fd, &outlen, NULL);
if (err)
goto done;
if (outlen == 0)
blob - bc26681be69317165c703408cb33e6bea57719da
blob + c2147b8044f1aa9ecd319e1f06a3e7eb56d26b46
--- lib/pack.c
+++ lib/pack.c
} else {
if (lseek(pack->fd, delta_data_offset, SEEK_SET) == -1)
return got_error_from_errno("lseek");
- err = got_inflate_to_mem_fd(delta_buf, delta_len, pack->fd);
+ err = got_inflate_to_mem_fd(delta_buf, delta_len, NULL,
+ pack->fd);
}
return err;
}
delta_data_offset = lseek(pack->fd, 0, SEEK_CUR);
if (delta_data_offset == -1)
return got_error_from_errno("lseek");
+ err = got_inflate_to_mem_fd(&delta_buf, &delta_len, NULL,
+ pack->fd);
+ if (err)
+ return err;
}
err = add_delta(deltas, delta_offset, tslen, delta_type, delta_size,
pack->filesize - mapoff);
} else
err = got_inflate_to_mem_fd(&base_buf,
- &base_bufsz, pack->fd);
+ &base_bufsz, NULL, pack->fd);
}
if (err)
goto done;
goto done;
}
err = got_inflate_to_mem_fd(&base_buf,
- &base_bufsz, pack->fd);
+ &base_bufsz, NULL, pack->fd);
}
if (err)
goto done;
} else {
if (lseek(pack->fd, obj->pack_offset, SEEK_SET) == -1)
return got_error_from_errno("lseek");
- err = got_inflate_to_mem_fd(buf, len, pack->fd);
+ err = got_inflate_to_mem_fd(buf, len, NULL, pack->fd);
}
} else
err = dump_delta_chain_to_mem(buf, len, &obj->deltas, pack);