448
+ − 1 /*
+ − 2 * Copyright (c) 2000, Red Hat, Inc.
+ − 3 *
+ − 4 * This program is free software; you can redistribute it and/or modify
+ − 5 * it under the terms of the GNU General Public License as published by
+ − 6 * the Free Software Foundation; either version 2 of the License, or
+ − 7 * (at your option) any later version.
+ − 8 *
+ − 9 * A copy of the GNU General Public License can be found at
+ − 10 * http://www.gnu.org/
+ − 11 *
+ − 12 * Written by DJ Delorie <dj@cygnus.com>
+ − 13 *
+ − 14 */
+ − 15
+ − 16 /* The purpose of this file is to hide the mess needed just to figure
+ − 17 out how full a given disk is. There is an old API that can't
+ − 18 handle disks bigger than 2G, and a new API that isn't always
+ − 19 available. */
+ − 20
+ − 21 #include "win32.h"
+ − 22 #include "diskfull.h"
+ − 23
+ − 24 typedef BOOL (WINAPI * GDFS)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER,
+ − 25 PULARGE_INTEGER);
+ − 26
+ − 27 int
+ − 28 diskfull (char *path)
+ − 29 {
+ − 30 GDFS gdfs = 0;
+ − 31
+ − 32 HINSTANCE k = LoadLibrary ("KERNEL32.DLL");
+ − 33 if (k)
+ − 34 {
+ − 35 gdfs = (GDFS) GetProcAddress (k, "GetDiskFreeSpaceExA");
+ − 36
+ − 37 if (gdfs)
+ − 38 {
+ − 39 ULARGE_INTEGER avail, total, free;
+ − 40 if (gdfs (path, &avail, &total, &free))
+ − 41 {
+ − 42 int perc = avail.QuadPart * 100 / total.QuadPart;
+ − 43 return 100-perc;
+ − 44 }
+ − 45 }
+ − 46 }
+ − 47
+ − 48 char root[4];
+ − 49 if (path[1] != ':')
+ − 50 return 0;
+ − 51
+ − 52 root[0] = path[0];
+ − 53 root[1] = ':';
+ − 54 root[2] = '\\';
+ − 55 root[3] = 0;
+ − 56
+ − 57 DWORD junk, free_clusters, total_clusters;
+ − 58
+ − 59 if (GetDiskFreeSpace (root, &junk, &junk, &free_clusters, &total_clusters))
+ − 60 {
+ − 61 int perc = free_clusters * 100 / total_clusters;
+ − 62 return 100-perc;
+ − 63 }
+ − 64
+ − 65 return 0;
+ − 66 }