Example #1
0
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;
}
Example #2
0
/**
 * 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;
}
Example #3
0
File: auvirt.c Project: yubo/audit
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;
}
Example #4
0
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;
}