battery plugin: Use walk_directory().
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>
Sat, 21 Jun 2008 20:20:24 +0000 (22:20 +0200)
committerFlorian Forster <octo@huhu.verplant.org>
Tue, 24 Jun 2008 11:28:40 +0000 (13:28 +0200)
src/battery.c: use walk_directory()

Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: Florian Forster <octo@huhu.verplant.org>
src/battery.c

index f8e67a4..74b3344 100644 (file)
@@ -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 = &current;
+               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 = &current;
-                               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);