diff options
| -rw-r--r-- | ext/zip/lib/zip_file_get_external_attributes.c | 53 | ||||
| -rw-r--r-- | ext/zip/lib/zip_file_set_external_attributes.c | 83 | ||||
| -rw-r--r-- | ext/zip/tests/oo_externalattributes.phpt | 75 | 
3 files changed, 211 insertions, 0 deletions
diff --git a/ext/zip/lib/zip_file_get_external_attributes.c b/ext/zip/lib/zip_file_get_external_attributes.c new file mode 100644 index 0000000000..f1ad66a63a --- /dev/null +++ b/ext/zip/lib/zip_file_get_external_attributes.c @@ -0,0 +1,53 @@ +/* +  zip_file_get_external_attributes.c -- get opsys/external attributes +  Copyright (C) 2013 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> + +  Redistribution and use in source and binary forms, with or without +  modification, are permitted provided that the following conditions +  are met: +  1. Redistributions of source code must retain the above copyright +     notice, this list of conditions and the following disclaimer. +  2. Redistributions in binary form must reproduce the above copyright +     notice, this list of conditions and the following disclaimer in +     the documentation and/or other materials provided with the +     distribution. +  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 +  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +int +zip_file_get_external_attributes(struct zip *za, zip_uint64_t idx, zip_flags_t flags, zip_uint8_t *opsys, zip_uint32_t *attributes) +{ +    struct zip_dirent *de; +    zip_uint32_t len; +    const zip_uint8_t *str; + +    if ((de=_zip_get_dirent(za, idx, flags, NULL)) == NULL) +	return -1; + +    if (opsys) +	*opsys = (de->version_madeby >> 8) & 0xff; + +    if (attributes) +	*attributes = de->ext_attrib; + +    return 0; +} diff --git a/ext/zip/lib/zip_file_set_external_attributes.c b/ext/zip/lib/zip_file_set_external_attributes.c new file mode 100644 index 0000000000..0820d6f5c8 --- /dev/null +++ b/ext/zip/lib/zip_file_set_external_attributes.c @@ -0,0 +1,83 @@ +/* +  zip_file_set_external_attributes.c -- set external attributes for entry +  Copyright (C) 2013 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> + +  Redistribution and use in source and binary forms, with or without +  modification, are permitted provided that the following conditions +  are met: +  1. Redistributions of source code must retain the above copyright +     notice, this list of conditions and the following disclaimer. +  2. Redistributions in binary form must reproduce the above copyright +     notice, this list of conditions and the following disclaimer in +     the documentation and/or other materials provided with the +     distribution. +  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 +  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "zipint.h" + +int +zip_file_set_external_attributes(struct zip *za, zip_uint64_t idx, zip_flags_t flags, zip_uint8_t opsys, zip_uint32_t attributes) +{ +    struct zip_entry *e; +    int changed; +    zip_uint8_t unchanged_opsys; +    zip_uint32_t unchanged_attributes; + +    if (_zip_get_dirent(za, idx, 0, NULL) == NULL) +	return -1; + +    if (ZIP_IS_RDONLY(za)) { +	_zip_error_set(&za->error, ZIP_ER_RDONLY, 0); +	return -1; +    } + +    e = za->entry+idx; + +    unchanged_opsys = e->orig ? e->orig->version_madeby>>8 : ZIP_OPSYS_DEFAULT; +    unchanged_attributes = e->orig ? e->orig->ext_attrib : ZIP_EXT_ATTRIB_DEFAULT; + +    changed = (opsys != unchanged_opsys || attributes != unchanged_attributes); + +    if (changed) { +        if (e->changes == NULL) { +            if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { +                _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); +                return -1; +            } +        } +        e->changes->version_madeby = (opsys << 8) | (e->changes->version_madeby & 0xff); +	e->changes->ext_attrib = attributes; +        e->changes->changed |= ZIP_DIRENT_ATTRIBUTES; +    } +    else if (e->changes) { +	e->changes->changed &= ~ZIP_DIRENT_ATTRIBUTES; +	if (e->changes->changed == 0) { +	    _zip_dirent_free(e->changes); +	    e->changes = NULL; +	} +	else { +	    e->changes->version_madeby = (unchanged_opsys << 8) | (e->changes->version_madeby & 0xff); +	    e->changes->ext_attrib = unchanged_attributes; +	} +    } + +    return 0; +} diff --git a/ext/zip/tests/oo_externalattributes.phpt b/ext/zip/tests/oo_externalattributes.phpt new file mode 100644 index 0000000000..1ee209e069 --- /dev/null +++ b/ext/zip/tests/oo_externalattributes.phpt @@ -0,0 +1,75 @@ +--TEST-- +ZipArchive::*ExternalAttributes*() function +--SKIPIF-- +<?php +/* $Id$ */ +if (!extension_loaded('zip')) die('skip'); +?> +--FILE-- +<?php + +$name = __DIR__ . '/withattr.zip'; + +echo "== Set\n"; +$zip = new ZipArchive; +$r = $zip->open($name, ZIPARCHIVE::CREATE); +$zip->addFromString('foo.txt', 'foo'); +$zip->addFromString('bar.txt', 'bar'); +var_dump($zip->setExternalAttributesName('foo.txt', ZipArchive::OPSYS_UNIX, 123)); +$id = $zip->locateName('bar.txt'); +var_dump($zip->setExternalAttributesIndex($id, ZipArchive::OPSYS_VFAT, 234)); +$zip->close(); + +echo "== Get\n"; +$r = $zip->open($name); +var_dump($zip->getExternalAttributesName('foo.txt', $a, $b), $a, $b); +$id = $zip->locateName('bar.txt'); +var_dump($zip->getExternalAttributesIndex($id, $a, $b), $a, $b); + +echo "== Set\n"; +var_dump($zip->setExternalAttributesName('foo.txt', ZipArchive::OPSYS_DOS, 345)); +var_dump($zip->setExternalAttributesIndex($id, ZipArchive::OPSYS_AMIGA, 456)); +echo "== Get changed\n"; +var_dump($zip->getExternalAttributesName('foo.txt', $a, $b), $a, $b); +var_dump($zip->getExternalAttributesIndex($id, $a, $b), $a, $b); +echo "== Get unchanged\n"; +var_dump($zip->getExternalAttributesName('foo.txt', $a, $b, ZipArchive::FL_UNCHANGED), $a, $b); +var_dump($zip->getExternalAttributesIndex($id, $a, $b, ZipArchive::FL_UNCHANGED), $a, $b); + +$zip->close(); +?> +== Done +--CLEAN-- +<?php +$name = __DIR__ . '/withattr.zip'; +@unlink($name); +?> +--EXPECTF-- +== Set +bool(true) +bool(true) +== Get +bool(true) +int(3) +int(123) +bool(true) +int(14) +int(234) +== Set +bool(true) +bool(true) +== Get changed +bool(true) +int(0) +int(345) +bool(true) +int(1) +int(456) +== Get unchanged +bool(true) +int(3) +int(123) +bool(true) +int(14) +int(234) +== Done  | 
