pollita         Fri Sep 22 23:57:38 2006 UTC

  Modified files:              
    /php-src/ext/standard       dir.c 
  Log:
  PHP6 Updates
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/dir.c?r1=1.153&r2=1.154&diff_format=u
Index: php-src/ext/standard/dir.c
diff -u php-src/ext/standard/dir.c:1.153 php-src/ext/standard/dir.c:1.154
--- php-src/ext/standard/dir.c:1.153    Sun Feb 19 04:29:41 2006
+++ php-src/ext/standard/dir.c  Fri Sep 22 23:57:38 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: dir.c,v 1.153 2006/02/19 04:29:41 andi Exp $ */
+/* $Id: dir.c,v 1.154 2006/09/22 23:57:38 pollita Exp $ */
 
 /* {{{ includes/startup/misc */
 
@@ -178,40 +178,63 @@
 /* {{{ internal functions */
 static void _php_do_opendir(INTERNAL_FUNCTION_PARAMETERS, int createobject)
 {
-       char *dirname;
-       int dir_len;
+       UChar *udir;
+       char *dir;
+       int dir_len, udir_len;
+       zend_uchar dir_type;
        zval *zcontext = NULL;
        php_stream_context *context = NULL;
        php_stream *dirp;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &dirname, 
&dir_len, &zcontext) == FAILURE) {
-               RETURN_NULL();
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|r", &dir, 
&dir_len, &zcontext) == FAILURE) {
+               return;
        }
 
+       RETVAL_FALSE;
+
+       /* Save for later */
+       udir = (UChar*)dir;
+       udir_len = dir_len;
+
        if (zcontext) {
                context = php_stream_context_from_zval(zcontext, 0);
        }
-       
-       dirp = php_stream_opendir(dirname, REPORT_ERRORS, context);
+
+       if (dir_type == IS_UNICODE) {
+               if (FAILURE == php_stream_path_encode(NULL, &dir, &dir_len, 
udir, udir_len, REPORT_ERRORS, context)) {
+                       goto opendir_cleanup;
+               }
+       }
+
+       dirp = php_stream_opendir(dir, REPORT_ERRORS, context);
 
        if (dirp == NULL) {
-               RETURN_FALSE;
+               goto opendir_cleanup;
        }
                
        php_set_default_dir(dirp->rsrc_id TSRMLS_CC);
 
        if (createobject) {
                object_init_ex(return_value, dir_class_entry_ptr);
-               add_property_rt_stringl(return_value, "path", dirname, dir_len, 
1);
+               if (dir_type == IS_UNICODE) {
+                       add_property_unicodel(return_value, "path", udir, 
udir_len, 1);
+               } else {
+                       add_property_stringl(return_value, "path", dir, 
dir_len, 1);
+               }
                add_property_resource(return_value, "handle", dirp->rsrc_id);
                php_stream_auto_cleanup(dirp); /* so we don't get warnings 
under debug */
        } else {
                php_stream_to_zval(dirp, return_value);
        }
+
+opendir_cleanup:
+       if (dir_type == IS_UNICODE) {
+               efree(dir);
+       }
 }
 /* }}} */
 
-/* {{{ proto mixed opendir(string path[, resource context])
+/* {{{ proto mixed opendir(string path[, resource context]) U
    Open a directory and return a dir_handle */
 PHP_FUNCTION(opendir)
 {
@@ -219,7 +242,7 @@
 }
 /* }}} */
 
-/* {{{ proto object dir(string directory[, resource context])
+/* {{{ proto object dir(string directory[, resource context]) U
    Directory class with properties, handle and class and methods read, rewind 
and close */
 PHP_FUNCTION(getdir)
 {
@@ -227,7 +250,7 @@
 }
 /* }}} */
 
-/* {{{ proto void closedir([resource dir_handle])
+/* {{{ proto void closedir([resource dir_handle]) U
    Close directory connection identified by the dir_handle */
 PHP_FUNCTION(closedir)
 {
@@ -245,18 +268,28 @@
 /* }}} */
 
 #if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC
-/* {{{ proto bool chroot(string directory)
+/* {{{ proto bool chroot(string directory) U
    Change root directory */
 PHP_FUNCTION(chroot)
 {
        char *str;
        int ret, str_len;
+       zend_uchar str_type;
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, 
&str_len) == FAILURE) {
-               RETURN_FALSE;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &str, 
&str_len, &str_type) == FAILURE) {
+               return;
+       }
+
+       if (str_type == IS_UNICODE) {
+               if (FAILURE == php_stream_path_encode(NULL, &str, &str_len, 
(UChar*)str, str_len, REPORT_ERRORS, FG(default_context))) {
+                       RETURN_FALSE;
+               }
        }
        
        ret = chroot(str);
+       if (str_type == IS_UNICODE) {
+               efree(str);
+       }
        
        if (ret != 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s (errno %d)", 
strerror(errno), errno);
@@ -275,18 +308,28 @@
 /* }}} */
 #endif
 
-/* {{{ proto bool chdir(string directory)
+/* {{{ proto bool chdir(string directory) U
    Change the current directory */
 PHP_FUNCTION(chdir)
 {
        char *str;
        int ret, str_len;
+       zend_uchar str_type;
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, 
&str_len) == FAILURE) {
-               RETURN_FALSE;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &str, 
&str_len, &str_type) == FAILURE) {
+               return;
+       }
+
+       if (str_type == IS_UNICODE) {
+               if (FAILURE == php_stream_path_encode(NULL, &str, &str_len, 
(UChar*)str, str_len, REPORT_ERRORS, FG(default_context))) {
+                       RETURN_FALSE;
+               }
        }
 
        ret = VCWD_CHDIR(str);
+       if (str_type == IS_UNICODE) {
+               efree(str);
+       }
        
        if (ret != 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s (errno %d)", 
strerror(errno), errno);
@@ -297,7 +340,7 @@
 }
 /* }}} */
 
-/* {{{ proto mixed getcwd(void)
+/* {{{ proto mixed getcwd(void) U
    Gets the current directory */
 PHP_FUNCTION(getcwd)
 {
@@ -315,14 +358,14 @@
 #endif
 
        if (ret) {
-               RETURN_RT_STRING(path, 1);
+               RETURN_RT_STRING(path, ZSTR_DUPLICATE);
        } else {
                RETURN_FALSE;
        }
 }
 /* }}} */
 
-/* {{{ proto void rewinddir([resource dir_handle])
+/* {{{ proto void rewinddir([resource dir_handle]) U
    Rewind dir_handle back to the start */
 PHP_FUNCTION(rewinddir)
 {
@@ -335,7 +378,7 @@
 }
 /* }}} */
 
-/* {{{ proto string readdir([resource dir_handle])
+/* {{{ proto string readdir([resource dir_handle]) U
    Read directory entry from dir_handle */
 PHP_NAMED_FUNCTION(php_if_readdir)
 {
@@ -346,7 +389,7 @@
        FETCH_DIRP();
 
        if (php_stream_readdir(dirp, &entry)) {
-               RETURN_RT_STRINGL(entry.d_name, strlen(entry.d_name), 1);
+               RETURN_RT_STRINGL(entry.d_name, strlen(entry.d_name), 
ZSTR_DUPLICATE);
        }
        RETURN_FALSE;
 }
@@ -419,7 +462,7 @@
        /* we assume that any glob pattern will match files from one directory 
only
           so checking the dirname of the first match should be sufficient */
        strncpy(cwd, globbuf.gl_pathv[0], MAXPATHLEN);
-
+
        if (php_check_open_basedir(cwd TSRMLS_CC)) {
                RETURN_FALSE;
        }

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

Reply via email to