Browse Source
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
committed by
Aaron Marcher
9 changed files with 573 additions and 539 deletions
@ -1,15 +1,18 @@ |
|||||
/* See LICENSE file for copyright and license details. */ |
/* See LICENSE file for copyright and license details. */ |
||||
#if defined(__linux__) |
#if defined(__linux__) |
||||
#include <stdio.h> |
#include <stdio.h> |
||||
|
|
||||
#include "../util.h" |
#include "../util.h" |
||||
|
|
||||
const char * |
const char * |
||||
entropy(void) |
entropy(void) |
||||
{ |
{ |
||||
int num; |
int num; |
||||
|
|
||||
return (pscanf("/proc/sys/kernel/random/entropy_avail", "%d", &num) == 1) ? |
return (pscanf("/proc/sys/kernel/random/entropy_avail", |
||||
bprintf("%d", num) : NULL; |
"%d", &num) == 1) ? |
||||
} |
bprintf("%d", num) : NULL; |
||||
|
} |
||||
|
#elif defined(__OpenBSD__) |
||||
|
/* unimplemented */ |
||||
#endif |
#endif |
||||
|
|||||
@ -1,129 +1,133 @@ |
|||||
/* See LICENSE file for copyright and license details. */ |
/* See LICENSE file for copyright and license details. */ |
||||
#include <stdio.h> |
#include <stdio.h> |
||||
#if defined (__OpenBSD__) |
|
||||
#include <sys/types.h> |
|
||||
#include <sys/sysctl.h> |
|
||||
#include <stdlib.h> |
|
||||
#include <unistd.h> |
|
||||
#endif |
|
||||
|
|
||||
#include "../util.h" |
#include "../util.h" |
||||
|
|
||||
#if defined(__linux__) |
#if defined(__linux__) |
||||
const char * |
const char * |
||||
ram_free(void) |
ram_free(void) |
||||
{ |
{ |
||||
long free; |
long free; |
||||
|
|
||||
return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ? |
return (pscanf("/proc/meminfo", "MemFree: %ld kB\n", &free) == 1) ? |
||||
bprintf("%f", (float)free / 1024 / 1024) : NULL; |
bprintf("%f", (float)free / 1024 / 1024) : NULL; |
||||
} |
} |
||||
|
|
||||
const char * |
const char * |
||||
ram_perc(void) |
ram_perc(void) |
||||
{ |
{ |
||||
long total, free, buffers, cached; |
long total, free, buffers, cached; |
||||
|
|
||||
return (pscanf("/proc/meminfo", |
return (pscanf("/proc/meminfo", |
||||
"MemTotal: %ld kB\n" |
"MemTotal: %ld kB\n" |
||||
"MemFree: %ld kB\n" |
"MemFree: %ld kB\n" |
||||
"MemAvailable: %ld kB\nBuffers: %ld kB\n" |
"MemAvailable: %ld kB\nBuffers: %ld kB\n" |
||||
"Cached: %ld kB\n", |
"Cached: %ld kB\n", |
||||
&total, &free, &buffers, &buffers, &cached) == 5) ? |
&total, &free, &buffers, &buffers, &cached) == 5) ? |
||||
bprintf("%d", 100 * ((total - free) - (buffers + cached)) / total) : |
bprintf("%d", 100 * ((total - free) - (buffers + cached)) / |
||||
NULL; |
total) : |
||||
} |
NULL; |
||||
|
} |
||||
const char * |
|
||||
ram_total(void) |
const char * |
||||
{ |
ram_total(void) |
||||
long total; |
{ |
||||
|
long total; |
||||
return (pscanf("/proc/meminfo", "MemTotal: %ld kB\n", &total) == 1) ? |
|
||||
bprintf("%f", (float)total / 1024 / 1024) : NULL; |
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); |
|
||||
} |
} |
||||
|
|
||||
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 * |
return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0; |
||||
ram_perc(void) |
} |
||||
{ |
|
||||
struct uvmexp uvmexp; |
|
||||
int percent; |
|
||||
|
|
||||
if (load_uvmexp(&uvmexp)) { |
const char * |
||||
percent = uvmexp.active * 100 / uvmexp.npages; |
ram_free(void) |
||||
return bprintf("%d", percent); |
{ |
||||
|
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 * |
if (load_uvmexp(&uvmexp)) { |
||||
ram_total(void) |
percent = uvmexp.active * 100 / uvmexp.npages; |
||||
{ |
return bprintf("%d", percent); |
||||
struct uvmexp uvmexp; |
} |
||||
float total; |
|
||||
|
|
||||
if (load_uvmexp(&uvmexp)) { |
return NULL; |
||||
total = (double) (uvmexp.npages * uvmexp.pagesize) / 1024 / 1024 / 1024; |
|
||||
return bprintf("%f", total); |
|
||||
} |
} |
||||
|
|
||||
return NULL; |
const char * |
||||
} |
ram_total(void) |
||||
|
{ |
||||
|
struct uvmexp uvmexp; |
||||
|
float total; |
||||
|
|
||||
const char * |
if (load_uvmexp(&uvmexp)) { |
||||
ram_used(void) |
total = (double) (uvmexp.npages * uvmexp.pagesize) / |
||||
{ |
1024 / 1024 / 1024; |
||||
struct uvmexp uvmexp; |
return bprintf("%f", total); |
||||
float used; |
} |
||||
|
|
||||
if (load_uvmexp(&uvmexp)) { |
return NULL; |
||||
used = (double) (uvmexp.active * uvmexp.pagesize) / 1024 / 1024 / 1024; |
|
||||
return bprintf("%f", used); |
|
||||
} |
} |
||||
|
|
||||
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 |
#endif |
||||
|
|||||
@ -1,138 +1,152 @@ |
|||||
/* See LICENSE file for copyright and license details. */ |
/* See LICENSE file for copyright and license details. */ |
||||
#if defined(__linux__) |
#if defined(__linux__) |
||||
#include <errno.h> |
#include <errno.h> |
||||
#include <stdio.h> |
#include <stdio.h> |
||||
#include <string.h> |
#include <string.h> |
||||
|
|
||||
#include "../util.h" |
#include "../util.h" |
||||
|
|
||||
const char * |
const char * |
||||
swap_free(void) |
swap_free(void) |
||||
{ |
{ |
||||
long total, free; |
long total, free; |
||||
FILE *fp; |
FILE *fp; |
||||
size_t bytes_read; |
size_t bytes_read; |
||||
char *match; |
char *match; |
||||
|
|
||||
fp = fopen("/proc/meminfo", "r"); |
fp = fopen("/proc/meminfo", "r"); |
||||
if (fp == NULL) { |
if (fp == NULL) { |
||||
fprintf(stderr, "fopen '/proc/meminfo': %s\n", strerror(errno)); |
fprintf(stderr, "fopen '/proc/meminfo': %s\n", |
||||
return NULL; |
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)); |
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); |
fclose(fp); |
||||
return NULL; |
|
||||
} |
if ((match = strstr(buf, "SwapTotal")) == NULL) |
||||
fclose(fp); |
return NULL; |
||||
|
sscanf(match, "SwapTotal: %ld kB\n", &total); |
||||
if ((match = strstr(buf, "SwapTotal")) == NULL) |
|
||||
return NULL; |
if ((match = strstr(buf, "SwapFree")) == NULL) |
||||
sscanf(match, "SwapTotal: %ld kB\n", &total); |
return NULL; |
||||
|
sscanf(match, "SwapFree: %ld kB\n", &free); |
||||
if ((match = strstr(buf, "SwapFree")) == NULL) |
|
||||
return NULL; |
return bprintf("%f", (float)free / 1024 / 1024); |
||||
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 ((bytes_read = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) == 0) { |
const char * |
||||
fprintf(stderr, "fread '/proc/meminfo': %s\n", strerror(errno)); |
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); |
fclose(fp); |
||||
return NULL; |
|
||||
} |
if ((match = strstr(buf, "SwapTotal")) == NULL) |
||||
fclose(fp); |
return NULL; |
||||
|
sscanf(match, "SwapTotal: %ld kB\n", &total); |
||||
if ((match = strstr(buf, "SwapTotal")) == NULL) |
|
||||
return NULL; |
if ((match = strstr(buf, "SwapCached")) == NULL) |
||||
sscanf(match, "SwapTotal: %ld kB\n", &total); |
return NULL; |
||||
|
sscanf(match, "SwapCached: %ld kB\n", &cached); |
||||
if ((match = strstr(buf, "SwapCached")) == NULL) |
|
||||
return NULL; |
if ((match = strstr(buf, "SwapFree")) == NULL) |
||||
sscanf(match, "SwapCached: %ld kB\n", &cached); |
return NULL; |
||||
|
sscanf(match, "SwapFree: %ld kB\n", &free); |
||||
if ((match = strstr(buf, "SwapFree")) == NULL) |
|
||||
return NULL; |
return bprintf("%d", 100 * (total - free - cached) / total); |
||||
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 ((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); |
fclose(fp); |
||||
return NULL; |
|
||||
} |
if ((match = strstr(buf, "SwapTotal")) == NULL) |
||||
fclose(fp); |
return NULL; |
||||
|
sscanf(match, "SwapTotal: %ld kB\n", &total); |
||||
if ((match = strstr(buf, "SwapTotal")) == NULL) |
|
||||
return NULL; |
return bprintf("%f", (float)total / 1024 / 1024); |
||||
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 ((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); |
fclose(fp); |
||||
return NULL; |
|
||||
} |
|
||||
fclose(fp); |
|
||||
|
|
||||
if ((match = strstr(buf, "SwapTotal")) == NULL) |
if ((match = strstr(buf, "SwapTotal")) == NULL) |
||||
return NULL; |
return NULL; |
||||
sscanf(match, "SwapTotal: %ld kB\n", &total); |
sscanf(match, "SwapTotal: %ld kB\n", &total); |
||||
|
|
||||
if ((match = strstr(buf, "SwapCached")) == NULL) |
if ((match = strstr(buf, "SwapCached")) == NULL) |
||||
return NULL; |
return NULL; |
||||
sscanf(match, "SwapCached: %ld kB\n", &cached); |
sscanf(match, "SwapCached: %ld kB\n", &cached); |
||||
|
|
||||
if ((match = strstr(buf, "SwapFree")) == NULL) |
if ((match = strstr(buf, "SwapFree")) == NULL) |
||||
return NULL; |
return NULL; |
||||
sscanf(match, "SwapFree: %ld kB\n", &free); |
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 |
#endif |
||||
|
|||||
@ -1,45 +1,47 @@ |
|||||
/* See LICENSE file for copyright and license details. */ |
/* See LICENSE file for copyright and license details. */ |
||||
#include <errno.h> |
#include <stddef.h> |
||||
#include <stdio.h> |
|
||||
#include <string.h> |
|
||||
#if defined(__OpenBSD__) |
|
||||
#include <sys/sysctl.h> |
|
||||
#include <sys/time.h> |
|
||||
#include <sys/sensors.h> |
|
||||
#endif |
|
||||
|
|
||||
#include "../util.h" |
#include "../util.h" |
||||
|
|
||||
#if defined(__linux__) |
#if defined(__linux__) |
||||
const char * |
const char * |
||||
temp(const char *file) |
temp(const char *file) |
||||
{ |
{ |
||||
int temp; |
int temp; |
||||
|
|
||||
return (pscanf(file, "%d", &temp) == 1) ? |
return (pscanf(file, "%d", &temp) == 1) ? |
||||
bprintf("%d", temp / 1000) : NULL; |
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; |
|
||||
} |
} |
||||
|
#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 |
#endif |
||||
|
|||||
@ -1,92 +1,100 @@ |
|||||
/* See LICENSE file for copyright and license details. */ |
/* See LICENSE file for copyright and license details. */ |
||||
#if defined(__linux__) |
#if defined(__linux__) |
||||
#include <errno.h> |
#include <errno.h> |
||||
#include <ifaddrs.h> |
#include <ifaddrs.h> |
||||
#include <linux/wireless.h> |
#include <linux/wireless.h> |
||||
#include <sys/socket.h> |
#include <sys/socket.h> |
||||
#include <stdio.h> |
#include <stdio.h> |
||||
#include <limits.h> |
#include <limits.h> |
||||
#include <string.h> |
#include <string.h> |
||||
#include <sys/ioctl.h> |
#include <sys/ioctl.h> |
||||
#include <unistd.h> |
#include <unistd.h> |
||||
|
|
||||
#include "../util.h" |
#include "../util.h" |
||||
|
|
||||
const char * |
const char * |
||||
wifi_perc(const char *iface) |
wifi_perc(const char *iface) |
||||
{ |
{ |
||||
int i, cur; |
int i, cur; |
||||
float perc; |
float perc; |
||||
int total = 70; /* the max of /proc/net/wireless */ |
int total = 70; /* the max of /proc/net/wireless */ |
||||
char *p, *datastart; |
char *p, *datastart; |
||||
char path[PATH_MAX]; |
char path[PATH_MAX]; |
||||
char status[5]; |
char status[5]; |
||||
FILE *fp; |
FILE *fp; |
||||
|
|
||||
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, "/operstate"); |
snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, |
||||
fp = fopen(path, "r"); |
"/operstate"); |
||||
if (fp == NULL) { |
fp = fopen(path, "r"); |
||||
fprintf(stderr, "fopen '%s': %s\n", path, strerror(errno)); |
if (fp == NULL) { |
||||
return NULL; |
fprintf(stderr, "fopen '%s': %s\n", path, |
||||
} |
strerror(errno)); |
||||
p = fgets(status, 5, fp); |
return NULL; |
||||
fclose(fp); |
} |
||||
if(!p || strcmp(status, "up\n") != 0) { |
p = fgets(status, 5, fp); |
||||
return NULL; |
fclose(fp); |
||||
} |
if(!p || strcmp(status, "up\n") != 0) { |
||||
|
return NULL; |
||||
|
} |
||||
|
|
||||
fp = fopen("/proc/net/wireless", "r"); |
fp = fopen("/proc/net/wireless", "r"); |
||||
if (fp == NULL) { |
if (fp == NULL) { |
||||
fprintf(stderr, "fopen '/proc/net/wireless': %s\n", strerror(errno)); |
fprintf(stderr, "fopen '/proc/net/wireless': %s\n", |
||||
return NULL; |
strerror(errno)); |
||||
} |
return NULL; |
||||
|
} |
||||
|
|
||||
for (i = 0; i < 3; i++) { |
for (i = 0; i < 3; i++) { |
||||
if (!(p = fgets(buf, sizeof(buf) - 1, fp))) |
if (!(p = fgets(buf, sizeof(buf) - 1, fp))) |
||||
break; |
break; |
||||
} |
} |
||||
fclose(fp); |
fclose(fp); |
||||
if (i < 2 || !p) |
if (i < 2 || !p) |
||||
return NULL; |
return NULL; |
||||
|
|
||||
|
if ((datastart = strstr(buf, iface)) == NULL) |
||||
|
return NULL; |
||||
|
|
||||
if ((datastart = strstr(buf, iface)) == NULL) |
datastart = (datastart+(strlen(iface)+1)); |
||||
return NULL; |
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)); |
perc = (float)cur / total * 100.0; |
||||
sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &cur); |
|
||||
|
|
||||
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 * |
memset(&wreq, 0, sizeof(struct iwreq)); |
||||
wifi_essid(const char *iface) |
wreq.u.essid.length = IW_ESSID_MAX_SIZE+1; |
||||
{ |
snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", 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)); |
if (sockfd == -1) { |
||||
wreq.u.essid.length = IW_ESSID_MAX_SIZE+1; |
fprintf(stderr, "socket 'AF_INET': %s\n", |
||||
snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface); |
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); |
close(sockfd); |
||||
return NULL; |
|
||||
} |
|
||||
|
|
||||
close(sockfd); |
if (strcmp(id, "") == 0) |
||||
|
return NULL; |
||||
if (strcmp(id, "") == 0) |
else |
||||
return NULL; |
return id; |
||||
else |
} |
||||
return id; |
#elif defined(__OpenBSD__) |
||||
} |
/* unimplemented */ |
||||
#endif |
#endif |
||||
|
|||||
Loading…
Reference in new issue