Initial revision
[chise/xemacs-chise.git.1] / netinstall / diskfull.cc
diff --git a/netinstall/diskfull.cc b/netinstall/diskfull.cc
new file mode 100644 (file)
index 0000000..3b8961d
--- /dev/null
@@ -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;
+}