update.
[chise/xemacs-chise.git.1] / netinstall / diskfull.cc
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 }