]> granicus.if.org Git - php/commitdiff
- [DOC] #45986, bad file descriptor warning when rename is used with invalid path...
authorPierre Joye <pajoye@php.net>
Tue, 26 Jan 2010 20:04:03 +0000 (20:04 +0000)
committerPierre Joye <pajoye@php.net>
Tue, 26 Jan 2010 20:04:03 +0000 (20:04 +0000)
main/main.c
main/php.h
main/streams/plain_wrapper.c

index a7c9d818ece3d1c6e2981a1d6a568d3e86be64d9..e074e71ed78b9265b5feef3d3a2a4824e0da0e62 100644 (file)
@@ -848,6 +848,27 @@ PHPAPI void php_error_docref2(const char *docref TSRMLS_DC, const char *param1,
 }
 /* }}} */
 
+#ifdef PHP_WIN32
+#define PHP_WIN32_ERROR_MSG_BUFFER_SIZE 512
+PHPAPI void php_win32_docref2_from_error(DWORD error, const char *param1, const char *param2 TSRMLS_DC) {
+       if (error == 0) {
+               php_error_docref2(NULL TSRMLS_CC, param1, param2, E_WARNING, "%s", strerror(errno));
+       } else {
+               char buf[PHP_WIN32_ERROR_MSG_BUFFER_SIZE + 1];
+               int buf_len;
+
+               FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, buf, PHP_WIN32_ERROR_MSG_BUFFER_SIZE, NULL);
+               buf_len = strlen(buf);
+               if (buf_len >= 2) {
+                       buf[buf_len - 1] = '\0';
+                       buf[buf_len - 2] = '\0';
+               }
+               php_error_docref2(NULL TSRMLS_CC, param1, param2, E_WARNING, "%s (code: %lu)", (char *)buf, error);
+       }
+}
+#undef PHP_WIN32_ERROR_MSG_BUFFER_SIZE
+#endif
+
 /* {{{ php_html_puts */
 PHPAPI void php_html_puts(const char *str, uint size TSRMLS_DC)
 {
index a7dad52b054d78009d69f6939b33732131befbb4..9c3124cf99f1aed218d01417d74c5de76c0973c5 100644 (file)
@@ -309,6 +309,8 @@ PHPAPI void php_error_docref1(const char *docref TSRMLS_DC, const char *param1,
        PHP_ATTRIBUTE_FORMAT(printf, PHP_ATTR_FMT_OFFSET + 4, PHP_ATTR_FMT_OFFSET + 5);
 PHPAPI void php_error_docref2(const char *docref TSRMLS_DC, const char *param1, const char *param2, int type, const char *format, ...)
        PHP_ATTRIBUTE_FORMAT(printf, PHP_ATTR_FMT_OFFSET + 5, PHP_ATTR_FMT_OFFSET + 6);
+PHPAPI void php_win32_docref2_from_error(DWORD error, const char *param1, const char *param2 TSRMLS_DC);
+
 END_EXTERN_C()
 
 #define php_error_docref php_error_docref0
index 1c415b22325899400075b03933e574e719deb326..8d94c27c227355cf59ac2147687207c45aca5617 100644 (file)
@@ -1080,12 +1080,13 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c
        ret = VCWD_RENAME(url_from, url_to);
 
        if (ret == -1) {
-#ifdef EXDEV
+#ifndef PHP_WIN32
+# ifdef EXDEV
                if (errno == EXDEV) {
                        struct stat sb;
                        if (php_copy_file(url_from, url_to TSRMLS_CC) == SUCCESS) {
                                if (VCWD_STAT(url_from, &sb) == 0) {
-#if !defined(TSRM_WIN32) && !defined(NETWARE)
+#  if !defined(TSRM_WIN32) && !defined(NETWARE)
                                        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));
@@ -1104,7 +1105,7 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c
                                                php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
                                                return 0;
                                        }
-#endif
+#  endif
                                        VCWD_UNLINK(url_from);
                                        return 1;
                                }
@@ -1112,8 +1113,14 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c
                        php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
                        return 0;
                }
+# endif
 #endif
+
+#ifdef PHP_WIN32
+               php_win32_docref2_from_error(GetLastError(), url_from, url_to TSRMLS_CC);
+#else
                php_error_docref2(NULL TSRMLS_CC, url_from, url_to, E_WARNING, "%s", strerror(errno));
+#endif
         return 0;
        }