X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=free.c;h=997430b39e106ad3834680ea82a5c9863e4b8ee8;hb=e714bce003a1b0e2c49e58fe14af86abc8b31f23;hp=b07135430f6bd93fefe465cb1b252616c06d4650;hpb=e49d5ecbbe51718fa925b6890a735e5937cc2aa2;p=oweals%2Fbusybox.git diff --git a/free.c b/free.c index b07135430..997430b39 100644 --- a/free.c +++ b/free.c @@ -2,7 +2,7 @@ /* * Mini free implementation for busybox * - * Copyright (C) 1999 by Lineo, inc. + * Copyright (C) 1999,2000 by Lineo, inc. * Written by Erik Andersen , * * This program is free software; you can redistribute it and/or modify @@ -23,15 +23,59 @@ #include "internal.h" #include +#include -#if ! defined BB_FEATURE_USE_PROCFS -#error Sorry, I depend on the /proc filesystem right now. -#endif - extern int free_main(int argc, char **argv) { - char *cmd[] = { "cat", "/proc/meminfo", "\0" }; + struct sysinfo info; + sysinfo(&info); + /* 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 + "\nDisplays the amount of free and used system memory\n" +#endif + ); + } + + + printf("%6s%13s%13s%13s%13s%13s\n", "", "total", "used", "free", + "shared", "buffers"); - exit(cat_main(3, cmd)); + printf("%6s%13ld%13ld%13ld%13ld%13ld\n", "Mem:", info.totalram, + info.totalram-info.freeram, info.freeram, + info.sharedram, info.bufferram); + + 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); + return(TRUE); } + +