Did a lot of cleanup and bug fixing, trying to make this viable

Signed-off-by: Al Stone <ahs3@redhat.com>
This commit is contained in:
Al Stone 2018-10-26 15:11:23 -06:00
commit 8cd89eeab0
9 changed files with 1112 additions and 39 deletions

73
ac_adapter.patch Normal file
View file

@ -0,0 +1,73 @@
Author: Michael Meskes <meskes@debian.org>
Description: Fix reading of ac_adapter information.
--- acpitool-0.5.1/src/ac_adapter.cpp 2009-08-13 21:26:02.000000000 +0200
+++ acpitool-0.5.1.fixed/src/ac_adapter.cpp 2010-03-09 12:26:22.000000000 +0100
@@ -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

View file

@ -1,34 +0,0 @@
diff -up acpitool-0.5/src/cpu.cpp.gcc43 acpitool-0.5/src/cpu.cpp
--- acpitool-0.5/src/cpu.cpp.gcc43 2008-09-18 16:48:49.000000000 +0200
+++ acpitool-0.5/src/cpu.cpp 2008-09-18 16:49:22.000000000 +0200
@@ -69,7 +69,7 @@ int Show_CPU_Info()
Show_Freq_Info(); // show freq scaling info if we have it //
else
{
- bzero(temp, 130);
+ memset(temp, '\0', 130);
sscanf(str, "%*[^:] %*s %s",temp); // ignore all up till :, then ignore the :, then use what's left //
printf(" CPU speed : %s MHz \n", temp);
}
diff -up acpitool-0.5/src/freq.cpp.gcc43 acpitool-0.5/src/freq.cpp
--- acpitool-0.5/src/freq.cpp.gcc43 2008-07-21 00:47:55.000000000 +0200
+++ acpitool-0.5/src/freq.cpp 2008-09-18 16:46:54.000000000 +0200
@@ -28,6 +28,7 @@
#endif
#include <cstdlib>
+#include <cstring>
#include <iostream>
#include <iomanip>
#include <fstream>
diff -up acpitool-0.5/src/toshiba.cpp.gcc43 acpitool-0.5/src/toshiba.cpp
--- acpitool-0.5/src/toshiba.cpp.gcc43 2007-11-06 22:19:59.000000000 +0100
+++ acpitool-0.5/src/toshiba.cpp 2008-09-18 16:46:54.000000000 +0200
@@ -29,6 +29,7 @@
#endif
#include <cstdlib>
+#include <cstring>
#include <iostream>
#include <iomanip>
#include <fstream>

View file

@ -1,14 +1,20 @@
Summary: Command line ACPI client
Name: acpitool
Version: 0.5.1
Release: 18%{?dist}
Release: 19%{?dist}
License: GPLv2+
Group: Applications/System
URL: http://freeunix.dyndns.org:8000/site2/acpitool.shtml
URL: https://sourceforge.net/projects/acpitool/
BuildRequires: gcc-c++
Source0: http://freeunix.dyndns.org:8088/ftp_site/pub/unix/acpitool/acpitool-%{version}.tar.bz2
#Patch0: acpitool-0.5-gcc43.patch
Source0: https://sourceforge.net/projects/acpitool/files/acpitool/%{version}/acpitool-%{version}.tar.bz2
Patch0: ac_adapter.patch
Patch1: battery.patch
Patch2: kernel3.patch
Patch3: wakeup.patch
Patch4: var-line.patch
Patch5: typos.patch
Patch6: cleanup.patch
%description
AcpiTool is a Linux ACPI client. It's a small command line application,
@ -21,7 +27,13 @@ toggle fan on/off, and more.
%prep
%setup -q
#patch0 -p1 -b .gcc43
%patch0 -p1 -b .ac_adapter
%patch1 -p1 -b .battery
%patch2 -p1 -b .kernel3
%patch3 -p1 -b .wakeup
%patch4 -p1 -b .var-line
%patch5 -p1 -b .typos
%patch6 -p1 -b .cleanup
%build
%configure
@ -37,6 +49,14 @@ make install DESTDIR=$RPM_BUILD_ROOT
%{_mandir}/man1/acpitool*
%changelog
* Fri Oct 26 2018 Al Stone <ahs3@redhat.com> - 0.5.1-19
- Remove commented out acpitool-0.5-gcc43.patch; it's no longer needed and
just clutters up the spec file
- Merge in patches from Debian (Arch uses very similar but not exactly
identical nor as extensive patches). Closes BZ#1625002.
- Add a new patch to clean up g++ warning about implicit casts
- Fixed upstream to more recent location on sf.net
* Mon Jul 23 2018 Al Stone <ahs3@redhat.com> - 0.5.1-18
- Add in BuildRequires for C++. Closes BZ1603341.

484
battery.patch Normal file
View file

@ -0,0 +1,484 @@
Author: Evgeni Golov <evgeni@debian.org>, Michael Meskes <meskes@debian.org>
Description: Fix reading of battery information.
--- acpitool-0.5.1/src/acpitool.h 2008-10-16 17:38:12.000000000 +0200
+++ acpitool-0.5.1.fixed/src/acpitool.h 2010-03-28 11:35:12.000000000 +0200
@@ -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];
};
--- acpitool-0.5.1/src/battery.cpp 2009-08-13 21:42:43.000000000 +0200
+++ acpitool-0.5.1.fixed/src/battery.cpp 2010-03-28 13:46:40.000000000 +0200
@@ -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;

371
cleanup.patch Normal file
View file

@ -0,0 +1,371 @@
Cleanup all of the warnings from implicit char const * casting
ISO C++ used to allow:
char *foo;
foo = "my string";
The standard has since changed, and this patch changes to the new
expectation:
char const *foo; // which makes more sense
foo = "my string";
Signed-off-by: Al Stone <ahs3@redhat.com>
diff -NaurEZbwB acpitool-0.5.1.orig/src/ac_adapter.cpp acpitool-0.5.1/src/ac_adapter.cpp
--- acpitool-0.5.1.orig/src/ac_adapter.cpp 2018-10-26 14:08:08.527714586 -0600
+++ acpitool-0.5.1/src/ac_adapter.cpp 2018-10-26 14:24:33.819571023 -0600
@@ -50,7 +50,8 @@
int Do_AC_Info(int verbose) // wrapper around the other 2 functions //
{
ifstream file_in;
- char *dirname, filename[4][50], str[40];
+ char const *dirname;
+ char filename[4][50], str[40];
int ac_count = 0;
DIR *ac_dir;
struct dirent *ac_dirent;
@@ -87,7 +88,8 @@
int Do_AC_Info_Proc(int verbose)
{
ifstream file_in;
- char *dirname, filename[4][50], str[40];
+ char const *dirname;
+ char filename[4][50], str[40];
int ac_count = 0;
DIR *ac_dir;
struct dirent *ac_dirent;
@@ -152,7 +154,7 @@
char filename[2][65], str[100], temp[100], attr[100];
int ac_count = 0, start = 0, findex = 0;
DIR *ac_dir;
- char *name, *dirname;
+ char const *name, *dirname;
dirname = "/sys/class/power_supply/"; //find all entries in this dir
diff -NaurEZbwB acpitool-0.5.1.orig/src/acpitool.cpp acpitool-0.5.1/src/acpitool.cpp
--- acpitool-0.5.1.orig/src/acpitool.cpp 2018-10-26 14:08:08.527714586 -0600
+++ acpitool-0.5.1/src/acpitool.cpp 2018-10-26 14:23:21.903926202 -0600
@@ -64,7 +64,8 @@
int Has_ACPI(char *c)
{
ifstream file_in, file2_in;
- char *filename, *filename2, str[50];
+ char const *filename, *filename2;
+ char str[50];
filename = "/proc/acpi/info";
filename2 = "/sys/module/acpi/parameters/acpica_version";
@@ -104,6 +105,7 @@
return 1;
}
}
+ return 0;
}
@@ -137,7 +139,8 @@
int Get_Kernel_Version(char *c, int verbose)
{
ifstream file_in;
- char *filename, str[20];
+ char const *filename;
+ char str[20];
filename = "/proc/sys/kernel/osrelease";
@@ -185,7 +188,8 @@
int Set_Kernel_Version()
{
ifstream file_in;
- char *filename, str[10];
+ char const *filename;
+ char str[10];
filename = "/proc/sys/kernel/osrelease";
@@ -218,7 +222,8 @@
int Do_Thermal_Info(const int show_trip, int verbose)
{
ifstream file_in, file_in2;
- char *dirname, str[120];
+ char const *dirname;
+ char str[120];
vector<string> filename;
DIR *thermal_dir;
@@ -341,7 +346,8 @@
int Do_Fan_Info(int verbose)
{
ifstream file_in;
- char *dirname, filename[4][50], str[40];
+ char const *dirname;
+ char filename[4][50], str[40];
int fan_count = 0;
DIR *fan_dir;
struct dirent *fan_dirent;
@@ -416,7 +422,7 @@
int Show_WakeUp_Devices(int verbose)
{
ifstream file_in;
- char *filename;
+ char const *filename;
string str;
filename = "/proc/acpi/wakeup";
@@ -461,7 +467,8 @@
int Toggle_WakeUp_Device(const int Device, int verbose)
{
ofstream file_out;
- char *filename; string str;
+ char const *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";
@@ -527,7 +534,7 @@
int Do_Suspend(int State) //put system in sleep state 3 or 4 (standby) //
{
ofstream file_out;
- char *filename, *str;
+ char const *filename, *str;
Set_Kernel_Version();
diff -NaurEZbwB acpitool-0.5.1.orig/src/asus.cpp acpitool-0.5.1/src/asus.cpp
--- acpitool-0.5.1.orig/src/asus.cpp 2018-10-26 14:08:08.527714586 -0600
+++ acpitool-0.5.1/src/asus.cpp 2018-10-26 14:28:37.753758221 -0600
@@ -45,7 +45,7 @@
int Has_Asus_ACPI()
{
ifstream file_in;
- char *filename;
+ char const *filename;
filename = "/proc/acpi/asus";
@@ -82,7 +82,8 @@
int Do_Asus_LCD_Info()
{
ifstream file_in;
- char *filename, lcdb[40];
+ char const *filename;
+ char lcdb[40];
filename = "/proc/acpi/asus/brn";
@@ -116,7 +117,7 @@
int Set_Asus_LCD_Level(int z)
{
ofstream file_out;
- char *filename;
+ char const *filename;
filename = "/proc/acpi/asus/brn";
@@ -144,7 +145,7 @@
int Do_Asus_Video_Info()
{
ifstream file_in;
- char *filename;
+ char const *filename;
int type;
filename = "/proc/acpi/asus/disp";
@@ -199,7 +200,8 @@
int Do_Asus_Info()
{
ifstream file_in;
- char *filename, info[255];
+ char const *filename;
+ char info[255];
filename = "/proc/acpi/asus/info";
@@ -264,7 +266,7 @@
int Set_Asus_LCD_State(int o)
{
ofstream file_out;
- char *filename;
+ char const *filename;
filename = "/proc/acpi/asus/lcd";
file_out.open(filename);
@@ -289,7 +291,7 @@
int Set_MLed(int state)
{
ofstream file_out;
- char *filename;
+ char const *filename;
filename = "/proc/acpi/asus/mled";
file_out.open(filename);
@@ -314,7 +316,7 @@
int Set_WLed(int state)
{
ofstream file_out;
- char *filename;
+ char const *filename;
filename = "/proc/acpi/asus/wled";
file_out.open(filename);
diff -NaurEZbwB acpitool-0.5.1.orig/src/battery.cpp acpitool-0.5.1/src/battery.cpp
--- acpitool-0.5.1.orig/src/battery.cpp 2018-10-26 14:08:08.527714586 -0600
+++ acpitool-0.5.1/src/battery.cpp 2018-10-26 14:34:12.828762620 -0600
@@ -355,7 +355,8 @@
char filename[4][65], str[100], temp[100];
int bat_count = 0, start = 0, findex = 0;
DIR *battery_dir;
- char *name, *dirname;
+ char *name;
+ char const *dirname;
dirname = "/proc/acpi/battery/"; //find all entries in this dir
// dirname = "/home/david/dropzone/data/devel/acpi/battery/"; // keep this for testing //
@@ -538,7 +539,8 @@
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;
+ char *name;
+ char const *dirname;
dirname = "/sys/class/power_supply/"; //find all entries in this dir
@@ -743,7 +745,8 @@
int Count_Batteries_ProcFS()
{
DIR *battery_dir;
- char *name, *dirname;
+ char *name;
+ char const *dirname;
int t = 0;
dirname = "/proc/acpi/battery/";
@@ -789,7 +792,8 @@
{
DIR *battery_dir;
char filename[4][65], str[100];
- char *name, *dirname;
+ char *name;
+ char const *dirname;
int findex = 0, batcount = 0;
/* Since kernel 2.6.24, the acpi interface is gradually being moved from /proc/acpi/... to the sys filesystem. */
diff -NaurEZbwB acpitool-0.5.1.orig/src/cpu.cpp acpitool-0.5.1/src/cpu.cpp
--- acpitool-0.5.1.orig/src/cpu.cpp 2018-10-26 14:08:08.527714586 -0600
+++ acpitool-0.5.1/src/cpu.cpp 2018-10-26 14:29:35.222273504 -0600
@@ -48,7 +48,8 @@
int Show_CPU_Info()
{
ifstream file_in, file2_in;
- char *dirname, filename[25][70], str[300], temp[130];
+ char const *dirname;
+ char filename[25][70], str[300], temp[130];
int cpu_count = 0, findex = 0, thrott = 0;
long int max_cstate = 0, cst_cnt = 0, cst_usage_abs[8],
cst_usage_notC0 = 0;
diff -NaurEZbwB acpitool-0.5.1.orig/src/thinkpad.cpp acpitool-0.5.1/src/thinkpad.cpp
--- acpitool-0.5.1.orig/src/thinkpad.cpp 2018-10-26 14:08:08.526714577 -0600
+++ acpitool-0.5.1/src/thinkpad.cpp 2018-10-26 14:31:29.979302456 -0600
@@ -12,7 +12,7 @@
int Has_Thinkpad_ACPI()
{
ifstream file_in;
- char *filename;
+ char const *filename;
filename = "/proc/acpi/ibm";
@@ -27,7 +27,7 @@
int Eject_Thinkpad_Bay()
{
ofstream bay;
- char *filename;
+ char const *filename;
if (!Has_Thinkpad_ACPI())
{
@@ -54,7 +54,7 @@
int Set_Thinkpad_LCD_Level(int z)
{
ofstream bright;
- char *filename;
+ char const *filename;
filename = "/proc/acpi/ibm/brightness";
@@ -78,7 +78,8 @@
int Do_Thinkpad_Fan_Info()
{
ifstream fan;
- char *filename, *status, *speed;
+ char const *filename;
+ char *status, *speed;
char line[32];
int i;
diff -NaurEZbwB acpitool-0.5.1.orig/src/toshiba.cpp acpitool-0.5.1/src/toshiba.cpp
--- acpitool-0.5.1.orig/src/toshiba.cpp 2018-10-26 14:08:08.526714577 -0600
+++ acpitool-0.5.1/src/toshiba.cpp 2018-10-26 14:26:28.736601409 -0600
@@ -45,7 +45,7 @@
int Has_Toshiba_ACPI()
{
ifstream file_in;
- char *filename;
+ char const *filename;
filename = "/proc/acpi/toshiba";
@@ -82,7 +82,8 @@
int Do_Toshiba_Fan_Info()
{
ifstream file_in;
- char *filename, str[40];
+ char const *filename;
+ char str[40];
filename = "/proc/acpi/toshiba/fan";
@@ -132,7 +133,8 @@
int Do_LCD_Info()
{
ifstream file_in;
- char *filename, str[40];
+ char const *filename;
+ char str[40];
filename = "/proc/acpi/toshiba/lcd";
@@ -166,7 +168,8 @@
int Force_Fan(int s)
{
ofstream file_out;
- char *filename, str[15];
+ char const *filename;
+ char str[15];
filename = "/proc/acpi/toshiba/fan";
@@ -200,7 +203,8 @@
int Set_LCD_Level(int l)
{
ofstream file_out;
- char *filename, str[15];
+ char const *filename;
+ char str[15];
filename = "/proc/acpi/toshiba/lcd";
@@ -230,7 +234,8 @@
int Do_Video_Info()
{
ifstream file_in;
- char *filename, str[40];
+ char const *filename;
+ char str[40];
int lcd, crt;
filename = "/proc/acpi/toshiba/video";

12
kernel3.patch Normal file
View file

@ -0,0 +1,12 @@
--- acpitool-0.5.1/src/acpitool.cpp 2009-08-13 14:37:48.000000000 -0500
+++ acpitool-0.5.1/src/acpitool.cpp 2011-07-28 08:40:37.000000000 -0500
@@ -205,8 +205,7 @@
Kernel_24 = 1;
Kernel_26 = 0;
}
-
- if(strncmp(str,"2.6",3)==0)
+ else
{
Kernel_24 = 0;
Kernel_26 = 1;

29
typos.patch Normal file
View file

@ -0,0 +1,29 @@
--- acpitool/man/acpitool.1 2012-01-13 07:56:18.000000000 -0500
+++ acpitool/man/acpitool.1 2012-08-10 00:07:25.646700871 -0400
@@ -33,7 +33,7 @@
.I /proc/acpi
or
.I /sys/class
-entries and presents the output in a meaningfull, human-readable format.
+entries and presents the output in a meaningful, human-readable format.
.br
It provides a.o. information on battery status, AC adapter presence, thermal reading, etc. This command is
@@ -46,7 +46,7 @@
If your laptop is a
.B Toshiba
-, it allows you to set the LCD brighness level and toggle the fan on/off.
+, it allows you to set the LCD brightness level and toggle the fan on/off.
.br
If you have an
@@ -98,7 +98,7 @@
.B \-l x
Set LCD brightness level to x, where x is in the range 0..7. Works only on Toshiba and IBM Thinkpad laptops.
Requires write access to
-.I /proc/acpi/tochiba/lcd
+.I /proc/acpi/toshiba/lcd
or
.I /proc/acpi/ibm/brightness
.

48
var-line.patch Normal file
View file

@ -0,0 +1,48 @@
From 2f16822b9487a951ac898fd6703a7f8c7cd4ce06 Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@hadrons.org>
Date: Sat, 15 Nov 2014 11:59:37 +0100
Subject: [PATCH] Do not assume fixed line lengths for /proc/acpi/wakeup file
The lines in that file might be equal or longer than 40 characters, which
means that the getline() call will truncate them, possibly at the wrong
place, and then be unable to proceed, as subsequent calls will get stuck
waiting for input that is not coming.
---
src/acpitool.cpp | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/acpitool.cpp b/src/acpitool.cpp
index f3beeca..e85a7c1 100644
--- a/src/acpitool.cpp
+++ b/src/acpitool.cpp
@@ -416,7 +416,8 @@ int Do_Fan_Info(int verbose)
int Show_WakeUp_Devices(int verbose)
{
ifstream file_in;
- char *filename, str[40];
+ char *filename;
+ string str;
filename = "/proc/acpi/wakeup";
@@ -437,14 +438,14 @@ int Show_WakeUp_Devices(int verbose)
}
else
{
- file_in.getline(str, 40); // first line are just headers //
+ getline(file_in, str); // first line are just headers //
cout<<" "<<str<<endl;
cout<<" ---------------------------------------"<<endl;
int t = 1;
while(!file_in.eof())
{
- file_in.getline(str, 40);
- if (strlen(str)!=0) // avoid printing last empty line //
+ getline(file_in, str);
+ if (str.length()!=0) // avoid printing last empty line //
{
cout<<" "<<t<<". "<<str<<endl;
t++;
--
2.1.3

70
wakeup.patch Normal file
View file

@ -0,0 +1,70 @@
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
@@ -459,16 +459,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)
{
@@ -483,14 +481,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