diff options
author | Anatol Belski <ab@php.net> | 2016-08-11 13:16:51 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2016-08-11 13:38:28 +0200 |
commit | 6359c7a2bffef34a9f360c8f8522dc6ec2d191d1 (patch) | |
tree | 3bf6542a3137446166462606b6ad2789f8b9746a | |
parent | 622d2f41d1cdb597f4fafecaaacf66e238742bd4 (diff) | |
download | php-git-6359c7a2bffef34a9f360c8f8522dc6ec2d191d1.tar.gz |
add missing mb path support chunk
-rw-r--r-- | ext/standard/filestat.c | 111 |
1 files changed, 18 insertions, 93 deletions
diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index f6bd99c474..4e80b2cbd3 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -110,59 +110,22 @@ PHP_RSHUTDOWN_FUNCTION(filestat) /* {{{ */ static int php_disk_total_space(char *path, double *space) /* {{{ */ #if defined(WINDOWS) /* {{{ */ { - double bytestotal = 0; - HINSTANCE kernel32; - FARPROC gdfse; - typedef BOOL (WINAPI *gdfse_func)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); - gdfse_func func; - - /* These are used by GetDiskFreeSpaceEx, if available. */ ULARGE_INTEGER FreeBytesAvailableToCaller; ULARGE_INTEGER TotalNumberOfBytes; ULARGE_INTEGER TotalNumberOfFreeBytes; + PHP_WIN32_IOUTIL_INIT_W(path) - /* These are used by GetDiskFreeSpace otherwise. */ - DWORD SectorsPerCluster; - DWORD BytesPerSector; - DWORD NumberOfFreeClusters; - DWORD TotalNumberOfClusters; - - /* GetDiskFreeSpaceEx is only available in NT and Win95 post-OSR2, - so we have to jump through some hoops to see if the function - exists. */ - kernel32 = LoadLibrary("kernel32.dll"); - if (kernel32) { - gdfse = GetProcAddress(kernel32, "GetDiskFreeSpaceExA"); - /* It's available, so we can call it. */ - if (gdfse) { - func = (gdfse_func)gdfse; - if (func(path, - &FreeBytesAvailableToCaller, - &TotalNumberOfBytes, - &TotalNumberOfFreeBytes) == 0) { - php_error_docref(NULL, E_WARNING, "%s", php_win_err()); - return FAILURE; - } - - /* i know - this is ugly, but i works <thies@thieso.net> */ - bytestotal = TotalNumberOfBytes.HighPart * - (double) (((zend_ulong)1) << 31) * 2.0 + - TotalNumberOfBytes.LowPart; - } else { /* If it's not available, we just use GetDiskFreeSpace */ - if (GetDiskFreeSpace(path, - &SectorsPerCluster, &BytesPerSector, - &NumberOfFreeClusters, &TotalNumberOfClusters) == 0) { - php_error_docref(NULL, E_WARNING, "%s", php_win_err()); - return FAILURE; - } - bytestotal = (double)TotalNumberOfClusters * (double)SectorsPerCluster * (double)BytesPerSector; - } - } else { - php_error_docref(NULL, E_WARNING, "Unable to load kernel32.dll"); + if (GetDiskFreeSpaceExW(path, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) == 0) { + php_error_docref(NULL, E_WARNING, "%s", php_win_err()); + PHP_WIN32_IOUTIL_CLEANUP_W() return FAILURE; } - *space = bytestotal; + /* i know - this is ugly, but i works <thies@thieso.net> */ + *space = TotalNumberOfBytes.HighPart * (double) (((zend_ulong)1) << 31) * 2.0 + TotalNumberOfBytes.LowPart; + + PHP_WIN32_IOUTIL_CLEANUP_W() + return SUCCESS; } /* }}} */ @@ -241,60 +204,22 @@ PHP_FUNCTION(disk_total_space) static int php_disk_free_space(char *path, double *space) /* {{{ */ #if defined(WINDOWS) /* {{{ */ { - double bytesfree = 0; - - HINSTANCE kernel32; - FARPROC gdfse; - typedef BOOL (WINAPI *gdfse_func)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); - gdfse_func func; - - /* These are used by GetDiskFreeSpaceEx, if available. */ ULARGE_INTEGER FreeBytesAvailableToCaller; ULARGE_INTEGER TotalNumberOfBytes; ULARGE_INTEGER TotalNumberOfFreeBytes; + PHP_WIN32_IOUTIL_INIT_W(path) - /* These are used by GetDiskFreeSpace otherwise. */ - DWORD SectorsPerCluster; - DWORD BytesPerSector; - DWORD NumberOfFreeClusters; - DWORD TotalNumberOfClusters; - - /* GetDiskFreeSpaceEx is only available in NT and Win95 post-OSR2, - so we have to jump through some hoops to see if the function - exists. */ - kernel32 = LoadLibrary("kernel32.dll"); - if (kernel32) { - gdfse = GetProcAddress(kernel32, "GetDiskFreeSpaceExA"); - /* It's available, so we can call it. */ - if (gdfse) { - func = (gdfse_func)gdfse; - if (func(path, - &FreeBytesAvailableToCaller, - &TotalNumberOfBytes, - &TotalNumberOfFreeBytes) == 0) { - php_error_docref(NULL, E_WARNING, "%s", php_win_err()); - return FAILURE; - } - - /* i know - this is ugly, but i works <thies@thieso.net> */ - bytesfree = FreeBytesAvailableToCaller.HighPart * - (double) (((zend_ulong)1) << 31) * 2.0 + - FreeBytesAvailableToCaller.LowPart; - } else { /* If it's not available, we just use GetDiskFreeSpace */ - if (GetDiskFreeSpace(path, - &SectorsPerCluster, &BytesPerSector, - &NumberOfFreeClusters, &TotalNumberOfClusters) == 0) { - php_error_docref(NULL, E_WARNING, "%s", php_win_err()); - return FAILURE; - } - bytesfree = (double)NumberOfFreeClusters * (double)SectorsPerCluster * (double)BytesPerSector; - } - } else { - php_error_docref(NULL, E_WARNING, "Unable to load kernel32.dll"); + if (GetDiskFreeSpaceExW(pathw, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) == 0) { + php_error_docref(NULL, E_WARNING, "%s", php_win_err()); + PHP_WIN32_IOUTIL_CLEANUP_W() return FAILURE; } - *space = bytesfree; + /* i know - this is ugly, but i works <thies@thieso.net> */ + *space = FreeBytesAvailableToCaller.HighPart * (double) (((zend_ulong)1) << 31) * 2.0 + FreeBytesAvailableToCaller.LowPart; + + PHP_WIN32_IOUTIL_CLEANUP_W() + return SUCCESS; } /* }}} */ |