char *error;
char *filter_name;
char tmpbuf[8];
+ HashTable *pharcontext;
php_url *resource = NULL;
php_stream *fp, *fpf;
php_stream_filter *filter/*, *consumed */;
php_uint32 offset, read, total, toread;
- zval **pzoption;
+ zval **pzoption, *metadata;
resource = php_url_parse(path);
php_url_free(resource);
return NULL;
}
- efree(error);
+ if (error) {
+ efree(error);
+ }
fpf = php_stream_alloc(&phar_ops, idata, NULL, mode);
php_url_free(resource);
efree(internal_file);
- if (idata->internal_file->uncompressed_filesize == 0
- && idata->internal_file->compressed_filesize == 0
- && context && context->options
- && zend_hash_find(HASH_OF(context->options), "phar", sizeof("phar"), (void**)&pzoption) == SUCCESS
- && zend_hash_find(HASH_OF(*pzoption), "compress", sizeof("compress"), (void**)&pzoption) == SUCCESS
- && Z_TYPE_PP(pzoption) == IS_LONG
- && (Z_LVAL_PP(pzoption) & ~PHAR_ENT_COMPRESSION_MASK) == 0
- ) {
- idata->internal_file->flags &= ~PHAR_ENT_COMPRESSION_MASK;
- idata->internal_file->flags |= Z_LVAL_PP(pzoption);
+ if (context && context->options && zend_hash_find(HASH_OF(context->options), "phar", sizeof("phar"), (void**)&pzoption) == SUCCESS) {
+ pharcontext = HASH_OF(*pzoption);
+ if (idata->internal_file->uncompressed_filesize == 0
+ && idata->internal_file->compressed_filesize == 0
+ && zend_hash_find(pharcontext, "compress", sizeof("compress"), (void**)&pzoption) == SUCCESS
+ && Z_TYPE_PP(pzoption) == IS_LONG
+ && (Z_LVAL_PP(pzoption) & ~PHAR_ENT_COMPRESSION_MASK) == 0
+ ) {
+ idata->internal_file->flags &= ~PHAR_ENT_COMPRESSION_MASK;
+ idata->internal_file->flags |= Z_LVAL_PP(pzoption);
+ }
+ if (zend_hash_find(pharcontext, "metadata", sizeof("metadata"), (void**)&pzoption) == SUCCESS) {
+ if (idata->internal_file->metadata) {
+ zval_ptr_dtor(&idata->internal_file->metadata);
+ idata->internal_file->metadata = NULL;
+ }
+
+ MAKE_STD_ZVAL(idata->internal_file->metadata);
+ metadata = *pzoption;
+ ZVAL_ZVAL(idata->internal_file->metadata, metadata, 1, 0);
+ idata->phar->is_modified = 1;
+ }
}
return fpf;
} else {
phar_set_32(entry_buffer+16, entry->flags);
phar_set_32(entry_buffer+20, metadata_str.len);
if (sizeof(entry_buffer) != php_stream_write(newfile, entry_buffer, sizeof(entry_buffer))
- || metadata_str.len != php_stream_write(newfile, metadata_str.c, sizeof(metadata_str.len))) {
+ || metadata_str.len != php_stream_write(newfile, metadata_str.c, metadata_str.len)) {
smart_str_free(&metadata_str);
if (oldfile) {
php_stream_close(oldfile);
php_url_free(resource);
return FAILURE;
}
- efree(error);
+ if (error) {
+ efree(error);
+ }
if (!idata) {
php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: \"%s\" is not a file in phar \"%s\", cannot unlink", internal_file, resource->host);
efree(internal_file);
var_dump(file_get_contents($pname . '/c'));
var_dump($phar['c']->isCompressed());
-$context = stream_context_create(array('phar'=>array('compress'=>Phar::GZ)));
+$context = stream_context_create(array('phar'=> array('compress'=>Phar::GZ, 'metadata' => array(2, 'hi' => 3))));
+$context2 = stream_context_create(array('phar' => array('metadata' => array(4))));
file_put_contents($pname . '/a', 'new a', 0); // no compression
file_put_contents($pname . '/b', 'new b', 0, $context);
-file_put_contents($pname . '/d', 'new d');//, 0, $context);
+file_put_contents($pname . '/d', 'new d', 0, $context2);
$phar = new Phar($fname);
var_dump(file_get_contents($pname . '/a'));
var_dump($phar['a']->isCompressed());
+var_dump($phar['a']->getMetaData());
var_dump(file_get_contents($pname . '/b'));
var_dump($phar['b']->isCompressed());
+var_dump($phar['b']->getMetaData());
var_dump(file_get_contents($pname . '/c'));
var_dump($phar['c']->isCompressed());
+var_dump($phar['c']->getMetaData());
var_dump(file_get_contents($pname . '/d'));
var_dump($phar['d']->isCompressed());
-
+var_dump($phar['d']->getMetaData());
+$context2 = stream_context_create(array('phar' => array('metadata' => array(4))));
+$fp = fopen($pname . '/b', 'r+', 0, $context2);
+fclose($fp);
+?>
+==AFTER==
+<?php
+var_dump(file_get_contents($pname . '/b'));
+var_dump($phar['b']->isCompressed());
+var_dump($phar['b']->getMetaData());
?>
===DONE===
--CLEAN--
<?php
unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php');
?>
---EXPECTF--
+--EXPECT--
string(1) "a"
bool(false)
string(1) "b"
bool(false)
string(5) "new a"
bool(false)
+NULL
string(5) "new b"
bool(true)
+array(2) {
+ [0]=>
+ int(2)
+ ["hi"]=>
+ int(3)
+}
string(1) "c"
bool(false)
+NULL
string(5) "new d"
bool(false)
-===DONE===
+array(1) {
+ [0]=>
+ int(4)
+}
+==AFTER==
+string(5) "new b"
+bool(true)
+array(1) {
+ [0]=>
+ int(4)
+}
+===DONE===
\ No newline at end of file