]> cygwin.com Git - cygwin-apps/setup.git/blame - diskfull.cc
* (all): add cvsid tags
[cygwin-apps/setup.git] / diskfull.cc
CommitLineData
23c9e63c
DD
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
8507f105
DD
21static char *cvsid = "\n%%% $Id$\n";
22
23c9e63c
DD
23#include "win32.h"
24
25#include "diskfull.h"
26
27typedef BOOL WINAPI (*GDFS)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER,
28 PULARGE_INTEGER);
29
30int
31diskfull (char *path)
32{
33 WINAPI GDFS gdfs = 0;
34
35 HINSTANCE k = LoadLibrary ("KERNEL32.DLL");
36 if (k)
37 {
38 gdfs = (GDFS) GetProcAddress (k, "GetDiskFreeSpaceExA");
39
40 if (gdfs)
41 {
42 ULARGE_INTEGER avail, total, free;
43 if (gdfs (path, &avail, &total, &free))
44 {
45 int perc = avail.QuadPart * 100 / total.QuadPart;
46 return 100-perc;
47 }
48 }
49 }
50
51 char root[4];
52 if (path[1] != ':')
53 return 0;
54
55 root[0] = path[0];
56 root[1] = ':';
57 root[2] = '\\';
58 root[3] = 0;
59
60 DWORD junk, free_clusters, total_clusters;
61
62 if (GetDiskFreeSpace (root, &junk, &junk, &free_clusters, &total_clusters))
63 {
64 int perc = free_clusters * 100 / total_clusters;
65 return 100-perc;
66 }
67
68 return 0;
69}
This page took 0.030784 seconds and 5 git commands to generate.