From a2fdbfcaf4b6ff7a49b43f536402b0380cce8ecf Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Thu, 13 Feb 2003 01:13:31 +0000 Subject: [PATCH] getfreediskspace() can now report larger-then-byte units (e.g. kilobytes, megabytes, etc) by specifying an optional "unit" parameter. --- src/sbbs3/atcodes.cpp | 7 ++++++- src/sbbs3/ftpsrvr.c | 4 ++-- src/sbbs3/js_system.c | 2 +- src/sbbs3/tmp_xfer.cpp | 4 ++-- src/sbbs3/upload.cpp | 6 +++--- src/xpdev/dirwrap.c | 26 +++++++++++++++++++++++--- src/xpdev/dirwrap.h | 2 +- 7 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp index 21eac815a2..8151c7dcc5 100644 --- a/src/sbbs3/atcodes.cpp +++ b/src/sbbs3/atcodes.cpp @@ -448,7 +448,12 @@ char* sbbs_t::atcode(char* sp, char* str) } if(!strcmp(sp,"FREESPACE")) { - sprintf(str,"%lu",getfreediskspace(cfg.temp_dir)); + sprintf(str,"%lu",getfreediskspace(cfg.temp_dir,0)); + return(str); + } + + if(!strcmp(sp,"FREESPACEK")) { + sprintf(str,"%lu",getfreediskspace(cfg.temp_dir,1024)); return(str); } diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index cc85b2d10a..70d50a38b3 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -2822,9 +2822,9 @@ static void ctrl_thread(void* arg) else l=0; if(local_fsys) - avail=getfreediskspace(local_dir); + avail=getfreediskspace(local_dir,0); else - avail=getfreediskspace(scfg.data_dir); /* Change to temp_dir? */ + avail=getfreediskspace(scfg.data_dir,0); /* Change to temp_dir? */ if(l && l>avail) sockprintf(sock,"504 Only %lu bytes available.",avail); else diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c index 737b9f07c6..4b728a46e4 100644 --- a/src/sbbs3/js_system.c +++ b/src/sbbs3/js_system.c @@ -156,7 +156,7 @@ static JSBool js_system_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) p=lastuseron; break; case SYS_PROP_FREEDISKSPACE: - val = getfreediskspace(cfg->temp_dir); + val = getfreediskspace(cfg->temp_dir,0); if(INT_FITS_IN_JSVAL(val) && !(val&0x80000000)) *vp = INT_TO_JSVAL(val); else diff --git a/src/sbbs3/tmp_xfer.cpp b/src/sbbs3/tmp_xfer.cpp index 4f20bc9104..b7aa680bca 100644 --- a/src/sbbs3/tmp_xfer.cpp +++ b/src/sbbs3/tmp_xfer.cpp @@ -105,7 +105,7 @@ void sbbs_t::temp_xfer() switch(ch) { case 'A': /* add to temp file */ /* free disk space */ - space=getfreediskspace(cfg.temp_dir); + space=getfreediskspace(cfg.temp_dir,0); if(space<(ulong)cfg.min_dspace*1024L) { bputs(text[LowDiskSpace]); sprintf(str,"Diskspace is low: %s (%lu bytes)" @@ -289,7 +289,7 @@ void sbbs_t::extract(uint dirnum) intmp=1; /* get free disk space */ - space=getfreediskspace(cfg.temp_dir); + space=getfreediskspace(cfg.temp_dir,0); if(space<(ulong)cfg.min_dspace*1024L) { bputs(text[LowDiskSpace]); sprintf(str,"Diskspace is low: %s (%lu bytes)",cfg.temp_dir,space); diff --git a/src/sbbs3/upload.cpp b/src/sbbs3/upload.cpp index 8b573098f9..05ecd71791 100644 --- a/src/sbbs3/upload.cpp +++ b/src/sbbs3/upload.cpp @@ -260,10 +260,10 @@ bool sbbs_t::upload(uint dirnum) /* get free disk space */ - space=getfreediskspace(path); - if(space<(ulong)cfg.min_dspace*1024L) { + space=getfreediskspace(path,1024); + if(space<(ulong)cfg.min_dspace) { bputs(text[LowDiskSpace]); - sprintf(str,"Diskspace is low: %s (%lu bytes)",path,space); + sprintf(str,"Diskspace is low: %s (%lu kilobytes)",path,space); errorlog(str); if(!dir_op(dirnum)) return(false); diff --git a/src/xpdev/dirwrap.c b/src/xpdev/dirwrap.c index 3cfcb40d97..2b478d2ad5 100644 --- a/src/xpdev/dirwrap.c +++ b/src/xpdev/dirwrap.c @@ -577,11 +577,23 @@ ulong DLLCALL delfiles(char *inpath, char *spec) /* Return free disk space in bytes (up to a maximum of 4GB) */ /****************************************************************************/ #if defined(_WIN32) - typedef BOOL(WINAPI * GetDiskFreeSpaceEx_t) - (LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); +typedef BOOL(WINAPI * GetDiskFreeSpaceEx_t) + (LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); + +static int bit_num(ulong val) +{ + int i; + + for(i=31;i>=0;i--) + if(val&(1<<i)) + return(i); + + return(-1); +} #endif -ulong DLLCALL getfreediskspace(const char* path) +/* Unit should be a power-of-2 (e.g. 1024 to report kilobytes) */ +ulong DLLCALL getfreediskspace(const char* path, ulong unit) { #if defined(_WIN32) char root[16]; @@ -606,6 +618,10 @@ ulong DLLCALL getfreediskspace(const char* path) &size, // receives the number of bytes on disk NULL)) // receives the free bytes on disk return(0); + + if(unit) + avail.QuadPart=Int64ShrlMod32(avail.QuadPart,bit_num(unit)); + #if defined(_ANONYMOUS_STRUCT) if(avail.HighPart) #else @@ -631,6 +647,8 @@ ulong DLLCALL getfreediskspace(const char* path) )) return(0); + if(unit) + NumberOfFreeClusters/=unit; return(NumberOfFreeClusters*SectorsPerCluster*BytesPerSector); @@ -642,6 +660,8 @@ ulong DLLCALL getfreediskspace(const char* path) if (statfs(path, &fs) < 0) return 0; + if(unit) + fs.f_bavail/=unit; return fs.f_bsize * fs.f_bavail; #else diff --git a/src/xpdev/dirwrap.h b/src/xpdev/dirwrap.h index 9509271dda..c3c4e9f578 100644 --- a/src/xpdev/dirwrap.h +++ b/src/xpdev/dirwrap.h @@ -197,7 +197,7 @@ DLLEXPORT time_t DLLCALL fdate(const char *filename); DLLEXPORT BOOL DLLCALL isdir(const char *filename); DLLEXPORT char* DLLCALL getfname(const char* path); DLLEXPORT int DLLCALL getfattr(const char* filename); -DLLEXPORT ulong DLLCALL getfreediskspace(const char* path); +DLLEXPORT ulong DLLCALL getfreediskspace(const char* path, ulong unit); DLLEXPORT ulong DLLCALL delfiles(char *inpath, char *spec); #if defined(__unix__) -- GitLab