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)