lbarnaud Thu Aug 7 09:24:04 2008 UTC Added files: /php-src/ext/standard/tests/file clearstatcache_001.phpt
Modified files: /php-src/ext/standard basic_functions.c filestat.c php_filestat.h /php-src/ext/standard/tests/file bug39367.phpt clearstatcache_error.phpt /php-src/main/streams plain_wrapper.c Log: Added clear_realpath_cache and filename parameters to clearstatcache() (Jani, Arnaud) [DOC] clearstatcache() now defaults to not affect the realpath cache. clearstatcache() now takes two optionnal parameters, clear_realpath_cache to clear the realpath cache (defaults to false), and filename to clear only the given filename from the cache.
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.912&r2=1.913&diff_format=u Index: php-src/ext/standard/basic_functions.c diff -u php-src/ext/standard/basic_functions.c:1.912 php-src/ext/standard/basic_functions.c:1.913 --- php-src/ext/standard/basic_functions.c:1.912 Sun Aug 3 12:04:57 2008 +++ php-src/ext/standard/basic_functions.c Thu Aug 7 09:24:04 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.912 2008/08/03 12:04:57 jani Exp $ */ +/* $Id: basic_functions.c,v 1.913 2008/08/07 09:24:04 lbarnaud Exp $ */ #include "php.h" #include "php_streams.h" @@ -1494,7 +1494,9 @@ #endif static -ZEND_BEGIN_ARG_INFO(arginfo_clearstatcache, 0) +ZEND_BEGIN_ARG_INFO_EX(arginfo_clearstatcache, 0, 0, 0) + ZEND_ARG_INFO(0, clear_realpath_cache) + ZEND_ARG_INFO(0, filename) ZEND_END_ARG_INFO() static http://cvs.php.net/viewvc.cgi/php-src/ext/standard/filestat.c?r1=1.173&r2=1.174&diff_format=u Index: php-src/ext/standard/filestat.c diff -u php-src/ext/standard/filestat.c:1.173 php-src/ext/standard/filestat.c:1.174 --- php-src/ext/standard/filestat.c:1.173 Tue Mar 4 23:39:15 2008 +++ php-src/ext/standard/filestat.c Thu Aug 7 09:24:04 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filestat.c,v 1.173 2008/03/04 23:39:15 felipe Exp $ */ +/* $Id: filestat.c,v 1.174 2008/08/07 09:24:04 lbarnaud Exp $ */ #include "php.h" #include "fopen_wrappers.h" @@ -780,8 +780,11 @@ /* {{{ php_clear_stat_cache() */ -PHPAPI void php_clear_stat_cache(TSRMLS_D) +PHPAPI void php_clear_stat_cache(zend_bool clear_realpath_cache, const char *filename, int filename_len TSRMLS_DC) { + /* always clear CurrentStatFile and CurrentLStatFile even if filename is not NULL + * as it may contains outdated data (e.g. "nlink" for a directory when deleting a file + * in this directory, as shown by lstat_stat_variation9.phpt) */ if (BG(CurrentStatFile)) { efree(BG(CurrentStatFile)); BG(CurrentStatFile) = NULL; @@ -790,18 +793,40 @@ efree(BG(CurrentLStatFile)); BG(CurrentLStatFile) = NULL; } - realpath_cache_clean(TSRMLS_C); + if (clear_realpath_cache) { + if (filename != NULL) { + realpath_cache_del(filename, filename_len TSRMLS_CC); + } else { + realpath_cache_clean(TSRMLS_C); + } + } } /* }}} */ -/* {{{ proto void clearstatcache(void) +/* {{{ proto void clearstatcache([bool clear_realpath_cache[, string filename]]) Clear file stat cache */ PHP_FUNCTION(clearstatcache) { - if (zend_parse_parameters_none() == FAILURE) { + zend_bool clear_realpath_cache = 0; + char *filename = NULL; + zend_uchar filename_type; + int filename_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|bt", &clear_realpath_cache, &filename, &filename_len, &filename_type) == FAILURE) { return; } - php_clear_stat_cache(TSRMLS_C); + + if (filename && filename_type == IS_UNICODE) { + if (FAILURE == php_stream_path_encode(NULL, &filename, &filename_len, (UChar*)filename, filename_len, REPORT_ERRORS, FG(default_context))) { + RETURN_FALSE; + } + } + + php_clear_stat_cache(clear_realpath_cache, filename, filename_len TSRMLS_CC); + + if (filename && filename_type == IS_UNICODE) { + efree(filename); + } } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/standard/php_filestat.h?r1=1.33&r2=1.34&diff_format=u Index: php-src/ext/standard/php_filestat.h diff -u php-src/ext/standard/php_filestat.h:1.33 php-src/ext/standard/php_filestat.h:1.34 --- php-src/ext/standard/php_filestat.h:1.33 Mon Dec 31 07:12:16 2007 +++ php-src/ext/standard/php_filestat.h Thu Aug 7 09:24:04 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_filestat.h,v 1.33 2007/12/31 07:12:16 sebastian Exp $ */ +/* $Id: php_filestat.h,v 1.34 2008/08/07 09:24:04 lbarnaud Exp $ */ #ifndef PHP_FILESTAT_H #define PHP_FILESTAT_H @@ -87,7 +87,7 @@ typedef int php_stat_len; #endif -PHPAPI void php_clear_stat_cache(TSRMLS_D); +PHPAPI void php_clear_stat_cache(zend_bool clear_realpath_cache, const char *filename, int filename_len TSRMLS_DC); PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int type, zval *return_value TSRMLS_DC); PHPAPI void php_u_stat(zend_uchar filename_type, const zstr filename, php_stat_len filename_length, int type, php_stream_context *context, zval *return_value TSRMLS_DC); http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/file/bug39367.phpt?r1=1.3&r2=1.4&diff_format=u Index: php-src/ext/standard/tests/file/bug39367.phpt diff -u php-src/ext/standard/tests/file/bug39367.phpt:1.3 php-src/ext/standard/tests/file/bug39367.phpt:1.4 --- php-src/ext/standard/tests/file/bug39367.phpt:1.3 Wed Apr 18 14:51:47 2007 +++ php-src/ext/standard/tests/file/bug39367.phpt Thu Aug 7 09:24:04 2008 @@ -19,7 +19,7 @@ echo file_get_contents('/tmp/1link')."\n"; unlink('/tmp/1link'); - clearstatcache(); + clearstatcache(true); echo file_get_contents('/tmp/1link')."\n"; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/file/clearstatcache_error.phpt?r1=1.5&r2=1.6&diff_format=u Index: php-src/ext/standard/tests/file/clearstatcache_error.phpt diff -u php-src/ext/standard/tests/file/clearstatcache_error.phpt:1.5 php-src/ext/standard/tests/file/clearstatcache_error.phpt:1.6 --- php-src/ext/standard/tests/file/clearstatcache_error.phpt:1.5 Tue May 27 09:34:52 2008 +++ php-src/ext/standard/tests/file/clearstatcache_error.phpt Thu Aug 7 09:24:04 2008 @@ -3,17 +3,17 @@ --FILE-- <?php /* - Prototype: void clearstatcache (void); + Prototype: void clearstatcache ([bool clear_realpath_cache[, filename]]); Description: clears files status cache */ echo "*** Testing clearstatcache() function: error conditions ***\n"; -var_dump( clearstatcache("file") ); //No.of args more than expected +var_dump( clearstatcache(0, "/foo/bar", 1) ); //No.of args more than expected echo "*** Done ***\n"; ?> --EXPECTF-- *** Testing clearstatcache() function: error conditions *** -Warning: clearstatcache() expects exactly 0 parameters, 1 given in %s on line %d +Warning: clearstatcache() expects at most 2 parameters, 3 given in %s on line %d NULL *** Done *** http://cvs.php.net/viewvc.cgi/php-src/main/streams/plain_wrapper.c?r1=1.95&r2=1.96&diff_format=u Index: php-src/main/streams/plain_wrapper.c diff -u php-src/main/streams/plain_wrapper.c:1.95 php-src/main/streams/plain_wrapper.c:1.96 --- php-src/main/streams/plain_wrapper.c:1.95 Sun Apr 13 22:19:23 2008 +++ php-src/main/streams/plain_wrapper.c Thu Aug 7 09:24:04 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: plain_wrapper.c,v 1.95 2008/04/13 22:19:23 cellog Exp $ */ +/* $Id: plain_wrapper.c,v 1.96 2008/08/07 09:24:04 lbarnaud Exp $ */ #include "php.h" #include "php_globals.h" @@ -1025,8 +1025,8 @@ return 0; } - /* Clear stat cache */ - php_clear_stat_cache(TSRMLS_C); + /* Clear stat cache (and realpath cache) */ + php_clear_stat_cache(1, NULL, 0 TSRMLS_CC); return 1; } @@ -1092,8 +1092,8 @@ return 0; } - /* Clear stat cache */ - php_clear_stat_cache(TSRMLS_C); + /* Clear stat cache (and realpath cache) */ + php_clear_stat_cache(1, NULL, 0 TSRMLS_CC); return 1; } @@ -1202,8 +1202,8 @@ return 0; } - /* Clear stat cache */ - php_clear_stat_cache(TSRMLS_C); + /* Clear stat cache (and realpath cache) */ + php_clear_stat_cache(1, NULL, 0 TSRMLS_CC); return 1; } http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/file/clearstatcache_001.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/file/clearstatcache_001.phpt +++ php-src/ext/standard/tests/file/clearstatcache_001.phpt --TEST-- clearstatcache() optionnal parameters --SKIPIF-- <?php if (strncmp(PHP_OS, "WIN", 3) === 0) { die('skip not for Windows'); } ?> --FILE-- <?php @rmdir(__FILE__ . "_dir1"); @rmdir(__FILE__ . "_dir2"); @unlink(__FILE__ . "_link1"); @unlink(__FILE__ . "_link2"); mkdir(__FILE__ . "_dir1"); mkdir(__FILE__ . "_dir2"); symlink(__FILE__ . "_link1", __FILE__ . "_link2"); symlink(__FILE__ . "_dir1", __FILE__ . "_link1"); var_dump(realpath(__FILE__ . "_link2")); passthru("rm -f " . escapeshellarg(__FILE__ . "_link1")); var_dump(realpath(__FILE__ . "_link2")); clearstatcache(false); var_dump(realpath(__FILE__ . "_link2")); clearstatcache(true, "/foo/bar"); var_dump(realpath(__FILE__ . "_link2")); clearstatcache(true, __FILE__ . "_link2"); var_dump(realpath(__FILE__ . "_link2")); ?> --CLEAN-- <?php @rmdir(__FILE__ . "_dir1"); @rmdir(__FILE__ . "_dir2"); @unlink(__FILE__ . "_link1"); @unlink(__FILE__ . "_link2"); ?> --EXPECTF-- %unicode|string%(%d) "%s_dir1" %unicode|string%(%d) "%s_dir1" %unicode|string%(%d) "%s_dir1" %unicode|string%(%d) "%s_dir1" bool(false)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php