memusage.c: Read 64-bit integers
[sysstatus.git] / src / status / memusage.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "common.h"
6 #include "tools.h"
7
8
9 void status_memusage(GlobalData *g)
10 {
11   StatusItem s;
12   char text[16] = { 0 };
13
14   char *stline = NULL;
15   size_t stlen;
16   FILE *stfile;
17
18   long long memtotal = 0;
19   long long memfree = 0;
20   long long memused;
21   long long membuffers = 0;
22   long long memcached = 0;
23
24
25   statusitem_init(&s);
26   s.text = text;
27
28   stfile = fopen("/proc/meminfo", "r");
29   if (stfile != NULL) {
30     stlen = getline(&stline, &stlen, stfile);
31     memtotal = atoll(&stline[16]);
32
33     stlen = getline(&stline, &stlen, stfile);
34     memfree = atoll(&stline[16]);
35
36     stlen = getline(&stline, &stlen, stfile);
37     if (stlen > 13 && !memcmp(stline, "MemAvailable:", 13)) {
38       stlen = getline(&stline, &stlen, stfile);
39     }
40     membuffers = atoll(&stline[16]);
41
42     stlen = getline(&stline, &stlen, stfile);
43     memcached = atoll(&stline[16]);
44     free(stline);
45
46     fclose(stfile);
47
48     memused = memtotal - memfree - memcached - membuffers;
49
50     memused /= 1024;    // Just show MBs used
51
52     /* Change color based on % of RAM used */
53     if ((float)memused / (float)memtotal < 0.85) {
54       s.color = "#22FF22";  // green
55     } else {
56       s.color = "#FF0000";  // red
57     }
58
59     snprintf(text, sizeof(text), "Mem: %lld M", memused);
60
61     line_append_item(g, &s);
62   }
63 }