summaryrefslogtreecommitdiff
path: root/ext/zip/lib/zip_source_zip.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/zip/lib/zip_source_zip.c')
-rw-r--r--ext/zip/lib/zip_source_zip.c151
1 files changed, 11 insertions, 140 deletions
diff --git a/ext/zip/lib/zip_source_zip.c b/ext/zip/lib/zip_source_zip.c
index 228803c717..e4fc2229f7 100644
--- a/ext/zip/lib/zip_source_zip.c
+++ b/ext/zip/lib/zip_source_zip.c
@@ -38,153 +38,24 @@
#include "zipint.h"
-struct read_zip {
- struct zip_file *zf;
- struct zip_stat st;
- zip_uint64_t off;
- zip_int64_t len;
-};
-
-static zip_int64_t read_zip(void *st, void *data, zip_uint64_t len,
- enum zip_source_cmd cmd);
-
-ZIP_EXTERN(struct zip_source *)
+ZIP_EXTERN struct zip_source *
zip_source_zip(struct zip *za, struct zip *srcza, zip_uint64_t srcidx,
- int flags, zip_uint64_t start, zip_int64_t len)
+ zip_flags_t flags, zip_uint64_t start, zip_int64_t len)
{
- struct zip_error error;
- struct zip_source *zs;
- struct read_zip *p;
-
- /* XXX: ZIP_FL_RECOMPRESS */
-
- if (za == NULL)
- return NULL;
-
- if (srcza == NULL || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) {
- _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
- return NULL;
+ if (len < -1) {
+ _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+ return NULL;
}
-
- if ((flags & ZIP_FL_UNCHANGED) == 0
- && ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx)) {
- _zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
- return NULL;
- }
-
- if (len == 0)
- len = -1;
-
- if (start == 0 && len == -1 && (flags & ZIP_FL_RECOMPRESS) == 0)
+
+ if (len == -1)
+ len = 0;
+
+ if (start == 0 && len == 0)
flags |= ZIP_FL_COMPRESSED;
else
flags &= ~ZIP_FL_COMPRESSED;
- if ((p=(struct read_zip *)malloc(sizeof(*p))) == NULL) {
- _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
- return NULL;
- }
-
- _zip_error_copy(&error, &srcza->error);
-
- if (zip_stat_index(srcza, srcidx, flags, &p->st) < 0
- || (p->zf=zip_fopen_index(srcza, srcidx, flags)) == NULL) {
- free(p);
- _zip_error_copy(&za->error, &srcza->error);
- _zip_error_copy(&srcza->error, &error);
-
- return NULL;
- }
- p->off = start;
- p->len = len;
-
- if ((flags & ZIP_FL_COMPRESSED) == 0) {
- p->st.size = p->st.comp_size = len;
- p->st.comp_method = ZIP_CM_STORE;
- p->st.crc = 0;
- }
-
- if ((zs=zip_source_function(za, read_zip, p)) == NULL) {
- free(p);
- return NULL;
- }
-
- return zs;
-}
-
-
-
-static zip_int64_t
-read_zip(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd)
-{
- struct read_zip *z;
- char b[8192], *buf;
- int i;
- zip_uint64_t n;
-
- z = (struct read_zip *)state;
- buf = (char *)data;
-
- switch (cmd) {
- case ZIP_SOURCE_OPEN:
- for (n=0; n<z->off; n+= i) {
- i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n);
- if ((i=zip_fread(z->zf, b, i)) < 0) {
- zip_fclose(z->zf);
- z->zf = NULL;
- return -1;
- }
- }
- return 0;
-
- case ZIP_SOURCE_READ:
- if (z->len != -1)
- n = len > z->len ? z->len : len;
- else
- n = len;
-
-
- if ((i=zip_fread(z->zf, buf, n)) < 0)
- return -1;
-
- if (z->len != -1)
- z->len -= i;
-
- return i;
-
- case ZIP_SOURCE_CLOSE:
- return 0;
-
- case ZIP_SOURCE_STAT:
- if (len < sizeof(z->st))
- return -1;
- len = sizeof(z->st);
-
- memcpy(data, &z->st, len);
- return len;
-
- case ZIP_SOURCE_ERROR:
- {
- int *e;
-
- if (len < sizeof(int)*2)
- return -1;
-
- e = (int *)data;
- zip_file_error_get(z->zf, e, e+1);
- }
- return sizeof(int)*2;
-
- case ZIP_SOURCE_FREE:
- zip_fclose(z->zf);
- free(z);
- return 0;
-
- default:
- ;
- }
-
- return -1;
+ return _zip_source_zip_new(za, srcza, srcidx, flags, start, (zip_uint64_t)len, NULL);
}