public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] gentoo-x86 commit in sys-power/acpitool/files: acpitool-0.5.1-kernel3.patch acpitool-0.5.1-wakeup.patch acpitool-0.5.1-battery.patch acpitool-0.5.1-ac_adapter.patch
@ 2012-01-30 14:45 Samuli Suominen (ssuominen)
  0 siblings, 0 replies; only message in thread
From: Samuli Suominen (ssuominen) @ 2012-01-30 14:45 UTC (permalink / raw
  To: gentoo-commits

ssuominen    12/01/30 14:45:58

  Added:                acpitool-0.5.1-kernel3.patch
                        acpitool-0.5.1-wakeup.patch
                        acpitool-0.5.1-battery.patch
                        acpitool-0.5.1-ac_adapter.patch
  Log:
  Fix compability with Linux 3.x wrt #377355 by Damien Thébault. Fix reading of values from ac_adapters and batteries. Rewrite part of the wakeup code. This will also close #337565 (overflow revealed by _FORTIFY_SOURCE) by Diego Elio Pettenò.
  
  (Portage version: 2.2.0_alpha84/cvs/Linux x86_64)

Revision  Changes    Path
1.1                  sys-power/acpitool/files/acpitool-0.5.1-kernel3.patch

file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-power/acpitool/files/acpitool-0.5.1-kernel3.patch?rev=1.1&view=markup
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-power/acpitool/files/acpitool-0.5.1-kernel3.patch?rev=1.1&content-type=text/plain

Index: acpitool-0.5.1-kernel3.patch
===================================================================
http://bugs.gentoo.org/377355

--- src/acpitool.cpp
+++ src/acpitool.cpp
@@ -205,8 +205,7 @@
 	Kernel_24 = 1;           
 	Kernel_26 = 0;
     }
-        
-    if(strncmp(str,"2.6",3)==0)
+    else
     {
 	Kernel_24 = 0;           
 	Kernel_26 = 1;



1.1                  sys-power/acpitool/files/acpitool-0.5.1-wakeup.patch

file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-power/acpitool/files/acpitool-0.5.1-wakeup.patch?rev=1.1&view=markup
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-power/acpitool/files/acpitool-0.5.1-wakeup.patch?rev=1.1&content-type=text/plain

Index: acpitool-0.5.1-wakeup.patch
===================================================================
From 3a87a4132667f78fc85c54ad89992bbdd02d1e55 Mon Sep 17 00:00:00 2001
From: Carlos Alberto Lopez Perez <clopez@igalia.com>
Date: Thu, 6 Oct 2011 03:12:55 +0200
Subject: [PATCH] Use dynamic structures instead of predefined ones

 * The file /proc/acpi/wakeup can have much more than 25 entries.
   In my computer (Dell E6420) I have 27 entries.
   So instead of using an array of [x] entries better use dynamic
   vectors and push the new entries when a new line from the file
   is read.

 * The name of the device is not ever 4 characters. For example I
   have a device called "LID" which is 3 characters long.
   Instead of using a fixed size for the device we split the line
   on the first tab (\t) and use the first part.
---
 src/acpitool.cpp |   23 +++++++++++------------
 1 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/src/acpitool.cpp b/src/acpitool.cpp
index 2a610a5..71e01d7 100644
--- a/src/acpitool.cpp
+++ b/src/acpitool.cpp
@@ -460,16 +460,14 @@ int Show_WakeUp_Devices(int verbose)
 
 int Toggle_WakeUp_Device(const int Device, int verbose)
 {
-    ifstream file_in;
     ofstream file_out;
-    char *filename, str[50];
-    int index = 1;
-    char Name[25][5];            // 25 should be enough I guess, I have only 9 so far //
-    
+    char *filename; string str;
+    int index = 1; int charindex = 0;
+    std::vector <std::string> Name(index); // Never is enough, use dynamic structures //
     filename = "/proc/acpi/wakeup";
     
-    file_in.open(filename);
-    if (!file_in)        
+    ifstream file_in(filename, ifstream::in);
+    if (!file_in.good()) // if opening is not successful
     {
     	if(!verbose)        
     	{
@@ -484,14 +482,15 @@ int Toggle_WakeUp_Device(const int Device, int verbose)
     	}	
     }
     
-    file_in.getline(str, 50);             // first line are just headers //
+    getline(file_in, str);                // first line are just headers //
     while(!file_in.eof())                 // count all devices and store their names//
     {
-        file_in.getline(str, 50);
-        if(strlen(str)!=0)                // avoid empty last line //
+        getline(file_in, str);
+        if( str.length() != 0 )           // avoid empty last line //
         {
-	    memset(Name[index], '\0', 5);
-	    strncpy(Name[index], str, 4);
+	    charindex = 0; // reset to zero
+	    while ( (str[++charindex]!='\t')  ); // stop on first tab and get the array index
+	    Name.push_back(str.substr(0,charindex)); // Push the name into the vector
 	    index++;
 	}
     }	
-- 
1.7.5.4





1.1                  sys-power/acpitool/files/acpitool-0.5.1-battery.patch

file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-power/acpitool/files/acpitool-0.5.1-battery.patch?rev=1.1&view=markup
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-power/acpitool/files/acpitool-0.5.1-battery.patch?rev=1.1&content-type=text/plain

Index: acpitool-0.5.1-battery.patch
===================================================================
Author: Evgeni Golov <evgeni@debian.org>, Michael Meskes <meskes@debian.org>
Description: Fix reading of battery information.

--- src/acpitool.h
+++ src/acpitool.h
@@ -39,6 +39,9 @@
     char Serial[13];
     char Bat_Type[13];
     char Voltage_Now[13];
+    char Charge_Now[13];
+    char Charge_Full[13];
+    char Charge_Full_Design[13];
 };
 
 
--- src/battery.cpp
+++ src/battery.cpp
@@ -107,6 +107,9 @@
 	    memset(Batt_Info[i]->Serial, '\0', 13);
 	    memset(Batt_Info[i]->Bat_Type, '\0', 13); 
 	    memset(Batt_Info[i]->Voltage_Now, '\0', 13); 
+	    memset(Batt_Info[i]->Charge_Now, '\0', 13);
+	    memset(Batt_Info[i]->Charge_Full, '\0', 13);
+	    memset(Batt_Info[i]->Charge_Full_Design, '\0', 13);
 	    
 	    // initialize all struct members to blanks --> avoid rubbish in output //
 			
@@ -139,7 +142,12 @@
 		case 1 : 
 		{	
 	    	    Present_Batteries++;
-		    Remaining_Percentage = float(atoi(Batt_Info[i]->Remaining_Cap)) / float(atoi(Batt_Info[i]->LastFull_Cap)) * 100.0;
+
+		    if (strcmp(Batt_Info[i]->Charge_Now,"")!=0 &&
+			strcmp(Batt_Info[i]->Charge_Now,"unknown")!=0)
+		    	Remaining_Percentage = float(atoi(Batt_Info[i]->Charge_Now)) / float(atoi(Batt_Info[i]->Charge_Full)) * 100.0;
+		    else
+			Remaining_Percentage = float(atoi(Batt_Info[i]->Remaining_Cap)) / float(atoi(Batt_Info[i]->LastFull_Cap)) * 100.0;
 		    
 		    /* from Alan Pope : some broken Dell batteries report a remaining capacity bigger
 		       than their last full capacity or their design capacity. This led acpitool to report
@@ -153,19 +161,24 @@
             	    else
             		Precision = 4;
             	    
-		    if( strncmp(Batt_Info[i]->Charging_State,"char",4)==0 ) 
+		    if(strncasecmp(Batt_Info[i]->Charging_State,"char",4)==0)
 		    {
 			Is_Charging = 1;
 		    }
 		    else
 		    {
-			if(strncmp(Batt_Info[i]->Charging_State,"disch",5)==0) Is_Discharging = 1;
+			if(strncasecmp(Batt_Info[i]->Charging_State,"disch",5)==0) Is_Discharging = 1;
 		    }
 		    		    
 	    	    if(Show_Time)      // calculate remaining or charging time only if present battery rate != 0 //
 	    	    {
-			if(Is_Charging)
-			  Remaining_Time = (float(atoi(Batt_Info[i]->LastFull_Cap)) - float(atoi(Batt_Info[i]->Remaining_Cap))) / float(atoi(Batt_Info[i]->Present_Rate)); 
+			if(Is_Charging) {
+			  if (strcmp(Batt_Info[i]->Charge_Now,"")!=0 &&
+			      strcmp(Batt_Info[i]->Charge_Now,"unknown")!=0)
+			  	Remaining_Time = (float(atoi(Batt_Info[i]->Charge_Full)) - float(atoi(Batt_Info[i]->Charge_Now))) / float(atoi(Batt_Info[i]->Present_Rate));
+			  else
+			  	Remaining_Time = (float(atoi(Batt_Info[i]->LastFull_Cap)) - float(atoi(Batt_Info[i]->Remaining_Cap))) / float(atoi(Batt_Info[i]->Present_Rate)); 
+			}
 			else
 			  Remaining_Time = float(atoi(Batt_Info[i]->Remaining_Cap)) / float(atoi(Batt_Info[i]->Present_Rate)); 
 			// this represents hours //
@@ -180,9 +193,11 @@
 			Minutes = Time_In_Seconds / 60;
 			Time_In_Seconds = Time_In_Seconds - (Minutes * 60);
 	    	    }
-		    
+		   
 		    if(atoi(Batt_Info[i]->Design_Cap) > 0)
 		      Battery_Left_Percent = float(atoi(Batt_Info[i]->LastFull_Cap)) / float(atoi(Batt_Info[i]->Design_Cap)) * 100.0;
+		    else if(atoi(Batt_Info[i]->Charge_Full_Design) > 0)
+		      Battery_Left_Percent = float(atoi(Batt_Info[i]->Charge_Full)) / float(atoi(Batt_Info[i]->Charge_Full_Design)) * 100.0;
 		    else
 		      Battery_Left_Percent = -1.0;
 		      			  
@@ -207,8 +222,15 @@
 				    <<setfill('0')<<setw(2)<<Time_In_Seconds;
 				 cout<<endl;
 				 
-				 cout<<"    Design capacity    : "<<Batt_Info[i]->Design_Cap<<endl;
-				 cout<<"    Last full capacity : "<<Batt_Info[i]->LastFull_Cap;
+		    		 if(atoi(Batt_Info[i]->Design_Cap) > 0)
+				 	cout<<"    Design capacity    : "<<Batt_Info[i]->Design_Cap<<endl;
+				 else if(atoi(Batt_Info[i]->Charge_Full_Design) > 0)
+				 	cout<<"    Design capacity    : "<<Batt_Info[i]->Charge_Full_Design<<endl;
+
+		    		 if(atoi(Batt_Info[i]->LastFull_Cap) > 0)
+					cout<<"    Last full capacity : "<<Batt_Info[i]->LastFull_Cap;
+				 else if(atoi(Batt_Info[i]->Charge_Full) > 0)
+					cout<<"    Last full capacity : "<<Batt_Info[i]->Charge_Full;
 				 
 				 if(Battery_Left_Percent<100.0)
 				 {
@@ -327,7 +349,7 @@
 
 
 
-int Get_Battery_Info_from_Proc(const int bat_nr, Battery_Info *bat_info, int verbose)
+int Get_Battery_Info_from_Proc(const int bat_nr, Battery_Info *batt_info, int verbose)
 {
     ifstream file_in;
     char filename[4][65], str[100], temp[100];
@@ -378,7 +400,7 @@
     {
 	if(!verbose)
    	{
-   	    bat_info->Battery_Present = 2;     // 2 represents error value //
+   	    batt_info->Battery_Present = 2;     // 2 represents error value //
    	    return 0;
    	}
    	else
@@ -422,24 +444,24 @@
     	file_in.getline(str, 100);
     	strncpy(temp, str+25, 4);
     	if(strncmp(temp,"yes",3)==0)
-    	    bat_info->Battery_Present = 1;               //yes, we have a battery //
+    	    batt_info->Battery_Present = 1;               //yes, we have a battery //
     	else
     	{
-    	    bat_info->Battery_Present = 0;
+    	    batt_info->Battery_Present = 0;
     	    return 0;                  //bail out if battery is not present //
     	}
     	
 	// then get the design capacity //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->Design_Cap, str+25, 9);
+    	strncpy(batt_info->Design_Cap, str+25, 9);
 	
     	// then get the last full capacity //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->LastFull_Cap, str+25, 9);
+    	strncpy(batt_info->LastFull_Cap, str+25, 9);
 	
-	if (strncmp(bat_info->LastFull_Cap,"unknown",7)==0)
+	if (strncmp(batt_info->LastFull_Cap,"unknown",7)==0)
 	{
-    	    bat_info->Battery_Present = 0;
+    	    batt_info->Battery_Present = 0;
     	    return 0;                  //bail out if battery is not present //
     	}
 	/* some Dell laptops seem to report a 2nd battery as being present, while it is NOT, but then report the 
@@ -449,21 +471,21 @@
     
     	// then get the technology //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->Technology, str+25, 12);
+    	strncpy(batt_info->Technology, str+25, 12);
     
     	// then get the model number //
     	for(int t=0; t<5; t++)
 	file_in.getline(str, 100);            //skip 5 lines //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->Model, str+25, 12);
+    	strncpy(batt_info->Model, str+25, 12);
     
     	// then get the serial number //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->Serial, str+25, 12);
+    	strncpy(batt_info->Serial, str+25, 12);
     
     	// then get the battery type //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->Bat_Type, str+25, 12);
+    	strncpy(batt_info->Bat_Type, str+25, 12);
     
     	file_in.close();
     	
@@ -480,17 +502,17 @@
     	// then get the charging state //
     	file_in.getline(str, 100); file_in.getline(str, 100);     // skip first 2 lines //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->Charging_State, str+25, 12);
-	if (strncmp(bat_info->Charging_State,"unknown",7)==0) strncpy(bat_info->Charging_State, "charged",7);
+    	strncpy(batt_info->Charging_State, str+25, 12);
+	if (strncmp(batt_info->Charging_State,"unknown",7)==0) strncpy(batt_info->Charging_State, "charged",7);
 	/* on older kernels, like 2.4.22, the charging state is reported as "unknown", whereas in recent kernels
 	   this was changed to "charged". */  
 
     	// then get the charging rate //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->Present_Rate, str+25, 9);
-	if (strncmp(bat_info->Charging_State,"charged",7)==0)
+    	strncpy(batt_info->Present_Rate, str+25, 9);
+	if (strncmp(batt_info->Charging_State,"charged",7)==0)
 	{
-	    if (strncmp(bat_info->Present_Rate, "unknown",7)==0) strncpy(bat_info->Present_Rate, "0      ",7);
+	    if (strncmp(batt_info->Present_Rate, "unknown",7)==0) strncpy(batt_info->Present_Rate, "0      ",7);
 	}    
 	/* some batteries report the present rate as "unknown", even when they report the battery as being charged.
 	   If the battery is charged, the rate should be 0 */     
@@ -498,12 +520,12 @@
 
     	// then get the remaining capacity //
     	file_in.getline(str, 100);
-    	strncpy(bat_info->Remaining_Cap, str+25, 9);
+    	strncpy(batt_info->Remaining_Cap, str+25, 9);
     
     	file_in.close();
 	}
 	else      // battery dir is readable but empty : only . and .. at most //
-	    bat_info->Battery_Present = 3;   
+	    batt_info->Battery_Present = 3;   
 	
 	return 0;
 }
@@ -513,8 +535,8 @@
 int Get_Battery_Info_from_Sys(const int bat_nr, Battery_Info *batt_info, int verbose)
 {
     ifstream file_in;
-    char filename[6][65], str[100], temp[100];
-    int bat_count = 0, start = 0, findex = 0;
+    char filename[6][65], str[100], temp[100], attr[100];
+    int bat_count = 0, start = 0, findex = 0, value = 0;
     DIR *battery_dir;
     char *name, *dirname;
        
@@ -613,165 +635,104 @@
 	    return -1;
     	}
     	
-    	memset(str, '\0', 100);
-	for(int t=0; t<5; t++)
-	    fgets(str, 100, power_fp);            /* skip first 5 lines */
-    	
-    	/* get battery status (full, charging, ...) */
-    	memset(str, '\0', 100);
-    	fgets(str, 100, power_fp);
-    	if (strlen(str)>0)
-    	{
-    	    memset(temp, '\0', 100);
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
-    	    strncpy(batt_info->Charging_State, temp, 12);
-    	}   
-	
-	    
-	/* get battery presence (0 or 1) */    
-	memset(str, '\0', 100);
-	fgets(str, 100, power_fp);   
-	if (strlen(str)>0)
-	{
-	    memset(temp, '\0', 100);
-	    strncpy(temp, str+21, 1);
-    	    if(strncmp(temp,"1",1)==0)
-    	        batt_info->Battery_Present = 1;               /* yes, we have a battery */
-    	    else
-    	    {
-    		batt_info->Battery_Present = 0;
-    		printf(" Battery is not present, bailing out. \n");
-    		return 0;                                    /* bail out if battery is not present */
-    	    }
-    	}
-    	    
-    	    
-    	/* get technology */    
-    	memset(str, '\0', 100);
-	fgets(str, 100, power_fp);   
-	if (strlen(str)>0)
-    	{
-    	    memset(temp, '\0', 100);
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
-    	    strncpy(batt_info->Technology, temp, 12);
-    	} 
-    	else
-    	    strncpy(batt_info->Technology, "unknown", 7);
-    	    
-    	    
-    	    
-    	//printf(" \n bat_info_tech = %s \n\n ",  batt_info->Technology);    
-    	
-    	
-
-	fgets(str, 100, power_fp);    	/* skip 1 line */	
-
-
-	/* get voltage_now */    
-	memset(str, '\0', 100);
-	fgets(str, 100, power_fp);
-	if (strlen(str)>0)
-    	{
-    	    memset(temp, '\0', 100);
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
-    	    strncpy(batt_info->Voltage_Now, temp, 12);
-    	}    
-    	else
-    	    strncpy(batt_info->Voltage_Now, "unknown", 7);
-
-    	
-	/* get current_now, which I believe is the charging rate ? */    
-	memset(str, '\0', 100);
-	fgets(str, 100, power_fp);
-	if (strlen(str)>0)
-    	{
-    	    memset(temp, '\0', 100);
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
-    	    strncpy(batt_info->Present_Rate, temp, 12);
-    	}       
-    	else
-    	    strncpy(batt_info->Present_Rate, "unknown", 7);
-
-	
-	/* get charge_full_design */    
-	memset(str, '\0', 100);
-	fgets(str, 100, power_fp);
-	if (strlen(str)>0)
-    	{
-    	    memset(temp, '\0', 100);
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
-    	    strncpy(batt_info->Design_Cap, temp, 12);
-    	}          
-    	else
-    	    strncpy(batt_info->Design_Cap, "unknown", 7);
-    	    
-    	    
-    	//printf(" \n bat_info_design_cap = %s \n ",  batt_info->Design_Cap);    
-
-
-	/* get charge_full, which is the last full capacity I guess ? */    
-	memset(str, '\0', 100);
-	fgets(str, 100, power_fp);   
-	if (strlen(str)>0)
-    	{
-    	    memset(temp, '\0', 100);
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
-    	    strncpy(batt_info->LastFull_Cap, temp, 12);
-    	}       
-    	else
-    	    strncpy(batt_info->LastFull_Cap, "unknown", 7);
-
-
-	//printf(" \n bat_info_lastfull_cap = %s \n\n ",  batt_info->LastFull_Cap); 
-
-
-	/* get charge_now */    
-	memset(str, '\0', 100);
-	fgets(str, 100, power_fp);   
-	if (strlen(str)>0)
-    	{
-    	    memset(temp, '\0', 100);
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
-    	    strncpy(batt_info->Remaining_Cap, temp, 12);
-    	}       
-    	else
-    	    strncpy(batt_info->Remaining_Cap, "unknown", 7);
-
-	//printf(" \n bat_info_remaining_cap = %s \n\n ",  batt_info->Remaining_Cap); 
-
-
-	/* get model_name */  
-	memset(str, '\0', 100);  
-	fgets(str, 100, power_fp);   
-	if (strlen(str)>0)
-    	{
-    	    memset(temp, '\0', 100);
-	    strncpy(temp, str+24, 12);         // use strncpy here because sscanf chokes on blanks in this one ? //
-
-    	    memset(str, '\0', 100);
-    	    sscanf(temp, "%[^\n]", str);       // strip trailing \n, fucks up output //
-    	    
-    	    strncpy(batt_info->Model, str, 12);
+	strncpy(batt_info->Technology, "unknown", 7);
+	strncpy(batt_info->Voltage_Now, "unknown", 7);
+	strncpy(batt_info->Charge_Now, "unknown", 7);
+	strncpy(batt_info->Charge_Full, "unknown", 7);
+	strncpy(batt_info->Charge_Full_Design, "unknown", 7);
+	strncpy(batt_info->Present_Rate, "unknown", 7);
+	strncpy(batt_info->Design_Cap, "unknown", 7);
+	strncpy(batt_info->LastFull_Cap, "unknown", 7);
+	strncpy(batt_info->Remaining_Cap, "unknown", 7);
+	strncpy(batt_info->Model, "unknown", 7);
+	strncpy(batt_info->Serial, "unknown", 7);
+
+	// see linux-2.6/drivers/power/power_supply_sysfs.c
+	// there can be different number of lines, so read up to 40 lines
+	for(int t=0; t<40; t++) {
+    		memset(str, '\0', 100);
+		memset(attr, '\0', 100);
+    		memset(temp, '\0', 100);
+		fgets(str, 100, power_fp);
+		sscanf(str, "%[^=]s %*s %*[^\n]", attr);
+    		sscanf(str, "%*[^=] %*c %s %*[^\n]",temp); 
+		if (strcmp(attr,"POWER_SUPPLY_STATUS")==0) {
+    			strncpy(batt_info->Charging_State, temp, 12);
+    		}   
+		else if (strcmp(attr,"POWER_SUPPLY_TYPE")==0) {
+			strncpy(batt_info->Bat_Type, temp, 12);
+    		}
+		else if (strcmp(attr,"POWER_SUPPLY_TECHNOLOGY")==0) {
+    			strncpy(batt_info->Technology, temp, 12);
+    		} 
+		else if (strcmp(attr,"POWER_SUPPLY_VOLTAGE_NOW")==0) {
+			value = atoi(temp) / 1000;
+			snprintf(temp, sizeof(temp), "%i mV", value);
+    	    		strncpy(batt_info->Voltage_Now, temp, 12);
+    		}    
+		else if (strcmp(attr,"POWER_SUPPLY_CURRENT_NOW")==0 ||
+			 strcmp(attr,"POWER_SUPPLY_POWER_NOW")==0) {
+			value = atoi(temp) / 1000;
+			snprintf(temp, sizeof(temp), "%i", value);
+			strncpy(batt_info->Present_Rate, temp, 9);
+		}
+		else if (strcmp(attr,"POWER_SUPPLY_CHARGE_NOW")==0) {
+			value = atoi(temp) / 1000;
+			snprintf(temp, sizeof(temp), "%i mA", value);
+			strncpy(batt_info->Charge_Now, temp, 12);
+		}
+		else if (strcmp(attr,"POWER_SUPPLY_CHARGE_FULL_DESIGN")==0) {
+			value = atoi(temp) / 1000;
+			snprintf(temp, sizeof(temp), "%i mA", value);
+			strncpy(batt_info->Charge_Full_Design, temp, 12);
+		}
+		else if (strcmp(attr,"POWER_SUPPLY_CHARGE_FULL")==0) {
+			value = atoi(temp) / 1000;
+			snprintf(temp, sizeof(temp), "%i mA", value);
+			strncpy(batt_info->Charge_Full, temp, 12);
+		}
+		else if (strcmp(attr,"POWER_SUPPLY_ENERGY_FULL_DESIGN")==0) {
+			value = atoi(temp) / 1000;
+			snprintf(temp, sizeof(temp), "%i mWh", value);
+			strncpy(batt_info->Design_Cap, temp, 9);
+		}
+		else if (strcmp(attr,"POWER_SUPPLY_ENERGY_FULL")==0) {
+			value = atoi(temp) / 1000;
+			snprintf(temp, sizeof(temp), "%i mWh", value);
+			strncpy(batt_info->LastFull_Cap, temp, 9);
+		}
+		else if (strcmp(attr,"POWER_SUPPLY_ENERGY_NOW")==0) {
+			value = atoi(temp) / 1000;
+			snprintf(temp, sizeof(temp), "%i mWh", value);
+			strncpy(batt_info->Remaining_Cap, temp, 9);
+    		}       
+		else if (strcmp(attr,"POWER_SUPPLY_MODEL_NAME")==0) {
+			strncpy(batt_info->Model, temp, 12);
+    		}
+		else if (strcmp(attr,"POWER_SUPPLY_SERIAL_NUMBER")==0) {
+			strncpy(batt_info->Serial, temp, 12);
+    		}       
+		else if (strcmp(attr,"POWER_SUPPLY_PRESENT")==0) {
+			if(strncmp(temp,"1",1)==0) {
+				batt_info->Battery_Present = 1;
+			}
+			else {
+				batt_info->Battery_Present = 0;
+				printf(" Battery is not present, bailing out. \n");
+				return 0;
+    			}
+           	}       
     	}       
+	if (strcmp(batt_info->Charge_Now,"")!=0 &&
+	   strcmp(batt_info->Charge_Now,"unknown")!=0)
+		snprintf(temp, sizeof(temp), "%s mA", batt_info->Present_Rate);
     	else
-    	    strncpy(batt_info->Model, "unknown", 7);
+		snprintf(temp, sizeof(temp), "%s mW", batt_info->Present_Rate);
 
-	fgets(str, 100, power_fp);   
+	strncpy(batt_info->Present_Rate, temp, 9);
 	
-	/* get serial */    
-	memset(str, '\0', 100);
-	fgets(str, 100, power_fp);   
-	if (strlen(str)!=0)
-    	{
-    	    memset(temp, '\0', 100);
-    	    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
-    	    strncpy(batt_info->Serial, temp, 12);
-    	}       
-    	else
-    	    strncpy(batt_info->Serial, "unknown", 7);
-    
     	fclose(power_fp);
-	}
+    }
     else      // battery dir is readable but empty : only . and .. at most //
         batt_info->Battery_Present = 3;   
     return 0;



1.1                  sys-power/acpitool/files/acpitool-0.5.1-ac_adapter.patch

file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-power/acpitool/files/acpitool-0.5.1-ac_adapter.patch?rev=1.1&view=markup
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-power/acpitool/files/acpitool-0.5.1-ac_adapter.patch?rev=1.1&content-type=text/plain

Index: acpitool-0.5.1-ac_adapter.patch
===================================================================
Author: Michael Meskes <meskes@debian.org>
Description: Fix reading of ac_adapter information.

--- src/ac_adapter.cpp
+++ src/ac_adapter.cpp
@@ -149,7 +149,7 @@
 int Do_AC_Info_Sys()
 {
     ifstream file_in;
-    char filename[2][65], str[100], temp[100];
+    char filename[2][65], str[100], temp[100], attr[100];
     int ac_count = 0, start = 0, findex = 0;
     DIR *ac_dir;
     char *name, *dirname;
@@ -206,31 +206,40 @@
 
     if(ac_count>0)
     {
-    	for(int i=0; i<ac_count; i++)            /* I don't expect to find > 1, but you never know */
+    	for(int i=0, t=0; i<ac_count; i++)            /* I don't expect to find > 1, but you never know */
     	{
     	    FILE *power_fp = fopen(filename[i], "r");
     	    if(power_fp)                   
     	    {
-		for(int t=0; t<5; t++) 
-		    fgets(str, 100, power_fp);              /* just skip the first 5 lines */
-
-		memset(str, '\0', 100);
-		fgets(str, 100, power_fp);  
+		// see linux-2.6/drivers/power/power_supply_sysfs.c
+		// there can be different number of lines, so read up to 40 lines
+		for(; t<40; t++)
+		{
+		    memset(str, '\0', 100);
+		    fgets(str, 100, power_fp);  
 		
-		if (strlen(str)!=0)
-    		{
-    		    memset(temp, '\0', 100);
-    		    sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
+		    if (strlen(str)!=0)
+    		    {
+    			memset(temp, '\0', 100);
+			memset(attr, '\0', 100);
+			sscanf(str, "%[^=]s %*s %[^\n]", attr);
+    			sscanf(str, "%*[^=] %*c %s %[^\n]",temp); 
     		    
-    		    /* keep this for debugging */
-    		    /* printf(" from Do_AC_SYS: temp = %s \n", temp);*/
-    		    
-    		    if(strncmp(temp,"1",1)==0)
-    			printf("  AC adapter     : online \n");
-    		    else
-    			printf("  AC adapter     : off-line \n");
+    			/* keep this for debugging */
+    			/* printf(" from Do_AC_SYS: temp = %s \n", temp);*/
+    		   
+			if (strcmp(attr, "POWER_SUPPLY_ONLINE") == 0)
+			{
+    			    if(strncmp(temp,"1",1)==0)
+    				printf("  AC adapter     : online \n");
+    			    else
+    				printf("  AC adapter     : off-line \n");
+
+			    break;
+			}
+		    }
     		}
-    		else
+    		if (t == 40) 
     		    printf("  AC adapter     : <info not available> \n");
     	    }	    	
     	    else






^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2012-01-30 14:46 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-30 14:45 [gentoo-commits] gentoo-x86 commit in sys-power/acpitool/files: acpitool-0.5.1-kernel3.patch acpitool-0.5.1-wakeup.patch acpitool-0.5.1-battery.patch acpitool-0.5.1-ac_adapter.patch Samuli Suominen (ssuominen)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox