]> granicus.if.org Git - php/commitdiff
Update copy() for PHP6
authorSara Golemon <pollita@php.net>
Fri, 22 Sep 2006 20:02:26 +0000 (20:02 +0000)
committerSara Golemon <pollita@php.net>
Fri, 22 Sep 2006 20:02:26 +0000 (20:02 +0000)
ext/standard/file.c

index a8b7b124a21b87099d81a1a4cb7d7807c711d189..4d8075a4fe2e86a440a12eea03a53a1dc1c5f0ac 100644 (file)
@@ -1779,23 +1779,45 @@ PHP_NAMED_FUNCTION(php_if_fstat)
    Copy a file */
 PHP_FUNCTION(copy)
 {
-       zval **source, **target;
+       char *source, *dest;
+       int source_len, dest_len;
+       zend_uchar source_type, dest_type;
+       zend_uchar free_source = 0, free_dest = 0;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &source, &target) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "tt", &source, &source_len, &source_type, &dest, &dest_len, &dest_type) == FAILURE) {
+               return;
        }
 
-       convert_to_string_ex(source);
-       convert_to_string_ex(target);
+       /* Assume failure until success is known */
+       RETVAL_FALSE;   
 
-       if (php_check_open_basedir(Z_STRVAL_PP(source) TSRMLS_CC)) {
-               RETURN_FALSE;
+       if (source_type == IS_UNICODE) {
+               if (FAILURE == php_stream_path_encode(NULL, &source, &source_len, (UChar*)source, source_len, REPORT_ERRORS, FG(default_context))) {
+                       goto copy_cleanup;
+               }
+               free_source = 1;
+       }
+       if (dest_type == IS_UNICODE) {
+               if (FAILURE == php_stream_path_encode(NULL, &dest, &dest_len, (UChar*)dest, dest_len, REPORT_ERRORS, FG(default_context))) {
+                       goto copy_cleanup;
+               }
+               free_dest = 1;
        }
 
-       if (php_copy_file(Z_STRVAL_PP(source), Z_STRVAL_PP(target) TSRMLS_CC)==SUCCESS) {
-               RETURN_TRUE;
-       } else {
-               RETURN_FALSE;
+       if (php_check_open_basedir(source TSRMLS_CC)) {
+               goto copy_cleanup;
+       }
+
+       if (php_copy_file(source, target TSRMLS_CC) == SUCCESS) {
+               RETVAL_TRUE;
+       }
+
+copy_cleanup:
+       if (free_source) {
+               efree(source);
+       }
+       if (free_dest) {
+               efree(dest);
        }
 }
 /* }}} */