]> granicus.if.org Git - php/commitdiff
Add stream_resolve_include_path()
authorSara Golemon <pollita@php.net>
Mon, 9 Oct 2006 02:48:06 +0000 (02:48 +0000)
committerSara Golemon <pollita@php.net>
Mon, 9 Oct 2006 02:48:06 +0000 (02:48 +0000)
NEWS
ext/standard/basic_functions.c
ext/standard/streamsfuncs.c
ext/standard/streamsfuncs.h

diff --git a/NEWS b/NEWS
index 5e61ea80e81cafc6112865c395538c263e41059b..b91ea39c326dccae16feb09bea0034199c453456 100644 (file)
--- 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)
index 1b0228ba3b6609c16578c4ea59f2dfad4c1e8365..4b24631282a742932bcdffe1b72ae1ea1b532135 100644 (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)
index 5d0cf54e8618fdb56eab419d9f6cc7ddcbf0197a..f6ef5ad2f675fdc6efa90432e2449c62a245f405 100644 (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
index ba9a79824f94ef9d849375e71516850efa3ac01c..5313e757b103208fb7fe86c65d0d8ac3323dad98 100644 (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: