pajoye                                   Fri, 10 Sep 2010 14:01:44 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=303256

Log:
- add php_sys_readlink

Changed paths:
    U   php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c
    U   php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.h
    U   php/php-src/branches/PHP_5_3/UPGRADING.INTERNALS
    U   php/php-src/trunk/TSRM/tsrm_virtual_cwd.c
    U   php/php-src/trunk/TSRM/tsrm_virtual_cwd.h
    U   php/php-src/trunk/UPGRADING.INTERNALS

Modified: php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c
===================================================================
--- php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c        2010-09-10 
13:22:05 UTC (rev 303255)
+++ php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.c        2010-09-10 
14:01:44 UTC (rev 303256)
@@ -207,6 +207,60 @@
        return (time_t)UnixTime;
 }

+CWD_API int php_sys_readlink(const char *link, char *target, size_t 
target_len){ /* {{{ */
+       HINSTANCE kernel32;
+       HANDLE hFile;
+       DWORD dwRet;
+
+       typedef BOOL (WINAPI *gfpnh_func)(HANDLE, LPTSTR, DWORD, DWORD);
+       gfpnh_func pGetFinalPathNameByHandle;
+
+       kernel32 = LoadLibrary("kernel32.dll");
+
+       if (kernel32) {
+               pGetFinalPathNameByHandle = 
(gfpnh_func)GetProcAddress(kernel32, "GetFinalPathNameByHandleA");
+               if (pGetFinalPathNameByHandle == NULL) {
+                       return -1;
+               }
+       } else {
+               return -1;
+       }
+
+       hFile = CreateFile(link,            // file to open
+                                GENERIC_READ,          // open for reading
+                                FILE_SHARE_READ,       // share for reading
+                                NULL,                  // default security
+                                OPEN_EXISTING,         // existing file only
+                                FILE_FLAG_BACKUP_SEMANTICS, // normal file
+                                NULL);                 // no attr. template
+
+       if( hFile == INVALID_HANDLE_VALUE) {
+                       return -1;
+       }
+
+       dwRet = pGetFinalPathNameByHandle(hFile, target, MAXPATHLEN, 
VOLUME_NAME_DOS);
+       if(dwRet >= MAXPATHLEN) {
+               return -1;
+       }
+
+       CloseHandle(hFile);
+
+       if(dwRet > 4) {
+               /* Skip first 4 characters if they are "\??\" */
+               if(target[0] == '\\' && target[1] == '\\' && target[2] == '?' 
&& target[3] ==  '\\') {
+                       char tmp[MAXPATHLEN];
+
+                       dwRet -= 4;
+                       memcpy(tmp, target + 4, dwRet);
+                       memcpy(target, tmp, dwRet);
+               }
+       }
+
+       target[dwRet] = '\0';
+       return dwRet;
+}
+/* }}} */
+
 CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* 
{{{ */
 {
        WIN32_FILE_ATTRIBUTE_DATA data;
@@ -756,7 +810,7 @@
                tmp = tsrm_do_alloca(len+1, use_heap);
                memcpy(tmp, path, len+1);

-               if(save &&
+               if(save &&
                                !(IS_UNC_PATH(path, len) && len >= 3 && path[2] 
!= '?') &&
                                (data.dwFileAttributes & 
FILE_ATTRIBUTE_REPARSE_POINT)) {
                        /* File is a reparse point. Get the target */

Modified: php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.h
===================================================================
--- php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.h        2010-09-10 
13:22:05 UTC (rev 303255)
+++ php/php-src/branches/PHP_5_3/TSRM/tsrm_virtual_cwd.h        2010-09-10 
14:01:44 UTC (rev 303256)
@@ -133,9 +133,13 @@
 CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat);
 # define php_sys_stat(path, buf) php_sys_stat_ex(path, buf, 0)
 # define php_sys_lstat(path, buf) php_sys_stat_ex(path, buf, 1)
+CWD_API int php_sys_readlink(link, target, target_len);
 #else
 # define php_sys_stat stat
 # define php_sys_lstat lstat
+# ifdef HAVE_SYMLINK
+# define php_sys_readlink(link, target, target_len) readlink(link, target, 
target_len)
+# endif
 #endif

 typedef struct _cwd_state {

Modified: php/php-src/branches/PHP_5_3/UPGRADING.INTERNALS
===================================================================
--- php/php-src/branches/PHP_5_3/UPGRADING.INTERNALS    2010-09-10 13:22:05 UTC 
(rev 303255)
+++ php/php-src/branches/PHP_5_3/UPGRADING.INTERNALS    2010-09-10 14:01:44 UTC 
(rev 303256)
@@ -8,9 +8,16 @@
 1. Internal API changes
 ========================

-       b. stat/lstat support
+       a. stat/lstat support

 lstat is now available on all platforms. On unix-like platform
 php_sys_lstat is an alias to lstat (when avaible). On Windows it is now
 available using php_sys_lstat. php_sys_stat and php_sys_lstat usage is 
recommended
 instead of calling lstat directly, to ensure portability.
+
+       b. readlink support
+
+readlink is now available on all platforms. On unix-like platform
+php_sys_readlink is an alias to readlink (when avaible). On Windows it is now
+available using php_sys_readlink. php_sys_readlink usage is recommended
+instead of calling readlink directly, to ensure portability.

Modified: php/php-src/trunk/TSRM/tsrm_virtual_cwd.c
===================================================================
--- php/php-src/trunk/TSRM/tsrm_virtual_cwd.c   2010-09-10 13:22:05 UTC (rev 
303255)
+++ php/php-src/trunk/TSRM/tsrm_virtual_cwd.c   2010-09-10 14:01:44 UTC (rev 
303256)
@@ -207,6 +207,60 @@
        return (time_t)UnixTime;
 }

+CWD_API int php_sys_readlink(const char *link, char *target, size_t 
target_len){ /* {{{ */
+       HINSTANCE kernel32;
+       HANDLE hFile;
+       DWORD dwRet;
+
+       typedef BOOL (WINAPI *gfpnh_func)(HANDLE, LPTSTR, DWORD, DWORD);
+       gfpnh_func pGetFinalPathNameByHandle;
+
+       kernel32 = LoadLibrary("kernel32.dll");
+
+       if (kernel32) {
+               pGetFinalPathNameByHandle = 
(gfpnh_func)GetProcAddress(kernel32, "GetFinalPathNameByHandleA");
+               if (pGetFinalPathNameByHandle == NULL) {
+                       return -1;
+               }
+       } else {
+               return -1;
+       }
+
+       hFile = CreateFile(link,            // file to open
+                                GENERIC_READ,          // open for reading
+                                FILE_SHARE_READ,       // share for reading
+                                NULL,                  // default security
+                                OPEN_EXISTING,         // existing file only
+                                FILE_FLAG_BACKUP_SEMANTICS, // normal file
+                                NULL);                 // no attr. template
+
+       if( hFile == INVALID_HANDLE_VALUE) {
+                       return -1;
+       }
+
+       dwRet = pGetFinalPathNameByHandle(hFile, target, MAXPATHLEN, 
VOLUME_NAME_DOS);
+       if(dwRet >= MAXPATHLEN) {
+               return -1;
+       }
+
+       CloseHandle(hFile);
+
+       if(dwRet > 4) {
+               /* Skip first 4 characters if they are "\??\" */
+               if(target[0] == '\\' && target[1] == '\\' && target[2] == '?' 
&& target[3] ==  '\\') {
+                       char tmp[MAXPATHLEN];
+
+                       dwRet -= 4;
+                       memcpy(tmp, target + 4, dwRet);
+                       memcpy(target, tmp, dwRet);
+               }
+       }
+
+       target[dwRet] = '\0';
+       return dwRet;
+}
+/* }}} */
+
 CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* 
{{{ */
 {
        WIN32_FILE_ATTRIBUTE_DATA data;

Modified: php/php-src/trunk/TSRM/tsrm_virtual_cwd.h
===================================================================
--- php/php-src/trunk/TSRM/tsrm_virtual_cwd.h   2010-09-10 13:22:05 UTC (rev 
303255)
+++ php/php-src/trunk/TSRM/tsrm_virtual_cwd.h   2010-09-10 14:01:44 UTC (rev 
303256)
@@ -133,9 +133,13 @@
 CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat);
 # define php_sys_stat(path, buf) php_sys_stat_ex(path, buf, 0)
 # define php_sys_lstat(path, buf) php_sys_stat_ex(path, buf, 1)
+CWD_API int php_sys_readlink(link, target, target_len);
 #else
 # define php_sys_stat stat
 # define php_sys_lstat lstat
+# ifdef HAVE_SYMLINK
+# define php_sys_readlink(link, target, target_len) readlink(link, target, 
target_len)
+# endif
 #endif

 typedef struct _cwd_state {

Modified: php/php-src/trunk/UPGRADING.INTERNALS
===================================================================
--- php/php-src/trunk/UPGRADING.INTERNALS       2010-09-10 13:22:05 UTC (rev 
303255)
+++ php/php-src/trunk/UPGRADING.INTERNALS       2010-09-10 14:01:44 UTC (rev 
303256)
@@ -20,3 +20,10 @@
 php_sys_lstat is an alias to lstat (when avaible). On Windows it is now
 available using php_sys_lstat. php_sys_stat and php_sys_lstat usage is 
recommended
 instead of calling lstat directly, to ensure portability.
+
+       b. readlink support
+
+readlink is now available on all platforms. On unix-like platform
+php_sys_readlink is an alias to readlink (when avaible). On Windows it is now
+available using php_sys_readlink. php_sys_readlink usage is recommended
+instead of calling readlink directly, to ensure portability.

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to