diff options
author | Max Kellermann <max@duempel.org> | 2009-12-15 21:09:13 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-12-15 21:09:13 +0100 |
commit | 03427d4effdbea05ad28cd985a1f5d9da2127344 (patch) | |
tree | ea4c69783478049db81cbb28d7f68d17204a7e51 /src | |
parent | a627a703caf0b5d04c76b26aa9c55bfebb5659e0 (diff) | |
download | mpd-03427d4effdbea05ad28cd985a1f5d9da2127344.tar.gz mpd-03427d4effdbea05ad28cd985a1f5d9da2127344.tar.xz mpd-03427d4effdbea05ad28cd985a1f5d9da2127344.zip |
archive/bz2: simplified error handling, short read
Don't attempt to fill the whole buffer in the read() method, return
whatever libbz2 provides with the first successful BZ2_bzDecompress().
Diffstat (limited to '')
-rw-r--r-- | src/archive/bz2_plugin.c | 57 |
1 files changed, 23 insertions, 34 deletions
diff --git a/src/archive/bz2_plugin.c b/src/archive/bz2_plugin.c index c51266160..44a1ddd2f 100644 --- a/src/archive/bz2_plugin.c +++ b/src/archive/bz2_plugin.c @@ -42,8 +42,9 @@ typedef struct { char *name; bool reset; struct input_stream istream; - int last_bz_result; - int last_parent_result; + + bool eof; + bz_stream bzstream; char *buffer; } bz2_context; @@ -69,8 +70,6 @@ bz2_alloc(bz2_context *data) return false; } - data->last_bz_result = BZ_OK; - data->last_parent_result = 0; return true; } @@ -169,6 +168,8 @@ bz2_open_stream(struct archive_file *file, struct input_stream *is, return false; } + context->eof = false; + return true; } @@ -183,7 +184,7 @@ bz2_is_close(struct input_stream *is) } static bool -bz2_fillbuffer(bz2_context *context, size_t length) +bz2_fillbuffer(bz2_context *context) { size_t count; bz_stream *bzstream; @@ -195,18 +196,11 @@ bz2_fillbuffer(bz2_context *context, size_t length) count = input_stream_read(&context->istream, context->buffer, BZ_BUFSIZE); + if (count == 0) + return false; - if (count == 0) { - if (bzstream->avail_out == length) - return false; - - if (!input_stream_eof(&context->istream)) - context->last_parent_result = 1; - } else { - bzstream->next_in = context->buffer; - bzstream->avail_in = count; - } - + bzstream->next_in = context->buffer; + bzstream->avail_in = count; return true; } @@ -218,32 +212,31 @@ bz2_is_read(struct input_stream *is, void *ptr, size_t length) int bz_result; size_t nbytes = 0; - if (context->last_bz_result != BZ_OK) - return 0; - if (context->last_parent_result != 0) + if (context->eof) return 0; bzstream = &context->bzstream; bzstream->next_out = ptr; bzstream->avail_out = length; - while (bzstream->avail_out != 0) { - if (!bz2_fillbuffer(context, length)) - break; + do { + if (!bz2_fillbuffer(context)) { + is->error = -1; + return 0; + } bz_result = BZ2_bzDecompress(bzstream); - if (context->last_bz_result != BZ_OK - && bzstream->avail_out == length) { - context->last_bz_result = bz_result; + if (bz_result == BZ_STREAM_END) { + context->eof = true; break; } - if (bz_result == BZ_STREAM_END) { - context->last_bz_result = bz_result; - break; + if (bz_result != BZ_OK) { + is->error = bz_result; + return 0; } - } + } while (bzstream->avail_out == length); nbytes = length - bzstream->avail_out; is->offset += nbytes; @@ -256,11 +249,7 @@ bz2_is_eof(struct input_stream *is) { bz2_context *context = (bz2_context *) is->data; - if (context->last_bz_result == BZ_STREAM_END) { - return true; - } - - return false; + return context->eof; } /* exported structures */ |