SaErrorT oh_process_events() { struct oh_event *e; while((e = g_async_queue_try_pop(oh_process_q)) != NULL) { /* FIXME: add real check if handler is allowed to push event to the domain id in the event */ if((e->did != oh_get_default_domain_id()) && (e->did != SAHPI_UNSPECIFIED_DOMAIN_ID)) { dbg("Domain Id %d not valid for event", e->did); g_free(e); continue; } switch(e->type) { case OH_ET_RESOURCE: trace("Event Type = Resource"); process_resource_event(e); break; case OH_ET_RESOURCE_DEL: trace("Event Type = Resource Delete"); process_resource_event(e); break; case OH_ET_RDR: trace("Event Type = RDR"); process_rdr_event(e); break; case OH_ET_RDR_DEL: trace("Event Type = RDR Delete"); process_rdr_event(e); break; case OH_ET_HPI: trace("Event Type = HPI Event"); process_hpi_event(e); break; default: trace("Event Type = Unknown Event"); } } oh_detect_event_alarm(e); g_free(e); return SA_OK; }
/** * get_handler_event: * @h: handler structure * * get_handler_event pulls an event from a given handler. It will normally * be called from get_events, which iterates across all handlers. * * Return value: 1 if event exists, 0 if no more events, -1 on failure **/ static int get_handler_event(struct oh_handler *h, RPTable *rpt) { struct oh_event event; struct timeval to = {0, 0}; int rv; rv = h->abi->get_event(h->hnd, &event, &to); if(rv < 1) { return rv; } switch (event.type) { case OH_ET_HPI: /* add the event to session event list */ process_session_event(rpt, &event.u.hpi_event); break; case OH_ET_RESOURCE_DEL: case OH_ET_RESOURCE: process_resource_event(h, rpt, &event); break; /* Domain events are not supported, pull them out for now */ /* case OH_ET_DOMAIN: process_domain_event(h, &event.u.domain_event); break; */ case OH_ET_RDR_DEL: case OH_ET_RDR: process_rdr_event(h, rpt, &event); break; /* Resource System event logs will be handled by the plugins and * will not be bubbled up. */ /* case OH_ET_RSEL: process_rsel_event(h, &event.u.rsel_event); break; */ default: dbg("Error! Should not reach here!"); return -1; } data_access_unlock(); return 1; }
int main(int argc, char **argv) { int rc = 0; auparse_state_t *au = NULL; setlocale(LC_ALL, ""); if (parse_args(argc, argv)) goto error; if (help_flag) { usage(stdout); goto exit; } /* Initialize event list*/ events = list_new((list_free_data_fn*) event_free); if (events == NULL) goto unexpected_error; /* Initialize auparse */ au = init_auparse(); if (au == NULL) goto error; if (create_search_criteria(au)) goto error; while (ausearch_next_event(au) > 0) { int err = 0; switch(auparse_get_type(au)) { case AUDIT_VIRT_MACHINE_ID: err = process_machine_id_event(au); break; case AUDIT_VIRT_CONTROL: err = process_control_event(au); break; case AUDIT_VIRT_RESOURCE: err = process_resource_event(au); break; case AUDIT_AVC: err = process_avc(au); break; case AUDIT_FIRST_ANOM_MSG ... AUDIT_LAST_ANOM_MSG: case AUDIT_FIRST_KERN_ANOM_MSG ... AUDIT_LAST_KERN_ANOM_MSG: err = process_anom(au); break; case AUDIT_SYSTEM_SHUTDOWN: err = process_shutdown(au); break; } if (err) { goto unexpected_error; } auparse_next_event(au); } /* Show results */ if (summary_flag) { print_summary(); } else { print_events(); } /* success */ goto exit; unexpected_error: fprintf(stderr, "Unexpected error\n"); error: rc = 1; exit: if (au) auparse_destroy(au); list_free(events); if (debug) fprintf(stdout, "Exit code: %d\n", rc); return rc; }
static int process_event(SaHpiDomainIdT did, struct oh_event *e) { struct oh_domain *d = NULL; RPTable *rpt = NULL; if (!e) { CRIT("Got NULL event"); return -1; } d = oh_get_domain(did); if (!d) return -2; rpt = &(d->rpt); DBG("Processing event for domain %u", d->id); switch (e->event.EventType) { case SAHPI_ET_RESOURCE: if (!e->hid) { CRIT("Resource event with invalid handler id! Dropping."); break; } if ( e->resource.ResourceCapabilities == 0 ) { SaHpiRptEntryT * restored; restored = oh_get_resource_by_id(rpt, e->event.Source); if ( restored ) { e->resource = *restored; } } if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_RESOURCE)) { CRIT("Resource event with invalid capabilities. Dropping."); break; } else if ((e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) && (e->event.EventDataUnion.ResourceEvent.ResourceEventType == SAHPI_RESE_RESOURCE_ADDED)) { CRIT("Invalid event. Resource in resource added event " "has FRU capability. Dropping."); } else { process_resource_event(d, e); } break; case SAHPI_ET_HOTSWAP: if (!e->hid) { CRIT("Hotswap event with invalid handler id! Dropping."); break; } if ( e->resource.ResourceCapabilities == 0 ) { SaHpiRptEntryT * restored; restored = oh_get_resource_by_id(rpt, e->event.Source); if ( restored ) { e->resource = *restored; } } if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_RESOURCE)) { CRIT("Hotswap event with invalid capabilities. Dropping."); break; } else if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { CRIT("Invalid event. Resource in hotswap event " "has no FRU capability. Dropping."); } else { process_hs_event(d, e); } break; case SAHPI_ET_SENSOR: case SAHPI_ET_SENSOR_ENABLE_CHANGE: case SAHPI_ET_WATCHDOG: case SAHPI_ET_HPI_SW: case SAHPI_ET_OEM: case SAHPI_ET_DOMAIN: case SAHPI_ET_USER: case SAHPI_ET_DIMI: case SAHPI_ET_DIMI_UPDATE: case SAHPI_ET_FUMI: process_hpi_event(d, e); break; default: CRIT("Don't know what to do for event type %d", e->event.EventType); } oh_detect_event_alarm(d, e); oh_release_domain(d); return 0; }