cvs: pecl /phar phar_object.c php-src NEWS php-src/ext/spl spl_directory.c spl_directory.h
| From: | Marcus Boerger | Date: | Wed, 30 Jan 2008 20:31:07 +0000 |
| Subject: | cvs: pecl /phar phar_object.c php-src NEWS php-src/ext/spl spl_directory.c spl_directory.h | ||
| Groups: | php.pecl.cvs | ||
| Request: | Send a blank email to pecl-cvs+get-9641@lists.php.net to get a copy of this message | ||
helly Wed Jan 30 20:31:07 2008 UTC
Modified files:
/php-src NEWS
/php-src/ext/spl spl_directory.c spl_directory.h
/pecl/phar phar_object.c
Log:
- Fixed glob:// stream handling in (Recursive)DirectoryIterator.
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.101&r2=1.2027.2.547.2.965.2.102&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.965.2.101 php-src/NEWS:1.2027.2.547.2.965.2.102 --- php-src/NEWS:1.2027.2.547.2.965.2.101 Wed Jan 30 10:27:28 2008 +++ php-src/NEWS Wed Jan 30 20:31:06 2008 @@ -29,6 +29,7 @@ SplObjectStorage. (Marcus) . Added ArrayAccess support to SplObjectStorage. (Marcus) . Added SplDoublyLinkedList, SplStack, SplQueue classes. (Etienne) + . Fixed glob:// stream handling in (Recursive)DirectoryIterator. (Marcus) - Added ability to use Traversable objects instead of plain arrays in ext/soap. (Joshua Reese, Dmitry) - Added "?:" operator. (Marcus) http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.45.2.27.2.23.2.7&r2=1.45.2.27.2.23.2.8&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.7 php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.8 --- php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.7 Mon Dec 31 07:17:14 2007 +++ php-src/ext/spl/spl_directory.c Wed Jan 30 20:31:06 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.45.2.27.2.23.2.7 2007/12/31 07:17:14 sebastian Exp $ */ +/* $Id: spl_directory.c,v 1.45.2.27.2.23.2.8 2008/01/30 20:31:06 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -76,8 +76,8 @@ zend_object_std_dtor(&intern->std TSRMLS_CC); - if (intern->path) { - efree(intern->path); + if (intern->_path) { + efree(intern->_path); } if (intern->file_name) { efree(intern->file_name); @@ -154,6 +154,19 @@ } /* }}} */ +PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len TSRMLS_DC) /* {{{ */ +{ + if (intern->type == SPL_FS_DIR) { + if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) { + return php_glob_stream_get_path(intern->u.dir.dirp, 0, len); + } + } + if (len) { + *len = intern->_path_len; + } + return intern->_path; +} /* }}} */ + static inline void spl_filesystem_object_get_file_name(spl_filesystem_object *intern TSRMLS_DC) /* {{{ */ { if (!intern->file_name) { @@ -163,7 +176,9 @@ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized"); break; case SPL_FS_DIR: - intern->file_name_len = spprintf(&intern->file_name, 0, "%s%c%s", intern->path, DEFAULT_SLASH, intern->u.dir.entry.d_name); + intern->file_name_len = spprintf(&intern->file_name, 0, "%s%c%s", + spl_filesystem_object_get_path(intern, NULL TSRMLS_CC), + DEFAULT_SLASH, intern->u.dir.entry.d_name); break; } } @@ -174,17 +189,17 @@ static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path TSRMLS_DC) { intern->type = SPL_FS_DIR; - intern->path_len = strlen(path); + intern->_path_len = strlen(path); intern->u.dir.dirp = php_stream_opendir(path, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL); - if (intern->path_len && (path[intern->path_len-1] == '/' + if (intern->_path_len && (path[intern->_path_len-1] == '/' #if defined(PHP_WIN32) || defined(NETWARE) || path[intern->path_len-1] == '\\' #endif )) { - intern->path = estrndup(path, --intern->path_len); + intern->_path = estrndup(path, --intern->_path_len); } else { - intern->path = estrndup(path, intern->path_len); + intern->_path = estrndup(path, intern->_path_len); } intern->u.dir.index = 0; @@ -265,13 +280,13 @@ switch (source->type) { case SPL_FS_INFO: - intern->path_len = source->path_len; - intern->path = estrndup(source->path, source->path_len); + intern->_path_len = source->_path_len; + intern->_path = estrndup(source->_path, source->_path_len); intern->file_name_len = source->file_name_len; intern->file_name = estrndup(source->file_name, intern->file_name_len); break; case SPL_FS_DIR: - spl_filesystem_dir_open(intern, source->path TSRMLS_CC); + spl_filesystem_dir_open(intern, source->_path TSRMLS_CC); break; case SPL_FS_FILE: php_error_docref(NULL TSRMLS_CC, E_ERROR, "An object of class %s cannot be cloned", old_object->ce->name); @@ -308,11 +323,11 @@ p2 = 0; #endif if (p1 || p2) { - intern->path_len = (p1 > p2 ? p1 : p2) - path; + intern->_path_len = (p1 > p2 ? p1 : p2) - path; } else { - intern->path_len = 0; + intern->_path_len = 0; } - intern->path = estrndup(path, intern->path_len); + intern->_path = estrndup(path, intern->_path_len); } /* }}} */ static spl_filesystem_object * spl_filesystem_object_create_info(spl_filesystem_object *source, char *file_path, int file_path_len, int use_copy, zend_class_entry *ce, zval *return_value TSRMLS_DC) /* {{{ */ @@ -392,8 +407,8 @@ } else { intern->file_name = estrndup(source->file_name, source->file_name_len); intern->file_name_len = source->file_name_len; - intern->path = estrndup(source->path, source->path_len); - intern->path_len = source->path_len; + intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len TSRMLS_CC); + intern->_path = estrndup(intern->_path, intern->_path_len); } break; case SPL_FS_FILE: @@ -414,8 +429,8 @@ } else { intern->file_name = source->file_name; intern->file_name_len = source->file_name_len; - intern->path = estrndup(source->path, source->path_len); - intern->path_len = source->path_len; + intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len TSRMLS_CC); + intern->_path = estrndup(intern->_path, intern->_path_len); intern->u.file.open_mode = "r"; intern->u.file.open_mode_len = 1; @@ -464,8 +479,8 @@ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(obj TSRMLS_CC); HashTable *rv; zval *tmp, zrv; - char *pnstr; - int pnlen; + char *pnstr, *path; + int pnlen, path_len; char stmp[2]; *is_temp = 1; @@ -478,15 +493,23 @@ zend_hash_copy(rv, intern->std.properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); + path = spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName", sizeof("pathName")-1, &pnlen TSRMLS_CC); - add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->path, intern->path_len, 1); + add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, path, path_len, 1); efree(pnstr); if (intern->file_name) { pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1, &pnlen TSRMLS_CC); add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->file_name, intern->file_name_len, 1); efree(pnstr); } - if (intern->type == SPL_FS_DIR && intern->u.dir.sub_path) { + if (intern->type == SPL_FS_DIR) { + pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "glob", sizeof("glob")-1, &pnlen TSRMLS_CC); + if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) { + add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->_path, intern->_path_len, 1); + } else { + add_assoc_bool_ex(&zrv, pnstr, pnlen+1, 0); + } + efree(pnstr); pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "subPathName", sizeof("subPathName")-1, &pnlen TSRMLS_CC); add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->u.dir.sub_path, intern->u.dir.sub_path_len, 1); efree(pnstr); @@ -610,8 +633,11 @@ SPL_METHOD(SplFileInfo, getPath) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + char *path; + int path_len; - RETURN_STRING(intern->path, 1); + path = spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); + RETURN_STRINGL(path, path_len, 1); } /* }}} */ @@ -620,9 +646,12 @@ SPL_METHOD(SplFileInfo, getFilename) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + int path_len; - if (intern->path_len && intern->path_len < intern->file_name_len) { - RETURN_STRINGL(intern->file_name + intern->path_len + 1, intern->file_name_len - (intern->path_len + 1), 1); + spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); + + if (path_len && path_len < intern->file_name_len) { + RETURN_STRINGL(intern->file_name + path_len + 1, intern->file_name_len - (path_len + 1), 1); } else { RETURN_STRINGL(intern->file_name, intern->file_name_len, 1); } @@ -646,15 +675,17 @@ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); char *fname, *suffix = 0; size_t flen; - int slen = 0; + int slen = 0, path_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &suffix, &slen) == FAILURE) { return; } - if (intern->path_len && intern->path_len < intern->file_name_len) { - fname = intern->file_name + intern->path_len + 1; - flen = intern->file_name_len - (intern->path_len + 1); + spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); + + if (path_len && path_len < intern->file_name_len) { + fname = intern->file_name + path_len + 1; + flen = intern->file_name_len - (path_len + 1); } else { fname = intern->file_name; flen = intern->file_name_len; @@ -998,7 +1029,9 @@ php_set_error_handling(EH_THROW, spl_ce_UnexpectedValueException TSRMLS_CC); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) { - spl_filesystem_object_create_info(intern, intern->path, intern->path_len, 1, ce, return_value TSRMLS_CC); + int path_len; + char *path = spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); + spl_filesystem_object_create_info(intern, path, path_len, 1, ce, return_value TSRMLS_CC); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); @@ -1790,11 +1823,11 @@ p2 = 0; #endif if (p1 || p2) { - intern->path_len = (p1 > p2 ? p1 : p2) - intern->file_name; + intern->_path_len = (p1 > p2 ? p1 : p2) - intern->file_name; } else { - intern->path_len = 0; + intern->_path_len = 0; } - intern->path = estrndup(intern->file_name, intern->path_len); + intern->_path = estrndup(intern->file_name, intern->_path_len); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); @@ -1830,8 +1863,8 @@ intern->u.file.zcontext = NULL; if (spl_filesystem_file_open(intern, 0, 0 TSRMLS_CC) == SUCCESS) { - intern->path_len = 0; - intern->path = estrndup("", 0); + intern->_path_len = 0; + intern->_path = estrndup("", 0); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.12.2.5.2.4.2.3&r2=1.12.2.5.2.4.2.4&diff_format=u Index: php-src/ext/spl/spl_directory.h diff -u php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.3 php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.4 --- php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.3 Mon Dec 31 07:17:14 2007 +++ php-src/ext/spl/spl_directory.h Wed Jan 30 20:31:07 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.h,v 1.12.2.5.2.4.2.3 2007/12/31 07:17:14 sebastian Exp $ */ +/* $Id: spl_directory.h,v 1.12.2.5.2.4.2.4 2008/01/30 20:31:07 helly Exp $ */ #ifndef SPL_DIRECTORY_H #define SPL_DIRECTORY_H @@ -43,6 +43,8 @@ typedef void (*spl_foreign_dtor_t)(spl_filesystem_object *object TSRMLS_DC); typedef void (*spl_foreign_clone_t)(spl_filesystem_object *src, spl_filesystem_object *dst TSRMLS_DC); +PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len TSRMLS_DC); + typedef struct _spl_other_handler { spl_foreign_dtor_t dtor; spl_foreign_clone_t clone; @@ -52,8 +54,8 @@ zend_object std; void *oth; spl_other_handler *oth_handler; - char *path; - int path_len; + char *_path; + int _path_len; char *file_name; int file_name_len; SPL_FS_OBJ_TYPE type; http://cvs.php.net/viewvc.cgi/pecl/phar/phar_object.c?r1=1.137&r2=1.138&diff_format=u Index: pecl/phar/phar_object.c diff -u pecl/phar/phar_object.c:1.137 pecl/phar/phar_object.c:1.138 --- pecl/phar/phar_object.c:1.137 Mon Jan 28 20:18:13 2008 +++ pecl/phar/phar_object.c Wed Jan 30 20:31:07 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c,v 1.137 2008/01/28 20:18:13 cellog Exp $ */ +/* $Id: phar_object.c,v 1.138 2008/01/30 20:31:07 helly Exp $ */ #include "phar_internal.h" #include "func_interceptors.h" @@ -1061,7 +1061,12 @@ } switch (intern->type) { case SPL_FS_DIR: - fname_len = spprintf(&fname, 0, "%s%c%s", intern->path, DEFAULT_SLASH, intern->u.dir.entry.d_name); +#if PHP_VERSION_ID >= 50300 + test = spl_filesystem_object_get_path(intern, NULL TSRMLS_CC); +#else + test = intern->path; +#endif + fname_len = spprintf(&fname, 0, "%s%c%s", test, DEFAULT_SLASH, intern->u.dir.entry.d_name); php_stat(fname, fname_len, FS_IS_DIR, &dummy TSRMLS_CC); if (Z_BVAL(dummy)) { /* ignore directories */
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.101&r2=1.2027.2.547.2.965.2.102&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.965.2.101 php-src/NEWS:1.2027.2.547.2.965.2.102 --- php-src/NEWS:1.2027.2.547.2.965.2.101 Wed Jan 30 10:27:28 2008 +++ php-src/NEWS Wed Jan 30 20:31:06 2008 @@ -29,6 +29,7 @@ SplObjectStorage. (Marcus) . Added ArrayAccess support to SplObjectStorage. (Marcus) . Added SplDoublyLinkedList, SplStack, SplQueue classes. (Etienne) + . Fixed glob:// stream handling in (Recursive)DirectoryIterator. (Marcus) - Added ability to use Traversable objects instead of plain arrays in ext/soap. (Joshua Reese, Dmitry) - Added "?:" operator. (Marcus) http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.c?r1=1.45.2.27.2.23.2.7&r2=1.45.2.27.2.23.2.8&diff_format=u Index: php-src/ext/spl/spl_directory.c diff -u php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.7 php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.8 --- php-src/ext/spl/spl_directory.c:1.45.2.27.2.23.2.7 Mon Dec 31 07:17:14 2007 +++ php-src/ext/spl/spl_directory.c Wed Jan 30 20:31:06 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.c,v 1.45.2.27.2.23.2.7 2007/12/31 07:17:14 sebastian Exp $ */ +/* $Id: spl_directory.c,v 1.45.2.27.2.23.2.8 2008/01/30 20:31:06 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -76,8 +76,8 @@ zend_object_std_dtor(&intern->std TSRMLS_CC); - if (intern->path) { - efree(intern->path); + if (intern->_path) { + efree(intern->_path); } if (intern->file_name) { efree(intern->file_name); @@ -154,6 +154,19 @@ } /* }}} */ +PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len TSRMLS_DC) /* {{{ */ +{ + if (intern->type == SPL_FS_DIR) { + if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) { + return php_glob_stream_get_path(intern->u.dir.dirp, 0, len); + } + } + if (len) { + *len = intern->_path_len; + } + return intern->_path; +} /* }}} */ + static inline void spl_filesystem_object_get_file_name(spl_filesystem_object *intern TSRMLS_DC) /* {{{ */ { if (!intern->file_name) { @@ -163,7 +176,9 @@ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized"); break; case SPL_FS_DIR: - intern->file_name_len = spprintf(&intern->file_name, 0, "%s%c%s", intern->path, DEFAULT_SLASH, intern->u.dir.entry.d_name); + intern->file_name_len = spprintf(&intern->file_name, 0, "%s%c%s", + spl_filesystem_object_get_path(intern, NULL TSRMLS_CC), + DEFAULT_SLASH, intern->u.dir.entry.d_name); break; } } @@ -174,17 +189,17 @@ static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path TSRMLS_DC) { intern->type = SPL_FS_DIR; - intern->path_len = strlen(path); + intern->_path_len = strlen(path); intern->u.dir.dirp = php_stream_opendir(path, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL); - if (intern->path_len && (path[intern->path_len-1] == '/' + if (intern->_path_len && (path[intern->_path_len-1] == '/' #if defined(PHP_WIN32) || defined(NETWARE) || path[intern->path_len-1] == '\\' #endif )) { - intern->path = estrndup(path, --intern->path_len); + intern->_path = estrndup(path, --intern->_path_len); } else { - intern->path = estrndup(path, intern->path_len); + intern->_path = estrndup(path, intern->_path_len); } intern->u.dir.index = 0; @@ -265,13 +280,13 @@ switch (source->type) { case SPL_FS_INFO: - intern->path_len = source->path_len; - intern->path = estrndup(source->path, source->path_len); + intern->_path_len = source->_path_len; + intern->_path = estrndup(source->_path, source->_path_len); intern->file_name_len = source->file_name_len; intern->file_name = estrndup(source->file_name, intern->file_name_len); break; case SPL_FS_DIR: - spl_filesystem_dir_open(intern, source->path TSRMLS_CC); + spl_filesystem_dir_open(intern, source->_path TSRMLS_CC); break; case SPL_FS_FILE: php_error_docref(NULL TSRMLS_CC, E_ERROR, "An object of class %s cannot be cloned", old_object->ce->name); @@ -308,11 +323,11 @@ p2 = 0; #endif if (p1 || p2) { - intern->path_len = (p1 > p2 ? p1 : p2) - path; + intern->_path_len = (p1 > p2 ? p1 : p2) - path; } else { - intern->path_len = 0; + intern->_path_len = 0; } - intern->path = estrndup(path, intern->path_len); + intern->_path = estrndup(path, intern->_path_len); } /* }}} */ static spl_filesystem_object * spl_filesystem_object_create_info(spl_filesystem_object *source, char *file_path, int file_path_len, int use_copy, zend_class_entry *ce, zval *return_value TSRMLS_DC) /* {{{ */ @@ -392,8 +407,8 @@ } else { intern->file_name = estrndup(source->file_name, source->file_name_len); intern->file_name_len = source->file_name_len; - intern->path = estrndup(source->path, source->path_len); - intern->path_len = source->path_len; + intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len TSRMLS_CC); + intern->_path = estrndup(intern->_path, intern->_path_len); } break; case SPL_FS_FILE: @@ -414,8 +429,8 @@ } else { intern->file_name = source->file_name; intern->file_name_len = source->file_name_len; - intern->path = estrndup(source->path, source->path_len); - intern->path_len = source->path_len; + intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len TSRMLS_CC); + intern->_path = estrndup(intern->_path, intern->_path_len); intern->u.file.open_mode = "r"; intern->u.file.open_mode_len = 1; @@ -464,8 +479,8 @@ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(obj TSRMLS_CC); HashTable *rv; zval *tmp, zrv; - char *pnstr; - int pnlen; + char *pnstr, *path; + int pnlen, path_len; char stmp[2]; *is_temp = 1; @@ -478,15 +493,23 @@ zend_hash_copy(rv, intern->std.properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); + path = spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName", sizeof("pathName")-1, &pnlen TSRMLS_CC); - add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->path, intern->path_len, 1); + add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, path, path_len, 1); efree(pnstr); if (intern->file_name) { pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1, &pnlen TSRMLS_CC); add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->file_name, intern->file_name_len, 1); efree(pnstr); } - if (intern->type == SPL_FS_DIR && intern->u.dir.sub_path) { + if (intern->type == SPL_FS_DIR) { + pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "glob", sizeof("glob")-1, &pnlen TSRMLS_CC); + if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) { + add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->_path, intern->_path_len, 1); + } else { + add_assoc_bool_ex(&zrv, pnstr, pnlen+1, 0); + } + efree(pnstr); pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "subPathName", sizeof("subPathName")-1, &pnlen TSRMLS_CC); add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->u.dir.sub_path, intern->u.dir.sub_path_len, 1); efree(pnstr); @@ -610,8 +633,11 @@ SPL_METHOD(SplFileInfo, getPath) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + char *path; + int path_len; - RETURN_STRING(intern->path, 1); + path = spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); + RETURN_STRINGL(path, path_len, 1); } /* }}} */ @@ -620,9 +646,12 @@ SPL_METHOD(SplFileInfo, getFilename) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + int path_len; - if (intern->path_len && intern->path_len < intern->file_name_len) { - RETURN_STRINGL(intern->file_name + intern->path_len + 1, intern->file_name_len - (intern->path_len + 1), 1); + spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); + + if (path_len && path_len < intern->file_name_len) { + RETURN_STRINGL(intern->file_name + path_len + 1, intern->file_name_len - (path_len + 1), 1); } else { RETURN_STRINGL(intern->file_name, intern->file_name_len, 1); } @@ -646,15 +675,17 @@ spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC); char *fname, *suffix = 0; size_t flen; - int slen = 0; + int slen = 0, path_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &suffix, &slen) == FAILURE) { return; } - if (intern->path_len && intern->path_len < intern->file_name_len) { - fname = intern->file_name + intern->path_len + 1; - flen = intern->file_name_len - (intern->path_len + 1); + spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); + + if (path_len && path_len < intern->file_name_len) { + fname = intern->file_name + path_len + 1; + flen = intern->file_name_len - (path_len + 1); } else { fname = intern->file_name; flen = intern->file_name_len; @@ -998,7 +1029,9 @@ php_set_error_handling(EH_THROW, spl_ce_UnexpectedValueException TSRMLS_CC); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) { - spl_filesystem_object_create_info(intern, intern->path, intern->path_len, 1, ce, return_value TSRMLS_CC); + int path_len; + char *path = spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC); + spl_filesystem_object_create_info(intern, path, path_len, 1, ce, return_value TSRMLS_CC); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); @@ -1790,11 +1823,11 @@ p2 = 0; #endif if (p1 || p2) { - intern->path_len = (p1 > p2 ? p1 : p2) - intern->file_name; + intern->_path_len = (p1 > p2 ? p1 : p2) - intern->file_name; } else { - intern->path_len = 0; + intern->_path_len = 0; } - intern->path = estrndup(intern->file_name, intern->path_len); + intern->_path = estrndup(intern->file_name, intern->_path_len); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); @@ -1830,8 +1863,8 @@ intern->u.file.zcontext = NULL; if (spl_filesystem_file_open(intern, 0, 0 TSRMLS_CC) == SUCCESS) { - intern->path_len = 0; - intern->path = estrndup("", 0); + intern->_path_len = 0; + intern->_path = estrndup("", 0); } php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_directory.h?r1=1.12.2.5.2.4.2.3&r2=1.12.2.5.2.4.2.4&diff_format=u Index: php-src/ext/spl/spl_directory.h diff -u php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.3 php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.4 --- php-src/ext/spl/spl_directory.h:1.12.2.5.2.4.2.3 Mon Dec 31 07:17:14 2007 +++ php-src/ext/spl/spl_directory.h Wed Jan 30 20:31:07 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_directory.h,v 1.12.2.5.2.4.2.3 2007/12/31 07:17:14 sebastian Exp $ */ +/* $Id: spl_directory.h,v 1.12.2.5.2.4.2.4 2008/01/30 20:31:07 helly Exp $ */ #ifndef SPL_DIRECTORY_H #define SPL_DIRECTORY_H @@ -43,6 +43,8 @@ typedef void (*spl_foreign_dtor_t)(spl_filesystem_object *object TSRMLS_DC); typedef void (*spl_foreign_clone_t)(spl_filesystem_object *src, spl_filesystem_object *dst TSRMLS_DC); +PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len TSRMLS_DC); + typedef struct _spl_other_handler { spl_foreign_dtor_t dtor; spl_foreign_clone_t clone; @@ -52,8 +54,8 @@ zend_object std; void *oth; spl_other_handler *oth_handler; - char *path; - int path_len; + char *_path; + int _path_len; char *file_name; int file_name_len; SPL_FS_OBJ_TYPE type; http://cvs.php.net/viewvc.cgi/pecl/phar/phar_object.c?r1=1.137&r2=1.138&diff_format=u Index: pecl/phar/phar_object.c diff -u pecl/phar/phar_object.c:1.137 pecl/phar/phar_object.c:1.138 --- pecl/phar/phar_object.c:1.137 Mon Jan 28 20:18:13 2008 +++ pecl/phar/phar_object.c Wed Jan 30 20:31:07 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c,v 1.137 2008/01/28 20:18:13 cellog Exp $ */ +/* $Id: phar_object.c,v 1.138 2008/01/30 20:31:07 helly Exp $ */ #include "phar_internal.h" #include "func_interceptors.h" @@ -1061,7 +1061,12 @@ } switch (intern->type) { case SPL_FS_DIR: - fname_len = spprintf(&fname, 0, "%s%c%s", intern->path, DEFAULT_SLASH, intern->u.dir.entry.d_name); +#if PHP_VERSION_ID >= 50300 + test = spl_filesystem_object_get_path(intern, NULL TSRMLS_CC); +#else + test = intern->path; +#endif + fname_len = spprintf(&fname, 0, "%s%c%s", test, DEFAULT_SLASH, intern->u.dir.entry.d_name); php_stat(fname, fname_len, FS_IS_DIR, &dummy TSRMLS_CC); if (Z_BVAL(dummy)) { /* ignore directories */