From 7353e234b47326fb071a7d4f809abad625e51d19 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 8 Dec 2009 01:35:08 +0000 Subject: [PATCH] add realpath cache inspect functions --- TSRM/tsrm_virtual_cwd.c | 16 +++++++++ TSRM/tsrm_virtual_cwd.h | 3 ++ ext/standard/basic_functions.c | 8 +++++ ext/standard/filestat.c | 38 +++++++++++++++++++++ ext/standard/php_filestat.h | 2 ++ ext/standard/tests/file/realpath_cache.phpt | 24 +++++++++++++ 6 files changed, 91 insertions(+) create mode 100644 ext/standard/tests/file/realpath_cache.phpt diff --git a/TSRM/tsrm_virtual_cwd.c b/TSRM/tsrm_virtual_cwd.c index bd4ce5684e..2d40777705 100644 --- a/TSRM/tsrm_virtual_cwd.c +++ b/TSRM/tsrm_virtual_cwd.c @@ -590,6 +590,22 @@ CWD_API realpath_cache_bucket* realpath_cache_lookup(const char *path, int path_ } /* }}} */ +CWD_API int realpath_cache_size() +{ + return CWDG(realpath_cache_size); +} + +CWD_API int realpath_cache_max_buckets() +{ + return (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0])); +} + +CWD_API realpath_cache_bucket** realpath_cache_get_buckets() +{ + return CWDG(realpath_cache); +} + + #undef LINK_MAX #define LINK_MAX 32 diff --git a/TSRM/tsrm_virtual_cwd.h b/TSRM/tsrm_virtual_cwd.h index 145516f09a..b5c54e8c7b 100644 --- a/TSRM/tsrm_virtual_cwd.h +++ b/TSRM/tsrm_virtual_cwd.h @@ -255,6 +255,9 @@ extern virtual_cwd_globals cwd_globals; CWD_API void realpath_cache_clean(TSRMLS_D); CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC); CWD_API realpath_cache_bucket* realpath_cache_lookup(const char *path, int path_len, time_t t TSRMLS_DC); +CWD_API int realpath_cache_size(); +CWD_API int realpath_cache_max_buckets(); +CWD_API realpath_cache_bucket** realpath_cache_get_buckets(); /* The actual macros to be used in programs using TSRM * If the program defines VIRTUAL_DIR it will use the diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 3e699380ff..20d2b61f9f 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -1297,6 +1297,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_clearstatcache, 0, 0, 0) ZEND_ARG_INFO(0, filename) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO(arginfo_realpath_cache_size, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO(arginfo_realpath_cache_get, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_fileperms, 0) ZEND_ARG_INFO(0, filename) ZEND_END_ARG_INFO() @@ -3226,6 +3232,8 @@ const zend_function_entry basic_functions[] = { /* {{{ */ PHP_FE(disk_total_space, arginfo_disk_total_space) PHP_FE(disk_free_space, arginfo_disk_free_space) PHP_FALIAS(diskfreespace, disk_free_space, arginfo_disk_free_space) + PHP_FE(realpath_cache_size, arginfo_realpath_cache_size) + PHP_FE(realpath_cache_get, arginfo_realpath_cache_get) /* functions from mail.c */ PHP_FE(mail, arginfo_mail) diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index 37a8e54233..a2d844a472 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -1204,6 +1204,44 @@ FileFunction(php_if_lstat, FS_LSTAT) FileFunction(php_if_stat, FS_STAT) /* }}} */ +/* {{{ proto bool realpath_cache_size() + Get current size of realpath cache */ +PHP_FUNCTION(realpath_cache_size) +{ + RETURN_LONG(realpath_cache_size()); +} + +/* {{{ proto bool realpath_cache_get() + Get current size of realpath cache */ +PHP_FUNCTION(realpath_cache_get) +{ + realpath_cache_bucket **buckets = realpath_cache_get_buckets(), **end = buckets + realpath_cache_max_buckets(); + + array_init(return_value); + while(buckets < end) { + realpath_cache_bucket *bucket = *buckets; + while(bucket) { + zval *entry; + MAKE_STD_ZVAL(entry); + array_init(entry); + + add_assoc_long(entry, "key", bucket->key); + add_assoc_bool(entry, "is_dir", bucket->is_dir); + add_assoc_stringl(entry, "realpath", bucket->realpath, bucket->realpath_len, 1); + add_assoc_long(entry, "expires", bucket->expires); +#ifdef PHP_WIN32 + add_assoc_bool(entry, "is_rvalid", bucket->is_rvalid); + add_assoc_bool(entry, "is_wvalid", bucket->is_wvalid); + add_assoc_bool(entry, "is_readable", bucket->is_readable); + add_assoc_bool(entry, "is_writable", bucket->is_writable); +#endif + zend_hash_update(Z_ARRVAL_P(return_value), bucket->path, bucket->path_len+1, &entry, sizeof(zval *), NULL); + bucket = bucket->next; + } + buckets++; + } +} + /* * Local variables: * tab-width: 4 diff --git a/ext/standard/php_filestat.h b/ext/standard/php_filestat.h index 673a788c7d..8dd9ec4cb2 100644 --- a/ext/standard/php_filestat.h +++ b/ext/standard/php_filestat.h @@ -24,6 +24,8 @@ PHP_RINIT_FUNCTION(filestat); PHP_RSHUTDOWN_FUNCTION(filestat); +PHP_FUNCTION(realpath_cache_size); +PHP_FUNCTION(realpath_cache_get); PHP_FUNCTION(clearstatcache); PHP_FUNCTION(fileatime); PHP_FUNCTION(filectime); diff --git a/ext/standard/tests/file/realpath_cache.phpt b/ext/standard/tests/file/realpath_cache.phpt new file mode 100644 index 0000000000..1e19486c49 --- /dev/null +++ b/ext/standard/tests/file/realpath_cache.phpt @@ -0,0 +1,24 @@ +--TEST-- +realpath_cache_size() and realpath_cache_get() +--FILE-- + +--EXPECTF-- +int(%d) +array(4) { + ["key"]=> + int(%d) + ["is_dir"]=> + bool(true) + ["realpath"]=> + string(%d) "%sfile" + ["expires"]=> + int(%d) +} +Done -- 2.40.0