]> granicus.if.org Git - php/commitdiff
- Implement bug #51804, splFileInfo::getLinkTarget() on Windows
authorPierre Joye <pajoye@php.net>
Fri, 10 Sep 2010 14:17:40 +0000 (14:17 +0000)
committerPierre Joye <pajoye@php.net>
Fri, 10 Sep 2010 14:17:40 +0000 (14:17 +0000)
NEWS
ext/spl/spl_directory.c

diff --git a/NEWS b/NEWS
index e52246a6f103170922bfc9acdb5a3f0c630515b5..124d1ec0fa45206ae0e372ae08d666100e60d614 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@
   (Andrey)
 - Improved support for is_link and related functions on Windows. (Pierre)
 
+- Implemented FR #51804, SplFileInfo::getLinkTarget on Windows. (Pierre)
+
 - Fixed symbolic resolution support when the target is a DFS share. (Pierre)
 - Fixed MOPS-2010-24, fix string validation. (CVE-2010-2950). (Pierre)
 - Changed deprecated ini options on startup from E_WARNING to E_DEPRECATED. 
index 5a3bd48ea5b4a45c6899699014a648f113c16ae7..98e810ab042de1d2cf0c8c86ebb910d9dea430b1 100755 (executable)
@@ -1050,8 +1050,21 @@ SPL_METHOD(SplFileInfo, getLinkTarget)
 
        zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling TSRMLS_CC);
 
-#ifdef HAVE_SYMLINK
-       ret = readlink(intern->file_name, buff, MAXPATHLEN-1);
+#if defined(PHP_WIN32) || HAVE_SYMLINK
+       if (!IS_ABSOLUTE_PATH(intern->file_name, intern->file_name_len)) {
+               char expanded_path[MAXPATHLEN];
+
+               /* TODO: Fix expand_filepath to do not resolve links but only expand the path
+                  avoiding double two resolution attempts
+                  (Pierre) */
+               if (!expand_filepath(intern->file_name, expanded_path TSRMLS_CC)) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory");
+                       RETURN_FALSE;
+               }
+               ret = php_sys_readlink(expanded_path, buff, MAXPATHLEN - 1);
+       } else {
+               ret = php_sys_readlink(intern->file_name, buff,  MAXPATHLEN-1);
+       }
 #else
        ret = -1; /* always fail if not implemented */
 #endif