summaryrefslogtreecommitdiffstats
path: root/src/gzip.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gzip.c')
-rw-r--r--src/gzip.c50
1 files changed, 18 insertions, 32 deletions
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 <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);