pollita         Wed Jan 28 17:21:55 2004 EDT

  Modified files:              
    /php-src/ext/standard       dir.c 
    /php-src/main       php_streams.h 
    /php-src/main/streams       streams.c 
  Log:
  'Bug Fix': scandir, being a new function in PHP5 should have always been wrapper 
aware.
  
http://cvs.php.net/diff.php/php-src/ext/standard/dir.c?r1=1.132&r2=1.133&ty=u
Index: php-src/ext/standard/dir.c
diff -u php-src/ext/standard/dir.c:1.132 php-src/ext/standard/dir.c:1.133
--- php-src/ext/standard/dir.c:1.132    Thu Jan  8 03:17:31 2004
+++ php-src/ext/standard/dir.c  Wed Jan 28 17:21:53 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: dir.c,v 1.132 2004/01/08 08:17:31 andi Exp $ */
+/* $Id: dir.c,v 1.133 2004/01/28 22:21:53 pollita Exp $ */
 
 /* {{{ includes/startup/misc */
 
@@ -444,74 +444,45 @@
 /* }}} */
 #endif 
 
-/* {{{ php_alphasortr
-*/
-static int php_alphasortr(const struct dirent **a, const struct dirent **b)
-{
-       return strcoll((*b)->d_name, (*a)->d_name);
-}
-/* }}} */
-
-/* {{{ proto array scandir(string dir [, int sorting_order])
+/* {{{ proto array scandir(string dir [, int sorting_order [, resource context]])
    List files & directories inside the specified path */
 PHP_FUNCTION(scandir)
 {
        char *dirn;
        int dirn_len;
        int flags = 0;
-       char *path;
-       struct dirent **namelist;
+       php_stream_dirent **namelist;
        int n, i;
+       zval *zcontext = NULL;
+       php_stream_context *context = NULL;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &dirn, &dirn_len, 
&flags) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lr", &dirn, &dirn_len, 
&flags, &zcontext) == FAILURE) {
                return;
        }
 
-#ifdef ZTS
-       if (!IS_ABSOLUTE_PATH(dirn, dirn_len)) {
-               path = expand_filepath(dirn, NULL TSRMLS_CC);
-       } else 
-#endif
-               path = dirn;
-
-       if (PG(safe_mode) && (!php_checkuid(path, NULL, CHECKUID_CHECK_FILE_AND_DIR))) 
{
-               RETVAL_FALSE;
-               goto err;
-       }
-       if (php_check_open_basedir(path TSRMLS_CC)) {
-               RETVAL_FALSE;
-               goto err;
+       if (zcontext) {
+               context = php_stream_context_from_zval(zcontext, 0);
        }
 
        if (!flags) {
-               n = php_scandir(path, &namelist, 0, php_alphasort);
+               n = php_stream_scandir(dirn, &namelist, context, (void *) 
php_stream_dirent_alphasort);
        } else {
-               n = php_scandir(path, &namelist, 0, (void *) php_alphasortr);
+               n = php_stream_scandir(dirn, &namelist, context, (void *) 
php_stream_dirent_alphasortr);
        }
-
        if (n < 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "(errno %d): %s", errno, 
strerror(errno));
-               RETVAL_FALSE;
-               goto err;
+               RETURN_FALSE;
        }
        
        array_init(return_value);
 
        for (i = 0; i < n; i++) {
-               add_next_index_string(return_value, namelist[i]->d_name, 1);
-               free(namelist[i]);
+               add_next_index_string(return_value, namelist[i]->d_name, 0);
        }
 
        if (n) {
-               free(namelist);
+               efree(namelist);
        }
-
-err:
-       if (path && path != dirn) {
-               efree(path);
-       }
-
-       return;
 }
 /* }}} */
 
http://cvs.php.net/diff.php/php-src/main/php_streams.h?r1=1.91&r2=1.92&ty=u
Index: php-src/main/php_streams.h
diff -u php-src/main/php_streams.h:1.91 php-src/main/php_streams.h:1.92
--- php-src/main/php_streams.h:1.91     Thu Jan  8 12:33:04 2004
+++ php-src/main/php_streams.h  Wed Jan 28 17:21:53 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_streams.h,v 1.91 2004/01/08 17:33:04 sniper Exp $ */
+/* $Id: php_streams.h,v 1.92 2004/01/28 22:21:53 pollita Exp $ */
 
 #ifndef PHP_STREAMS_H
 #define PHP_STREAMS_H
@@ -325,6 +325,13 @@
 #define php_stream_closedir(dirstream) php_stream_close((dirstream))
 #define php_stream_rewinddir(dirstream)        php_stream_rewind((dirstream))
 
+PHPAPI int php_stream_dirent_alphasort(const php_stream_dirent **a, const 
php_stream_dirent **b);
+PHPAPI int php_stream_dirent_alphasortr(const php_stream_dirent **a, const 
php_stream_dirent **b);
+
+PHPAPI int _php_stream_scandir(char *dirname, php_stream_dirent **namelist[], int 
flags, php_stream_context *context,
+                       int (*compare) (const php_stream_dirent **a, const 
php_stream_dirent **b) TSRMLS_DC);
+#define php_stream_scandir(dirname, namelist, context, compare) 
_php_stream_scandir((dirname), (namelist), 0, (context), (compare) TSRMLS_CC)
+
 PHPAPI int _php_stream_set_option(php_stream *stream, int option, int value, void 
*ptrparam TSRMLS_DC);
 #define php_stream_set_option(stream, option, value, ptrvalue) 
_php_stream_set_option((stream), (option), (value), (ptrvalue) TSRMLS_CC)
 
http://cvs.php.net/diff.php/php-src/main/streams/streams.c?r1=1.47&r2=1.48&ty=u
Index: php-src/main/streams/streams.c
diff -u php-src/main/streams/streams.c:1.47 php-src/main/streams/streams.c:1.48
--- php-src/main/streams/streams.c:1.47 Thu Jan  8 03:17:59 2004
+++ php-src/main/streams/streams.c      Wed Jan 28 17:21:54 2004
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.47 2004/01/08 08:17:59 andi Exp $ */
+/* $Id: streams.c,v 1.48 2004/01/28 22:21:54 pollita Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -1834,6 +1834,65 @@
 }
 /* }}} */
 
+/* {{{ php_stream_dirent_alphasort
+ */
+PHPAPI int php_stream_dirent_alphasort(const php_stream_dirent **a, const 
php_stream_dirent **b)
+{
+       return strcoll((*a)->d_name,(*b)->d_name);
+}
+/* }}} */
+
+/* {{{ php_stream_dirent_alphasortr
+ */
+PHPAPI int php_stream_dirent_alphasortr(const php_stream_dirent **a, const 
php_stream_dirent **b)
+{
+       return strcoll((*b)->d_name,(*a)->d_name);
+}
+/* }}} */
+
+/* {{{ php_stream_scandir
+ */
+PHPAPI int _php_stream_scandir(char *dirname, php_stream_dirent **namelist[], int 
flags, php_stream_context *context,
+                         int (*compare) (const php_stream_dirent **a, const 
php_stream_dirent **b) TSRMLS_DC)
+{
+       php_stream *stream;
+       php_stream_dirent sdp;
+       php_stream_dirent **vector = NULL;
+       int vector_size = 0;
+       int nfiles = 0;
+
+       if (!namelist) {
+               return FAILURE;
+       }
+
+       stream = php_stream_opendir(dirname, ENFORCE_SAFE_MODE | REPORT_ERRORS, 
context);
+       if (!stream) {
+               return FAILURE;
+       }
+
+       while (php_stream_readdir(stream, &sdp)) {
+               if (nfiles == vector_size) {
+                       if (vector_size == 0) {
+                               vector_size = 10;
+                       } else {
+                               vector_size *= 2;
+                       }
+                       vector = (php_stream_dirent **) erealloc(vector, vector_size * 
sizeof(php_stream_dirent *));
+               }
+
+               vector[nfiles++] = (php_stream_dirent*)estrndup(&sdp, 
sizeof(php_stream_dirent) + ((strlen(sdp.d_name) + 1) * sizeof(char)));
+       }
+       php_stream_closedir(stream);
+
+       *namelist = vector;
+
+       if (compare) {
+               qsort(*namelist, nfiles, sizeof(php_stream_dirent *), compare);
+       }
+       return nfiles;
+}
+/* }}} */
+
 /*
  * Local variables:
  * tab-width: 4

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to