diff options
author | Remi Collet <remi@fedoraproject.org> | 2015-05-06 14:36:18 +0200 |
---|---|---|
committer | Remi Collet <remi@php.net> | 2015-05-06 15:16:43 +0200 |
commit | 9e0cc7a1d926c1364a834177cadea431cd8b39a7 (patch) | |
tree | f63c505073d6aa0b74bde71eb6a67e6e4c23d8bd /ext/zip/lib/zip_fdopen.c | |
parent | 31f516b4888fcf096fe0912828948bed84f2ad1c (diff) | |
download | php-git-9e0cc7a1d926c1364a834177cadea431cd8b39a7.tar.gz |
update libzip to version 1.0.1
Diffstat (limited to 'ext/zip/lib/zip_fdopen.c')
-rw-r--r-- | ext/zip/lib/zip_fdopen.c | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/ext/zip/lib/zip_fdopen.c b/ext/zip/lib/zip_fdopen.c index edeaa56488..c5b55311d2 100644 --- a/ext/zip/lib/zip_fdopen.c +++ b/ext/zip/lib/zip_fdopen.c @@ -1,6 +1,6 @@ /* zip_fdopen.c -- open read-only archive from file descriptor - Copyright (C) 2009-2010 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2014 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> @@ -17,7 +17,7 @@ 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -32,44 +32,51 @@ */ - #include "zipint.h" - -ZIP_EXTERN struct zip * +ZIP_EXTERN zip_t * zip_fdopen(int fd_orig, int _flags, int *zep) { int fd; FILE *fp; - unsigned int flags; + zip_t *za; + zip_source_t *src; + struct zip_error error; - if (_flags < 0) { - if (zep) - *zep = ZIP_ER_INVAL; + if (_flags < 0 || (_flags & ZIP_TRUNCATE)) { + _zip_set_open_error(zep, NULL, ZIP_ER_INVAL); return NULL; } - flags = (unsigned int)_flags; - - if (flags & ZIP_TRUNCATE) { - *zep = ZIP_ER_INVAL; - return NULL; - } - + /* We dup() here to avoid messing with the passed in fd. We could not restore it to the original state in case of error. */ if ((fd=dup(fd_orig)) < 0) { - *zep = ZIP_ER_OPEN; + _zip_set_open_error(zep, NULL, ZIP_ER_OPEN); return NULL; } if ((fp=fdopen(fd, "rb")) == NULL) { close(fd); - *zep = ZIP_ER_OPEN; + _zip_set_open_error(zep, NULL, ZIP_ER_OPEN); + return NULL; + } + + zip_error_init(&error); + if ((src = zip_source_filep_create(fp, 0, -1, &error)) == NULL) { + _zip_set_open_error(zep, &error, 0); + zip_error_fini(&error); + return NULL; + } + + if ((za = zip_open_from_source(src, _flags, &error)) == NULL) { + _zip_set_open_error(zep, &error, 0); + zip_error_fini(&error); return NULL; } + zip_error_fini(&error); close(fd_orig); - return _zip_open(NULL, fp, flags, zep); + return za; } |