Xinqi Bao's Git

corrected calculations for disk space on openbsd
[slstatus.git] / components / ram.c
1 /* See LICENSE file for copyright and license details. */
2 #include <stdio.h>
3
4 #include "../util.h"
5
6 #if defined(__linux__)
7 const char *
8 ram_free(void)
9 {
10 long free;
11
12 return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ?
13 bprintf("%f", (float)free / 1024 / 1024) : NULL;
14 }
15
16 const char *
17 ram_perc(void)
18 {
19 long total, free, buffers, cached;
20
21 return (pscanf("/proc/meminfo",
22 "MemTotal: %ld kB\n"
23 "MemFree: %ld kB\n"
24 "MemAvailable: %ld kB\nBuffers: %ld kB\n"
25 "Cached: %ld kB\n",
26 &total, &free, &buffers, &buffers, &cached) == 5) ?
27 bprintf("%d", 100 * ((total - free) - (buffers + cached)) /
28 total) :
29 NULL;
30 }
31
32 const char *
33 ram_total(void)
34 {
35 long total;
36
37 return (pscanf("/proc/meminfo", "MemTotal: %ld kB\n", &total) == 1) ?
38 bprintf("%f", (float)total / 1024 / 1024) : NULL;
39 }
40
41 const char *
42 ram_used(void)
43 {
44 long total, free, buffers, cached;
45
46 return (pscanf("/proc/meminfo",
47 "MemTotal: %ld kB\n"
48 "MemFree: %ld kB\n"
49 "MemAvailable: %ld kB\nBuffers: %ld kB\n"
50 "Cached: %ld kB\n",
51 &total, &free, &buffers, &buffers, &cached) == 5) ?
52 bprintf("%f", (float)(total - free - buffers - cached) /
53 1024 / 1024) :
54 NULL;
55 }
56 #elif defined(__OpenBSD__)
57 #include <stdlib.h>
58 #include <sys/sysctl.h>
59 #include <sys/types.h>
60 #include <unistd.h>
61
62 #define LOG1024 10
63 #define pagetok(size, pageshift) ((size) << (pageshift - LOG1024))
64
65 inline int
66 load_uvmexp(struct uvmexp *uvmexp)
67 {
68 int uvmexp_mib[] = {CTL_VM, VM_UVMEXP};
69 size_t size;
70
71 size = sizeof(*uvmexp);
72
73 return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0;
74 }
75
76 const char *
77 ram_free(void)
78 {
79 struct uvmexp uvmexp;
80 float free;
81 int free_pages;
82
83 if (load_uvmexp(&uvmexp)) {
84 free_pages = uvmexp.npages - uvmexp.active;
85 free = (float)(pagetok(free_pages, uvmexp.pageshift)) / 1024 / 1024;
86 return bprintf("%f", free);
87 }
88
89 return NULL;
90 }
91
92 const char *
93 ram_perc(void)
94 {
95 struct uvmexp uvmexp;
96 int percent;
97
98 if (load_uvmexp(&uvmexp)) {
99 percent = uvmexp.active * 100 / uvmexp.npages;
100 return bprintf("%d", percent);
101 }
102
103 return NULL;
104 }
105
106 const char *
107 ram_total(void)
108 {
109 struct uvmexp uvmexp;
110 float total;
111
112 if (load_uvmexp(&uvmexp)) {
113 total = (float)(pagetok(uvmexp.npages, uvmexp.pageshift)) / 1024 / 1024;
114 return bprintf("%f", total);
115 }
116
117 return NULL;
118 }
119
120 const char *
121 ram_used(void)
122 {
123 struct uvmexp uvmexp;
124 float used;
125
126 if (load_uvmexp(&uvmexp)) {
127 used = (float)(pagetok(uvmexp.active, uvmexp.pageshift)) / 1024 / 1024;
128 return bprintf("%f", used);
129 }
130
131 return NULL;
132 }
133 #endif