Granted, this style is definitely not common, but for the short utility-functions of this program it's just the right choice. This provides great flexibility, such that in the long run, it will be possible to also share code between the OS-implementations. This also keeps the state-keeping at a minimum and makes it clearer which functions are implemented on which OS without having to jiggle around with too many files in the process.master
@@ -11,7 +11,7 @@ Copyright 2016-2017 Quentin Rameau <quinq@fifth.space> | |||
Copyright 2016 Mike Coddington <mike@coddington.us> | |||
Copyright 2016-2018 parazyd <parazyd@dyne.org> | |||
Copyright 2017 Tobias Stoeckmann <tobias@stoeckmann.org> | |||
Copyright 2017 Laslo Hunhold <dev@frign.de> | |||
Copyright 2017-2018 Laslo Hunhold <dev@frign.de> | |||
Copyright 2018 Darron Anderson <darronanderson@protonmail.com> | |||
Permission to use, copy, modify, and/or distribute this software for any | |||
@@ -2,90 +2,90 @@ | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#if defined(__linux__) | |||
#include <limits.h> | |||
#include <string.h> | |||
#elif defined(__OpenBSD__) | |||
#include <sys/ioctl.h> | |||
#include <fcntl.h> | |||
#include <unistd.h> | |||
#include <machine/apmvar.h> | |||
#endif | |||
#include "../util.h" | |||
#if defined(__linux__) | |||
const char * | |||
battery_perc(const char *bat) | |||
{ | |||
int perc; | |||
char path[PATH_MAX]; | |||
#include <limits.h> | |||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/capacity"); | |||
return (pscanf(path, "%i", &perc) == 1) ? | |||
bprintf("%d", perc) : NULL; | |||
} | |||
#elif defined(__OpenBSD__) | |||
const char * | |||
battery_perc(const char *null) | |||
{ | |||
struct apm_power_info apm_info; | |||
int fd; | |||
const char * | |||
battery_perc(const char *bat) | |||
{ | |||
int perc; | |||
char path[PATH_MAX]; | |||
fd = open("/dev/apm", O_RDONLY); | |||
if (fd < 0) { | |||
fprintf(stderr, "open '/dev/apm': %s\n", strerror(errno)); | |||
return NULL; | |||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", | |||
bat, "/capacity"); | |||
return (pscanf(path, "%i", &perc) == 1) ? | |||
bprintf("%d", perc) : NULL; | |||
} | |||
if (ioctl(fd, APM_IOC_GETPOWER, &apm_info) < 0) { | |||
fprintf(stderr, "ioctl 'APM_IOC_GETPOWER': %s\n", strerror(errno)); | |||
close(fd); | |||
return NULL; | |||
const char * | |||
battery_power(const char *bat) | |||
{ | |||
int watts; | |||
char path[PATH_MAX]; | |||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", | |||
bat, "/power_now"); | |||
return (pscanf(path, "%i", &watts) == 1) ? | |||
bprintf("%d", (watts + 500000) / 1000000) : NULL; | |||
} | |||
close(fd); | |||
return bprintf("%d", apm_info.battery_life); | |||
} | |||
#endif | |||
const char * | |||
battery_state(const char *bat) | |||
{ | |||
struct { | |||
char *state; | |||
char *symbol; | |||
} map[] = { | |||
{ "Charging", "+" }, | |||
{ "Discharging", "-" }, | |||
{ "Full", "=" }, | |||
{ "Unknown", "/" }, | |||
}; | |||
size_t i; | |||
char path[PATH_MAX], state[12]; | |||
#if defined(__linux__) | |||
const char * | |||
battery_power(const char *bat) | |||
{ | |||
int watts; | |||
char path[PATH_MAX]; | |||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", | |||
bat, "/status"); | |||
if (pscanf(path, "%12s", state) != 1) { | |||
return NULL; | |||
} | |||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/power_now"); | |||
return (pscanf(path, "%i", &watts) == 1) ? | |||
bprintf("%d", (watts + 500000) / 1000000) : NULL; | |||
} | |||
for (i = 0; i < LEN(map); i++) { | |||
if (!strcmp(map[i].state, state)) { | |||
break; | |||
} | |||
} | |||
return (i == LEN(map)) ? "?" : map[i].symbol; | |||
} | |||
#elif defined(__OpenBSD__) | |||
#include <fcntl.h> | |||
#include <machine/apmvar.h> | |||
#include <sys/ioctl.h> | |||
#include <unistd.h> | |||
const char * | |||
battery_state(const char *bat) | |||
{ | |||
struct { | |||
char *state; | |||
char *symbol; | |||
} map[] = { | |||
{ "Charging", "+" }, | |||
{ "Discharging", "-" }, | |||
{ "Full", "=" }, | |||
{ "Unknown", "/" }, | |||
}; | |||
size_t i; | |||
char path[PATH_MAX], state[12]; | |||
const char * | |||
battery_perc(const char *null) | |||
{ | |||
struct apm_power_info apm_info; | |||
int fd; | |||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/power_supply/", bat, "/status"); | |||
if (pscanf(path, "%12s", state) != 1) { | |||
return NULL; | |||
} | |||
fd = open("/dev/apm", O_RDONLY); | |||
if (fd < 0) { | |||
fprintf(stderr, "open '/dev/apm': %s\n", strerror(errno)); | |||
return NULL; | |||
} | |||
for (i = 0; i < LEN(map); i++) { | |||
if (!strcmp(map[i].state, state)) { | |||
break; | |||
if (ioctl(fd, APM_IOC_GETPOWER, &apm_info) < 0) { | |||
fprintf(stderr, "ioctl 'APM_IOC_GETPOWER': %s\n", | |||
strerror(errno)); | |||
close(fd); | |||
return NULL; | |||
} | |||
close(fd); | |||
return bprintf("%d", apm_info.battery_life); | |||
} | |||
return (i == LEN(map)) ? "?" : map[i].symbol; | |||
} | |||
#endif |
@@ -2,87 +2,91 @@ | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#if defined(__OpenBSD__) | |||
#include <sys/sysctl.h> | |||
#endif | |||
#include "../util.h" | |||
#if defined(__linux__) | |||
const char * | |||
cpu_freq(void) | |||
{ | |||
int freq; | |||
return (pscanf("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", | |||
"%i", &freq) == 1) ? | |||
bprintf("%d", (freq + 500) / 1000) : NULL; | |||
} | |||
const char * | |||
cpu_perc(void) | |||
{ | |||
int perc; | |||
static long double a[7]; | |||
static int valid; | |||
long double b[7]; | |||
memcpy(b, a, sizeof(b)); | |||
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2], | |||
&a[3], &a[4], &a[5], &a[6]) != 7) { | |||
return NULL; | |||
} | |||
if (!valid) { | |||
valid = 1; | |||
return NULL; | |||
const char * | |||
cpu_freq(void) | |||
{ | |||
int freq; | |||
return (pscanf("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", | |||
"%i", &freq) == 1) ? | |||
bprintf("%d", (freq + 500) / 1000) : NULL; | |||
} | |||
perc = 100 * ((b[0]+b[1]+b[2]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[5]+a[6])) / | |||
((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6])); | |||
const char * | |||
cpu_perc(void) | |||
{ | |||
int perc; | |||
static long double a[7]; | |||
static int valid; | |||
long double b[7]; | |||
return bprintf("%d", perc); | |||
} | |||
memcpy(b, a, sizeof(b)); | |||
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", | |||
&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6]) != 7) { | |||
return NULL; | |||
} | |||
if (!valid) { | |||
valid = 1; | |||
return NULL; | |||
} | |||
const char * | |||
cpu_iowait(void) | |||
{ | |||
int perc; | |||
static int valid; | |||
static long double a[7]; | |||
long double b[7]; | |||
perc = 100 * | |||
((b[0]+b[1]+b[2]+b[5]+b[6]) - | |||
(a[0]+a[1]+a[2]+a[5]+a[6])) / | |||
((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - | |||
(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6])); | |||
memcpy(b, a, sizeof(b)); | |||
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2], | |||
&a[3], &a[4], &a[5], &a[6]) != 7) { | |||
return NULL; | |||
} | |||
if (!valid) { | |||
valid = 1; | |||
return NULL; | |||
return bprintf("%d", perc); | |||
} | |||
perc = 100 * ((b[4]) - (a[4])) / | |||
((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6])); | |||
const char * | |||
cpu_iowait(void) | |||
{ | |||
int perc; | |||
static int valid; | |||
static long double a[7]; | |||
long double b[7]; | |||
memcpy(b, a, sizeof(b)); | |||
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", | |||
&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6]) != 7) { | |||
return NULL; | |||
} | |||
if (!valid) { | |||
valid = 1; | |||
return NULL; | |||
} | |||
return bprintf("%d", perc); | |||
} | |||
perc = 100 * ((b[4]) - (a[4])) / | |||
((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - | |||
(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6])); | |||
return bprintf("%d", perc); | |||
} | |||
#elif defined(__OpenBSD__) | |||
const char * | |||
cpu_freq(void) | |||
{ | |||
int freq, mib[2]; | |||
size_t size; | |||
#include <sys/sysctl.h> | |||
mib[0] = CTL_HW; | |||
mib[1] = HW_CPUSPEED; | |||
const char * | |||
cpu_freq(void) | |||
{ | |||
int freq, mib[2]; | |||
size_t size; | |||
size = sizeof(freq); | |||
mib[0] = CTL_HW; | |||
mib[1] = HW_CPUSPEED; | |||
if (sysctl(mib, 2, &freq, &size, NULL, 0) == -1) { | |||
fprintf(stderr, "sysctl 'HW_CPUSPEED': %s\n", strerror(errno)); | |||
return NULL; | |||
} | |||
size = sizeof(freq); | |||
return bprintf("%d", freq); | |||
} | |||
if (sysctl(mib, 2, &freq, &size, NULL, 0) == -1) { | |||
fprintf(stderr, "sysctl 'HW_CPUSPEED': %s\n", | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
return bprintf("%d", freq); | |||
} | |||
#endif |
@@ -1,15 +1,18 @@ | |||
/* See LICENSE file for copyright and license details. */ | |||
#if defined(__linux__) | |||
#include <stdio.h> | |||
#include <stdio.h> | |||
#include "../util.h" | |||
#include "../util.h" | |||
const char * | |||
entropy(void) | |||
{ | |||
int num; | |||
const char * | |||
entropy(void) | |||
{ | |||
int num; | |||
return (pscanf("/proc/sys/kernel/random/entropy_avail", "%d", &num) == 1) ? | |||
bprintf("%d", num) : NULL; | |||
} | |||
return (pscanf("/proc/sys/kernel/random/entropy_avail", | |||
"%d", &num) == 1) ? | |||
bprintf("%d", num) : NULL; | |||
} | |||
#elif defined(__OpenBSD__) | |||
/* unimplemented */ | |||
#endif |
@@ -1,129 +1,133 @@ | |||
/* See LICENSE file for copyright and license details. */ | |||
#include <stdio.h> | |||
#if defined (__OpenBSD__) | |||
#include <sys/types.h> | |||
#include <sys/sysctl.h> | |||
#include <stdlib.h> | |||
#include <unistd.h> | |||
#endif | |||
#include "../util.h" | |||
#if defined(__linux__) | |||
const char * | |||
ram_free(void) | |||
{ | |||
long free; | |||
return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ? | |||
bprintf("%f", (float)free / 1024 / 1024) : NULL; | |||
} | |||
const char * | |||
ram_perc(void) | |||
{ | |||
long total, free, buffers, cached; | |||
return (pscanf("/proc/meminfo", | |||
"MemTotal: %ld kB\n" | |||
"MemFree: %ld kB\n" | |||
"MemAvailable: %ld kB\nBuffers: %ld kB\n" | |||
"Cached: %ld kB\n", | |||
&total, &free, &buffers, &buffers, &cached) == 5) ? | |||
bprintf("%d", 100 * ((total - free) - (buffers + cached)) / total) : | |||
NULL; | |||
} | |||
const char * | |||
ram_total(void) | |||
{ | |||
long total; | |||
return (pscanf("/proc/meminfo", "MemTotal: %ld kB\n", &total) == 1) ? | |||
bprintf("%f", (float)total / 1024 / 1024) : NULL; | |||
} | |||
const char * | |||
ram_used(void) | |||
{ | |||
long total, free, buffers, cached; | |||
return (pscanf("/proc/meminfo", | |||
"MemTotal: %ld kB\n" | |||
"MemFree: %ld kB\n" | |||
"MemAvailable: %ld kB\nBuffers: %ld kB\n" | |||
"Cached: %ld kB\n", | |||
&total, &free, &buffers, &buffers, &cached) == 5) ? | |||
bprintf("%f", (float)(total - free - buffers - cached) / 1024 / 1024) : | |||
NULL; | |||
} | |||
#elif defined(__OpenBSD__) | |||
inline int | |||
load_uvmexp(struct uvmexp *uvmexp) | |||
{ | |||
int uvmexp_mib[] = {CTL_VM, VM_UVMEXP}; | |||
size_t size; | |||
size = sizeof(*uvmexp); | |||
return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0; | |||
} | |||
const char * | |||
ram_free(void) | |||
{ | |||
struct uvmexp uvmexp; | |||
float free; | |||
int free_pages; | |||
if (load_uvmexp(&uvmexp)) { | |||
free_pages = uvmexp.npages - uvmexp.active; | |||
free = (double) (free_pages * uvmexp.pagesize) / 1024 / 1024 / 1024; | |||
return bprintf("%f", free); | |||
const char * | |||
ram_free(void) | |||
{ | |||
long free; | |||
return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ? | |||
bprintf("%f", (float)free / 1024 / 1024) : NULL; | |||
} | |||
const char * | |||
ram_perc(void) | |||
{ | |||
long total, free, buffers, cached; | |||
return (pscanf("/proc/meminfo", | |||
"MemTotal: %ld kB\n" | |||
"MemFree: %ld kB\n" | |||
"MemAvailable: %ld kB\nBuffers: %ld kB\n" | |||
"Cached: %ld kB\n", | |||
&total, &free, &buffers, &buffers, &cached) == 5) ? | |||
bprintf("%d", 100 * ((total - free) - (buffers + cached)) / | |||
total) : | |||
NULL; | |||
} | |||
const char * | |||
ram_total(void) | |||
{ | |||
long total; | |||
return (pscanf("/proc/meminfo", "MemTotal: %ld kB\n", &total) == 1) ? | |||
bprintf("%f", (float)total / 1024 / 1024) : NULL; | |||
} | |||
return NULL; | |||
} | |||
const char * | |||
ram_used(void) | |||
{ | |||
long total, free, buffers, cached; | |||
return (pscanf("/proc/meminfo", | |||
"MemTotal: %ld kB\n" | |||
"MemFree: %ld kB\n" | |||
"MemAvailable: %ld kB\nBuffers: %ld kB\n" | |||
"Cached: %ld kB\n", | |||
&total, &free, &buffers, &buffers, &cached) == 5) ? | |||
bprintf("%f", (float)(total - free - buffers - cached) / | |||
1024 / 1024) : | |||
NULL; | |||
} | |||
#elif defined(__OpenBSD__) | |||
#include <sys/types.h> | |||
#include <sys/sysctl.h> | |||
#include <stdlib.h> | |||
#include <unistd.h> | |||
inline int | |||
load_uvmexp(struct uvmexp *uvmexp) | |||
{ | |||
int uvmexp_mib[] = {CTL_VM, VM_UVMEXP}; | |||
size_t size; | |||
size = sizeof(*uvmexp); | |||
const char * | |||
ram_perc(void) | |||
{ | |||
struct uvmexp uvmexp; | |||
int percent; | |||
return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0; | |||
} | |||
if (load_uvmexp(&uvmexp)) { | |||
percent = uvmexp.active * 100 / uvmexp.npages; | |||
return bprintf("%d", percent); | |||
const char * | |||
ram_free(void) | |||
{ | |||
struct uvmexp uvmexp; | |||
float free; | |||
int free_pages; | |||
if (load_uvmexp(&uvmexp)) { | |||
free_pages = uvmexp.npages - uvmexp.active; | |||
free = (double) (free_pages * uvmexp.pagesize) / 1024 / | |||
1024 / 1024; | |||
return bprintf("%f", free); | |||
} | |||
return NULL; | |||
} | |||
return NULL; | |||
} | |||
const char * | |||
ram_perc(void) | |||
{ | |||
struct uvmexp uvmexp; | |||
int percent; | |||
const char * | |||
ram_total(void) | |||
{ | |||
struct uvmexp uvmexp; | |||
float total; | |||
if (load_uvmexp(&uvmexp)) { | |||
percent = uvmexp.active * 100 / uvmexp.npages; | |||
return bprintf("%d", percent); | |||
} | |||
if (load_uvmexp(&uvmexp)) { | |||
total = (double) (uvmexp.npages * uvmexp.pagesize) / 1024 / 1024 / 1024; | |||
return bprintf("%f", total); | |||
return NULL; | |||
} | |||
return NULL; | |||
} | |||
const char * | |||
ram_total(void) | |||
{ | |||
struct uvmexp uvmexp; | |||
float total; | |||
const char * | |||
ram_used(void) | |||
{ | |||
struct uvmexp uvmexp; | |||
float used; | |||
if (load_uvmexp(&uvmexp)) { | |||
total = (double) (uvmexp.npages * uvmexp.pagesize) / | |||
1024 / 1024 / 1024; | |||
return bprintf("%f", total); | |||
} | |||
if (load_uvmexp(&uvmexp)) { | |||
used = (double) (uvmexp.active * uvmexp.pagesize) / 1024 / 1024 / 1024; | |||
return bprintf("%f", used); | |||
return NULL; | |||
} | |||
return NULL; | |||
} | |||
const char * | |||
ram_used(void) | |||
{ | |||
struct uvmexp uvmexp; | |||
float used; | |||
if (load_uvmexp(&uvmexp)) { | |||
used = (double) (uvmexp.active * uvmexp.pagesize) / | |||
1024 / 1024 / 1024; | |||
return bprintf("%f", used); | |||
} | |||
return NULL; | |||
} | |||
#endif |
@@ -1,138 +1,152 @@ | |||
/* See LICENSE file for copyright and license details. */ | |||
#if defined(__linux__) | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include "../util.h" | |||
const char * | |||
swap_free(void) | |||
{ | |||
long total, free; | |||
FILE *fp; | |||
size_t bytes_read; | |||
char *match; | |||
fp = fopen("/proc/meminfo", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno)); | |||
return NULL; | |||
} | |||
if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { | |||
fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno)); | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include "../util.h" | |||
const char * | |||
swap_free(void) | |||
{ | |||
long total, free; | |||
FILE *fp; | |||
size_t bytes_read; | |||
char *match; | |||
fp = fopen("/proc/meminfo", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, | |||
fp)) == 0) { | |||
fprintf(stderr, "fread '/proc/meminfo': %s\n", | |||
strerror(errno)); | |||
fclose(fp); | |||
return NULL; | |||
} | |||
fclose(fp); | |||
return NULL; | |||
} | |||
fclose(fp); | |||
if ((match = strstr(buf, "SwapTotal")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapTotal: %ld kB\n", &total); | |||
if ((match = strstr(buf, "SwapFree")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapFree: %ld kB\n", &free); | |||
return bprintf("%f", (float)free / 1024 / 1024); | |||
} | |||
const char * | |||
swap_perc(void) | |||
{ | |||
long total, free, cached; | |||
FILE *fp; | |||
size_t bytes_read; | |||
char *match; | |||
fp = fopen("/proc/meminfo", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno)); | |||
return NULL; | |||
if ((match = strstr(buf, "SwapTotal")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapTotal: %ld kB\n", &total); | |||
if ((match = strstr(buf, "SwapFree")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapFree: %ld kB\n", &free); | |||
return bprintf("%f", (float)free / 1024 / 1024); | |||
} | |||
if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { | |||
fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno)); | |||
const char * | |||
swap_perc(void) | |||
{ | |||
long total, free, cached; | |||
FILE *fp; | |||
size_t bytes_read; | |||
char *match; | |||
fp = fopen("/proc/meminfo", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, | |||
fp)) == 0) { | |||
fprintf(stderr, "fread '/proc/meminfo': %s\n", | |||
strerror(errno)); | |||
fclose(fp); | |||
return NULL; | |||
} | |||
fclose(fp); | |||
return NULL; | |||
} | |||
fclose(fp); | |||
if ((match = strstr(buf, "SwapTotal")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapTotal: %ld kB\n", &total); | |||
if ((match = strstr(buf, "SwapCached")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapCached: %ld kB\n", &cached); | |||
if ((match = strstr(buf, "SwapFree")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapFree: %ld kB\n", &free); | |||
return bprintf("%d", 100 * (total - free - cached) / total); | |||
} | |||
const char * | |||
swap_total(void) | |||
{ | |||
long total; | |||
FILE *fp; | |||
size_t bytes_read; | |||
char *match; | |||
fp = fopen("/proc/meminfo", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno)); | |||
return NULL; | |||
if ((match = strstr(buf, "SwapTotal")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapTotal: %ld kB\n", &total); | |||
if ((match = strstr(buf, "SwapCached")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapCached: %ld kB\n", &cached); | |||
if ((match = strstr(buf, "SwapFree")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapFree: %ld kB\n", &free); | |||
return bprintf("%d", 100 * (total - free - cached) / total); | |||
} | |||
if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { | |||
fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno)); | |||
const char * | |||
swap_total(void) | |||
{ | |||
long total; | |||
FILE *fp; | |||
size_t bytes_read; | |||
char *match; | |||
fp = fopen("/proc/meminfo", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, | |||
fp)) == 0) { | |||
fprintf(stderr, "fread '/proc/meminfo': %s\n", | |||
strerror(errno)); | |||
fclose(fp); | |||
return NULL; | |||
} | |||
fclose(fp); | |||
return NULL; | |||
} | |||
fclose(fp); | |||
if ((match = strstr(buf, "SwapTotal")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapTotal: %ld kB\n", &total); | |||
return bprintf("%f", (float)total / 1024 / 1024); | |||
} | |||
const char * | |||
swap_used(void) | |||
{ | |||
long total, free, cached; | |||
FILE *fp; | |||
size_t bytes_read; | |||
char *match; | |||
fp = fopen("/proc/meminfo", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno)); | |||
return NULL; | |||
if ((match = strstr(buf, "SwapTotal")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapTotal: %ld kB\n", &total); | |||
return bprintf("%f", (float)total / 1024 / 1024); | |||
} | |||
if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { | |||
fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno)); | |||
const char * | |||
swap_used(void) | |||
{ | |||
long total, free, cached; | |||
FILE *fp; | |||
size_t bytes_read; | |||
char *match; | |||
fp = fopen("/proc/meminfo", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
if ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, | |||
fp)) == 0) { | |||
fprintf(stderr, "fread '/proc/meminfo': %s\n", | |||
strerror(errno)); | |||
fclose(fp); | |||
return NULL; | |||
} | |||
fclose(fp); | |||
return NULL; | |||
} | |||
fclose(fp); | |||
if ((match = strstr(buf, "SwapTotal")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapTotal: %ld kB\n", &total); | |||
if ((match = strstr(buf, "SwapTotal")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapTotal: %ld kB\n", &total); | |||
if ((match = strstr(buf, "SwapCached")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapCached: %ld kB\n", &cached); | |||
if ((match = strstr(buf, "SwapCached")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapCached: %ld kB\n", &cached); | |||
if ((match = strstr(buf, "SwapFree")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapFree: %ld kB\n", &free); | |||
if ((match = strstr(buf, "SwapFree")) == NULL) | |||
return NULL; | |||
sscanf(match, "SwapFree: %ld kB\n", &free); | |||
return bprintf("%f", (float)(total - free - cached) / 1024 / 1024); | |||
} | |||
return bprintf("%f", (float)(total - free - cached) / 1024 / 1024); | |||
} | |||
#elif defined(__OpenBSD__) | |||
/* unimplemented */ | |||
#endif |
@@ -1,45 +1,47 @@ | |||
/* See LICENSE file for copyright and license details. */ | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#if defined(__OpenBSD__) | |||
#include <sys/sysctl.h> | |||
#include <sys/time.h> | |||
#include <sys/sensors.h> | |||
#endif | |||
#include <stddef.h> | |||
#include "../util.h" | |||
#if defined(__linux__) | |||
const char * | |||
temp(const char *file) | |||
{ | |||
int temp; | |||
return (pscanf(file, "%d", &temp) == 1) ? | |||
bprintf("%d", temp / 1000) : NULL; | |||
} | |||
#elif defined(__OpenBSD__) | |||
const char * | |||
temp(const char *null) | |||
{ | |||
int mib[5]; | |||
size_t size; | |||
struct sensor temp; | |||
mib[0] = CTL_HW; | |||
mib[1] = HW_SENSORS; | |||
mib[2] = 0; /* cpu0 */ | |||
mib[3] = SENSOR_TEMP; | |||
mib[4] = 0; /* temp0 */ | |||
size = sizeof(temp); | |||
if (sysctl(mib, 5, &temp, &size, NULL, 0) == -1) { | |||
fprintf(stderr, "sysctl 'SENSOR_TEMP': %s\n", strerror(errno)); | |||
return NULL; | |||
const char * | |||
temp(const char *file) | |||
{ | |||
int temp; | |||
return (pscanf(file, "%d", &temp) == 1) ? | |||
bprintf("%d", temp / 1000) : NULL; | |||
} | |||
#elif defined(__OpenBSD__) | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include <sys/sysctl.h> | |||
#include <sys/time.h> | |||
#include <sys/sensors.h> | |||
const char * | |||
temp(const char *null) | |||
{ | |||
int mib[5]; | |||
size_t size; | |||
struct sensor temp; | |||
return bprintf("%d", (temp.value - 273150000) / 1000000); /* kelvin to celsius */ | |||
} | |||
mib[0] = CTL_HW; | |||
mib[1] = HW_SENSORS; | |||
mib[2] = 0; /* cpu0 */ | |||
mib[3] = SENSOR_TEMP; | |||
mib[4] = 0; /* temp0 */ | |||
size = sizeof(temp); | |||
if (sysctl(mib, 5, &temp, &size, NULL, 0) == -1) { | |||
fprintf(stderr, "sysctl 'SENSOR_TEMP': %s\n", | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
/* kelvin to celsius */ | |||
return bprintf("%d", (temp.value - 273150000) / 1000000); | |||
} | |||
#endif |
@@ -2,62 +2,61 @@ | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#if defined(__linux__) | |||
#include <sys/sysinfo.h> | |||
#elif defined(__OpenBSD__) | |||
#include <sys/sysctl.h> | |||
#include <sys/time.h> | |||
#endif | |||
#include "../util.h" | |||
#if defined(__linux__) | |||
const char * | |||
uptime(void) | |||
{ | |||
int h; | |||
int m; | |||
int uptime = 0; | |||
struct sysinfo info; | |||
sysinfo(&info); | |||
uptime = info.uptime; | |||
h = uptime / 3600; | |||
m = (uptime - h * 3600) / 60; | |||
return bprintf("%dh %dm", h, m); | |||
} | |||
#elif defined(__OpenBSD__) | |||
const char * | |||
uptime(void) | |||
{ | |||
int h; | |||
int m; | |||
int uptime = 0; | |||
int mib[2]; | |||
size_t size; | |||
time_t now; | |||
struct timeval boottime; | |||
time(&now); | |||
mib[0] = CTL_KERN; | |||
mib[1] = KERN_BOOTTIME; | |||
size = sizeof(boottime); | |||
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1) | |||
uptime = now - boottime.tv_sec; | |||
else { | |||
fprintf(stderr, "sysctl 'KERN_BOOTTIME': %s\n", strerror(errno)); | |||
return NULL; | |||
#include <sys/sysinfo.h> | |||
const char * | |||
uptime(void) | |||
{ | |||
int h; | |||
int m; | |||
int uptime = 0; | |||
struct sysinfo info; | |||
sysinfo(&info); | |||
uptime = info.uptime; | |||
h = uptime / 3600; | |||
m = (uptime - h * 3600) / 60; | |||
return bprintf("%dh %dm", h, m); | |||
} | |||
#elif defined(__OpenBSD__) | |||
#include <sys/sysctl.h> | |||
#include <sys/time.h> | |||
const char * | |||
uptime(void) | |||
{ | |||
int h; | |||
int m; | |||
int uptime = 0; | |||
int mib[2]; | |||
size_t size; | |||
time_t now; | |||
struct timeval boottime; | |||
time(&now); | |||
h = uptime / 3600; | |||
m = (uptime - h * 3600) / 60; | |||
mib[0] = CTL_KERN; | |||
mib[1] = KERN_BOOTTIME; | |||
return bprintf("%dh %dm", h, m); | |||
} | |||
size = sizeof(boottime); | |||
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1) | |||
uptime = now - boottime.tv_sec; | |||
else { | |||
fprintf(stderr, "sysctl 'KERN_BOOTTIME': %s\n", strerror(errno)); | |||
return NULL; | |||
} | |||
h = uptime / 3600; | |||
m = (uptime - h * 3600) / 60; | |||
return bprintf("%dh %dm", h, m); | |||
} | |||
#endif |
@@ -1,92 +1,100 @@ | |||
/* See LICENSE file for copyright and license details. */ | |||
#if defined(__linux__) | |||
#include <errno.h> | |||
#include <ifaddrs.h> | |||
#include <linux/wireless.h> | |||
#include <sys/socket.h> | |||
#include <stdio.h> | |||
#include <limits.h> | |||
#include <string.h> | |||
#include <sys/ioctl.h> | |||
#include <unistd.h> | |||
#include <errno.h> | |||
#include <ifaddrs.h> | |||
#include <linux/wireless.h> | |||
#include <sys/socket.h> | |||
#include <stdio.h> | |||
#include <limits.h> | |||
#include <string.h> | |||
#include <sys/ioctl.h> | |||
#include <unistd.h> | |||
#include "../util.h" | |||
#include "../util.h" | |||
const char * | |||
wifi_perc(const char *iface) | |||
{ | |||
int i, cur; | |||
float perc; | |||
int total = 70; /* the max of /proc/net/wireless */ | |||
char *p, *datastart; | |||
char path[PATH_MAX]; | |||
char status[5]; | |||
FILE *fp; | |||
const char * | |||
wifi_perc(const char *iface) | |||
{ | |||
int i, cur; | |||
float perc; | |||
int total = 70; /* the max of /proc/net/wireless */ | |||
char *p, *datastart; | |||
char path[PATH_MAX]; | |||
char status[5]; | |||
FILE *fp; | |||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, "/operstate"); | |||
fp = fopen(path, "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '%s': %s\n", path, strerror(errno)); | |||
return NULL; | |||
} | |||
p = fgets(status, 5, fp); | |||
fclose(fp); | |||
if(!p || strcmp(status, "up\n") != 0) { | |||
return NULL; | |||
} | |||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, | |||
"/operstate"); | |||
fp = fopen(path, "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '%s': %s\n", path, | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
p = fgets(status, 5, fp); | |||
fclose(fp); | |||
if(!p || strcmp(status, "up\n") != 0) { | |||
return NULL; | |||
} | |||
fp = fopen("/proc/net/wireless", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/net/wireless': %s\n", strerror(errno)); | |||
return NULL; | |||
} | |||
fp = fopen("/proc/net/wireless", "r"); | |||
if (fp == NULL) { | |||
fprintf(stderr, "fopen '/proc/net/wireless': %s\n", | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
for (i = 0; i < 3; i++) { | |||
if (!(p = fgets(buf, sizeof(buf) - 1, fp))) | |||
break; | |||
} | |||
fclose(fp); | |||
if (i < 2 || !p) | |||
return NULL; | |||
for (i = 0; i < 3; i++) { | |||
if (!(p = fgets(buf, sizeof(buf) - 1, fp))) | |||
break; | |||
} | |||
fclose(fp); | |||
if (i < 2 || !p) | |||
return NULL; | |||
if ((datastart = strstr(buf, iface)) == NULL) | |||
return NULL; | |||
if ((datastart = strstr(buf, iface)) == NULL) | |||
return NULL; | |||
datastart = (datastart+(strlen(iface)+1)); | |||
sscanf(datastart + 1, " %*d %d %*d %*d\t\t %*d\t " | |||
"%*d\t\t%*d\t\t %*d\t %*d\t\t %*d", &cur); | |||
datastart = (datastart+(strlen(iface)+1)); | |||
sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &cur); | |||
perc = (float)cur / total * 100.0; | |||
perc = (float)cur / total * 100.0; | |||
return bprintf("%.0f", perc); | |||
} | |||
return bprintf("%.0f", perc); | |||
} | |||
const char * | |||
wifi_essid(const char *iface) | |||
{ | |||
static char id[IW_ESSID_MAX_SIZE+1]; | |||
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); | |||
struct iwreq wreq; | |||
const char * | |||
wifi_essid(const char *iface) | |||
{ | |||
static char id[IW_ESSID_MAX_SIZE+1]; | |||
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); | |||
struct iwreq wreq; | |||
memset(&wreq, 0, sizeof(struct iwreq)); | |||
wreq.u.essid.length = IW_ESSID_MAX_SIZE+1; | |||
snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface); | |||
memset(&wreq, 0, sizeof(struct iwreq)); | |||
wreq.u.essid.length = IW_ESSID_MAX_SIZE+1; | |||
snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface); | |||
if (sockfd == -1) { | |||
fprintf(stderr, "socket 'AF_INET': %s\n", | |||
strerror(errno)); | |||
return NULL; | |||
} | |||
wreq.u.essid.pointer = id; | |||
if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) { | |||
fprintf(stderr, "ioctl 'SIOCGIWESSID': %s\n", | |||
strerror(errno)); | |||
close(sockfd); | |||
return NULL; | |||
} | |||
if (sockfd == -1) { | |||
fprintf(stderr, "socket 'AF_INET': %s\n", strerror(errno)); | |||
return NULL; | |||
} | |||
wreq.u.essid.pointer = id; | |||
if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) { | |||
fprintf(stderr, "ioctl 'SIOCGIWESSID': %s\n", strerror(errno)); | |||
close(sockfd); | |||
return NULL; | |||
} | |||
close(sockfd); | |||
if (strcmp(id, "") == 0) | |||
return NULL; | |||
else | |||
return id; | |||
} | |||
if (strcmp(id, "") == 0) | |||
return NULL; | |||
else | |||
return id; | |||
} | |||
#elif defined(__OpenBSD__) | |||
/* unimplemented */ | |||
#endif |