Fixed DRIVE_GetFreeSpace to handle space > 4 GByte.
diff --git a/files/drive.c b/files/drive.c index c1c3740..d1c1906 100644 --- a/files/drive.c +++ b/files/drive.c
@@ -580,9 +580,11 @@ /*********************************************************************** * DRIVE_GetFreeSpace */ -static int DRIVE_GetFreeSpace( int drive, DWORD *size, DWORD *available ) +static int DRIVE_GetFreeSpace( int drive, LPULARGE_INTEGER size, + LPULARGE_INTEGER available ) { struct statfs info; + unsigned long long bigsize,bigavail=0; if (!DRIVE_IsValid(drive)) { @@ -602,16 +604,23 @@ return 0; } - *size = info.f_bsize * info.f_blocks; + bigsize = (unsigned long long)info.f_bsize + * (unsigned long long)info.f_blocks; #ifdef STATFS_HAS_BAVAIL - *available = info.f_bavail * info.f_bsize; + bigavail = (unsigned long long)info.f_bavail + * (unsigned long long)info.f_bsize; #else # ifdef STATFS_HAS_BFREE - *available = info.f_bfree * info.f_bsize; + bigavail = (unsigned long long)info.f_bfree + * (unsigned long long)info.f_bsize; # else # error "statfs has no bfree/bavail member!" # endif #endif + size->LowPart = (DWORD)bigsize; + size->HighPart = (DWORD)(bigsize>>32); + available->LowPart = (DWORD)bigavail; + available->HighPart = (DWORD)(bigavail>>32); return 1; } @@ -660,7 +669,7 @@ LPDWORD total_clusters ) { int drive; - DWORD size,available; + ULARGE_INTEGER size,available; LPCSTR path; DWORD cluster_sec; @@ -685,30 +694,37 @@ if (!DRIVE_GetFreeSpace(drive, &size, &available)) return FALSE; /* Cap the size and available at 2GB as per specs. */ - if (size > 0x7fffffff) size = 0x7fffffff; - if (available > 0x7fffffff) available = 0x7fffffff; - + if ((size.HighPart) ||(size.LowPart > 0x7fffffff)) + { + size.HighPart = 0; + size.LowPart = 0x7fffffff; + } + if ((available.HighPart) ||(available.LowPart > 0x7fffffff)) + { + available.HighPart =0; + available.LowPart = 0x7fffffff; + } if (DRIVE_GetType(drive)==TYPE_CDROM) { if (sector_bytes) *sector_bytes = 2048; - size /= 2048; - available /= 2048; + size.LowPart /= 2048; + available.LowPart /= 2048; } else { if (sector_bytes) *sector_bytes = 512; - size /= 512; - available /= 512; + size.LowPart /= 512; + available.LowPart /= 512; } /* fixme: probably have to adjust those variables too for CDFS */ cluster_sec = 1; - while (cluster_sec * 65536 < size) cluster_sec *= 2; + while (cluster_sec * 65536 < size.LowPart) cluster_sec *= 2; if (cluster_sectors) *cluster_sectors = cluster_sec; if (free_clusters) - *free_clusters = available / cluster_sec; + *free_clusters = available.LowPart / cluster_sec; if (total_clusters) - *total_clusters = size / cluster_sec; + *total_clusters = size.LowPart / cluster_sec; return TRUE; } @@ -740,7 +756,7 @@ LPULARGE_INTEGER totalfree) { int drive; - DWORD size,available; + ULARGE_INTEGER size,available; if (!root) drive = DRIVE_GetCurrentDrive(); else @@ -754,14 +770,10 @@ } if (!DRIVE_GetFreeSpace(drive, &size, &available)) return FALSE; /*FIXME: Do we have the number of bytes available to the user? */ - avail->HighPart = total->HighPart = 0; - avail->LowPart = available; - total->LowPart = size; - if(totalfree) - { - totalfree->HighPart =0; - totalfree->LowPart= available; - } + avail->HighPart = available.HighPart; + totalfree->HighPart = size.HighPart; + avail->LowPart = available.LowPart ; + totalfree->LowPart = size.LowPart ; return TRUE; }