]> granicus.if.org Git - php/commitdiff
add missing mb path support chunk
authorAnatol Belski <ab@php.net>
Thu, 11 Aug 2016 11:16:51 +0000 (13:16 +0200)
committerAnatol Belski <ab@php.net>
Thu, 11 Aug 2016 11:38:28 +0000 (13:38 +0200)
ext/standard/filestat.c

index f6bd99c474108afd544eff5ebed522dc946afedd..4e80b2cbd379bb458cfbd86c874513a077d15660 100644 (file)
@@ -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;
 }
 /* }}} */