mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
Add stream_resolve_include_path()
This commit is contained in:
parent
ff6b250bba
commit
1caed2fa18
1
NEWS
1
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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user