diff options
Diffstat (limited to 'procps')
-rw-r--r-- | procps/free.c | 83 |
1 files changed, 48 insertions, 35 deletions
diff --git a/procps/free.c b/procps/free.c index e8bea5064..a941b6252 100644 --- a/procps/free.c +++ b/procps/free.c @@ -15,54 +15,67 @@ int free_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int free_main(int argc UNUSED_PARAM, char **argv) { struct sysinfo info; + unsigned mem_unit; + +#if ENABLE_DESKTOP + if (argv[1] && argv[1][0] == '-') + bb_show_usage(); +#endif + sysinfo(&info); /* Kernels prior to 2.4.x will return info.mem_unit==0, so cope... */ - if (info.mem_unit == 0) { - info.mem_unit=1; + mem_unit = 1; + if (info.mem_unit != 0) { + mem_unit = info.mem_unit; } - if (info.mem_unit == 1) { - info.mem_unit=1024; - /* TODO: Make all this stuff not overflow when mem >= 4 Gib */ - info.totalram/=info.mem_unit; - info.freeram/=info.mem_unit; + /* Convert values to kbytes */ + if (mem_unit == 1) { + info.totalram >>= 10; + info.freeram >>= 10; #if BB_MMU - info.totalswap/=info.mem_unit; - info.freeswap/=info.mem_unit; + info.totalswap >>= 10; + info.freeswap >>= 10; #endif - info.sharedram/=info.mem_unit; - info.bufferram/=info.mem_unit; + info.sharedram >>= 10; + info.bufferram >>= 10; } else { - info.mem_unit/=1024; - /* TODO: Make all this stuff not overflow when mem >= 4 Gib */ - info.totalram*=info.mem_unit; - info.freeram*=info.mem_unit; + mem_unit >>= 10; + /* TODO: Make all this stuff not overflow when mem >= 4 Tb */ + info.totalram *= mem_unit; + info.freeram *= mem_unit; #if BB_MMU - info.totalswap*=info.mem_unit; - info.freeswap*=info.mem_unit; + info.totalswap *= mem_unit; + info.freeswap *= mem_unit; #endif - info.sharedram*=info.mem_unit; - info.bufferram*=info.mem_unit; + info.sharedram *= mem_unit; + info.bufferram *= mem_unit; } - if (argv[1] && argv[1][0] == '-') - bb_show_usage(); - - printf("%6s%13s%13s%13s%13s%13s\n", "", "total", "used", "free", - "shared", "buffers"); - - printf("%6s%13ld%13ld%13ld%13ld%13ld\n", "Mem:", info.totalram, - info.totalram-info.freeram, info.freeram, - info.sharedram, info.bufferram); - + printf(" %13s%13s%13s%13s%13s\n", + "total", + "used", + "free", + "shared", "buffers" /* swap and total don't have these columns */ + ); + printf("%6s%13lu%13lu%13lu%13lu%13lu\n", "Mem:", + info.totalram, + info.totalram - info.freeram, + info.freeram, + info.sharedram, info.bufferram + ); #if BB_MMU - printf("%6s%13ld%13ld%13ld\n", "Swap:", info.totalswap, - info.totalswap-info.freeswap, info.freeswap); - - printf("%6s%13ld%13ld%13ld\n", "Total:", info.totalram+info.totalswap, - (info.totalram-info.freeram)+(info.totalswap-info.freeswap), - info.freeram+info.freeswap); + printf("%6s%13lu%13lu%13lu\n", "Swap:", + info.totalswap, + info.totalswap - info.freeswap, + info.freeswap + ); + printf("%6s%13lu%13lu%13lu\n", "Total:", + info.totalram + info.totalswap, + (info.totalram - info.freeram) + (info.totalswap - info.freeswap), + info.freeram + info.freeswap + ); #endif return EXIT_SUCCESS; } |