aboutsummaryrefslogtreecommitdiff
path: root/toys/other/acpi.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/other/acpi.c')
-rw-r--r--toys/other/acpi.c79
1 files changed, 42 insertions, 37 deletions
diff --git a/toys/other/acpi.c b/toys/other/acpi.c
index 5caefeb2..11d3ee63 100644
--- a/toys/other/acpi.c
+++ b/toys/other/acpi.c
@@ -1,77 +1,82 @@
/* acpi.c - show power state
+ *
* Written by Isaac Dunham, 2013
+ *
* No standard.
+
USE_ACPI(NEWTOY(acpi, "ab", TOYFLAG_USR|TOYFLAG_BIN))
config ACPI
bool "acpi"
- default n
+ default y
help
usage: acpi [-ab]
Show status of power sources.
- -a show power adapters
- -b show batteries
+
+ -a show power adapters
+ -b show batteries
*/
#define FOR_acpi
#include "toys.h"
GLOBALS(
-int ac;
-int bat;
+ int ac;
+ int bat;
)
-int read_int_at(int dirfd, char *name) {
+int read_int_at(int dirfd, char *name)
+{
int fd, ret=0;
- if ((fd=openat(dirfd, name, O_RDONLY)) < 0)
- return -1;
- FILE * fil = xfdopen(fd, "r");
- fscanf(fil, "%d", &ret);
+ FILE *fil;
+
+ if ((fd = openat(dirfd, name, O_RDONLY)) < 0) return -1;
+ fscanf(fil = xfdopen(fd, "r"), "%d", &ret);
fclose(fil);
+
return ret;
}
int acpi_callback(struct dirtree *tree)
{
+ int dfd;
+
errno = 0;
- if (tree->name[0]=='.')
- return 0;
- if (strlen(dirtree_path(tree, NULL)) < 26) {
- return (DIRTREE_RECURSE | DIRTREE_SYMFOLLOW);
- }
- int dfd=open(dirtree_path(tree, NULL), O_RDONLY);
- if (dfd > 0) {
- int fd;
- if ((fd = openat(dfd, "type", O_RDONLY)) < 0) {
- close(dfd);
- return 0;
- }
- read(fd, toybuf, 4096);
+ if (tree->name[0]=='.') return 0;
+
+ if (strlen(dirtree_path(tree, NULL)) < 26)
+ return DIRTREE_RECURSE | DIRTREE_SYMFOLLOW;
+
+ if (0 <= (dfd = open(dirtree_path(tree, NULL), O_RDONLY))) {
+ int fd, len;
+
+ if ((fd = openat(dfd, "type", O_RDONLY)) < 0) goto done;
+ len = readall(fd, toybuf, sizeof(toybuf));
close(fd);
- if (0 == strncmp(toybuf, "Battery", 7)) {
- if (toys.optflags & FLAG_b || (!toys.optflags)) {
+ if (len < 1) goto done;
+
+ if (!strncmp(toybuf, "Battery", 7)) {
+ if ((toys.optflags & FLAG_b) || (!toys.optflags)) {
int cap = 0, curr = 0, max = 0;
+
if ((cap = read_int_at(dfd, "capacity")) < 0) {
- if ((max = read_int_at(dfd, "charge_full")) > 0) {
+ if ((max = read_int_at(dfd, "charge_full")) > 0)
curr = read_int_at(dfd, "charge_now");
- } else if ((max = read_int_at(dfd, "energy_full")) > 0) {
+ else if ((max = read_int_at(dfd, "energy_full")) > 0)
curr = read_int_at(dfd, "energy_now");
- }
- if (max > 0 && (curr >= 0))
- cap = 100 * curr / max;
+ if (max > 0 && curr >= 0) cap = 100 * curr / max;
}
if (cap >= 0) printf("Battery %d: %d%%\n", TT.bat++, cap);
}
- } else {
- //ac
- if (toys.optflags & FLAG_a) {
- int on;
- if ((on = read_int_at(dfd, "online")) >= 0)
- printf("Adapter %d: %s-line\n", TT.ac++, (on ? "on" : "off"));
- }
+ } else if (toys.optflags & FLAG_a) {
+ int on;
+
+ if ((on = read_int_at(dfd, "online")) >= 0)
+ printf("Adapter %d: %s-line\n", TT.ac++, (on ? "on" : "off"));
}
+done:
close(dfd);
}
return 0;