master xplshn/aruu / shared / libutil / sysinfo.c
  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