master xplshn/aruu / cmd / pseudo / free.c
 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}