]> granicus.if.org Git - php/commitdiff
with stream wrappers in include_path, and after marcus's last fix, only 1 failing...
authorGreg Beaver <cellog@php.net>
Fri, 21 Mar 2008 18:50:22 +0000 (18:50 +0000)
committerGreg Beaver <cellog@php.net>
Fri, 21 Mar 2008 18:50:22 +0000 (18:50 +0000)
add mounted file/dir to url stat

ext/phar/stream.c
ext/phar/tests/mounteddir.phpt
ext/phar/tests/tar/tar_makegz.phpt

index 993304a270b7e80b66452bdbadd4366c5129cc99..a8743c4bcd123b6af0895f55db3d5b3e57997054 100644 (file)
@@ -605,8 +605,58 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, char *url, int flags,
                                break;
                        }
                }
+               /* check for mounted directories */
+               if (phar->mounted_dirs.arBuckets && zend_hash_num_elements(&phar->mounted_dirs)) {
+                       char *key;
+                       ulong unused;
+                       uint keylen;
+       
+                       zend_hash_internal_pointer_reset(&phar->mounted_dirs);
+                       while (FAILURE != zend_hash_has_more_elements(&phar->mounted_dirs)) {
+                               if (HASH_KEY_NON_EXISTANT == zend_hash_get_current_key_ex(&phar->mounted_dirs, &key, &keylen, &unused, 0, NULL)) {
+                                       break;
+                               }
+                               if ((int)keylen >= internal_file_len || strncmp(key, internal_file, keylen)) {
+                                       continue;
+                               } else {
+                                       char *test;
+                                       int test_len;
+                                       phar_entry_info *entry;
+                                       php_stream_statbuf ssbi;
+       
+                                       if (SUCCESS != zend_hash_find(&phar->manifest, key, keylen, (void **) &entry)) {
+                                               php_stream_wrapper_log_error(wrapper, flags TSRMLS_CC, "phar internal error: mounted path \"%s\" could not be retrieved from manifest", key);
+                                               goto free_resource;
+                                       }
+                                       if (!entry->link || !entry->is_mounted) {
+                                               php_stream_wrapper_log_error(wrapper, flags TSRMLS_CC, "phar internal error: mounted path \"%s\" is not properly initialized as a mounted path", key);
+                                               goto free_resource;
+                                       }
+                                       test_len = spprintf(&test, MAXPATHLEN, "%s%s", entry->link, internal_file + keylen);
+                                       if (SUCCESS != php_stream_stat_path(test, &ssbi)) {
+                                               efree(test);
+                                               continue;
+                                       }
+                                       /* mount the file/directory just in time */
+                                       if (SUCCESS != phar_mount_entry(phar, test, test_len, internal_file, internal_file_len TSRMLS_CC)) {
+                                               efree(test);
+                                               php_stream_wrapper_log_error(wrapper, flags TSRMLS_CC, "phar error: path \"%s\" exists as file \"%s\" and could not be mounted", internal_file, test);
+                                               goto free_resource;
+                                       }
+                                       efree(test);
+                                       if (SUCCESS != zend_hash_find(&phar->manifest, internal_file, internal_file_len, (void**)&entry)) {
+                                               php_stream_wrapper_log_error(wrapper, flags TSRMLS_CC, "phar error: path \"%s\" exists as file \"%s\" and could not be retrieved after being mounted", internal_file, test);
+                                               goto free_resource;
+                                       }
+                                       phar_dostat(phar, entry, ssb, 0, phar->alias, phar->alias_len TSRMLS_CC);
+                                       php_url_free(resource);
+                                       return SUCCESS;
+                               }
+                       }
+               }
        }
 
+free_resource:
        php_url_free(resource);
        return FAILURE;
 }
index fcb5e223adc9ebdf9a262cd6dbf580552c22429c..876d6c3478a9d0f8d95c78314da19efc46e40601 100644 (file)
@@ -9,13 +9,13 @@ phar.readonly=0
 $fname = dirname(__FILE__) . '/tempmanifest1.phar.php';
 $a = new Phar($fname);
 $a['index.php'] = '<?php
-set_include_path(".");
 Phar::mount("testit", dirname(Phar::getRunningPhar()) . "/testit");
 include "testit/extfile.php";
 include "testit/extfile2.php";
 ?>';
 $a->setStub('<?php
-include "phar://" . __FILE__ . "/index.php";
+set_include_path("phar://" . __FILE__);
+include "index.php";
 __HALT_COMPILER();');
 unset($a);
 mkdir(dirname(__FILE__) . '/testit');
index dada63de6872bf390f92567593d61ce0373493ba..0d781c7fdd968e48f6ddd2005a1a4b82ebcf2769 100644 (file)
@@ -9,9 +9,9 @@ phar.readonly=0
 --FILE--
 <?php
 
-$fname = dirname(__FILE__) . '/tar_makebz2.phar.tar';
-$fname2 = dirname(__FILE__) . '/tar_makebz2.phar.tar.gz';
-$fname3 = dirname(__FILE__) . '/tar_makebz2_b.phar.tar.gz';
+$fname = dirname(__FILE__) . '/tar_makegz.phar.tar';
+$fname2 = dirname(__FILE__) . '/tar_makegz.phar.tar.gz';
+$fname3 = dirname(__FILE__) . '/tar_makegz_b.phar.tar.gz';
 
 $phar = new Phar($fname);
 $phar['test'] = 'hi';
@@ -28,8 +28,8 @@ var_dump($phar2->isCompressed() == Phar::GZ);
 ===DONE===
 --CLEAN--
 <?php
-@unlink(dirname(__FILE__) . '/tar_makebz2.phar.tar.gz');
-@unlink(dirname(__FILE__) . '/tar_makebz2_b.phar.tar.gz');
+@unlink(dirname(__FILE__) . '/tar_makegz.phar.tar.gz');
+@unlink(dirname(__FILE__) . '/tar_makegz_b.phar.tar.gz');
 ?>
 --EXPECTF--
 bool(true)