From 17019425b82a8f0c925b90a7638678b1b3b71a25 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Micha=C5=82=20Miros=C5=82aw?= Date: Sat, 21 Jun 2008 22:20:24 +0200 Subject: [PATCH] battery plugin: Use walk_directory(). MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit src/battery.c: use walk_directory() Signed-off-by: Michał Mirosław Signed-off-by: Florian Forster --- src/battery.c | 199 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 95 insertions(+), 104 deletions(-) diff --git a/src/battery.c b/src/battery.c index f8e67a41..74b3344a 100644 --- a/src/battery.c +++ b/src/battery.c @@ -61,6 +61,7 @@ #elif KERNEL_LINUX static int battery_pmu_num = 0; static char *battery_pmu_file = "/proc/pmu/battery_%i"; +static const char *battery_acpi_dir = "/proc/acpi/battery"; #endif /* KERNEL_LINUX */ static int battery_init (void) @@ -313,6 +314,99 @@ static void get_via_generic_iokit (double *ret_charge, } #endif /* HAVE_IOKIT_IOKITLIB_H */ +#if KERNEL_LINUX +static int battery_read_acpi (const char *name) +{ + double current = INVALID_VALUE; + double voltage = INVALID_VALUE; + double charge = INVALID_VALUE; + double *valptr = NULL; + int charging = 0; + + char filename[256]; + FILE *fh; + + char buffer[1024]; + char *fields[8]; + int numfields; + char *endptr; + int len; + + len = ssnprintf (filename, sizeof (filename), "%s/%s/state", battery_acpi_dir, name); + + if ((len < 0) || ((unsigned int)len >= sizeof (filename))) + return -1; + + if ((fh = fopen (filename, "r")) == NULL) { + char errbuf[1024]; + ERROR ("Cannot open `%s': %s", filename, + sstrerror (errno, errbuf, sizeof (errbuf))); + return -1; + } + + /* + * [11:00] <@tokkee> $ cat /proc/acpi/battery/BAT1/state + * [11:00] <@tokkee> present: yes + * [11:00] <@tokkee> capacity state: ok + * [11:00] <@tokkee> charging state: charging + * [11:00] <@tokkee> present rate: 1724 mA + * [11:00] <@tokkee> remaining capacity: 4136 mAh + * [11:00] <@tokkee> present voltage: 12428 mV + */ + while (fgets (buffer, sizeof (buffer), fh) != NULL) + { + numfields = strsplit (buffer, fields, 8); + + if (numfields < 3) + continue; + + if ((strcmp (fields[0], "charging") == 0) + && (strcmp (fields[1], "state:") == 0)) + { + if (strcmp (fields[2], "charging") == 0) + charging = 1; + else + charging = 0; + continue; + } + + if ((strcmp (fields[0], "present") == 0) + && (strcmp (fields[1], "rate:") == 0)) + valptr = ¤t; + else if ((strcmp (fields[0], "remaining") == 0) + && (strcmp (fields[1], "capacity:") == 0)) + valptr = &charge; + else if ((strcmp (fields[0], "present") == 0) + && (strcmp (fields[1], "voltage:") == 0)) + valptr = &voltage; + else + continue; + + endptr = NULL; + errno = 0; + *valptr = strtod (fields[2], &endptr) / 1000.0; + + if ((fields[2] == endptr) || (errno != 0)) + *valptr = INVALID_VALUE; + } /* while (fgets (buffer, sizeof (buffer), fh) != NULL) */ + + fclose (fh); + + if ((current != INVALID_VALUE) && (charging == 0)) + current *= -1; + + if (charge != INVALID_VALUE) + battery_submit ("0", "charge", charge); + if (current != INVALID_VALUE) + battery_submit ("0", "current", current); + if (voltage != INVALID_VALUE) + battery_submit ("0", "voltage", voltage); + + return 0; +} +#endif /* KERNEL_LINUX */ + + static int battery_read (void) { #if HAVE_IOKIT_IOKITLIB_H || HAVE_IOKIT_PS_IOPOWERSOURCES_H @@ -412,111 +506,8 @@ static int battery_read (void) battery_submit ("0", "voltage", voltage); } - if (access ("/proc/acpi/battery", R_OK | X_OK) == 0) - { - double current = INVALID_VALUE; - double voltage = INVALID_VALUE; - double charge = INVALID_VALUE; - double *valptr = NULL; - int charging = 0; - - struct dirent *ent; - DIR *dh; + walk_directory (battery_acpi_dir, battery_read_acpi); - if ((dh = opendir ("/proc/acpi/battery")) == NULL) - { - char errbuf[1024]; - ERROR ("Cannot open `/proc/acpi/battery': %s", - sstrerror (errno, errbuf, sizeof (errbuf))); - return (-1); - } - - while ((ent = readdir (dh)) != NULL) - { - if (ent->d_name[0] == '.') - continue; - - len = ssnprintf (filename, sizeof (filename), - "/proc/acpi/battery/%s/state", - ent->d_name); - if ((len < 0) || ((unsigned int)len >= sizeof (filename))) - continue; - - if ((fh = fopen (filename, "r")) == NULL) - { - char errbuf[1024]; - ERROR ("Cannot open `%s': %s", filename, - sstrerror (errno, errbuf, - sizeof (errbuf))); - continue; - } - - /* - * [11:00] <@tokkee> $ cat /proc/acpi/battery/BAT1/state - * [11:00] <@tokkee> present: yes - * [11:00] <@tokkee> capacity state: ok - * [11:00] <@tokkee> charging state: charging - * [11:00] <@tokkee> present rate: 1724 mA - * [11:00] <@tokkee> remaining capacity: 4136 mAh - * [11:00] <@tokkee> present voltage: 12428 mV - */ - while (fgets (buffer, sizeof (buffer), fh) != NULL) - { - numfields = strsplit (buffer, fields, 8); - - if (numfields < 3) - continue; - - if ((strcmp (fields[0], "present") == 0) - && (strcmp (fields[1], "rate:") == 0)) - valptr = ¤t; - else if ((strcmp (fields[0], "remaining") == 0) - && (strcmp (fields[1], "capacity:") == 0)) - valptr = &charge; - else if ((strcmp (fields[0], "present") == 0) - && (strcmp (fields[1], "voltage:") == 0)) - valptr = &voltage; - else - valptr = NULL; - - if ((strcmp (fields[0], "charging") == 0) - && (strcmp (fields[1], "state:") == 0)) - { - if (strcmp (fields[2], "charging") == 0) - charging = 1; - else - charging = 0; - } - - if (valptr != NULL) - { - char *endptr; - - endptr = NULL; - errno = 0; - - *valptr = strtod (fields[2], &endptr) / 1000.0; - - if ((fields[2] == endptr) || (errno != 0)) - *valptr = INVALID_VALUE; - } - } /* while (fgets (buffer, sizeof (buffer), fh) != NULL) */ - - fclose (fh); - - if ((current != INVALID_VALUE) && (charging == 0)) - current *= -1; - - if (charge != INVALID_VALUE) - battery_submit ("0", "charge", charge); - if (current != INVALID_VALUE) - battery_submit ("0", "current", current); - if (voltage != INVALID_VALUE) - battery_submit ("0", "voltage", voltage); - } - - closedir (dh); - } #endif /* KERNEL_LINUX */ return (0); -- 2.11.0