From 34b2d80ed29b6d914429d95ed1229cec03307172 Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Sun, 07 May 2023 04:48:47 -0400 Subject: gzip: Write compressed output to file directly --- diff --git a/src/gzip.c b/src/gzip.c index da4f6a8..531294b 100644 --- a/src/gzip.c +++ b/src/gzip.c @@ -17,6 +17,7 @@ * along with opkg-opkg. If not, see . */ +#include #include #include #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); diff --git a/src/gzip.h b/src/gzip.h index cf017ce..d42a969 100644 --- a/src/gzip.h +++ b/src/gzip.h @@ -20,10 +20,11 @@ #ifndef OPKG_OPK_GZIP_H_ #define OPKG_OPK_GZIP_H_ +#include + struct opkg_opk_gzip; typedef int (opkg_opk_gzip_read_func)(void *, char **, size_t *); -typedef int (opkg_opk_gzip_write_func)(void *, size_t); /* * Allocates and initializes a decompression structure. @@ -45,11 +46,7 @@ struct opkg_opk_gzip * 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); - -int -opkg_opk_gzip_set_write_buffer(struct opkg_opk_gzip *gzip, char *buffer, - size_t size); +opkg_opk_gzip_init_write(FILE *write_fp); /* * Reads and decompresses data to output the next record (512 octets). diff --git a/src/opk/write.c b/src/opk/write.c index 5ddd502..2a38f79 100644 --- a/src/opk/write.c +++ b/src/opk/write.c @@ -31,18 +31,6 @@ #include "opk.h" static int -_opkg_opk_opk_write_file(void *user_data, size_t size) -{ - struct opkg_opk_opk *opk = user_data; - - if (fwrite(opk->file_buffer, 1, size, opk->file) == size) { - return OPKG_OPK_OK; - } else { - return OPKG_OPK_ERROR; - } -} - -static int _opkg_opk_opk_source_date_epoch(uint64_t *mtime) { char *env; @@ -87,15 +75,12 @@ opkg_opk_opk_write(struct opkg_opk_opk *opk, const char *file_name) } /* Initialize outer gzip decompressor. */ - opk->outer_gzip = opkg_opk_gzip_init_write(&_opkg_opk_opk_write_file, - opk); + opk->outer_gzip = opkg_opk_gzip_init_write(opk->file); if (opk->outer_gzip == NULL) { fputs(_("Error: Failed to initialize\n"), stderr); ret = OPKG_OPK_ERROR; goto out1; } - opkg_opk_gzip_set_write_buffer(opk->outer_gzip, opk->file_buffer, - sizeof(opk->file_buffer)); /* Initialize outer ustar unarchiver. */ opk->outer_ustar = opkg_opk_ustar_init(opk->outer_gzip); -- cgit v0.9.1