CVS update: php3/functions

From: Date: Sat, 26 Jun 1999 18:15:47 +0000
Subject: CVS update: php3/functions
Groups: php.dev 
Request: Send a blank email to php-dev+get-7595@lists.php.net to get a copy of this message
Date: Saturday June 26, 1999 @ 14:15 Author: jim Update of /repository/php3/functions In directory php:/tmp/cvs-serv16413/functions Modified Files: filestat.c Log Message: Fix diskspacefree() function on Windows 95 pre-OSR2. Yeah, it's not pretty. Index: php3/functions/filestat.c diff -u php3/functions/filestat.c:1.88 php3/functions/filestat.c:1.89 --- php3/functions/filestat.c:1.88 Wed Jun 16 07:34:19 1999 +++ php3/functions/filestat.c Sat Jun 26 14:15:42 1999 @@ -27,7 +27,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filestat.c,v 1.88 1999/06/16 11:34:19 ssb Exp $ */ +/* $Id: filestat.c,v 1.89 1999/06/26 18:15:42 jim Exp $ */ #ifdef THREAD_SAFE #include "tls.h" #endif @@ -128,10 +128,23 @@ #ifdef WINDOWS pval *path; double bytesfree; - - ULARGE_INTEGER FreeBytesAvailableToCaller; + + HINSTANCE kernel32; + FARPROC gdfse; + typedef BOOL (*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; + + /* These are used by GetDiskFreeSpace otherwise. */ + DWORD SectorsPerCluster; + DWORD BytesPerSector; + DWORD NumberOfFreeClusters; + DWORD TotalNumberOfClusters; + #else /* not - WINDOWS */ pval *path; #if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS) @@ -152,15 +165,39 @@ if (_php3_check_open_basedir(path->value.str.val)) RETURN_FALSE; #ifdef WINDOWS - if (GetDiskFreeSpaceEx(path->value.str.val, - &FreeBytesAvailableToCaller, - &TotalNumberOfBytes, - &TotalNumberOfFreeBytes) == 0) RETURN_FALSE; - - /* i know - this is ugly, but i works (thies@digicol.de) */ - bytesfree = FreeBytesAvailableToCaller.HighPart * - (double) (((unsigned long)1) << 31) * 2.0 + - FreeBytesAvailableToCaller.LowPart; + /* 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->value.str.val, + &FreeBytesAvailableToCaller, + &TotalNumberOfBytes, + &TotalNumberOfFreeBytes) == 0) RETURN_FALSE; + + /* i know - this is ugly, but i works (thies@digicol.de) */ + bytesfree = FreeBytesAvailableToCaller.HighPart * + (double) (((unsigned long)1) << 31) * 2.0 + + FreeBytesAvailableToCaller.LowPart; + } + /* If it's not available, we just use GetDiskFreeSpace */ + else { + if (GetDiskFreeSpace(path->value.str.val, + &SectorsPerCluster, &BytesPerSector, + &NumberOfFreeClusters, &TotalNumberOfClusters) == 0) RETURN_FALSE; + bytesfree = (double)NumberOfFreeClusters * (double)SectorsPerCluster * (double)BytesPerSector; + } + } + else { + php3_error(E_WARNING, "Unable to load kernel32.dll"); + RETURN_FALSE; + } + + #else /* WINDOWS */ #if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS) if (statvfs(path->value.str.val,&buf)) RETURN_FALSE;

« previous php.dev (#7595) next »