From: Greg Beaver Date: Sun, 28 Jan 2007 05:40:18 +0000 (+0000) Subject: fix commitWrite test, enable creation of Phars with phar object X-Git-Tag: RELEASE_1_0_0RC1~100 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e8cabb46f66aaa5c369a2592f0a2b7f174d5437a;p=php fix commitWrite test, enable creation of Phars with phar object --- diff --git a/ext/phar/phar.c b/ext/phar/phar.c index c4398000d0..ef6843639d 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -901,7 +901,7 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int /** * Create or open a phar for writing */ -static int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar TSRMLS_DC) /* {{{ */ +int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar TSRMLS_DC) /* {{{ */ { phar_archive_data *mydata; int register_alias; @@ -942,6 +942,9 @@ static int phar_open_or_create_filename(char *fname, int fname_len, char *alias, /* set up our manifest */ mydata = ecalloc(sizeof(phar_archive_data), 1); + if (pphar) { + *pphar = mydata; + } zend_hash_init(&mydata->manifest, sizeof(phar_entry_info), zend_get_hash_value, destroy_phar_manifest, 0); mydata->fname = estrndup(fname, fname_len); @@ -2229,7 +2232,7 @@ static void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stre ssb->sb.st_ctime = phar->max_timestamp; #endif } - if (!phar->is_writeable) { + if (PHAR_G(readonly)) { ssb->sb.st_mode = (ssb->sb.st_mode & 0555) | (ssb->sb.st_mode & ~0777); } @@ -2426,6 +2429,11 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) ALLOC_HASHTABLE(data); zend_hash_init(data, 64, zend_get_hash_value, NULL, 0); + if (*dir == '/' && dirlen == 1 && (manifest->nNumOfElements == 0)) { + // make empty root directory for empty phar + efree(dir); + return php_stream_alloc(&phar_dir_ops, data, NULL, "r"); + } zend_hash_internal_pointer_reset(manifest); while (FAILURE != zend_hash_has_more_elements(manifest)) { if (HASH_KEY_NON_EXISTANT == zend_hash_get_current_key_ex(manifest, &key, &keylen, &unused, 0, NULL)) { diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 2b098bcc51..f0558cdfff 100755 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -213,6 +213,7 @@ BEGIN_EXTERN_C() void phar_object_init(TSRMLS_D); int phar_open_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar TSRMLS_DC); +int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar TSRMLS_DC); int phar_open_compiled_file(char *alias, int alias_len TSRMLS_DC); #ifdef PHAR_MAIN diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 58cc636434..bd4002c552 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -135,7 +135,7 @@ PHP_METHOD(Phar, __construct) return; } - if (phar_open_filename(fname, fname_len, alias, alias_len, REPORT_ERRORS, &phar_data TSRMLS_CC) == FAILURE) { + if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, REPORT_ERRORS, &phar_data TSRMLS_CC) == FAILURE) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Cannot open phar file '%s' with alias '%s'", fname, alias); return; diff --git a/ext/phar/tests/phar_commitwrite.phpt b/ext/phar/tests/phar_commitwrite.phpt index e96daf5999..890c83de04 100644 --- a/ext/phar/tests/phar_commitwrite.phpt +++ b/ext/phar/tests/phar_commitwrite.phpt @@ -12,12 +12,12 @@ $p['file1.txt'] = 'hi'; $p->commitWrite(); var_dump($p->getStub()); $p->commitWrite(""); var_dump($p->getStub()); @@ -27,4 +27,15 @@ var_dump($p->getStub()); ---EXPECT-- \ No newline at end of file +--EXPECT-- +string(24) "" +===DONE=== \ No newline at end of file