X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=free.c;h=997430b39e106ad3834680ea82a5c9863e4b8ee8;hb=e714bce003a1b0e2c49e58fe14af86abc8b31f23;hp=e6f130ea9891cdebb5227fee4da9fd2eab02926c;hpb=7ab9c7ee52db8759d457819f5480378fa3aa97cc;p=oweals%2Fbusybox.git diff --git a/free.c b/free.c index e6f130ea9..997430b39 100644 --- a/free.c +++ b/free.c @@ -23,20 +23,36 @@ #include "internal.h" #include -#include +#include + -#define DIVISOR 1024 extern int free_main(int argc, char **argv) { struct sysinfo info; sysinfo(&info); - info.totalram/=DIVISOR; - info.freeram/=DIVISOR; - info.totalswap/=DIVISOR; - info.freeswap/=DIVISOR; - info.sharedram/=DIVISOR; - info.bufferram/=DIVISOR; - + /* Kernels prior to 2.4.x will return info.mem_unit==0. Kernels after + * 2.4.x actually fill this value in */ + if (info.mem_unit==0) { + /* Looks like we have a kernel prior to Linux 2.4.x */ + info.mem_unit=1024; + info.totalram/=info.mem_unit; + info.freeram/=info.mem_unit; + info.totalswap/=info.mem_unit; + info.freeswap/=info.mem_unit; + info.sharedram/=info.mem_unit; + info.bufferram/=info.mem_unit; + } else { + /* Bah. Linux 2.4.x completely changed sysinfo. This can in theory + overflow a 32 bit unsigned long, but who puts more then 4GiB ram+swap + on an embedded system? */ + info.mem_unit/=1024; + info.totalram*=info.mem_unit; + info.freeram*=info.mem_unit; + info.totalswap*=info.mem_unit; + info.freeswap*=info.mem_unit; + info.sharedram*=info.mem_unit; + info.bufferram*=info.mem_unit; + } if (argc > 1 && **(argv + 1) == '-') { usage("free\n" #ifndef BB_FEATURE_TRIVIAL_HELP @@ -59,5 +75,7 @@ extern int free_main(int argc, char **argv) printf("%6s%13ld%13ld%13ld\n", "Total:", info.totalram+info.totalswap, (info.totalram-info.freeram)+(info.totalswap-info.freeswap), info.freeram+info.freeswap); - exit(TRUE); + return(TRUE); } + +