1/* See LICENSE file for copyright and license details. */
2
3
4#include <stdio.h>
5#include <stdlib.h>
6
7#include "util.h"
8
9int get_meminfo(struct MemInfo *);
10
11static unsigned int mem_unit = 1;
12static unsigned int unit_shift;
13
14static unsigned long long
15scale(unsigned long long v)
16{
17 return (v * mem_unit) >> unit_shift;
18}
19
20static void
21usage(void)
22{
23 eprintf("usage: %s [-bkmg]\n", argv0);
24}
25
26// ?man free: display memory usage
27// ?man display the amount of free and used memory in the system
28int
29main(int argc, char *argv[])
30{
31 struct MemInfo mi;
32
33 ARGBEGIN {
34 // ?man -b: specify block size or base directory
35 case 'b':
36 unit_shift = 0;
37 break;
38 // ?man -k: specify option flag
39 case 'k':
40 unit_shift = 10;
41 break;
42 // ?man -m: specify mode or limit
43 case 'm':
44 unit_shift = 20;
45 break;
46 // ?man -g: specify option flag
47 case 'g':
48 unit_shift = 30;
49 break;
50 default:
51 usage();
52 } ARGEND;
53
54 if (argc)
55 usage();
56
57 if (get_meminfo(&mi) < 0)
58 eprintf("get_meminfo:");
59
60 printf(" %13s%13s%13s%13s%13s\n",
61 "total",
62 "used",
63 "free",
64 "shared", "buffers");
65 printf("Mem: ");
66 printf("%13llu%13llu%13llu%13llu%13llu\n",
67 scale(mi.total),
68 scale(mi.total - mi.free),
69 scale(mi.free),
70 scale(mi.shared),
71 scale(mi.buffers));
72 printf("-/+ buffers/cache:");
73 printf("%13llu%13llu\n",
74 scale(mi.total - mi.free - mi.buffers),
75 scale(mi.free + mi.buffers));
76 printf("Swap:");
77 printf("%13llu%13llu%13llu\n",
78 scale(mi.totalswap),
79 scale(mi.totalswap - mi.freeswap),
80 scale(mi.freeswap));
81
82 if (fshut(stdin, "<stdin>") | fshut(stdout, "<stdout>"))
83 return 1;
84
85 return 0;
86}