1 /* 2 * $Id: getfree.c,v 2.2 2001/04/25 20:07:36 gul Exp $ 3 * 4 * Revision history: 5 * $Log: getfree.c,v $ 6 * Revision 2.2 2001/04/25 20:07:36 gul 7 * bugfix 8 * 9 * Revision 2.1 2001/04/23 07:58:57 gul 10 * getfree() on large drives fixed 11 * 12 * Revision 2.0 2001/01/10 12:12:40 gul 13 * Binkd is under CVS again 14 * 15 * 16 */ 17 #ifdef __WATCOMC__ 18 #define __IBMC__ 0 19 #define __IBMCPP__ 0 20 #endif 21 22 #define INCL_DOS 23 #include <os2.h> 24 #include <ctype.h> 25 #include <limits.h> 26 27 extern void Log (int lev, char *s,...); 28 getfree(char * path)29unsigned long getfree (char *path) 30 { 31 FSALLOCATE fsa; 32 ULONG disknum = 0; 33 APIRET rc; 34 35 if (isalpha (path[0]) && path[1] == ':') 36 disknum = toupper (path[0]) - 'A' + 1; 37 38 rc = DosQueryFSInfo (disknum, /* Drive number */ 39 FSIL_ALLOC, /* Level 1 allocation info */ 40 (PVOID) & fsa, /* Buffer */ 41 sizeof (fsa)); /* Size of buffer */ 42 43 if (rc) 44 { 45 Log (1, "DosQueryFSInfo error: return code = %u", rc); 46 return ULONG_MAX; /* Assume enough disk space */ 47 } 48 else 49 { 50 if (fsa.cSectorUnit * fsa.cbSector >= 1024) 51 return fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector / 1024); 52 else 53 return fsa.cUnitAvail / (1024 / (fsa.cSectorUnit * fsa.cbSector)); 54 } 55 } 56