1*cf5a6c84SAndroid Build Coastguard Worker /* free.c - Display amount of free and used memory in the system.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2012 Elie De Brauwer <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker
5*cf5a6c84SAndroid Build Coastguard Worker // Flag order is signifcant: b-g are units in order, FLAG_h-1 is unit mask
6*cf5a6c84SAndroid Build Coastguard Worker USE_FREE(NEWTOY(free, "hgmkb[!hgmkb]", TOYFLAG_USR|TOYFLAG_BIN))
7*cf5a6c84SAndroid Build Coastguard Worker
8*cf5a6c84SAndroid Build Coastguard Worker config FREE
9*cf5a6c84SAndroid Build Coastguard Worker bool "free"
10*cf5a6c84SAndroid Build Coastguard Worker default y
11*cf5a6c84SAndroid Build Coastguard Worker help
12*cf5a6c84SAndroid Build Coastguard Worker usage: free [-bkmgt]
13*cf5a6c84SAndroid Build Coastguard Worker
14*cf5a6c84SAndroid Build Coastguard Worker Display the total, free and used amount of physical memory and swap space.
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker -bkmg Output units (default is bytes)
17*cf5a6c84SAndroid Build Coastguard Worker -h Human readable (K=1024)
18*cf5a6c84SAndroid Build Coastguard Worker */
19*cf5a6c84SAndroid Build Coastguard Worker
20*cf5a6c84SAndroid Build Coastguard Worker #define FOR_free
21*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
22*cf5a6c84SAndroid Build Coastguard Worker
GLOBALS(unsigned bits;unsigned long long units;char * buf;)23*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
24*cf5a6c84SAndroid Build Coastguard Worker unsigned bits;
25*cf5a6c84SAndroid Build Coastguard Worker unsigned long long units;
26*cf5a6c84SAndroid Build Coastguard Worker char *buf;
27*cf5a6c84SAndroid Build Coastguard Worker )
28*cf5a6c84SAndroid Build Coastguard Worker
29*cf5a6c84SAndroid Build Coastguard Worker static char *convert(unsigned long d)
30*cf5a6c84SAndroid Build Coastguard Worker {
31*cf5a6c84SAndroid Build Coastguard Worker long long ll = d*TT.units;
32*cf5a6c84SAndroid Build Coastguard Worker char *s = TT.buf;
33*cf5a6c84SAndroid Build Coastguard Worker
34*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(h)) human_readable(s, ll, 0);
35*cf5a6c84SAndroid Build Coastguard Worker else sprintf(s, "%llu",ll>>TT.bits);
36*cf5a6c84SAndroid Build Coastguard Worker TT.buf += strlen(TT.buf)+1;
37*cf5a6c84SAndroid Build Coastguard Worker
38*cf5a6c84SAndroid Build Coastguard Worker return s;
39*cf5a6c84SAndroid Build Coastguard Worker }
40*cf5a6c84SAndroid Build Coastguard Worker
free_main(void)41*cf5a6c84SAndroid Build Coastguard Worker void free_main(void)
42*cf5a6c84SAndroid Build Coastguard Worker {
43*cf5a6c84SAndroid Build Coastguard Worker struct sysinfo in;
44*cf5a6c84SAndroid Build Coastguard Worker
45*cf5a6c84SAndroid Build Coastguard Worker sysinfo(&in);
46*cf5a6c84SAndroid Build Coastguard Worker TT.units = in.mem_unit ? in.mem_unit : 1;
47*cf5a6c84SAndroid Build Coastguard Worker while ((toys.optflags&(FLAG_h-1)) && !(toys.optflags&(1<<TT.bits))) TT.bits++;
48*cf5a6c84SAndroid Build Coastguard Worker TT.bits *= 10;
49*cf5a6c84SAndroid Build Coastguard Worker TT.buf = toybuf;
50*cf5a6c84SAndroid Build Coastguard Worker
51*cf5a6c84SAndroid Build Coastguard Worker xprintf("\t\ttotal used free shared buffers\n"
52*cf5a6c84SAndroid Build Coastguard Worker "Mem:%17s%12s%12s%12s%12s\n-/+ buffers/cache:%15s%12s\n"
53*cf5a6c84SAndroid Build Coastguard Worker "Swap:%16s%12s%12s\n", convert(in.totalram),
54*cf5a6c84SAndroid Build Coastguard Worker convert(in.totalram-in.freeram), convert(in.freeram), convert(in.sharedram),
55*cf5a6c84SAndroid Build Coastguard Worker convert(in.bufferram), convert(in.totalram - in.freeram - in.bufferram),
56*cf5a6c84SAndroid Build Coastguard Worker convert(in.freeram + in.bufferram), convert(in.totalswap),
57*cf5a6c84SAndroid Build Coastguard Worker convert(in.totalswap - in.freeswap), convert(in.freeswap));
58*cf5a6c84SAndroid Build Coastguard Worker }
59