From 1caed2fa180bb805fa376957f6871b1b81e61586 Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Mon, 9 Oct 2006 02:48:06 +0000 Subject: [PATCH] Add stream_resolve_include_path() --- NEWS | 1 + ext/standard/basic_functions.c | 7 ++++ ext/standard/streamsfuncs.c | 66 ++++++++++++++++++++++++++++++++++ ext/standard/streamsfuncs.h | 1 + 4 files changed, 75 insertions(+) diff --git a/NEWS b/NEWS index 5e61ea80e8..b91ea39c32 100644 --- a/NEWS +++ b/NEWS @@ -55,6 +55,7 @@ PHP NEWS . sys_get_temp_dir() function that returns the default directory for temporary files (as requested in bug #35380). (Hartmut) . "context" and "binary_pipes" params in "other_options" arg. (Sara) + . stream_resolve_include_path(). (Sara) - Fixed bug #36630 (umask not reset at the end of the request). (Ilia) - Fixed bug #34286 (__toString() behavior is inconsistent). (Marcus) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 1b0228ba3b..4b24631282 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2443,6 +2443,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_encoding, 0, 0, 1) ZEND_ARG_INFO(0, stream) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() + +static +ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_resolve_include_path, 0, 0, 1) + ZEND_ARG_INFO(0, filename) + ZEND_ARG_INFO(0, context) +ZEND_END_ARG_INFO() /* }}} */ /* {{{ string.c */ static @@ -3553,6 +3559,7 @@ zend_function_entry basic_functions[] = { #endif PHP_FE(stream_copy_to_stream, arginfo_stream_copy_to_stream) PHP_FE(stream_get_contents, arginfo_stream_get_contents) + PHP_FE(stream_resolve_include_path, arginfo_stream_resolve_include_path) PHP_FE(fgetcsv, arginfo_fgetcsv) PHP_FE(fputcsv, arginfo_fputcsv) PHP_FE(flock, arginfo_flock) diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 5d0cf54e86..f6ef5ad2f6 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -1579,6 +1579,72 @@ PHP_FUNCTION(stream_encoding) } /* }}} */ +/* {{{ proto string stream_resolve_include_path(string filename[, resource context]) U +Determine what file will be opened by calls to fopen() with a relative path */ +PHP_FUNCTION(stream_resolve_include_path) +{ + zval **ppfilename, *zcontext = NULL; + char *filename, *ptr = PG(include_path), *end = ptr + (ptr ? strlen(ptr) : 0), buffer[MAXPATHLEN]; + int filename_len; + php_stream_context *context = NULL; + struct stat sb; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|r", &ppfilename, &zcontext) == FAILURE || + php_stream_path_param_encode(ppfilename, &filename, &filename_len, REPORT_ERRORS, context = php_stream_context_from_zval(zcontext, 0)) == FAILURE) { + return; + } + + while (ptr < end) { + char *s = strchr(ptr, DEFAULT_DIR_SEPARATOR); + + if (!s) { + s = end; + } + + if (s == ptr) { + ptr++; + continue; + } + + if ((s - ptr) + 1 + filename_len >= MAXPATHLEN) { + /* Too long to try */ + ptr = s + 1; + continue; + } + + memcpy(buffer, ptr, s - ptr); + buffer[s - ptr] = '/'; + memcpy(buffer + (s - ptr) + 1, filename, filename_len + 1); + + if (php_check_open_basedir_ex(buffer, 0 TSRMLS_CC)) { + ptr = s + 1; + continue; + } + + if (VCWD_STAT(buffer, &sb)) { + ptr = s + 1; + continue; + } + + if (UG(unicode)) { + UChar *upath; + int upath_len; + + if (SUCCESS == php_stream_path_decode(NULL, &upath, &upath_len, buffer, (s - ptr) + 1 + filename_len, REPORT_ERRORS, context)) { + RETURN_UNICODEL(upath, upath_len, 0); + } else { + /* Fallback */ + RETURN_STRINGL(buffer, (s - ptr) + 1 + filename_len, 1); + } + } else { + RETURN_STRINGL(buffer, (s - ptr) + 1 + filename_len, 1); + } + } + + RETURN_FALSE; +} +/* }}} */ + /* * Local variables: * tab-width: 4 diff --git a/ext/standard/streamsfuncs.h b/ext/standard/streamsfuncs.h index ba9a79824f..5313e757b1 100644 --- a/ext/standard/streamsfuncs.h +++ b/ext/standard/streamsfuncs.h @@ -55,6 +55,7 @@ PHP_FUNCTION(stream_filter_remove); PHP_FUNCTION(stream_encoding); PHP_FUNCTION(stream_socket_enable_crypto); PHP_FUNCTION(stream_socket_pair); +PHP_FUNCTION(stream_resolve_include_path); /* * Local variables: -- 2.50.1