if (intern->u.file.open_mode) {
efree(intern->u.file.open_mode);
}
+ if (intern->orig_path) {
+ efree(intern->orig_path);
+ }
}
spl_filesystem_file_free_line(intern TSRMLS_CC);
break;
intern->file_name_len--;
}
+ /* NOTE: Works as long as stream->orig_path is not unicode aware, might
+ * break later. */
+ intern->orig_path = estrndup(intern->u.file.stream->orig_path, strlen(intern->u.file.stream->orig_path));
+
intern->file_name = ezstrndup(intern->file_name_type, intern->file_name, intern->file_name_len);
intern->u.file.open_mode = estrndup(intern->u.file.open_mode, intern->u.file.open_mode_len);
spl_filesystem_object_get_file_name(intern TSRMLS_CC);
}
- if (intern->file_name_type == IS_UNICODE) {
- php_stream_path_encode(NULL, &filename, &filename_len, intern->file_name.u, intern->file_name_len, REPORT_ERRORS, FG(default_context));
+ if (intern->orig_path) {
+ filename = intern->orig_path;
} else {
- filename = intern->file_name.s;
+ if (intern->file_name_type == IS_UNICODE) {
+ php_stream_path_encode(NULL, &filename, &filename_len, intern->file_name.u, intern->file_name_len, REPORT_ERRORS, FG(default_context));
+ } else {
+ filename = intern->file_name.s;
+ }
}
if (filename && VCWD_REALPATH(filename, buff)) {
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
zend_bool use_include_path = 0;
zstr p1, p2;
+ char *tmp_path;
+ int tmp_path_len;
php_set_error_handling(EH_THROW, spl_ce_RuntimeException TSRMLS_CC);
}
if (spl_filesystem_file_open(intern, use_include_path, 0 TSRMLS_CC) == SUCCESS) {
- if (intern->file_name_type == IS_UNICODE) {
- p1.u = u_strrchr(intern->file_name.u, '/');
- } else {
- p1.s = strrchr(intern->file_name.s, '/');
+ tmp_path_len = strlen(intern->u.file.stream->orig_path);
+
+ if (tmp_path_len && IS_SLASH_AT(IS_STRING, ZSTR(intern->u.file.stream->orig_path), tmp_path_len-1)) {
+ tmp_path_len--;
}
+
+ tmp_path = estrndup(intern->u.file.stream->orig_path, tmp_path_len);
+
+ p1.s = strrchr(tmp_path, '/');
#if defined(PHP_WIN32) || defined(NETWARE)
- if (intern->file_name_type == IS_UNICODE) {
- p2.u = u_strrchr(intern->file_name.u, '\\');
- } else {
- p2.s = strrchr(intern->file_name.s, '\\');
- }
+ p2.s = strrchr(tmp_path, '\\');
#else
p2.v = 0;
#endif
+
if (p1.v || p2.v) {
- if (intern->file_name_type == IS_UNICODE) {
- intern->_path_len = (p1.u > p2.u ? p1.u : p2.u) - intern->file_name.u;
- } else {
- intern->_path_len = (p1.s > p2.s ? p1.s : p2.s) - intern->file_name.s;
- }
+ intern->_path_len = (p1.s > p2.s ? p1.s : p2.s) - tmp_path;
} else {
intern->_path_len = 0;
}
- intern->_path_type = intern->file_name_type;
- intern->_path = ezstrndup(intern->file_name_type, intern->file_name, intern->_path_len);
+
+ efree(tmp_path);
+
+ intern->_path = ZSTR(estrndup(intern->u.file.stream->orig_path, intern->_path_len));
+ intern->_path_type = IS_STRING;
}
php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
--- /dev/null
+--TEST--
+SPL: SplFileObject realpath and include_path
+--SKIPIF--
+<?php if (!extension_loaded("spl")) print "skip"; ?>
+--FILE--
+<?php
+
+set_include_path('tests');
+
+chdir(dirname(dirname(__FILE__))); // ext/spl
+
+
+$fo = new SplFileObject('fileobject_004.phpt', 'r', true);
+
+var_dump($fo->getPath());
+var_dump($fo->getFilename());
+var_dump($fo->getRealPath());
+?>
+==DONE==
+--EXPECTF--
+string(%d) "%sspl%stests"
+string(19) "fileobject_004.phpt"
+string(%d) "%sspl%stests%sfileobject_004.phpt"
+==DONE==