]> granicus.if.org Git - php/commitdiff
MFB: Fixed bug #48788 (RecursiveDirectoryIterator doesn't descend into
authorIlia Alshanetsky <iliaa@php.net>
Wed, 8 Jul 2009 03:09:58 +0000 (03:09 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Wed, 8 Jul 2009 03:09:58 +0000 (03:09 +0000)
symlinked
directories).

ext/spl/spl_directory.c
ext/spl/spl_directory.h

index 75d66c46daaa92dd133cd99f87fac3cec1482b16..e8aebef2445940e307587a582ed795304279ecd3 100755 (executable)
@@ -1364,7 +1364,7 @@ SPL_METHOD(RecursiveDirectoryIterator, hasChildren)
                        return;
                }
                spl_filesystem_object_get_file_name(intern TSRMLS_CC);
-               if (!allow_links) {
+               if (!allow_links && !(intern->flags & SPL_FILE_DIR_FOLLOW_SYMLINKS)) {
                        php_u_stat(intern->file_name_type, intern->file_name, intern->file_name_len, FS_IS_LINK, FG(default_context), return_value TSRMLS_CC);
                        if (zend_is_true(return_value)) {
                                RETURN_FALSE;
@@ -2787,6 +2787,7 @@ PHP_MINIT_FUNCTION(spl_directory)
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_AS_SELF",     SPL_FILE_DIR_CURRENT_AS_SELF);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_MODE_MASK",       SPL_FILE_DIR_KEY_MODE_MASK);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_AS_PATHNAME",     SPL_FILE_DIR_KEY_AS_PATHNAME);
+       REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "FOLLOW_SYMLINKS",     SPL_FILE_DIR_FOLLOW_SYMLINKS);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "KEY_AS_FILENAME",     SPL_FILE_DIR_KEY_AS_FILENAME);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "NEW_CURRENT_AND_KEY", SPL_FILE_DIR_KEY_AS_FILENAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO);
        REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "SKIP_DOTS",           SPL_FILE_DIR_SKIPDOTS);
index 091b742a4003c627edfcfde82216457138cec263..e08571c8453c87d30632d8611997feca2432c66f 100755 (executable)
@@ -131,6 +131,7 @@ static inline spl_filesystem_object* spl_filesystem_iterator_to_object(spl_files
 
 #define SPL_FILE_DIR_KEY_AS_PATHNAME       0x00000000 /* make RecursiveDirectoryTree::key() return getPathname() */
 #define SPL_FILE_DIR_KEY_AS_FILENAME       0x00000100 /* make RecursiveDirectoryTree::key() return getFilename() */
+#define SPL_FILE_DIR_FOLLOW_SYMLINKS       0x00000200 /* make RecursiveDirectoryTree::hasChildren() follow symlinks */
 #define SPL_FILE_DIR_KEY_MODE_MASK         0x00000F00 /* mask RecursiveDirectoryTree::key() */
 #define SPL_FILE_DIR_KEY(intern,mode)      ((intern->flags&SPL_FILE_DIR_KEY_MODE_MASK)==mode)