From dee6ffa492c2efee982dcd0b4724213317eceb37 Mon Sep 17 00:00:00 2001 From: Timo Teras Date: Wed, 12 Aug 2009 11:05:09 +0300 Subject: io: better error handling when writing stuff out also have the output stream support writing to temporary file and do renameat/unlinkat on close depending on if all writes succeeded or not. --- src/gunzip.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'src/gunzip.c') diff --git a/src/gunzip.c b/src/gunzip.c index e5144a0..dd8d248 100644 --- a/src/gunzip.c +++ b/src/gunzip.c @@ -190,24 +190,29 @@ static ssize_t gzo_write(void *stream, const void *ptr, size_t size) return size; } -static void gzo_close(void *stream) +static int gzo_close(void *stream) { struct apk_gzip_ostream *gos = (struct apk_gzip_ostream *) stream; unsigned char buffer[1024]; size_t have; - int r; + int r, rc = 0; do { gos->zs.avail_out = sizeof(buffer); gos->zs.next_out = buffer; r = deflate(&gos->zs, Z_FINISH); have = sizeof(buffer) - gos->zs.avail_out; - gos->output->write(gos->output, buffer, have); + if (gos->output->write(gos->output, buffer, have) != have) + rc = -EIO; } while (r == Z_OK); - gos->output->close(gos->output); + r = gos->output->close(gos->output); + if (r != 0) + rc = r; deflateEnd(&gos->zs); free(stream); + + return rc; } struct apk_ostream *apk_ostream_gzip(struct apk_ostream *output) -- cgit v1.2.3-60-g2f50