ソースを参照

Use indentation to increase readability

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
Laslo Hunhold 6年前
committed by Aaron Marcher
コミット
9750a3d731
9個のファイルの変更573行の追加539行の削除
  1. +1
    -1
      LICENSE
  2. +69
    -69
      components/battery.c
  3. +70
    -66
      components/cpu.c
  4. +12
    -9
      components/entropy.c
  5. +112
    -108
      components/ram.c
  6. +137
    -123
      components/swap.c
  7. +39
    -37
      components/temperature.c
  8. +50
    -51
      components/uptime.c
  9. +83
    -75
      components/wifi.c

+ 1
- 1
LICENSE ファイルの表示

@@ -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


+ 69
- 69
components/battery.c ファイルの表示

@@ -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

+ 70
- 66
components/cpu.c ファイルの表示

@@ -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

+ 12
- 9
components/entropy.c ファイルの表示

@@ -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

+ 112
- 108
components/ram.c ファイルの表示

@@ -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

+ 137
- 123
components/swap.c ファイルの表示

@@ -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

+ 39
- 37
components/temperature.c ファイルの表示

@@ -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

+ 50
- 51
components/uptime.c ファイルの表示

@@ -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

+ 83
- 75
components/wifi.c ファイルの表示

@@ -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

読み込み中…
キャンセル
保存