static int lid_test_state(fwts_framework *fw, int button) { int gpe_count = 0; int fd; int matching = 0; int not_matching = 0; int events = 0; size_t len; char *state; int i; fwts_gpe *gpes_start; fwts_gpe *gpes_end; switch (button) { case FWTS_BUTTON_LID_OPENED: state = "open"; break; case FWTS_BUTTON_LID_CLOSED: state = "closed"; break; default: state = "unknown"; break; } if ((gpe_count = fwts_gpe_read(&gpes_start)) == FWTS_ERROR) { fwts_log_error(fw, "Cannot read GPEs."); return FWTS_ERROR; } if ((fd = fwts_acpi_event_open()) < 0) { fwts_log_error(fw, "Cannot connect to acpid."); fwts_gpe_free(gpes_start, gpe_count); return FWTS_ERROR; } for (i = 0; i <= 20; i++) { char *buffer; if ((buffer = fwts_acpi_event_read(fd, &len, 1)) != NULL) { if (strstr(buffer, "button/lid")) { events++; lid_check_field_poll(fw, button, &matching, ¬_matching); break; } free(buffer); } fwts_printf(fw, "Waiting %2.2d/20\r", 20-i); } fwts_acpi_event_close(fd); if ((gpe_count = fwts_gpe_read(&gpes_end)) == FWTS_ERROR) { fwts_log_error(fw, "Cannot read GPEs."); fwts_gpe_free(gpes_start, gpe_count); return FWTS_ERROR; } fwts_gpe_test(fw, gpes_start, gpes_end, gpe_count); fwts_gpe_free(gpes_start, gpe_count); fwts_gpe_free(gpes_end, gpe_count); if (events == 0) fwts_failed(fw, LOG_LEVEL_HIGH, "NoLidEvents", "Did not detect any ACPI LID events while waiting for to LID %s.", state); else { fwts_passed(fw, "Detected ACPI LID events while waiting for LID to %s.", state); if ((matching == 0) || (not_matching > 0)) fwts_failed(fw, LOG_LEVEL_HIGH, "NoLidState", "Could not detect lid %s state.", state); else fwts_passed(fw, "Detected lid %s state.", state); } return FWTS_OK; }
static int wait_for_acpi_event(fwts_framework *fw, const char *name) { int gpe_count = 0; int fd; int events = 0; int matching = 0; size_t len; int i; fwts_gpe *gpes_start; fwts_gpe *gpes_end; if ((gpe_count = fwts_gpe_read(&gpes_start)) == FWTS_ERROR) { fwts_log_error(fw, "Cannot read GPEs."); return FWTS_ERROR; } if ((fd = fwts_acpi_event_open()) < 0) { fwts_log_error(fw, "Cannot connect to acpid."); fwts_gpe_free(gpes_start, gpe_count); return FWTS_ERROR; } for (i = 0; i <= 20; i++) { char *buffer; if ((buffer = fwts_acpi_event_read(fd, &len, 1)) != NULL) { char *str; if ((str = strstr(buffer, "battery")) != NULL) { events++; if (strstr(str, name) != NULL) { matching++; free(buffer); break; } } free(buffer); } fwts_printf(fw, "Waiting %2.2d/20\r", 20-i); } fwts_acpi_event_close(fd); if ((gpe_count = fwts_gpe_read(&gpes_end)) == FWTS_ERROR) { fwts_log_error(fw, "Cannot read GPEs."); fwts_gpe_free(gpes_start, gpe_count); return FWTS_ERROR; } fwts_gpe_test(fw, gpes_start, gpes_end, gpe_count); fwts_gpe_free(gpes_start, gpe_count); fwts_gpe_free(gpes_end, gpe_count); if (events == 0) fwts_failed(fw, LOG_LEVEL_HIGH, "BatteryNoEvents", "Did not detect any ACPI battery events."); else { fwts_passed(fw, "Detected ACPI battery events."); if (matching == 0) fwts_failed(fw, LOG_LEVEL_HIGH, "BatteryNoEvents", "Could not detect ACPI events for battery %s.", name); else fwts_passed(fw, "Detected ACPI event for battery %s.", name); } return FWTS_OK; }