diff options
Diffstat (limited to 'toys/other/acpi.c')
-rw-r--r-- | toys/other/acpi.c | 79 |
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; |