The Pedigree Project 0.1
free/main.c
1/* Copyright (c) 2026, Pedigree Developers. */
2#include <stdio.h>
3#include <string.h>
4
5int main(int argc, char* argv[]) {
6 unsigned long long divisor = 1;
7 if (argc == 2 && !strcmp(argv[1], "-m")) {
8 divisor = 1024;
9 } else if (argc != 1 && !(argc == 2 && !strcmp(argv[1], "-k"))) {
10 int help = argc == 2 && !strcmp(argv[1], "--help");
11 fprintf(help ? stdout : stderr, "Usage: free [-k|-m]\nShow memory in KiB (default) or MiB.\n");
12 return help ? 0 : 1;
13 }
14
15 FILE* file = fopen("/proc/meminfo", "r");
16 if (!file) {
17 perror("/proc/meminfo");
18 return 1;
19 }
20 char line[256], key[64], unit[16];
21 unsigned long long total = 0, freeKb = 0, value;
22 int fields = 0;
23 while (fgets(line, sizeof(line), file)) {
24 if (sscanf(line, "%63s %llu %15s", key, &value, unit) != 3 || strcmp(unit, "kB"))
25 continue;
26 if (!strcmp(key, "MemTotal:")) {
27 total = value;
28 fields |= 1;
29 } else if (!strcmp(key, "MemFree:")) {
30 freeKb = value;
31 fields |= 2;
32 }
33 }
34 int failed = ferror(file);
35 fclose(file);
36 if (failed || fields != 3 || freeKb > total) {
37 fputs("free: invalid memory information\n", stderr);
38 return 1;
39 }
40 printf("%12s %12s %12s %12s\n", "", "total", "used", "free");
41 printf("%12s %12llu %12llu %12llu\n", "Mem:", total / divisor, (total - freeKb) / divisor,
42 freeKb / divisor);
43 if (fflush(stdout) || ferror(stdout)) {
44 perror("free");
45 return 1;
46 }
47 return 0;
48}