summaryrefslogtreecommitdiff
path: root/ext/zip/lib/zip_fopen_index.c
diff options
context:
space:
mode:
authorAnatoliy Belsky <ab@php.net>2012-06-04 21:30:04 +0200
committerAnatoliy Belsky <ab@php.net>2012-06-07 21:01:31 +0200
commit335a11b14b35e261c484d44a0e1b5ea9cc758e19 (patch)
tree515f54cede9e42804b4da1e1ef60d1d9f55bb633 /ext/zip/lib/zip_fopen_index.c
parent7cae4ff02c593ed212a363d65c83c38a67a27f0d (diff)
downloadphp-git-335a11b14b35e261c484d44a0e1b5ea9cc758e19.tar.gz
initial libzip upgrade patch to 0.10.1
Diffstat (limited to 'ext/zip/lib/zip_fopen_index.c')
-rw-r--r--ext/zip/lib/zip_fopen_index.c173
1 files changed, 3 insertions, 170 deletions
diff --git a/ext/zip/lib/zip_fopen_index.c b/ext/zip/lib/zip_fopen_index.c
index 1e7e419897..5c777ee0ff 100644
--- a/ext/zip/lib/zip_fopen_index.c
+++ b/ext/zip/lib/zip_fopen_index.c
@@ -1,6 +1,6 @@
/*
zip_fopen_index.c -- open file in zip archive for reading by index
- Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
+ Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <libzip@nih.at>
@@ -39,178 +39,11 @@
#include "zipint.h"
-static struct zip_file *_zip_file_new(struct zip *za);
ZIP_EXTERN(struct zip_file *)
-zip_fopen_index(struct zip *za, int fileno, int flags)
+zip_fopen_index(struct zip *za, zip_uint64_t fileno, int flags)
{
- int len, ret;
- int zfflags;
- struct zip_file *zf;
-
- if ((fileno < 0) || (fileno >= za->nentry)) {
- _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
- return NULL;
- }
-
- if ((flags & ZIP_FL_UNCHANGED) == 0
- && ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) {
- _zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
- return NULL;
- }
-
- if (fileno >= za->cdir->nentry) {
- _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
- return NULL;
- }
-
- zfflags = 0;
- switch (za->cdir->entry[fileno].comp_method) {
- case ZIP_CM_STORE:
- zfflags |= ZIP_ZF_CRC;
- break;
-
- case ZIP_CM_DEFLATE:
- if ((flags & ZIP_FL_COMPRESSED) == 0)
- zfflags |= ZIP_ZF_CRC | ZIP_ZF_DECOMP;
- break;
- default:
- if ((flags & ZIP_FL_COMPRESSED) == 0) {
- _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
- return NULL;
- }
- break;
- }
-
- zf = _zip_file_new(za);
-
- zf->flags = zfflags;
- /* zf->name = za->cdir->entry[fileno].filename; */
- zf->method = za->cdir->entry[fileno].comp_method;
- zf->bytes_left = za->cdir->entry[fileno].uncomp_size;
- zf->cbytes_left = za->cdir->entry[fileno].comp_size;
- zf->crc_orig = za->cdir->entry[fileno].crc;
-
- if ((zf->fpos=_zip_file_get_offset(za, fileno)) == 0) {
- zip_fclose(zf);
- return NULL;
- }
-
- if ((zf->flags & ZIP_ZF_DECOMP) == 0)
- zf->bytes_left = zf->cbytes_left;
- else {
- if ((zf->buffer=(char *)malloc(BUFSIZE)) == NULL) {
- _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
- zip_fclose(zf);
- return NULL;
- }
-
- len = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf);
- if (len <= 0) {
- _zip_error_copy(&za->error, &zf->error);
- zip_fclose(zf);
- return NULL;
- }
-
- if ((zf->zstr = (z_stream *)malloc(sizeof(z_stream))) == NULL) {
- _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
- zip_fclose(zf);
- return NULL;
- }
- zf->zstr->zalloc = Z_NULL;
- zf->zstr->zfree = Z_NULL;
- zf->zstr->opaque = NULL;
- zf->zstr->next_in = (Bytef *)zf->buffer;
- zf->zstr->avail_in = len;
-
- /* negative value to tell zlib that there is no header */
- if ((ret=inflateInit2(zf->zstr, -MAX_WBITS)) != Z_OK) {
- _zip_error_set(&za->error, ZIP_ER_ZLIB, ret);
- zip_fclose(zf);
- return NULL;
- }
- }
-
- return zf;
-}
-
-
-
-int
-_zip_file_fillbuf(void *buf, size_t buflen, struct zip_file *zf)
-{
- int i, j;
-
- if (zf->error.zip_err != ZIP_ER_OK)
- return -1;
-
- if ((zf->flags & ZIP_ZF_EOF) || zf->cbytes_left <= 0 || buflen <= 0)
- return 0;
-
- if (fseeko(zf->za->zp, zf->fpos, SEEK_SET) < 0) {
- _zip_error_set(&zf->error, ZIP_ER_SEEK, errno);
- return -1;
- }
- if (buflen < zf->cbytes_left)
- i = buflen;
- else
- i = zf->cbytes_left;
-
- j = fread(buf, 1, i, zf->za->zp);
- if (j == 0) {
- _zip_error_set(&zf->error, ZIP_ER_EOF, 0);
- j = -1;
- }
- else if (j < 0)
- _zip_error_set(&zf->error, ZIP_ER_READ, errno);
- else {
- zf->fpos += j;
- zf->cbytes_left -= j;
- }
-
- return j;
-}
-
-
-
-static struct zip_file *
-_zip_file_new(struct zip *za)
-{
- struct zip_file *zf, **file;
- int n;
-
- if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) {
- _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
- return NULL;
- }
-
- if (za->nfile >= za->nfile_alloc-1) {
- n = za->nfile_alloc + 10;
- file = (struct zip_file **)realloc(za->file,
- n*sizeof(struct zip_file *));
- if (file == NULL) {
- _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
- free(zf);
- return NULL;
- }
- za->nfile_alloc = n;
- za->file = file;
- }
-
- za->file[za->nfile++] = zf;
-
- zf->za = za;
- _zip_error_init(&zf->error);
- zf->flags = 0;
- zf->crc = crc32(0L, Z_NULL, 0);
- zf->crc_orig = 0;
- zf->method = -1;
- zf->bytes_left = zf->cbytes_left = 0;
- zf->fpos = 0;
- zf->buffer = NULL;
- zf->zstr = NULL;
-
- return zf;
+ return zip_fopen_index_encrypted(za, fileno, flags, za->default_password);
}