1
0
Fork 0

handle opened_path in 1 place

git-svn-id: svn://svn.lighttpd.net/xcache/trunk@864 c26eb9a1-5813-0410-bd6c-c2e55f420ca7
This commit is contained in:
Xuefer 2012-03-29 05:51:14 +00:00
parent be2e034a8f
commit a51bea945b
7 changed files with 130 additions and 26 deletions

5
tests/include-skipif.php Normal file
View File

@ -0,0 +1,5 @@
<?php
if (version_compare(PHP_VERSION, '5.3.0', '<')) {
die('skip __DIR__ not supported in this php version');
}
?>

5
tests/sub-a.php Normal file
View File

@ -0,0 +1,5 @@
<?php
echo __DIR__, PHP_EOL;
echo __FILE__, PHP_EOL;

5
tests/sub-b.php Normal file
View File

@ -0,0 +1,5 @@
<?php
echo __DIR__, PHP_EOL;
echo __FILE__, PHP_EOL;

View File

@ -0,0 +1,16 @@
--TEST--
include absolute path
--SKIPIF--
<?php
require("include-skipif.php");
?>
--FILE--
<?php
include __DIR__ . "/sub-a.php";
include __DIR__ . "/sub-b.php";
?>
--EXPECTF--
%stests
%stests%ssub-a.php
%stests
%stests%ssub-b.php

View File

@ -0,0 +1,17 @@
--TEST--
include relative to current working dir
--SKIPIF--
<?php
require("include-skipif.php");
?>
--FILE--
<?php
chdir(__DIR__);
include "./sub-a.php";
include "./sub-b.php";
?>
--EXPECTF--
%stests
%stests%ssub-a.php
%stests
%stests%ssub-b.php

View File

@ -0,0 +1,16 @@
--TEST--
include relative to current file
--SKIPIF--
<?php
require("include-skipif.php");
?>
--FILE--
<?php
include "sub-a.php";
include "sub-b.php";
?>
--EXPECTF--
%stests
%stests%ssub-a.php
%stests
%stests%ssub-b.php

View File

@ -198,22 +198,48 @@ static inline int xc_entry_equal_dmz(xc_entry_type_t type, const xc_entry_t *ent
}
}
#endif
#ifdef IS_UNICODE
if (entry1->name_type == IS_UNICODE) {
assert(IS_ABSOLUTE_PATH(entry1->name.ustr.val, entry1->name.ustr.len));
}
else
#endif
{
assert(IS_ABSOLUTE_PATH(entry1->name.str.val, entry1->name.str.len));
}
#ifdef IS_UNICODE
if (entry2->name_type == IS_UNICODE) {
assert(IS_ABSOLUTE_PATH(entry2->name.ustr.val, entry2->name.ustr.len));
}
else
#endif
{
assert(IS_ABSOLUTE_PATH(entry2->name.str.val, entry2->name.str.len));
}
/* fall */
case XC_TYPE_VAR:
do {
#ifdef IS_UNICODE
if (entry1->name_type == IS_UNICODE) {
if (entry1->name_type != entry2->name_type) {
return 0;
}
else if (entry1->name_type == IS_UNICODE) {
if (entry1->name.ustr.len != entry2->name.ustr.len) {
return 0;
}
return memcmp(entry1->name.ustr.val, entry2->name.ustr.val, (entry1->name.ustr.len + 1) * sizeof(UChar)) == 0;
}
else
#endif
if (entry1->name.str.len != entry2->name.str.len) {
return 0;
{
if (entry1->name.str.len != entry2->name.str.len) {
return 0;
}
return memcmp(entry1->name.str.val, entry2->name.str.val, entry1->name.str.len + 1) == 0;
}
return memcmp(entry1->name.str.val, entry2->name.str.val, entry1->name.str.len + 1) == 0;
} while(0);
default:
@ -972,16 +998,15 @@ static void xc_entry_free_key_php(xc_entry_php_t *xce TSRMLS_DC) /* {{{ */
}
/* }}} */
static int xc_entry_init_key_php(xc_compiler_t *compiler TSRMLS_DC) /* {{{ */
static int xc_entry_php_resolve_opened_path(xc_compiler_t *compiler TSRMLS_DC) /* {{{ */
{
assert(!compiler->opened_path);
compiler->opened_path = expand_filepath(compiler->filename, compiler->opened_path_buffer TSRMLS_CC);
return SUCCESS;
}
/* }}} */
static int xc_entry_php_init_key(xc_compiler_t *compiler TSRMLS_DC) /* {{{ */
{
if (!compiler->filename || !SG(request_info).path_translated) {
return FAILURE;
}
if (strstr(compiler->filename, "://") != NULL) {
return FAILURE;
}
if (XG(stat)) {
struct stat buf, *pbuf;
@ -1048,7 +1073,12 @@ stat_done:
compiler->new_entry.file_device = 0;
compiler->new_entry.file_inode = 0;
#endif
compiler->opened_path = expand_filepath(compiler->filename, compiler->opened_path_buffer TSRMLS_CC);
}
if (!compiler->new_entry.file_inode) {
if (!compiler->opened_path) {
xc_entry_php_resolve_opened_path(compiler TSRMLS_CC);
}
}
UNISW(NOTHING, compiler->new_entry.entry.name_type = IS_STRING;)
@ -1093,7 +1123,7 @@ static inline xc_hash_value_t xc_php_hash_md5(xc_entry_data_php_t *php TSRMLS_DC
return HASH_STR_S(php->md5.digest, sizeof(php->md5.digest));
}
/* }}} */
static int xc_entry_init_key_php_md5(xc_cache_t *cache, xc_compiler_t *compiler TSRMLS_DC) /* {{{ */
static int xc_entry_data_php_init_md5(xc_cache_t *cache, xc_compiler_t *compiler TSRMLS_DC) /* {{{ */
{
unsigned char buf[1024];
PHP_MD5_CTX context;
@ -1133,7 +1163,7 @@ static int xc_entry_init_key_php_md5(xc_cache_t *cache, xc_compiler_t *compiler
return SUCCESS;
}
/* }}} */
static void xc_entry_init_key_php_entry(xc_entry_php_t *entry_php, const char *filepath TSRMLS_DC) /* {{{*/
static void xc_entry_php_init(xc_entry_php_t *entry_php, const char *filepath TSRMLS_DC) /* {{{*/
{
entry_php->filepath = ZEND_24((char *), NOTHING) filepath;
entry_php->filepath_len = strlen(entry_php->filepath);
@ -1634,7 +1664,7 @@ static zend_op_array *xc_compile_php(xc_compiler_t *compiler, zend_file_handle *
xc_const_usage_t const_usage;
unsigned int i;
xc_entry_init_key_php_entry(&compiler->new_entry, zend_get_compiled_filename(TSRMLS_C) TSRMLS_CC);
xc_entry_php_init(&compiler->new_entry, zend_get_compiled_filename(TSRMLS_C) TSRMLS_CC);
memset(&const_usage, 0, sizeof(const_usage));
for (i = 0; i < compiler->new_php.classinfo_cnt; i ++) {
@ -1824,21 +1854,20 @@ static zend_op_array *xc_compile_file_ex(xc_compiler_t *compiler, zend_file_hand
cache->misses ++;
TRACE("miss entry %d:%s", compiler->new_entry.file_inode, compiler->new_entry.entry.name.str.val);
if (xc_entry_init_key_php_md5(cache, compiler TSRMLS_CC) != SUCCESS) {
if (xc_entry_data_php_init_md5(cache, compiler TSRMLS_CC) != SUCCESS) {
gaveup = 1;
break;
}
stored_php = xc_php_find_dmz(cache, &compiler->new_php TSRMLS_CC);
/* miss but compiling */
if (stored_php) {
compiler->new_entry.php = stored_php;
xc_php_addref_dmz(stored_php);
if (!compiler->opened_path) {
compiler->opened_path = expand_filepath(compiler->filename, compiler->opened_path_buffer TSRMLS_CC);
xc_entry_php_resolve_opened_path(compiler TSRMLS_CC);
}
xc_entry_init_key_php_entry(&compiler->new_entry, compiler->opened_path TSRMLS_CC);
xc_entry_php_init(&compiler->new_entry, compiler->opened_path TSRMLS_CC);
stored_entry = xc_entry_php_store_dmz(cache, compiler->entry_hash.entryslotid, &compiler->new_entry TSRMLS_CC);
TRACE(" cached %d:%s, holding", compiler->new_entry.file_inode, stored_entry->entry.name.str.val);
xc_entry_hold_php_dmz(cache, stored_entry TSRMLS_CC);
@ -1977,7 +2006,11 @@ static zend_op_array *xc_compile_file(zend_file_handle *h, int type TSRMLS_DC) /
assert(xc_initized);
TRACE("xc_compile_file: type=%d name=%s", h->type, h->filename ? h->filename : "NULL");
if (!XG(cacher)) {
if (!XG(cacher)
|| !h->filename
|| !SG(request_info).path_translated
|| strstr(h->filename, "://") != NULL) {
op_array = old_compile_file(h, type TSRMLS_CC);
TRACE("%s", "cacher not enabled");
return op_array;
@ -1986,7 +2019,7 @@ static zend_op_array *xc_compile_file(zend_file_handle *h, int type TSRMLS_DC) /
/* {{{ entry_init_key */
compiler.opened_path = h->opened_path;
compiler.filename = compiler.opened_path ? compiler.opened_path : h->filename;
if (xc_entry_init_key_php(&compiler TSRMLS_CC) != SUCCESS) {
if (xc_entry_php_init_key(&compiler TSRMLS_CC) != SUCCESS) {
TRACE("failed to init key for %s", compiler.filename);
return old_compile_file(h, type TSRMLS_CC);
}
@ -2630,11 +2663,18 @@ static int xc_entry_init_key_var(xc_entry_hash_t *entry_hash, xc_entry_var_t *xc
{
xc_hash_value_t hv;
switch (name->type) {
#ifdef IS_UNICODE
convert_to_unicode(name);
#else
convert_to_string(name);
case IS_UNICODE:
case IS_STRING:
#endif
default:
#ifdef IS_UNICODE
convert_to_unicode(name);
#else
convert_to_string(name);
#endif
}
#ifdef IS_UNICODE
xce->entry.name_type = name->type;