コード例 #1
0
ファイル: rpt_utils.c プロジェクト: openhpi1/testrepo
/**
 * rpt_diff
 * @cur_rpt: IN. Pointer to RPTable that represents the current state of resources
 * and rdrs.
 * @new_rpt: IN. Pointer to RPTable that contains rpt entries and rdrs just recently
 * discovered.
 * @res_new: OUT. List of new or changed rpt entries
 * @rdr_new: OUT. List of new or changed rdrs
 * @res_gone: OUT. List of old and not present resources.
 * @rdr_gone: OUT. List of old and not present rdrs.
 *
 * Extracts from current the resources and rdrs that are not found
 * in new and puts them in res_gone and rdr_gone. Also, puts in res_new and rdr_new
 * the resources and rdrs that are not already in current Or that are not identical
 * to the ones in current.
 *
 * Returns: void.
 **/
void rpt_diff(RPTable *cur_rpt, RPTable *new_rpt,
              GSList **res_new, GSList **rdr_new,
              GSList **res_gone, GSList **rdr_gone) {

        SaHpiRptEntryT *res = NULL;

        if (!cur_rpt || !new_rpt ||
            !res_new || !rdr_new || !res_gone || !rdr_gone) return;

        /* Look for absent resources and rdrs */
        for (res = oh_get_resource_by_id(cur_rpt, SAHPI_FIRST_ENTRY);
             res != NULL;
             res = oh_get_resource_next(cur_rpt, res->ResourceId)) {

                SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(new_rpt, res->ResourceId);

                if (tmp_res == NULL) *res_gone = g_slist_append(*res_gone, (gpointer)res);
                else {
                        SaHpiRdrT *rdr = NULL;

                        for (rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, SAHPI_FIRST_ENTRY);
                             rdr != NULL;
                             rdr = oh_get_rdr_next(cur_rpt, res->ResourceId, rdr->RecordId)) {

                                SaHpiRdrT *tmp_rdr =
                                        oh_get_rdr_by_id(new_rpt, res->ResourceId, rdr->RecordId);

                                if (tmp_rdr == NULL)
                                        *rdr_gone = g_slist_append(*rdr_gone, (gpointer)rdr);
                        }
                }
        }

        /* Look for new resources and rdrs*/
        for (res = oh_get_resource_by_id(new_rpt, SAHPI_FIRST_ENTRY);
             res != NULL;
             res = oh_get_resource_next(new_rpt, res->ResourceId)) {

                SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(cur_rpt, res->ResourceId);
                SaHpiRdrT *rdr = NULL;
                if (tmp_res == NULL || memcmp(res, tmp_res, sizeof(SaHpiRptEntryT))) {
                        *res_new = g_slist_append(*res_new, (gpointer)res);
                }

                for (rdr = oh_get_rdr_by_id(new_rpt, res->ResourceId, SAHPI_FIRST_ENTRY);
                     rdr != NULL;
                     rdr = oh_get_rdr_next(new_rpt, res->ResourceId, rdr->RecordId)) {

                        SaHpiRdrT *tmp_rdr = NULL;

                        if (tmp_res != NULL)
                                tmp_rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, rdr->RecordId);

                        if (tmp_rdr == NULL || memcmp(rdr, tmp_rdr, sizeof(SaHpiRdrT)))
                                *rdr_new = g_slist_append(*rdr_new, (gpointer)rdr);

                }
        }
}
コード例 #2
0
ファイル: rpt_utils_016.c プロジェクト: openhpi1/testrepo
/**
 * main: Starts with an RPTable of 10 resources, multiple rdrs
 * on some resources. Remove resource. Check if resource was removed
 * searching for it in sequence. If not fail, else passed test.
 *
 * Return value: 0 on success, 1 on failure
 **/
int main(int argc, char **argv)
{
        RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable));
        SaHpiRptEntryT *tmpentry = NULL;
        guint i = 0;

        for (i = 0; rptentries[i].ResourceId != 0; i++) {
                if (oh_add_resource(rptable, rptentries + i, NULL, 0))
                        return 1;
        }

        for (i = 0; i < 5; i++) {
                if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, rdrs + i, NULL,0))
                        return 1;
        }

        for (; i < 7; i++) {
                if (oh_add_rdr(rptable, rptentries[9].ResourceId, rdrs + i, NULL,0))
                        return 1;
        }

        oh_remove_resource(rptable, rptentries[0].ResourceId);
        for (tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY);
             tmpentry;
             tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) {
                if (tmpentry->ResourceId == rptentries[0].ResourceId)
                        return 1;
        }
        
        return 0;
}
コード例 #3
0
ファイル: ohpi.c プロジェクト: openhpi1/testrepo
/**
 * oHpiHandlerDestroy
 * @sid:    IN.     a valid session id
 * @id:     IN.     The id of the handler to destroy
 *
 * Destroys a handler. Calls the plugin's abi close function.
 *
 * Returns: SA_OK on success. Minus SA_OK on error.
 **/
SaErrorT SAHPI_API oHpiHandlerDestroy (
     SAHPI_IN    SaHpiSessionIdT sid,
     SAHPI_IN    oHpiHandlerIdT id )
{
        SaHpiDomainIdT did;
        struct oh_domain *d = NULL;
	SaErrorT error = SA_OK;

        if (sid == 0)
		return SA_ERR_HPI_INVALID_SESSION;
        if (id == 0)
                return SA_ERR_HPI_INVALID_PARAMS;
                
        OH_CHECK_INIT_STATE(sid);
        OH_GET_DID(sid, did);
        OH_GET_DOMAIN(did, d); /* Lock domain */
                
        if (oh_init()) error = SA_ERR_HPI_INTERNAL_ERROR;

        if (error == SA_OK)
           if (oh_destroy_handler(id)) error = SA_ERR_HPI_ERROR;

        if (error == SA_OK) {
            // Remove all handler remaing resources from the Domain RPT
            SaHpiRptEntryT *rpte;
            SaHpiResourceIdT rid;
            GSList *events = 0;

            rid = SAHPI_FIRST_ENTRY;
            while ((rpte = oh_get_resource_next(&(d->rpt), rid)) != 0) {
                const void * data;
                data = oh_get_resource_data(&(d->rpt), rpte->ResourceId);
                if (data) {
                    const unsigned int hid = *(const unsigned int*)(data);
                    if (hid == id) {
                        struct oh_event * e = g_new0(struct oh_event, 1);
                        e->hid = id;
                        e->resource = *rpte;
                        e->rdrs = 0;
                        e->rdrs_to_remove = 0;
                        e->event.Source = rpte->ResourceId;
                        e->event.EventType = SAHPI_ET_RESOURCE;
                        oh_gettimeofday(&e->event.Timestamp);
                        e->event.Severity = SAHPI_MAJOR;
                        e->event.EventDataUnion.ResourceEvent.ResourceEventType
                            = SAHPI_RESE_RESOURCE_REMOVED;
                        events = g_slist_prepend(events, e);
                    }
                }
                rid = rpte->ResourceId;
            }

            GSList *iter = events;
            while (iter) {
                oh_evt_queue_push(oh_process_q, iter->data);
                iter = g_slist_next(iter);
            }
            g_slist_free(events);
        }
コード例 #4
0
ファイル: sim_util.c プロジェクト: openhpi1/testrepo
int sim_util_get_res_id(RPTable *table, char *filename, SaHpiResourceIdT *rid)
{
        SaHpiRptEntryT *entry;
        SaHpiResourceIdT  id;

        for (id = RPT_ENTRY_BEGIN, entry = oh_get_resource_next(table, id);
             entry; entry = oh_get_resource_next(table, entry->ResourceId)) {
                char* data;
                data = (char*) oh_get_resource_data(table, entry->ResourceId);
                if (data == NULL) continue;
                if (!strcmp(data, filename)) {
                        *rid = entry->ResourceId;
                        return 0;
                }
        }
        return -1;
}
コード例 #5
0
int eventq_event_add(struct oh_handler_state *oh_hnd)
{
	struct oh_event event;
	SaHpiRptEntryT *rpt_entry;
	SaHpiRdrT      *rdr_entry;

	/* get the first rpt entry */
	
	rpt_entry = oh_get_resource_next(oh_hnd->rptcache, RPT_ENTRY_BEGIN);
	
	while (rpt_entry) {
		memset(&event, 0, sizeof(event));
		event.type = OH_ET_RESOURCE;
		memcpy(&event.u.res_event.entry, rpt_entry, sizeof(SaHpiRptEntryT));
		oh_hnd->eventq = g_slist_append(oh_hnd->eventq, eventdup(&event) );
	
	
		/* get every resource rdr's */
		rdr_entry = oh_get_rdr_next(oh_hnd->rptcache, 
					    rpt_entry->ResourceId, 
					    RDR_BEGIN);
		while (rdr_entry) {
			memset(&event, 0, sizeof(event));
			event.type = OH_ET_RDR;
			memcpy(&event.u.rdr_event.rdr, rdr_entry, sizeof(SaHpiRdrT));
			oh_hnd->eventq = g_slist_append(oh_hnd->eventq, eventdup(&event));
			rdr_entry = oh_get_rdr_next(oh_hnd->rptcache, 
						    rpt_entry->ResourceId, 
						    rdr_entry->RecordId);
		}
		/* get any resource rdr's end */
	
	
		rpt_entry = oh_get_resource_next(oh_hnd->rptcache, rpt_entry->ResourceId);
	}

	
	return SA_OK;
}
コード例 #6
0
ファイル: ipmi_util.c プロジェクト: openhpi1/testrepo
/*XXX algorithm here is so ulgy! */
SaHpiRptEntryT *ohoi_get_resource_by_entityid(RPTable                *table,
                                              const ipmi_entity_id_t *entity_id)
{
        struct ohoi_resource_info res_info1;
        SaHpiRptEntryT *rpt_entry;
        
        res_info1.type            = OHOI_RESOURCE_ENTITY;
        res_info1.u.entity_id     = *entity_id;
        
        rpt_entry = oh_get_resource_next(table, SAHPI_FIRST_ENTRY);
        while (rpt_entry) {
                struct ohoi_resource_info *ohoi_res_info;
                ohoi_res_info = oh_get_resource_data(table, rpt_entry->ResourceId);
                if (ohoi_resource_info_is_equal(res_info1, *ohoi_res_info)) {
                        return rpt_entry;
		}
                rpt_entry = oh_get_resource_next(table, 
                                                 rpt_entry->ResourceId);            
        }

	dbg("Not found resource by entity_id");
        return NULL;
}
コード例 #7
0
ファイル: rpt_utils_037.c プロジェクト: openhpi1/openhpitest
/**
 * main: Adds 2 resources to an rpt table.
 * Fetches the 2nd resource through the get_next call
 * using a NULL table.
 * Passes the test if the interface returns NULL, else it fails.
 *
 * Return value: 0 on success, 1 on failure
 **/
int main(int argc, char **argv)
{
        RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable));
        oh_init_rpt(rptable);

        if (oh_add_resource(rptable, rptentries, NULL, 1))
                return 1;

        if (oh_add_resource(rptable, rptentries + 1, NULL, 1))
                return 1;

        if (oh_get_resource_next(NULL, rptentries[0].ResourceId))
                return 1;

        return 0;
}
コード例 #8
0
ファイル: rpt_utils_039.c プロジェクト: openhpi1/testrepo
/**
 * main: Adds 10 resources to an rpt table.
 * Fetches the 1st resource through the get_next call
 * using SAHPI_FIRST_ENTRY for the Resource Id. Makes sure that the resource
 * returned is the 1st resource.
 * Passes the test if the interface returns a valid entry, else it fails.
 *
 * Return value: 0 on success, 1 on failure
 **/
int main(int argc, char **argv)
{
        RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable));
        oh_init_rpt(rptable);
        SaHpiRptEntryT *tmpentry = NULL;
        guint i;

        for (i = 0; rptentries[i].ResourceId; i++) {
                if (oh_add_resource(rptable, rptentries+i, NULL, 1))
                        return 1;        
        }

        tmpentry = oh_get_resource_next(rptable, SAHPI_FIRST_ENTRY);
        if (!tmpentry)
                return 1;

        if (tmpentry->ResourceId != rptentries[0].ResourceId)
                return 1;

        return 0;
}
コード例 #9
0
ファイル: rpt_utils_008.c プロジェクト: openhpi1/testrepo
/**
 * main: Starts with an RPTable of 10 resources, starting at
 * a random resource on going on to the next, compares
 * resource ids against the originals. A failed comparison
 * means the test failed, otherwise the test passed.
 *
 * Return value: 0 on success, 1 on failure
 **/
int main(int argc, char **argv)
{
        RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable));
        oh_init_rpt(rptable);
        SaHpiRptEntryT *tmpentry = NULL;
        guint i = 0, k = 0;

        for (i = 0; rptentries[i].ResourceId != 0; i++) {
                if (oh_add_resource(rptable, rptentries + i, NULL, 0))
                        return 1;
        }

        k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0));

        for (tmpentry = oh_get_resource_by_id(rptable, rptentries[k].ResourceId);
             tmpentry;
             tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) {
                if (rptentries[k++].ResourceId != tmpentry->ResourceId)
                        return 1;
        }

        return 0;
}