Mercurial > hg > toybox
changeset 1065:9211bc984285 draft
Cleanup on acpi, switch to default y.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 09 Sep 2013 11:39:18 -0500 |
parents | 0d7d6fed8141 |
children | 4263a4390758 |
files | toys/other/acpi.c |
diffstat | 1 files changed, 42 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/toys/other/acpi.c Mon Sep 09 11:19:59 2013 -0500 +++ b/toys/other/acpi.c Mon Sep 09 11:39:18 2013 -0500 @@ -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;