diff --git a/wmacpi/ChangeLog b/wmacpi/ChangeLog index 1f1e857..be3fdcd 100644 --- a/wmacpi/ChangeLog +++ b/wmacpi/ChangeLog @@ -1,3 +1,9 @@ +2004 July 19 1.99r6 + Fix for Debian bug #250792 - the parser for the acpi files was + too stupid to deal with error conditions. I've now added some + basic checking to make it handle the error that caused the bug + report, but I'll need to add more later. + 2004 April 23 1.99r5 Collected fixes for the collected fixes below . . . diff --git a/wmacpi/libacpi.c b/wmacpi/libacpi.c index d6148f7..b888d5f 100644 --- a/wmacpi/libacpi.c +++ b/wmacpi/libacpi.c @@ -195,6 +195,13 @@ char *get_value(char *string) return retval; } +int check_error(char *buf) +{ + if(strstr(buf, "ERROR") != NULL) + return 1; + return 0; +} + power_state_t get_power_status(void) { FILE *file; @@ -237,6 +244,13 @@ int get_battery_info(int batt_no) buflen = fread(buf, sizeof(buf), 1, file); fclose(file); + /* check to see if there were any errors reported in the file */ + if(check_error(buf)) { + pinfo("Error reported in file %s - discarding data\n", + info->info_file); + return 0; + } + /* check to see if battery is present */ entry = strstr(buf, "present:"); val = get_value(entry); @@ -282,9 +296,16 @@ int get_battery_info(int batt_no) } /* grab the file contents */ + memset(buf, 0, sizeof(buf)); buflen = fread(buf, sizeof(buf), 1, file); fclose(file); + /* check to see if there were any errors reported in the file */ + if(check_error(buf)) { + pinfo("Error reported in file %s - discarding data\n", + info->state_file); + return 0; + } /* check to see if battery is present */ entry = strstr(buf, "present:"); val = get_value(entry); diff --git a/wmacpi/wmacpi.c b/wmacpi/wmacpi.c index 256bed3..abde0d3 100644 --- a/wmacpi/wmacpi.c +++ b/wmacpi/wmacpi.c @@ -35,7 +35,7 @@ #include "libacpi.h" #include "wmacpi.h" -#define WMACPI_VER "1.99r2" +#define WMACPI_VER "1.99r6" /* main pixmap */ #ifdef LOW_COLOR @@ -59,6 +59,7 @@ typedef struct { int blink; /* should we blink the LED? (critical battery) */ int bell; /* bell on critical low, or not? */ int scroll; /* scroll message text? */ + int scroll_reset; /* reset the scrolling text */ } Dockapp; /* globals */ @@ -75,7 +76,7 @@ static void new_window(char *name); static int open_display(char *display); static void redraw_window(void); static void render_text(char *string); -static void scroll_text(int x, int y, int width, int tw, int reset); +static void scroll_text(void); static void display_percentage(int percent); static void display_time(int minutes); @@ -122,6 +123,10 @@ static void invalid_time_display(void) copy_xpm_area(122, 13, 31, 11, 7, 32); } +static void reset_scroll(void) { + dockapp->scroll_reset = 1; +} + static void redraw_window(void) { if (dockapp->update) { @@ -262,7 +267,8 @@ static void render_text(char *string) } dockapp->tw = k; /* length of text segment */ /* re-scroll the message */ - scroll_text(6, 50, 52, dockapp->tw, 1); + reset_scroll(); + scroll_text(); } static int open_display(char *display) @@ -275,19 +281,24 @@ static int open_display(char *display) return 0; } -static void scroll_text(int x, int y, int width, int tw, int reset) +static void scroll_text(void) { static int pos, first, stop; + int x = 6; + int y = 50; + int width = 52; + int tw = dockapp->tw; if (!dockapp->scroll) return; - if (reset) { + if (dockapp->scroll_reset) { pos = 0; first = 0; stop = 0; XCopyArea(dockapp->display, dockapp->pixmap, dockapp->text, dockapp->gc, 0, 0, width, 7, x, y); + dockapp->scroll_reset = 0; } if (stop) { @@ -487,7 +498,7 @@ void scroll_slower(double factor) { scroll_reset = scroll_reset * factor; } -void reset_scroll(void) { +void reset_scroll_speed(void) { scroll_reset = DEFAULT_SCROLL_RESET; } @@ -526,20 +537,20 @@ static void set_message(void) if (!binfo->present) { if (state != M_NP) { state = M_NP; - reset_scroll(); + reset_scroll_speed(); render_text("not present"); } } else if (ap->power == AC) { if (binfo->charge_state == CHARGE) { if (state != M_CH) { state = M_CH; - reset_scroll(); + reset_scroll_speed(); render_text("battery charging"); } } else { if (state != M_AC) { state = M_AC; - reset_scroll(); + reset_scroll_speed(); render_text("on ac power"); } } @@ -565,7 +576,7 @@ static void set_message(void) } else { if (state != M_BATT) { state = M_BATT; - reset_scroll(); + reset_scroll_speed(); render_text("on battery"); } } @@ -706,6 +717,7 @@ int main(int argc, char **argv) dockapp->blink = 1; dockapp->bell = 0; dockapp->scroll = 1; + dockapp->scroll_reset = 0; globals->crit_level = 10; battery_no = 1; @@ -743,7 +755,7 @@ int main(int argc, char **argv) MAXBATT); return 1; } - fprintf(stderr, "Monitoring battery %d\n", battery_no); + pinfo("Monitoring battery %d\n", battery_no); } break; case 's': @@ -798,7 +810,7 @@ int main(int argc, char **argv) exit(1); if (battery_no > globals->battery_count) { - pfatal("Battery %d not available for monitoring\n", battery_no); + pfatal("Battery %d not available for monitoring.\n", battery_no); exit(1); } @@ -907,7 +919,7 @@ int main(int argc, char **argv) } if (scroll_count++ >= scroll_reset) { - scroll_text(6, 50, 52, dockapp->tw, 1); + reset_scroll(); scroll_count = 0; } @@ -926,7 +938,7 @@ int main(int argc, char **argv) set_power_panel(); set_message(); display_percentage(binfo->percentage); - scroll_text(6, 50, 52, dockapp->tw, 0); + scroll_text(); /* redraw_window, if anything changed - determined inside * redraw_window. */