diff options
Diffstat (limited to 'procps')
-rw-r--r-- | procps/free.c | 36 | ||||
-rw-r--r-- | procps/uptime.c | 3 |
2 files changed, 29 insertions, 10 deletions
diff --git a/procps/free.c b/procps/free.c index a81189be9..997430b39 100644 --- a/procps/free.c +++ b/procps/free.c @@ -23,20 +23,36 @@ #include "internal.h" #include <stdio.h> -#include <sys/sysinfo.h> +#include <errno.h> + -#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 @@ -61,3 +77,5 @@ extern int free_main(int argc, char **argv) info.freeram+info.freeswap); return(TRUE); } + + diff --git a/procps/uptime.c b/procps/uptime.c index 67ca34d75..efdbccf00 100644 --- a/procps/uptime.c +++ b/procps/uptime.c @@ -31,13 +31,14 @@ #include "internal.h" #include <stdio.h> #include <time.h> -#include <sys/sysinfo.h> +#include <errno.h> #define FSHIFT 16 /* nr of bits of precision */ #define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */ #define LOAD_INT(x) ((x) >> FSHIFT) #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100) + extern int uptime_main(int argc, char **argv) { int updays, uphours, upminutes; |