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