[Goodies-dev] battery plugin: small fix to libacpi.c

Giuseppe Ciotta giuseppe at telvia.it
Wed Jun 14 21:16:17 CEST 2006


In libacpi.c there are some ugly checks in hardcoded paths for the
battery status file, attached a small patch which makes use of
readdir() to discover the right path. It applies to 0.4.0 and trunk.

-- 
-------------- next part --------------
--- xfce4-battery-plugin-0.4.0/panel-plugin/libacpi.c	2006-04-27 21:10:40.000000000 +0200
+++ xfce4-battery-plugin-new/panel-plugin/libacpi.c	2006-06-14 21:01:56.000000000 +0200
@@ -40,6 +40,7 @@
 #include <stdlib.h>
 #include <sys/types.h>
 #include <dirent.h>
+#include <unistd.h>
 
 #if HAVE_SYSCTL
 #include <sys/sysctl.h>
@@ -224,12 +225,6 @@
     }
     else fclose (acpi);
     
-#if 0    
-    if (!(acpi = fopen ("/proc/acpi/battery/1/status", "r")))
-	    sprintf (batteries[batt_count], "/proc/acpi/battery/%s/state", name);
-    else
-	    sprintf (batteries[batt_count], "/proc/acpi/battery/%s/status", name);
-#endif    
     sprintf (battinfo[batt_count], "/proc/acpi/battery/%s/info", name);
 #ifdef DEBUG
 	  printf("DBG:battery number %d at:\n",batt_count);
@@ -274,16 +269,31 @@
   FILE *acpi;
   char *ptr;
   char stat;
-
-  if (!(acpi = fopen ("/proc/acpi/ac_adapter/0/status", "r")))
-    if (!(acpi = fopen ("/proc/acpi/ac_adapter/ACAD/state", "r")))
-      if (!(acpi = fopen ("/proc/acpi/ac_adapter/AC/state", "r")))
-        if (!(acpi = fopen ("/proc/acpi/ac_adapter/ADP1/state", "r")))
-         if (!(acpi = fopen ("/proc/acpi/ac_adapter/AC0/state", "r")))
-	    if (!(acpi = fopen ("/proc/acpi/ac_adapter/ADP0/state", "r")))
-	      if (!(acpi = fopen ("/proc/acpi/ac_adapter/C11B/state", "r")))
-	        return -1;
-
+  char acpath[64];
+  char *name;
+  DIR  *acdir;
+  struct dirent *ac;
+  #define ACBASE "/proc/acpi/ac_adapter"  
+
+  if (!(acdir=opendir(ACBASE))){
+    return -1;
+  }
+  while ((ac = readdir (acdir))){
+    name = ac->d_name;
+    if (!strncmp (".", name, 1) || !strncmp ("..", name, 2)){
+      continue;
+    }
+    sprintf (acpath, ACBASE"/%s/state", name);
+    if (access(acpath,R_OK)){
+      sprintf (acpath, ACBASE"/%s/status", name);
+      if (access(acpath,R_OK)){
+	return -1;
+      }
+    }
+    break; //only one ac adapter supported
+  }
+  closedir(acdir);
+  acpi = fopen (acpath, "r");
   fread (buf, 512, 1, acpi);
   fclose (acpi);
   if (!acadstate) acadstate=(ACADstate *)malloc(sizeof(ACADstate));


More information about the Goodies-dev mailing list