1#include "../util.h"
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6#include <time.h>
7#include <unistd.h>
8
9#ifdef __linux__
10#include <sys/sysinfo.h>
11#else
12#include <sys/sysctl.h>
13#include <sys/time.h>
14#endif
15
16int
17get_uptime(long *uptime_secs)
18{
19#ifdef __linux__
20 struct sysinfo info;
21
22 if (sysinfo(&info) < 0)
23 return -1;
24 *uptime_secs = info.uptime;
25 return 0;
26#else
27 struct timeval boottime;
28 size_t len = sizeof(boottime);
29 int mib[2] = { CTL_KERN, KERN_BOOTTIME };
30 time_t now;
31
32 if (sysctl(mib, 2, &boottime, &len, NULL, 0) < 0)
33 return -1;
34 time(&now);
35 *uptime_secs = (long)(now - boottime.tv_sec);
36 return 0;
37#endif
38}
39
40int
41get_loads(double loads[3])
42{
43 if (getloadavg(loads, 3) != 3)
44 return -1;
45 return 0;
46}
47
48int
49get_meminfo(struct MemInfo *mi)
50{
51 memset(mi, 0, sizeof(*mi));
52#ifdef __linux__
53 struct sysinfo info;
54 unsigned long long unit;
55
56 if (sysinfo(&info) < 0)
57 return -1;
58 unit = info.mem_unit ? info.mem_unit : 1;
59 mi->total = info.totalram * unit;
60 mi->free = info.freeram * unit;
61 mi->shared = info.sharedram * unit;
62 mi->buffers = info.bufferram * unit;
63 mi->cached = 0;
64 mi->totalswap = info.totalswap * unit;
65 mi->freeswap = info.freeswap * unit;
66 return 0;
67#else
68 int mib[2];
69 size_t len;
70 unsigned long physmem = 0;
71 unsigned int page_size = 4096;
72 unsigned int free_pages = 0;
73
74 mib[0] = CTL_HW;
75 mib[1] = HW_PHYSMEM;
76 len = sizeof(physmem);
77 if (sysctl(mib, 2, &physmem, &len, NULL, 0) < 0)
78 return -1;
79 mi->total = physmem;
80
81 mib[0] = CTL_HW;
82 mib[1] = HW_PAGESIZE;
83 len = sizeof(page_size);
84 sysctl(mib, 2, &page_size, &len, NULL, 0);
85
86 len = sizeof(free_pages);
87 if (sysctlbyname("vm.stats.vm.v_free_count", &free_pages, &len, NULL, 0) >= 0) {
88 mi->free = (unsigned long long)free_pages * page_size;
89 } else {
90 mi->free = mi->total / 4;
91 }
92 return 0;
93#endif
94}
95
96#ifdef __linux__
97#include <sys/klog.h>
98ssize_t
99get_dmesg(char *buf, size_t len)
100{
101 if (!buf && len == 0)
102 return klogctl(10, NULL, 0);
103 return klogctl(3, buf, len);
104}
105
106int
107clear_dmesg(void)
108{
109 if (klogctl(5, NULL, 0) < 0)
110 return -1;
111 return 0;
112}
113
114int
115set_console_level(int level)
116{
117 if (klogctl(8, NULL, level) < 0)
118 return -1;
119 return 0;
120}
121#else
122ssize_t
123get_dmesg(char *buf, size_t len)
124{
125 int mib[2];
126 size_t needed = len;
127
128 mib[0] = CTL_KERN;
129 mib[1] = KERN_MSGBUF;
130 if (sysctl(mib, 2, buf, &needed, NULL, 0) < 0)
131 return -1;
132 return (ssize_t)needed;
133}
134
135int
136clear_dmesg(void)
137{
138 return -1;
139}
140
141int
142set_console_level(int level)
143{
144 (void)level;
145 return -1;
146}
147#endif