]> granicus.if.org Git - php/commitdiff
Fixed a bug in opendir(), which prevented readdir() from working properly if
authorZeev Suraski <zeev@php.net>
Tue, 27 Jun 2000 18:44:30 +0000 (18:44 +0000)
committerZeev Suraski <zeev@php.net>
Tue, 27 Jun 2000 18:44:30 +0000 (18:44 +0000)
the $dir argument wasn't explicitly specified

NEWS
ext/standard/dir.c

diff --git a/NEWS b/NEWS
index 8242d5293187d118b07f03218225f568d7bd0603..d9f922e920116c9112509bc8c85253682dc0ce2d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,7 +2,9 @@ PHP 4.0                                                                    NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
 28 Jun 2000, Version 4.0.1
-- Make --enable-discard-path work again. (Andi) 
+- Fixed a bug in opendir(), which prevented readdir() from working properly if
+  the $dir argument wasn't explicitly specified (Zeev)
+- Made --enable-discard-path work again. (Andi) 
 - Removed 8KB limit on line length of the file() function (Zeev)
 - Disabled dl() when PHP is being used as a module inside a multithreaded web
   server - it didn't work before, and caused weird results (Zeev)
@@ -96,8 +98,8 @@ PHP 4.0                                                                    NEWS
 - Clean up constants in flock() function and add optional 3rd arg which
   is set to true on EWOULDBLOCK (Rasmus)
 - Added functions pg_loimport(), pg_loexport(). (Jouni)
-- Add SWF support to getimagesize() function (Derick Rethans)
-- Add support for both indexed and non-indexed arrays of file uploads
+- Added SWF support to getimagesize() function (Derick Rethans)
+- Added support for both indexed and non-indexed arrays of file uploads
   eg. name="file[]" type="file" (Rasmus)
 - Added create_function(), which gives the ability to create functions
   on-the-fly (Zeev, Zend Engine)
@@ -151,7 +153,7 @@ PHP 4.0                                                                    NEWS
   jpeg images it generates.  (Rasmus)
 - Fixed basename() bug where "file.ext///" would not return the same
   as "/path/file.ext///" (Rasmus)
-- Add the swf_ortho function. (Sterling)
+- Added the swf_ortho function. (Sterling)
 - Moved to virtual current working directory support. This highly improves the
   functionality and stability of multi-threaded versions of PHP (Andi, Sascha)
 
index 73f9cb8f9a1cf5ed4f306a04189f15124d0568c5..c2e9a988226769134f0820318e7b9fe5d5d46a09 100644 (file)
@@ -45,12 +45,20 @@ typedef struct {
 } php_dir_globals;
 
 #ifdef ZTS
-#define DIR(v) (dir_globals->v)
+#define DIRG(v) (dir_globals->v)
 #define DIRLS_FETCH() php_dir_globals *dir_globals = ts_resource(dir_globals_id)
+#define DIRLS_D                php_dir_globals *dir_globals
+#define DIRLS_DC       , DIRLS_D
+#define DIRLS_C                dir_globals
+#define DIRLS_CC       , DIRLS_C
 int dir_globals_id;
 #else
-#define DIR(v) (dir_globals.v)
+#define DIRG(v) (dir_globals.v)
 #define DIRLS_FETCH()
+#define DIRLS_D
+#define DIRLS_DC
+#define DIRLS_C
+#define DIRLS_CC
 php_dir_globals dir_globals;
 #endif
 
@@ -73,7 +81,7 @@ static zend_class_entry *dir_class_entry_ptr;
                        } \
                        ZEND_FETCH_RESOURCE(dirp,php_dir *,tmp,-1, "Directory", le_dirp); \
                } else { \
-                       ZEND_FETCH_RESOURCE(dirp,php_dir *,0,DIR(default_dir), "Directory", le_dirp); \
+                       ZEND_FETCH_RESOURCE(dirp,php_dir *,0,DIRG(default_dir), "Directory", le_dirp); \
                } \
        } else if ((ZEND_NUM_ARGS() != 1) || zend_get_parameters_ex(1, &id) == FAILURE) { \
                WRONG_PARAM_COUNT; \
@@ -89,18 +97,26 @@ static zend_function_entry php_dir_class_functions[] = {
 };
 
 
+static void php_set_default_dir(int id DIRLS_DC)
+{
+    if (DIRG(default_dir)!=-1) {
+        zend_list_delete(DIRG(default_dir));
+    }
+    DIRG(default_dir) = id;
+    zend_list_addref(id);
+}
+
+
 static void _dir_dtor(php_dir *dirp)
 {
        closedir(dirp->dir);
        efree(dirp);
 }
 
-#ifdef ZTS
-static void php_dir_init_globals(php_dir_globals *dir_globals)
+static void php_dir_init_globals(DIRLS_D)
 {
-       DIR(default_dir) = 0;
+       DIRG(default_dir) = -1;
 }
-#endif
 
 PHP_MINIT_FUNCTION(dir)
 {
@@ -114,7 +130,7 @@ PHP_MINIT_FUNCTION(dir)
 #ifdef ZTS
        dir_globals_id = ts_allocate_id(sizeof(php_dir_globals), (ts_allocate_ctor) php_dir_init_globals, NULL);
 #else
-       DIR(default_dir) = 0;
+       php_dir_init_globals(DIRLS_C);
 #endif
 
        return SUCCESS;
@@ -150,7 +166,7 @@ static void _php_do_opendir(INTERNAL_FUNCTION_PARAMETERS, int createobject)
 
        dirp->id = zend_list_insert(dirp,le_dirp);
 
-       DIR(default_dir) = dirp->id;
+       php_set_default_dir(dirp->id DIRLS_CC);
 
        if (createobject) {
                object_init_ex(return_value, dir_class_entry_ptr);