aboutsummaryrefslogtreecommitdiff
path: root/libstore/do-gunzip.c
diff options
context:
space:
mode:
authorIgnazio Sgalmuzzo <ignaker@gmail.com>2014-02-17 22:21:31 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2014-02-18 21:33:42 -0800
commit2a685b05f91f71c3b00ee8890ebaed16839b0cd0 (patch)
treea9e96668322523efc5ca6bbeadee63fc609ed594 /libstore/do-gunzip.c
parent8132295cfd2d26a13a6cd2f61b7f5c56ea5efaa7 (diff)
downloadhurd-2a685b05f91f71c3b00ee8890ebaed16839b0cd0.tar.gz
hurd-2a685b05f91f71c3b00ee8890ebaed16839b0cd0.tar.bz2
hurd-2a685b05f91f71c3b00ee8890ebaed16839b0cd0.zip
libstore: replaced gz decompression code with libz
Note: dropped .zip support configure.ac: added check for libz ext2fs/Makefile: linked libz fatfs/Makefile: linked libz isofs/Makefile: linked libz libstore/Makefile: linked libz libstore/do-gunzip.c: new decompression function using libz calls. libstore/gunzip.c: removed no longer needed code replaced by do_gunzip() libstore/gzip.h: deleted, no longer needed libstore/inflate.c: deleted: no longer needed libstore/tailor.h: deleted: no longer needed libstore/unzip.c: deleted: no longer needed libstore/util.c: removed no longer needed code.
Diffstat (limited to 'libstore/do-gunzip.c')
-rw-r--r--libstore/do-gunzip.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/libstore/do-gunzip.c b/libstore/do-gunzip.c
new file mode 100644
index 00000000..6a1c2a95
--- /dev/null
+++ b/libstore/do-gunzip.c
@@ -0,0 +1,59 @@
+#include <zlib.h>
+
+/* I/O interface */
+extern int (*unzip_read) (char *buf, size_t maxread);
+extern void (*unzip_write) (const char *buf, size_t nwrite);
+extern void (*unzip_read_error) (void);
+extern void (*unzip_error) (const char *msg);
+
+#define INBUFSIZ 0x1000
+#define OUTBUFSIZ 0x1000
+
+static unsigned char inbuf[INBUFSIZ];
+static unsigned char outbuf[OUTBUFSIZ];
+
+void
+do_gunzip (void)
+{
+ int result;
+ z_stream strm;
+
+ strm.zalloc = NULL;
+ strm.zfree = NULL;
+ strm.opaque = NULL;
+
+ strm.avail_in = 0;
+ strm.next_out = outbuf;
+ strm.avail_out = OUTBUFSIZ;
+
+ result = inflateInit2 (&strm, 32 + MAX_WBITS);
+
+ while (result == Z_OK)
+ {
+ if (strm.avail_in == 0)
+ {
+ strm.next_in = inbuf;
+ strm.avail_in = (*unzip_read)((char*) strm.next_in, INBUFSIZ);
+
+ if (strm.avail_in == 0)
+ break;
+ }
+
+ result = inflate (&strm, Z_NO_FLUSH);
+
+ if ((result != Z_OK) && (result != Z_STREAM_END))
+ break;
+
+ if ((strm.avail_out == 0) || (result == Z_STREAM_END))
+ {
+ (*unzip_write) ((char*) outbuf, OUTBUFSIZ - strm.avail_out);
+ strm.next_out = outbuf;
+ strm.avail_out = OUTBUFSIZ;
+ }
+ }
+
+ inflateEnd (&strm);
+
+ if (result != Z_STREAM_END)
+ (*unzip_error) (NULL);
+}