Add stream_resolve_include_path()

This commit is contained in:
Sara Golemon 2006-10-09 02:48:06 +00:00
parent ff6b250bba
commit 1caed2fa18
4 changed files with 75 additions and 0 deletions

1
NEWS
View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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: