Mercurial > hg > xemacs-beta
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/netinstall/diskfull.cc Mon Aug 13 11:38:25 2007 +0200 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2000, Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * A copy of the GNU General Public License can be found at + * http://www.gnu.org/ + * + * Written by DJ Delorie <dj@cygnus.com> + * + */ + +/* The purpose of this file is to hide the mess needed just to figure + out how full a given disk is. There is an old API that can't + handle disks bigger than 2G, and a new API that isn't always + available. */ + +#include "win32.h" +#include "diskfull.h" + +typedef BOOL (WINAPI * GDFS)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, + PULARGE_INTEGER); + +int +diskfull (char *path) +{ + GDFS gdfs = 0; + + HINSTANCE k = LoadLibrary ("KERNEL32.DLL"); + if (k) + { + gdfs = (GDFS) GetProcAddress (k, "GetDiskFreeSpaceExA"); + + if (gdfs) + { + ULARGE_INTEGER avail, total, free; + if (gdfs (path, &avail, &total, &free)) + { + int perc = avail.QuadPart * 100 / total.QuadPart; + return 100-perc; + } + } + } + + char root[4]; + if (path[1] != ':') + return 0; + + root[0] = path[0]; + root[1] = ':'; + root[2] = '\\'; + root[3] = 0; + + DWORD junk, free_clusters, total_clusters; + + if (GetDiskFreeSpace (root, &junk, &junk, &free_clusters, &total_clusters)) + { + int perc = free_clusters * 100 / total_clusters; + return 100-perc; + } + + return 0; +}