diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp index 21eac815a2c462354d1df589054e84c40ecbbb96..8151c7dcc5fcfe6041a212fc79f154e4c257db49 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 cc85b2d10ab7fbf35e07a34a4bf30c297f726986..70d50a38b37c832a46cc6585ef62f69a0fbfd46b 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 737b9f07c603764794d90c80fc9a6ca4bb0b5ec1..4b728a46e44697ab4ed9af46b243f7f5d48a725d 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 4f20bc91044a62e7d938180aa87e2ba425920491..b7aa680bca796d6ba63858e5f4f68fd75295b638 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 8b573098f93c5c48df6e75eff01eaf27d05487a8..05ecd7179169117f4fd21db757d7a3834f3d59bb 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 3cfcb40d9756261299b3a0f2b025822ae469f5da..2b478d2ad5a4c77c5c177414c975e0f0b52a32b0 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 9509271dda507dd2577ec22c774875483447bcbd..c3c4e9f578a0ca24b7076e6b7e8f557f7e4779f0 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__)