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);
}
}
/* }}} */