fix bug #30388 (rename across filesystems loses ownership and permission info)

This commit is contained in:
Antony Dovgal 2004-10-27 11:58:49 +00:00
parent c8cc96e6fe
commit ceacc834fb

View file

@ -1021,10 +1021,33 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c
if (ret == -1) { if (ret == -1) {
#ifdef EXDEV #ifdef EXDEV
if (errno == EXDEV) { if (errno == EXDEV) {
struct stat sb;
if (php_copy_file(url_from, url_to TSRMLS_CC) == SUCCESS) { if (php_copy_file(url_from, url_to TSRMLS_CC) == SUCCESS) {
VCWD_UNLINK(url_from); if (VCWD_STAT(url_from, &sb) == 0) {
return 1; if (VCWD_CHMOD(url_to, sb.st_mode)) {
if (errno == EPERM) {
php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
VCWD_UNLINK(url_from);
return 1;
}
php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
return 0;
}
if (VCWD_CHOWN(url_to, sb.st_uid, sb.st_gid)) {
if (errno == EPERM) {
php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
VCWD_UNLINK(url_from);
return 1;
}
php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
return 0;
}
VCWD_UNLINK(url_from);
return 1;
}
} }
php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
return 0;
} }
#endif #endif
php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno)); php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));