From 1f2670fb080e2a5a6a2a0c1f48a8a924af1ada8e Mon Sep 17 00:00:00 2001 From: Matthew Endsley Date: Sat, 12 May 2012 18:00:11 -0700 Subject: moving bz2 decompression to compressread --- bspatch.c | 88 ++++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 26 deletions(-) diff --git a/bspatch.c b/bspatch.c index 47f7073..b47f14b 100644 --- a/bspatch.c +++ b/bspatch.c @@ -55,31 +55,75 @@ static int64_t offtin(uint8_t *buf) return y; } +static const int BUFFER_SIZE = 4096; + +static int readcompress(bz_stream* bz2, FILE* pf, uint8_t* dest, int length) +{ + int n; + int ret; + + bz2->next_out = (char*)dest; + bz2->avail_out = length; + + for (;;) + { + if (bz2->avail_in == 0 && !feof(pf) && bz2->avail_out > 0) + { + n = fread(bz2->opaque, 1, BUFFER_SIZE, pf); + if (ferror(pf)) + return -1; + + bz2->next_in = bz2->opaque; + bz2->avail_in = n; + } + + ret = BZ2_bzDecompress(bz2); + if (ret != BZ_OK && ret != BZ_STREAM_END) + return -1; + + if (ret == BZ_OK && feof(pf) && bz2->avail_in == 0 && bz2->avail_out > 0) + return -1; + + if (ret == BZ_STREAM_END) + return length - bz2->avail_out; + if (bz2->avail_out == 0) + return length; + } + + // unreachable + return -1; +} + int bspatch(const uint8_t* old, const int oldsize, uint8_t* new, const int newsize, FILE* cpf, FILE* dpf, FILE* epf) { - BZFILE * cpfbz2, * dpfbz2, * epfbz2; + bz_stream cbz2 = {0}; + bz_stream dbz2 = {0}; + bz_stream ebz2 = {0}; + char cbuf[BUFFER_SIZE], dbuf[BUFFER_SIZE], ebuf[BUFFER_SIZE]; int cbz2err, dbz2err, ebz2err; - ssize_t bzctrllen,bzdatalen; uint8_t buf[8]; int64_t oldpos,newpos; int64_t ctrl[3]; int64_t lenread; int64_t i; - if ((cpfbz2 = BZ2_bzReadOpen(&cbz2err, cpf, 0, 0, NULL, 0)) == NULL) - errx(1, "BZ2_bzReadOpen, bz2err = %d", cbz2err); - if ((dpfbz2 = BZ2_bzReadOpen(&dbz2err, dpf, 0, 0, NULL, 0)) == NULL) - errx(1, "BZ2_bzReadOpen, bz2err = %d", dbz2err); - if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL) - errx(1, "BZ2_bzReadOpen, bz2err = %d", ebz2err); + cbz2.opaque = cbuf; + dbz2.opaque = dbuf; + ebz2.opaque = ebuf; + + if (BZ_OK != (cbz2err = BZ2_bzDecompressInit(&cbz2, 0, 0))) + errx(1, "BZ2_bzDecompressInit, bz2err = %d", cbz2err); + if (BZ_OK != (dbz2err = BZ2_bzDecompressInit(&dbz2, 0, 0))) + errx(1, "BZ2_bzDecompressInit, bz2err = %d", dbz2err); + if (BZ_OK != (ebz2err = BZ2_bzDecompressInit(&ebz2, 0, 0))) + errx(1, "BZ2_bzDecompressInit, bz2err = %d", ebz2err); oldpos=0;newpos=0; while(newpos