diff options
Diffstat (limited to 'src/gzip.c')
-rw-r--r-- | src/gzip.c | 50 |
1 files changed, 18 insertions, 32 deletions
@@ -17,6 +17,7 @@ * along with opkg-opkg. If not, see <http://www.gnu.org/licenses/>. */ +#include <stdio.h> #include <stdlib.h> #include <zlib.h> #include "defs.h" @@ -31,14 +32,13 @@ enum _opkg_opk_gzip_dir { }; struct opkg_opk_gzip { - enum _opkg_opk_gzip_dir dir; - char *buffer; - size_t buffer_size; - opkg_opk_gzip_read_func *read_func; - opkg_opk_gzip_write_func *write_func; - void *user_data; - z_stream stream; - gz_header gz_header; + enum _opkg_opk_gzip_dir dir; + opkg_opk_gzip_read_func *read_func; + void *user_data; + FILE *write_fp; + char write_buffer[512]; + z_stream stream; + gz_header gz_header; }; struct opkg_opk_gzip * @@ -70,7 +70,7 @@ opkg_opk_gzip_init_read(opkg_opk_gzip_read_func *read_func, void *user_data) } struct opkg_opk_gzip * -opkg_opk_gzip_init_write(opkg_opk_gzip_write_func *write_func, void *user_data) +opkg_opk_gzip_init_write(FILE *write_fp) { struct opkg_opk_gzip *gzip; @@ -79,9 +79,8 @@ opkg_opk_gzip_init_write(opkg_opk_gzip_write_func *write_func, void *user_data) return NULL; } - gzip->dir = _OPKG_OPK_GZIP_DIR_WRITE; - gzip->write_func = write_func; - gzip->user_data = user_data; + gzip->dir = _OPKG_OPK_GZIP_DIR_WRITE; + gzip->write_fp = write_fp; gzip->stream.zalloc = Z_NULL; gzip->stream.zfree = Z_NULL; @@ -112,15 +111,6 @@ opkg_opk_gzip_init_write(opkg_opk_gzip_write_func *write_func, void *user_data) } int -opkg_opk_gzip_set_write_buffer(struct opkg_opk_gzip *gzip, char *buffer, - size_t size) -{ - gzip->buffer = buffer; - gzip->buffer_size = size; - return OPKG_OPK_OK; -} - -int opkg_opk_gzip_read(struct opkg_opk_gzip *gzip, void *record) { int end; @@ -179,6 +169,8 @@ static int _opkg_opk_gzip_write(struct opkg_opk_gzip *gzip, void *record, size_t size, int last) { + size_t len; + /* Sanity check */ if (gzip->dir != _OPKG_OPK_GZIP_DIR_WRITE) { return OPKG_OPK_ERROR; @@ -188,8 +180,8 @@ _opkg_opk_gzip_write(struct opkg_opk_gzip *gzip, void *record, size_t size, gzip->stream.avail_in = size; do { - gzip->stream.next_out = gzip->buffer; - gzip->stream.avail_out = gzip->buffer_size; + gzip->stream.next_out = gzip->write_buffer; + gzip->stream.avail_out = sizeof(gzip->write_buffer); switch (deflate(&gzip->stream, (last > 0 ? Z_FINISH : Z_NO_FLUSH))) { case Z_OK: @@ -200,15 +192,9 @@ _opkg_opk_gzip_write(struct opkg_opk_gzip *gzip, void *record, size_t size, return OPKG_OPK_ERROR; } /* Process output buffer. */ - switch (gzip->write_func(gzip->user_data, - gzip->buffer_size - - gzip->stream.avail_out)) { - case OPKG_OPK_OK: - break; - case OPKG_OPK_END: - case OPKG_OPK_ERROR: - default: - return OPKG_OPK_ERROR; + len = sizeof(gzip->write_buffer) - gzip->stream.avail_out; + if (fwrite(gzip->write_buffer, 1, len, gzip->write_fp) != len) { + return OPKG_OPK_ERROR; } } while (gzip->stream.avail_out == 0); |