pajoye Fri, 10 Sep 2010 19:25:56 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=303263
Log: - use php_sys_readlink Changed paths: U php/php-src/branches/PHP_5_3/ext/standard/link_win32.c U php/php-src/trunk/ext/standard/link_win32.c Modified: php/php-src/branches/PHP_5_3/ext/standard/link_win32.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/standard/link_win32.c 2010-09-10 19:21:02 UTC (rev 303262) +++ php/php-src/branches/PHP_5_3/ext/standard/link_win32.c 2010-09-10 19:25:56 UTC (rev 303263) @@ -45,7 +45,7 @@ /* TODO: -- Create php_readlink, php_link and php_symlink in win32/link.c +- Create php_readlink (done), php_link and php_symlink in win32/link.c - Expose them (PHPAPI) so extensions developers can use them - define link/readlink/symlink to their php_ equivalent and use them in ext/standart/link.c - this file is then useless and we have a portable link API @@ -63,30 +63,10 @@ Return the target of a symbolic link */ PHP_FUNCTION(readlink) { - HINSTANCE kernel32; char *link; int link_len; - TCHAR Path[MAXPATHLEN]; - char path_resolved[MAXPATHLEN]; - HANDLE hFile; - DWORD dwRet; + char target[MAXPATHLEN]; - 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) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't call GetFinalPathNameByHandleA"); - RETURN_FALSE; - } - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't call get a handle on kernel32.dll"); - RETURN_FALSE; - } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &link, &link_len) == FAILURE) { return; } @@ -94,42 +74,11 @@ if (OPENBASEDIR_CHECKPATH(link)) { RETURN_FALSE; } - if (!expand_filepath(link, path_resolved TSRMLS_CC)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory"); - RETURN_FALSE; - } - hFile = CreateFile(path_resolved, // 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) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not open file (error %d)", GetLastError()); - RETURN_FALSE; + if (php_sys_readlink(link, target, MAXPATHLEN) == -1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "readlink failed to read the symbolic link (%s), error %d)", link, GetLastError()); } - - dwRet = pGetFinalPathNameByHandle(hFile, Path, MAXPATHLEN, VOLUME_NAME_DOS); - if(dwRet >= MAXPATHLEN) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't resolve the full path, the path exceeds the MAX_PATH_LEN (%d) limit", MAXPATHLEN); - RETURN_FALSE; - } - - CloseHandle(hFile); - - /* Append NULL to the end of the string */ - Path[dwRet] = '\0'; - - if(dwRet > 4) { - /* Skip first 4 characters if they are "\??\" */ - if(Path[0] == '\\' && Path[1] == '\\' && Path[2] == '?' && Path[3] == '\\') { - RETURN_STRING(Path + 4, 1); - } - } else { - RETURN_STRING(Path, 1); - } + RETURN_STRING(target, 1); } /* }}} */ Modified: php/php-src/trunk/ext/standard/link_win32.c =================================================================== --- php/php-src/trunk/ext/standard/link_win32.c 2010-09-10 19:21:02 UTC (rev 303262) +++ php/php-src/trunk/ext/standard/link_win32.c 2010-09-10 19:25:56 UTC (rev 303263) @@ -44,7 +44,7 @@ /* TODO: -- Create php_readlink, php_link and php_symlink in win32/link.c +- Create php_readlink (done), php_link and php_symlink in win32/link.c - Expose them (PHPAPI) so extensions developers can use them - define link/readlink/symlink to their php_ equivalent and use them in ext/standart/link.c - this file is then useless and we have a portable link API @@ -62,73 +62,22 @@ Return the target of a symbolic link */ PHP_FUNCTION(readlink) { - HINSTANCE kernel32; char *link; int link_len; - TCHAR Path[MAXPATHLEN]; - char path_resolved[MAXPATHLEN]; - HANDLE hFile; - DWORD dwRet; + char target[MAXPATHLEN]; - 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) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't call GetFinalPathNameByHandleA"); - RETURN_FALSE; - } - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't call get a handle on kernel32.dll"); - RETURN_FALSE; - } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &link, &link_len) == FAILURE) { return; } - if (php_check_open_basedir(link TSRMLS_CC)) { + if (OPENBASEDIR_CHECKPATH(link)) { RETURN_FALSE; } - if (!expand_filepath(link, path_resolved TSRMLS_CC)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such file or directory"); - RETURN_FALSE; - } - hFile = CreateFile(path_resolved, // 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) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not open file (error %d)", GetLastError()); - RETURN_FALSE; + if (php_sys_readlink(link, target, MAXPATHLEN) == -1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "readlink failed to read the symbolic link (%s), error %d)", link, GetLastError()); } - - dwRet = pGetFinalPathNameByHandle(hFile, Path, MAXPATHLEN, VOLUME_NAME_DOS); - if(dwRet >= MAXPATHLEN) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't resolve the full path, the path exceeds the MAX_PATH_LEN (%d) limit", MAXPATHLEN); - RETURN_FALSE; - } - - CloseHandle(hFile); - - /* Append NULL to the end of the string */ - Path[dwRet] = '\0'; - - if(dwRet > 4) { - /* Skip first 4 characters if they are "\??\" */ - if(Path[0] == '\\' && Path[1] == '\\' && Path[2] == '?' && Path[3] == '\\') { - RETURN_STRING(Path + 4, 1); - } - } else { - RETURN_STRING(Path, 1); - } + RETURN_STRING(target, 1); } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php