This patch adds the familiar command line switches -b, -k, -m and -g to the free command. Its far easier to use "-m" to check whether the system logged into has 20 MB, 200 MB or 2 GB of RAM.
I also put up the commit on github: http://github.com/wertarbyte/busybox/commit/0c41db201d4467290daddb23bfb3bfc07a725d1d --- include/usage.src.h | 8 +++++- procps/free.c | 75 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/include/usage.src.h b/include/usage.src.h index c26ed8b..f4b8ac7 100644 --- a/include/usage.src.h +++ b/include/usage.src.h @@ -1303,7 +1303,13 @@ INSERT #define free_trivial_usage \ "" #define free_full_usage "\n\n" \ - "Display the amount of free and used system memory" + "Display the amount of free and used system memory" \ + "\nOptions:" \ + "\n -b show output in bytes" \ + "\n -k show output in KB" \ + "\n -m show output in MB" \ + "\n -g show output in GB" \ + #define free_example_usage \ "$ free\n" \ " total used free shared buffers\n" \ diff --git a/procps/free.c b/procps/free.c index be65f46..fa2fa95 100644 --- a/procps/free.c +++ b/procps/free.c @@ -16,10 +16,33 @@ int free_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM)) { struct sysinfo info; unsigned mem_unit; + /* + * Convert numbers to a more readable format by dividing + * unit_steps times by 1024 (kB->MB->GB) + */ +#define SI_UNIT(d) ((d) >> (10*(unit_steps))) + /* we like to use kbytes as our default unit */ + int unit_steps = 1; #if ENABLE_DESKTOP - if (argv[1] && argv[1][0] == '-') - bb_show_usage(); + if (argv[1] && argv[1][0] == '-') { + switch (argv[1][1]) { + case 'b': + unit_steps = 0; + break; + case 'k': /* 2^10 */ + unit_steps = 1; + break; + case 'm': /* 2^(2*10) */ + unit_steps = 2; + break; + case 'g': /* 2^(3*10) */ + unit_steps = 3; + break; + default: + bb_show_usage(); + } + } #endif sysinfo(&info); @@ -30,28 +53,16 @@ int free_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM)) mem_unit = info.mem_unit; } - /* Convert values to kbytes */ - if (mem_unit == 1) { - info.totalram >>= 10; - info.freeram >>= 10; -#if BB_MMU - info.totalswap >>= 10; - info.freeswap >>= 10; -#endif - info.sharedram >>= 10; - info.bufferram >>= 10; - } else { - mem_unit >>= 10; - /* TODO: Make all this stuff not overflow when mem >= 4 Tb */ - info.totalram *= mem_unit; - info.freeram *= mem_unit; + /* Convert values to bytes */ + /* TODO: Make all this stuff not overflow when mem >= 4 Tb */ + info.totalram *= mem_unit; + info.freeram *= mem_unit; #if BB_MMU - info.totalswap *= mem_unit; - info.freeswap *= mem_unit; + info.totalswap *= mem_unit; + info.freeswap *= mem_unit; #endif - info.sharedram *= mem_unit; - info.bufferram *= mem_unit; - } + info.sharedram *= mem_unit; + info.bufferram *= mem_unit; printf(" %13s%13s%13s%13s%13s\n", "total", @@ -66,27 +77,29 @@ int free_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM)) #define FIELDS_5 "%13lu%13lu%13lu%13lu%13lu\n" #define FIELDS_3 (FIELDS_5 + 2*5) #define FIELDS_2 (FIELDS_5 + 3*5) + printf("Mem: "); printf(FIELDS_5, - info.totalram, - info.totalram - info.freeram, - info.freeram, - info.sharedram, info.bufferram + SI_UNIT(info.totalram), + SI_UNIT(info.totalram - info.freeram), + SI_UNIT(info.freeram), + SI_UNIT(info.sharedram), + SI_UNIT(info.bufferram) ); /* Show alternate, more meaningful busy/free numbers by counting * buffer cache as free memory (make it "-/+ buffers/cache" * if/when we add support for "cached" column): */ printf("-/+ buffers: "); printf(FIELDS_2, - info.totalram - info.freeram - info.bufferram, - info.freeram + info.bufferram + SI_UNIT(info.totalram - info.freeram - info.bufferram), + SI_UNIT(info.freeram + info.bufferram) ); #if BB_MMU printf("Swap:"); printf(FIELDS_3, - info.totalswap, - info.totalswap - info.freeswap, - info.freeswap + SI_UNIT(info.totalswap), + SI_UNIT(info.totalswap - info.freeswap), + SI_UNIT(info.freeswap) ); #endif return EXIT_SUCCESS; -- 1.7.1 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
