diff --git a/ac_adapter.patch b/ac_adapter.patch new file mode 100644 index 0000000..156400b --- /dev/null +++ b/ac_adapter.patch @@ -0,0 +1,73 @@ +Author: Michael Meskes +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 1, but you never know */ ++ for(int i=0, t=0; i 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 : \n"); + } + else diff --git a/acpitool-0.5-gcc43.patch b/acpitool-0.5-gcc43.patch deleted file mode 100644 index 0a0ccd1..0000000 --- a/acpitool-0.5-gcc43.patch +++ /dev/null @@ -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 -+#include - #include - #include - #include -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 -+#include - #include - #include - #include diff --git a/acpitool.spec b/acpitool.spec index 942af60..a3a5e94 100644 --- a/acpitool.spec +++ b/acpitool.spec @@ -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 - 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 - 0.5.1-18 - Add in BuildRequires for C++. Closes BZ1603341. diff --git a/battery.patch b/battery.patch new file mode 100644 index 0000000..377502c --- /dev/null +++ b/battery.patch @@ -0,0 +1,484 @@ +Author: Evgeni Golov , Michael Meskes +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 @@ + <Design_Cap<LastFull_Cap; ++ if(atoi(Batt_Info[i]->Design_Cap) > 0) ++ cout<<" Design capacity : "<Design_Cap<Charge_Full_Design) > 0) ++ cout<<" Design capacity : "<Charge_Full_Design<LastFull_Cap) > 0) ++ cout<<" Last full capacity : "<LastFull_Cap; ++ else if(atoi(Batt_Info[i]->Charge_Full) > 0) ++ cout<<" Last full capacity : "<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; diff --git a/cleanup.patch b/cleanup.patch new file mode 100644 index 0000000..3f231af --- /dev/null +++ b/cleanup.patch @@ -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 + +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 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 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"; diff --git a/kernel3.patch b/kernel3.patch new file mode 100644 index 0000000..8fb592d --- /dev/null +++ b/kernel3.patch @@ -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; diff --git a/typos.patch b/typos.patch new file mode 100644 index 0000000..3c974b9 --- /dev/null +++ b/typos.patch @@ -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 + . diff --git a/var-line.patch b/var-line.patch new file mode 100644 index 0000000..b3a790d --- /dev/null +++ b/var-line.patch @@ -0,0 +1,48 @@ +From 2f16822b9487a951ac898fd6703a7f8c7cd4ce06 Mon Sep 17 00:00:00 2001 +From: Guillem Jover +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<<" "< +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 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 + +