* [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