comparison netinstall/diskfull.cc @ 448:3078fd1074e8 r21-2-39

Import from CVS: tag r21-2-39
author cvs
date Mon, 13 Aug 2007 11:38:25 +0200
parents
children
comparison
equal deleted inserted replaced
447:4fc5f13f3bd3 448:3078fd1074e8
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 }