Blame utils/rpt_utils.c

Packit db01ca
/*      -*- linux-c -*-
Packit db01ca
 *
Packit db01ca
 * (C) Copyright IBM Corp. 2003, 2005
Packit db01ca
 *
Packit db01ca
 * This program is distributed in the hope that it will be useful,
Packit db01ca
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit db01ca
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  This
Packit db01ca
 * file and program are licensed under a BSD style license.  See
Packit db01ca
 * the Copying file included with the OpenHPI distribution for
Packit db01ca
 * full licensing terms.
Packit db01ca
 *
Packit db01ca
 * Author(s):
Packit db01ca
 *      Renier Morales <renier@openhpi.org>
Packit db01ca
 */
Packit db01ca
Packit db01ca
#include <string.h>
Packit db01ca
Packit db01ca
#include <oh_utils.h>
Packit db01ca
#include <oh_error.h>
Packit db01ca
Packit db01ca
typedef struct {
Packit db01ca
        SaHpiRptEntryT rpt_entry;
Packit db01ca
        int owndata;
Packit db01ca
        void *data; /* private data for the owner of the RPTable */
Packit db01ca
        SaHpiUint32T update_count; /* RDR Update counter */
Packit db01ca
        GSList *rdrlist; /* Contains RDRecords for sequence lookups */
Packit db01ca
        GHashTable *rdrtable; /* Contains RDRecords for fast RecordId lookups */
Packit db01ca
} RPTEntry;
Packit db01ca
Packit db01ca
typedef struct {
Packit db01ca
       SaHpiRdrT rdr;
Packit db01ca
       int owndata;
Packit db01ca
       void *data; /* private data for the owner of the rpt entry. */
Packit db01ca
} RDRecord;
Packit db01ca
Packit db01ca
Packit db01ca
static RPTEntry *get_rptentry_by_rid(RPTable *table, SaHpiResourceIdT rid)
Packit db01ca
{
Packit db01ca
        GSList *rptnode = NULL;
Packit db01ca
        RPTEntry *rptentry = NULL;
Packit db01ca
Packit db01ca
        if (!table) {
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (!(table->rptlist)) {
Packit db01ca
                /*DBG("Info: RPT is empty.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (rid == SAHPI_FIRST_ENTRY) {
Packit db01ca
                rptentry = (RPTEntry *) (table->rptlist->data);
Packit db01ca
        } else {
Packit db01ca
                rptnode = (GSList *)g_hash_table_lookup(table->rptable, &rid;;
Packit db01ca
                rptentry = rptnode ? (RPTEntry *)rptnode->data : NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return rptentry;
Packit db01ca
}
Packit db01ca
Packit db01ca
static GSList *get_rptnode_by_rid(RPTable *table, SaHpiResourceIdT rid)
Packit db01ca
{
Packit db01ca
        GSList *rptnode = NULL;
Packit db01ca
Packit db01ca
        if (!table) {
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (!(table->rptlist)) {
Packit db01ca
                /*DBG("Info: RPT is empty.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (rid == SAHPI_FIRST_ENTRY) {
Packit db01ca
                rptnode = (GSList *) (table->rptlist);
Packit db01ca
        } else {
Packit db01ca
                rptnode = (GSList *)g_hash_table_lookup(table->rptable, &rid;;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return rptnode;
Packit db01ca
}
Packit db01ca
Packit db01ca
static RDRecord *get_rdrecord_by_id(RPTEntry *rptentry, SaHpiEntryIdT id)
Packit db01ca
{
Packit db01ca
        GSList *rdrnode = NULL;
Packit db01ca
        RDRecord *rdrecord = NULL;
Packit db01ca
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (!rptentry->rdrlist) {
Packit db01ca
                /*DBG("Info: RDR repository is empty.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (id == SAHPI_FIRST_ENTRY) {
Packit db01ca
                rdrecord = (RDRecord *) (rptentry->rdrlist->data);
Packit db01ca
        } else {
Packit db01ca
                rdrnode = (GSList *)g_hash_table_lookup(rptentry->rdrtable, &id;;
Packit db01ca
                rdrecord = rdrnode ? (RDRecord *)rdrnode->data : NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return rdrecord;
Packit db01ca
}
Packit db01ca
Packit db01ca
static GSList *get_rdrnode_by_id(RPTEntry *rptentry, SaHpiEntryIdT id)
Packit db01ca
{
Packit db01ca
        GSList *rdrnode = NULL;
Packit db01ca
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (!rptentry->rdrlist) {
Packit db01ca
                /*DBG("Info: RPT is empty.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (id == SAHPI_FIRST_ENTRY) {
Packit db01ca
                rdrnode = (GSList *) (rptentry->rdrlist);
Packit db01ca
        } else {
Packit db01ca
                rdrnode = (GSList *)g_hash_table_lookup(rptentry->rdrtable, &id;;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return rdrnode;
Packit db01ca
}
Packit db01ca
Packit db01ca
static int check_instrument_id(SaHpiRptEntryT *rptentry, SaHpiRdrT *rdr)
Packit db01ca
{
Packit db01ca
        int result = 0;
Packit db01ca
        static const SaHpiInstrumentIdT SENSOR_AGGREGATE_MAX = 0x0000010F;
Packit db01ca
Packit db01ca
        switch (rdr->RdrType) {
Packit db01ca
                case SAHPI_SENSOR_RDR:
Packit db01ca
                        if (rdr->RdrTypeUnion.SensorRec.Num >= SAHPI_STANDARD_SENSOR_MIN &&
Packit db01ca
                            rdr->RdrTypeUnion.SensorRec.Num <= SAHPI_STANDARD_SENSOR_MAX) {
Packit db01ca
                                if (rdr->RdrTypeUnion.SensorRec.Num > SENSOR_AGGREGATE_MAX) {
Packit db01ca
                                        result = -1;
Packit db01ca
                                } else if (rptentry->ResourceCapabilities &
Packit db01ca
                                           SAHPI_CAPABILITY_AGGREGATE_STATUS) {
Packit db01ca
                                        result = 0;
Packit db01ca
                                } else {
Packit db01ca
                                        result = -1;
Packit db01ca
                                }
Packit db01ca
                        } else {
Packit db01ca
                                result = 0;
Packit db01ca
                        }
Packit db01ca
                        break;
Packit db01ca
                default:
Packit db01ca
                        result = 0;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return result;
Packit db01ca
}
Packit db01ca
Packit db01ca
static void update_rptable(RPTable *table) {
Packit db01ca
        if (!table) {
Packit db01ca
                return;
Packit db01ca
        }
Packit db01ca
        oh_gettimeofday(&table->update_timestamp);
Packit db01ca
        table->update_count++;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_rdr_uid
Packit db01ca
 * @type: type of rdr
Packit db01ca
 * @num: id number of the RDR unique withing the RDR type for that resource
Packit db01ca
 *
Packit db01ca
 * Helper function to derive the Record id of an rdr from its @type and @num
Packit db01ca
 *
Packit db01ca
 * Returns: a derived Record Id used to identify RDRs within Resources
Packit db01ca
 */
Packit db01ca
SaHpiEntryIdT oh_get_rdr_uid(SaHpiRdrTypeT type, SaHpiInstrumentIdT num)
Packit db01ca
{
Packit db01ca
        SaHpiEntryIdT uid;
Packit db01ca
Packit db01ca
        uid = ((SaHpiEntryIdT)type) << 16;
Packit db01ca
        uid = uid + (SaHpiEntryIdT)num;
Packit db01ca
Packit db01ca
        return uid;
Packit db01ca
}
Packit db01ca
Packit db01ca
SaHpiInstrumentIdT oh_get_rdr_num(SaHpiEntryIdT rdrid) {
Packit db01ca
        return rdrid & 0x0000ffff;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_instrument_id
Packit db01ca
 * @rdr: RDR
Packit db01ca
 *
Packit db01ca
 * Helper function to derive the Instrument Id of the rdr
Packit db01ca
 *
Packit db01ca
 * Returns: an instrument id or zero
Packit db01ca
 */
Packit db01ca
SaHpiInstrumentIdT oh_get_instrument_id(const SaHpiRdrT *rdr)
Packit db01ca
{
Packit db01ca
        SaHpiInstrumentIdT num = 0;
Packit db01ca
Packit db01ca
        switch (rdr->RdrType) {
Packit db01ca
                case SAHPI_CTRL_RDR:
Packit db01ca
                        num = rdr->RdrTypeUnion.CtrlRec.Num;
Packit db01ca
                        break;
Packit db01ca
                case SAHPI_SENSOR_RDR:
Packit db01ca
                        num = rdr->RdrTypeUnion.SensorRec.Num;
Packit db01ca
                        break;
Packit db01ca
                case SAHPI_INVENTORY_RDR:
Packit db01ca
                        num = rdr->RdrTypeUnion.InventoryRec.IdrId;
Packit db01ca
                        break;
Packit db01ca
                case SAHPI_WATCHDOG_RDR:
Packit db01ca
                        num = rdr->RdrTypeUnion.WatchdogRec.WatchdogNum;
Packit db01ca
                        break;
Packit db01ca
                case SAHPI_ANNUNCIATOR_RDR:
Packit db01ca
                        num = rdr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum;
Packit db01ca
                        break;
Packit db01ca
               case SAHPI_DIMI_RDR:
Packit db01ca
                        num = rdr->RdrTypeUnion.DimiRec.DimiNum;
Packit db01ca
                        break;
Packit db01ca
                case SAHPI_FUMI_RDR:
Packit db01ca
                        num = rdr->RdrTypeUnion.FumiRec.Num;
Packit db01ca
                        break;
Packit db01ca
                default:
Packit db01ca
                        num = 0;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return num;
Packit db01ca
}
Packit db01ca
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * General RPT calls
Packit db01ca
 **/
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_init_rpt
Packit db01ca
 * @table: Pointer to RPTable structure to be initialized.
Packit db01ca
 *
Packit db01ca
 *
Packit db01ca
 * Returns: SA_OK on success Or minus SA_OK on error.
Packit db01ca
 **/
Packit db01ca
SaErrorT oh_init_rpt(RPTable *table)
Packit db01ca
{
Packit db01ca
        if (!table) {
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        table->update_timestamp = SAHPI_TIME_UNSPECIFIED;
Packit db01ca
        table->update_count = 0;
Packit db01ca
        table->rptlist = NULL;
Packit db01ca
        table->rptable = NULL;
Packit db01ca
Packit db01ca
        return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_flush_rpt
Packit db01ca
 * @table: Pointer to the RPT to flush.
Packit db01ca
 *
Packit db01ca
 * Cleans RPT from all entries and RDRs and frees the memory
Packit db01ca
 * associated with them.
Packit db01ca
 *
Packit db01ca
 * Returns: SA_OK on success Or minus SA_OK on error.
Packit db01ca
 **/
Packit db01ca
SaErrorT oh_flush_rpt(RPTable *table)
Packit db01ca
{
Packit db01ca
        SaHpiRptEntryT *tmp_entry;
Packit db01ca
Packit db01ca
        while ((tmp_entry = oh_get_resource_by_id(table, SAHPI_FIRST_ENTRY)) != NULL) {
Packit db01ca
                oh_remove_resource(table, SAHPI_FIRST_ENTRY);
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * rpt_diff
Packit db01ca
 * @cur_rpt: IN. Pointer to RPTable that represents the current state of resources
Packit db01ca
 * and rdrs.
Packit db01ca
 * @new_rpt: IN. Pointer to RPTable that contains rpt entries and rdrs just recently
Packit db01ca
 * discovered.
Packit db01ca
 * @res_new: OUT. List of new or changed rpt entries
Packit db01ca
 * @rdr_new: OUT. List of new or changed rdrs
Packit db01ca
 * @res_gone: OUT. List of old and not present resources.
Packit db01ca
 * @rdr_gone: OUT. List of old and not present rdrs.
Packit db01ca
 *
Packit db01ca
 * Extracts from current the resources and rdrs that are not found
Packit db01ca
 * in new and puts them in res_gone and rdr_gone. Also, puts in res_new and rdr_new
Packit db01ca
 * the resources and rdrs that are not already in current Or that are not identical
Packit db01ca
 * to the ones in current.
Packit db01ca
 *
Packit db01ca
 * Returns: SA_ERR_HPI_INVALID_PARAMS if any argument is NULL, otherwise SA_OK.
Packit db01ca
 **/
Packit db01ca
SaErrorT rpt_diff(RPTable *cur_rpt, RPTable *new_rpt,
Packit db01ca
                  GSList **res_new, GSList **rdr_new,
Packit db01ca
                  GSList **res_gone, GSList **rdr_gone) {
Packit db01ca
Packit db01ca
        SaHpiRptEntryT *res = NULL;
Packit db01ca
Packit db01ca
        if (!cur_rpt || !new_rpt ||
Packit db01ca
            !res_new || !rdr_new || !res_gone || !rdr_gone)
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
Packit db01ca
        /* Look for absent resources and rdrs */
Packit db01ca
        for (res = oh_get_resource_by_id(cur_rpt, SAHPI_FIRST_ENTRY);
Packit db01ca
             res != NULL;
Packit db01ca
             res = oh_get_resource_next(cur_rpt, res->ResourceId)) {
Packit db01ca
Packit db01ca
                SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(new_rpt, res->ResourceId);
Packit db01ca
Packit db01ca
                if (tmp_res == NULL) *res_gone = g_slist_append(*res_gone, (gpointer)res);
Packit db01ca
                else {
Packit db01ca
                        SaHpiRdrT *rdr = NULL;
Packit db01ca
Packit db01ca
                        for (rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, SAHPI_FIRST_ENTRY);
Packit db01ca
                             rdr != NULL;
Packit db01ca
                             rdr = oh_get_rdr_next(cur_rpt, res->ResourceId, rdr->RecordId)) {
Packit db01ca
Packit db01ca
                                SaHpiRdrT *tmp_rdr =
Packit db01ca
                                        oh_get_rdr_by_id(new_rpt, res->ResourceId, rdr->RecordId);
Packit db01ca
Packit db01ca
                                if (tmp_rdr == NULL)
Packit db01ca
                                        *rdr_gone = g_slist_append(*rdr_gone, (gpointer)rdr);
Packit db01ca
                        }
Packit db01ca
                }
Packit db01ca
        }
Packit db01ca
Packit db01ca
        /* Look for new resources and rdrs*/
Packit db01ca
        for (res = oh_get_resource_by_id(new_rpt, SAHPI_FIRST_ENTRY);
Packit db01ca
             res != NULL;
Packit db01ca
             res = oh_get_resource_next(new_rpt, res->ResourceId)) {
Packit db01ca
Packit db01ca
                SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(cur_rpt, res->ResourceId);
Packit db01ca
                SaHpiRdrT *rdr = NULL;
Packit db01ca
                if (tmp_res == NULL || memcmp(res, tmp_res, sizeof(SaHpiRptEntryT))) {
Packit db01ca
                        *res_new = g_slist_append(*res_new, (gpointer)res);
Packit db01ca
                }
Packit db01ca
Packit db01ca
                for (rdr = oh_get_rdr_by_id(new_rpt, res->ResourceId, SAHPI_FIRST_ENTRY);
Packit db01ca
                     rdr != NULL;
Packit db01ca
                     rdr = oh_get_rdr_next(new_rpt, res->ResourceId, rdr->RecordId)) {
Packit db01ca
Packit db01ca
                        SaHpiRdrT *tmp_rdr = NULL;
Packit db01ca
Packit db01ca
                        if (tmp_res != NULL)
Packit db01ca
                                tmp_rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, rdr->RecordId);
Packit db01ca
Packit db01ca
                        if (tmp_rdr == NULL || memcmp(rdr, tmp_rdr, sizeof(SaHpiRdrT)))
Packit db01ca
                                *rdr_new = g_slist_append(*rdr_new, (gpointer)rdr);
Packit db01ca
Packit db01ca
                }
Packit db01ca
        }
Packit db01ca
        
Packit db01ca
        return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_rpt_info
Packit db01ca
 * @table: pointer to RPT
Packit db01ca
 * @update_count: pointer of where to place the rpt's update count
Packit db01ca
 * @update_timestamp: pointer of where to place the rpt's update timestamp
Packit db01ca
 *
Packit db01ca
 * Returns: SA_OK on success Or minus SA_OK on error.
Packit db01ca
 **/
Packit db01ca
SaErrorT oh_get_rpt_info(RPTable *table,
Packit db01ca
                         SaHpiUint32T *update_count,
Packit db01ca
                         SaHpiTimeT *update_timestamp)
Packit db01ca
{
Packit db01ca
        if (!table || !update_count || !update_timestamp) {
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        *update_count = table->update_count;
Packit db01ca
        *update_timestamp = table->update_timestamp;
Packit db01ca
Packit db01ca
        return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * Resource interface functions
Packit db01ca
 */
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_add_resource
Packit db01ca
 * @table: Pointer to the RPT to which the RPT entry will be added.
Packit db01ca
 * @entry: The RPT entry (resource) to be added to the RPT.
Packit db01ca
 * @data: Pointer to private data for storing along with the RPT entry.
Packit db01ca
 * @owndata: boolean flag. true (%KEEP_RPT_DATA) to tell the interface *not*
Packit db01ca
 * to free the data when the resource is removed. false (%FREE_RPT_DATA) to tell
Packit db01ca
 * the interface to free the data when the resource is removed.
Packit db01ca
 *
Packit db01ca
 * Add a RPT entry to the RPT along with some private data.
Packit db01ca
 * If an RPT entry with the same resource id exists int the RPT, it will be
Packit db01ca
 * overlayed with the new RPT entry. Also, this function will assign the
Packit db01ca
 * resource id as its entry id since it is expected to be unique for the table.
Packit db01ca
 * The update count and timestamp will not be updated if the entry being added
Packit db01ca
 * already existed in the table and was the same.
Packit db01ca
 *
Packit db01ca
 * Returns: SA_OK on success Or minus SA_OK on error. SA_ERR_HPI_INVALID_PARAMS will
Packit db01ca
 * be returned if @table is NULL, @entry is NULL, ResourceId in @entry equals
Packit db01ca
 * SAHPI_FIRST_ENTRY, ResourceId in @entry equals SAHPI_UNSPECIFIED_RESOURCE_ID,
Packit db01ca
 * or ResourceEntity in @entry has a malformed entity path (look at the
Packit db01ca
 * entity path utils documentation).
Packit db01ca
 **/
Packit db01ca
SaErrorT oh_add_resource(RPTable *table, SaHpiRptEntryT *entry, void *data, int owndata)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry;
Packit db01ca
        int update_info = 0;
Packit db01ca
Packit db01ca
        if (!table) {
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        } else if (!entry) {
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        } else if (entry->ResourceId == SAHPI_FIRST_ENTRY) {
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        } else if (entry->ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) {
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        } else if (!oh_valid_ep(&(entry->ResourceEntity))) {
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        entry->EntryId = entry->ResourceId;
Packit db01ca
        /* Check to see if the entry is in the RPTable already */
Packit db01ca
        rptentry = get_rptentry_by_rid(table, entry->ResourceId);
Packit db01ca
        /* If not, create new RPTEntry */
Packit db01ca
        if (!rptentry) {
Packit db01ca
                rptentry = g_new0(RPTEntry, 1);
Packit db01ca
                if (!rptentry) {
Packit db01ca
                        return SA_ERR_HPI_OUT_OF_MEMORY;
Packit db01ca
                }
Packit db01ca
                update_info = 1; /* Have a new changed entry */
Packit db01ca
                /* Put new RPTEntry in RPTable */
Packit db01ca
                table->rptlist = g_slist_append(table->rptlist, (gpointer)rptentry);
Packit db01ca
Packit db01ca
                /* Add to rpt hash table */
Packit db01ca
                if (!table->rptable) /* Create hash table if it doesn't exist */
Packit db01ca
                        table->rptable = g_hash_table_new(g_int_hash, g_int_equal);
Packit db01ca
Packit db01ca
                rptentry->rpt_entry.EntryId = entry->ResourceId;
Packit db01ca
                g_hash_table_insert(table->rptable,
Packit db01ca
                                    &(rptentry->rpt_entry.EntryId),
Packit db01ca
                                    g_slist_last(table->rptlist));
Packit db01ca
        }
Packit db01ca
        /* Else, modify existing RPTEntry */
Packit db01ca
        if (rptentry->data && rptentry->data != data && !rptentry->owndata)
Packit db01ca
                g_free(rptentry->data);
Packit db01ca
        rptentry->data = data;
Packit db01ca
        rptentry->owndata = owndata;
Packit db01ca
        /* Check if we really have a new/changed entry */
Packit db01ca
        if (update_info || memcmp(entry, &(rptentry->rpt_entry), sizeof(SaHpiRptEntryT))) {
Packit db01ca
                update_info = 1;
Packit db01ca
                rptentry->rpt_entry = *entry;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (update_info) update_rptable(table);
Packit db01ca
Packit db01ca
        return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_remove_resource
Packit db01ca
 * @table: Pointer to the RPT from which an RPT entry will be removed.
Packit db01ca
 * @rid: Resource id of the RPT entry to be removed.
Packit db01ca
 *
Packit db01ca
 * Remove a resource from the RPT. If the @rid is
Packit db01ca
 * %SAHPI_FIRST_ENTRY, the first RPT entry in the table will be removed.
Packit db01ca
 * The void data will be freed if @owndata was false (%FREE_RPT_DATA) when adding
Packit db01ca
 * the resource, otherwise if @owndata was true (%KEEP_RPT_DATA) it will not be freed.
Packit db01ca
 *
Packit db01ca
 * Returns: SA_OK on success Or minus SA_OK on error.
Packit db01ca
 **/
Packit db01ca
SaErrorT oh_remove_resource(RPTable *table, SaHpiResourceIdT rid)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return SA_ERR_HPI_NOT_PRESENT;
Packit db01ca
        } else {
Packit db01ca
                SaHpiRdrT *tmp_rdr;
Packit db01ca
                /* Remove all RDRs for the resource first */
Packit db01ca
                while ((tmp_rdr = oh_get_rdr_by_id(table, rid, SAHPI_FIRST_ENTRY)) != NULL) {
Packit db01ca
                        oh_remove_rdr(table, rid, SAHPI_FIRST_ENTRY);
Packit db01ca
                }
Packit db01ca
                /* then remove the resource itself. */
Packit db01ca
                table->rptlist = g_slist_remove(table->rptlist, (gpointer)rptentry);
Packit db01ca
                if (!rptentry->owndata) g_free(rptentry->data);
Packit db01ca
                g_hash_table_remove(table->rptable, &(rptentry->rpt_entry.EntryId));
Packit db01ca
                g_free((gpointer)rptentry);
Packit db01ca
                if (!table->rptlist) {
Packit db01ca
                        g_hash_table_destroy(table->rptable);
Packit db01ca
                        table->rptable = NULL;
Packit db01ca
                }
Packit db01ca
        }
Packit db01ca
Packit db01ca
        update_rptable(table);
Packit db01ca
Packit db01ca
        return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_resource_data
Packit db01ca
 * @table: Pointer to the RPT for looking up the RPT entry's private data.
Packit db01ca
 * @rid: Resource id of the RPT entry that holds the private data.
Packit db01ca
 *
Packit db01ca
 * Get the private data for a RPT entry.  If the @rid is
Packit db01ca
 * %SAHPI_FIRST_ENTRY, the first RPT entry's data in the table will be returned.
Packit db01ca
 *
Packit db01ca
 * Returns: A void pointer to the private data for the RPT entry requested, or NULL
Packit db01ca
 * if the RPT entry was not found or the table was a NULL pointer.
Packit db01ca
 **/
Packit db01ca
void *oh_get_resource_data(RPTable *table, SaHpiResourceIdT rid)
Packit db01ca
{
Packit db01ca
Packit db01ca
        RPTEntry *rptentry;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                /*DBG("Warning: RPT entry not found. Returning NULL.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return rptentry->data;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_resource_by_id
Packit db01ca
 * @table: Pointer to the RPT for looking up the RPT entry.
Packit db01ca
 * @rid: Resource id of the RPT entry to be looked up.
Packit db01ca
 *
Packit db01ca
 * Get a RPT entry from the RPT by using the resource id.
Packit db01ca
 * If @rid is %SAHPI_FIRST_ENTRY, the first RPT entry in the table will be returned.
Packit db01ca
 *
Packit db01ca
 * Returns:
Packit db01ca
 * Pointer to the RPT entry found or NULL if an RPT entry by that
Packit db01ca
 * id was not found or the table was a NULL pointer.
Packit db01ca
 **/
Packit db01ca
SaHpiRptEntryT *oh_get_resource_by_id(RPTable *table, SaHpiResourceIdT rid)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                /*DBG("Warning: RPT entry not found. Returning NULL.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return &(rptentry->rpt_entry);
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_resource_by_ep
Packit db01ca
 * @table: Pointer to the RPT for looking up the RPT entry.
Packit db01ca
 * @ep: Entity path of the RPT entry to be looked up.
Packit db01ca
 *
Packit db01ca
 * Get a RPT entry from the RPT by using the entity path.
Packit db01ca
 *
Packit db01ca
 * Returns:
Packit db01ca
 * Pointer to the RPT entry found or NULL if an RPT entry by that
Packit db01ca
 * entity path was not found or the table was a NULL pointer.
Packit db01ca
 **/
Packit db01ca
SaHpiRptEntryT *oh_get_resource_by_ep(RPTable *table, SaHpiEntityPathT *ep)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry = NULL;
Packit db01ca
        GSList *node = NULL;
Packit db01ca
        SaHpiResourceIdT rid = 0;
Packit db01ca
Packit db01ca
        if (!table) {
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
        /* Check the uid database first */
Packit db01ca
        rid = oh_uid_is_initialized() ? oh_uid_lookup(ep) : 0;
Packit db01ca
        if (rid > 0) {
Packit db01ca
                /* Found it in uid database */
Packit db01ca
                return oh_get_resource_by_id(table, rid);
Packit db01ca
        } else {
Packit db01ca
                DBG("Didn't find the EP in the Uid table so "
Packit db01ca
                    "looking manually in the RPTable");
Packit db01ca
        }
Packit db01ca
Packit db01ca
        for (node = table->rptlist; node != NULL; node = node->next) {
Packit db01ca
                rptentry = (RPTEntry *) node->data;
Packit db01ca
                if (oh_cmp_ep(&(rptentry->rpt_entry.ResourceEntity), ep))
Packit db01ca
                        break;
Packit db01ca
                else rptentry = NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (!rptentry) {
Packit db01ca
                /*DBG("Warning: RPT entry not found. Returning NULL.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return &(rptentry->rpt_entry);
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_resource_next
Packit db01ca
 * @table: Pointer to the RPT for looking up the RPT entry.
Packit db01ca
 * @rid_prev: Resource id of the RPT entry previous to the one being looked up.
Packit db01ca
 *
Packit db01ca
 * Get the RPT entry next to the specified RPT entry
Packit db01ca
 * from the RPT. If @rid_prev is %SAHPI_FIRST_ENTRY, the first RPT entry
Packit db01ca
 * in the table will be returned.
Packit db01ca
 *
Packit db01ca
 * Returns:
Packit db01ca
 * Pointer to the RPT entry found or NULL if the previous RPT entry by that
Packit db01ca
 * id was not found or the table was a NULL pointer.
Packit db01ca
 **/
Packit db01ca
SaHpiRptEntryT *oh_get_resource_next(RPTable *table, SaHpiResourceIdT rid_prev)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry = NULL;
Packit db01ca
        GSList *rptnode = NULL;
Packit db01ca
Packit db01ca
        if (rid_prev == SAHPI_FIRST_ENTRY) {
Packit db01ca
                rptentry = get_rptentry_by_rid(table, rid_prev);
Packit db01ca
        } else {
Packit db01ca
                rptnode = get_rptnode_by_rid(table, rid_prev);
Packit db01ca
                if (rptnode && rptnode->next) {
Packit db01ca
                        rptentry = (RPTEntry *)rptnode->next->data;
Packit db01ca
                }
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return rptentry ? &(rptentry->rpt_entry) : NULL;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_rdr_update_count
Packit db01ca
 * @table: Pointer to the RPT for looking up the RPT entry.
Packit db01ca
 * @rid: Resource id of the RPT entry to be looked up.
Packit db01ca
 * @update_count: pointer of where to place the rdr update count
Packit db01ca
 *
Packit db01ca
 * Get a RDR Repository Update Counter for the resource using the resource id.
Packit db01ca
 *
Packit db01ca
 * Returns:
Packit db01ca
 * Returns: SA_OK on success.
Packit db01ca
 * Will return SA_ERR_HPI_INVALID_PARAMS if update_count is NULL.
Packit db01ca
 * Will return SA_ERR_HPI_NOT_PRESENT if there is no resource
Packit db01ca
 * with specified rid in RPT.
Packit db01ca
 **/
Packit db01ca
SaErrorT oh_get_rdr_update_count(RPTable *table,
Packit db01ca
                                 SaHpiResourceIdT rid,
Packit db01ca
                                 SaHpiUint32T *update_count)
Packit db01ca
{
Packit db01ca
    RPTEntry *rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
    if ( !rptentry ) {
Packit db01ca
        return SA_ERR_HPI_NOT_PRESENT;
Packit db01ca
    }
Packit db01ca
    if ( !update_count ) {
Packit db01ca
        return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
    }
Packit db01ca
    *update_count = rptentry->update_count;
Packit db01ca
    return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * RDR interface functions
Packit db01ca
 */
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_add_rdr
Packit db01ca
 * @table: Pointer to RPT table containig the RPT entry to which the RDR will belong.
Packit db01ca
 * @rid: Id of the RPT entry that will own the RDR to be added.
Packit db01ca
 * @rdr: RDR to be added to an RPT entry's RDR repository.
Packit db01ca
 * @data: Pointer to private data belonging to the RDR that is being added.
Packit db01ca
 * @owndata: boolean flag. true (%KEEP_RPT_DATA) to tell the interface *not*
Packit db01ca
 * to free the data when the rdr is removed. false (%FREE_RPT_DATA) to tell
Packit db01ca
 * the interface to free the data when the rdr is removed.
Packit db01ca
 *
Packit db01ca
 * Add an RDR to a RPT entry's RDR repository.
Packit db01ca
 * If an RDR is found with the same record id as the one being added, the RDR being
Packit db01ca
 * added will overlay the existing one. Also, a unique record id will be assigned
Packit db01ca
 * to it based on the RDR type and its type's numeric id.
Packit db01ca
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
Packit db01ca
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
Packit db01ca
 *
Packit db01ca
 * Returns: SA_OK on success Or minus SA_OK on error. Will return
Packit db01ca
 * SA_ERR_HPI_INVALID_PARAMS if instrument id is invalid. An invalid
Packit db01ca
 * intrument id for a sensor is in the range of 0x100-0x1FF. An aggregate type
Packit db01ca
 * of sensor can have its instrument id in the range of 0x100-0x10F, but
Packit db01ca
 * the resource must have the aggregate sensor capabilitiy bit set.
Packit db01ca
 **/
Packit db01ca
SaErrorT oh_add_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrT *rdr, void *data, int owndata)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry;
Packit db01ca
        RDRecord *rdrecord;
Packit db01ca
        SaHpiInstrumentIdT instr_id;
Packit db01ca
Packit db01ca
        if (!rdr) {
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry){
Packit db01ca
                return SA_ERR_HPI_NOT_PRESENT;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (check_instrument_id(&(rptentry->rpt_entry), rdr)) {
Packit db01ca
                CRIT("Invalid instrument id found in RDR.");
Packit db01ca
                return SA_ERR_HPI_INVALID_PARAMS;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        instr_id = oh_get_instrument_id(rdr);
Packit db01ca
Packit db01ca
        /* Form correct RecordId. */
Packit db01ca
        rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, instr_id);
Packit db01ca
        /* Check if record exists */
Packit db01ca
        rdrecord = get_rdrecord_by_id(rptentry, rdr->RecordId);
Packit db01ca
        /* If not, create new rdr */
Packit db01ca
        if (!rdrecord) {
Packit db01ca
                rdrecord = g_new0(RDRecord, 1);
Packit db01ca
                if (!rdrecord) {
Packit db01ca
                        return SA_ERR_HPI_OUT_OF_MEMORY;
Packit db01ca
                }
Packit db01ca
                /* Put new rdrecord in rdr repository */
Packit db01ca
                rptentry->rdrlist = g_slist_append(rptentry->rdrlist, (gpointer)rdrecord);
Packit db01ca
                /* Create rdr hash table if first rdr here */
Packit db01ca
                if (!rptentry->rdrtable)
Packit db01ca
                        rptentry->rdrtable = g_hash_table_new(g_int_hash, g_int_equal);
Packit db01ca
Packit db01ca
                rdrecord->rdr.RecordId = rdr->RecordId;
Packit db01ca
                g_hash_table_insert(rptentry->rdrtable,
Packit db01ca
                                    &(rdrecord->rdr.RecordId),
Packit db01ca
                                    g_slist_last(rptentry->rdrlist));
Packit db01ca
        }
Packit db01ca
        /* Else, modify existing rdrecord */
Packit db01ca
        if (rdrecord->data && rdrecord->data != data && !rdrecord->owndata)
Packit db01ca
                g_free(rdrecord->data);
Packit db01ca
        rdrecord->data = data;
Packit db01ca
        rdrecord->owndata = owndata;
Packit db01ca
        rdrecord->rdr = *rdr;
Packit db01ca
Packit db01ca
        ++rptentry->update_count;
Packit db01ca
Packit db01ca
        return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_remove_rdr
Packit db01ca
 * @table: Pointer to RPT table containig the RPT entry from which the RDR will
Packit db01ca
 * be removed.
Packit db01ca
 * @rid: Id of the RPT entry from which the RDR will be removed.
Packit db01ca
 * @rdrid: Record id of the RDR to remove.
Packit db01ca
 *
Packit db01ca
 *
Packit db01ca
 * Remove an RDR from a RPT entry's RDR repository.
Packit db01ca
 * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR in the repository will be removed.
Packit db01ca
 * If @owndata was set to false (%FREE_RPT_DATA) on the rdr when it was added,
Packit db01ca
 * the data will be freed, otherwise if it was set to true (%KEEP_RPT_DATA),
Packit db01ca
 * it will not be freed.
Packit db01ca
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
Packit db01ca
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
Packit db01ca
 *
Packit db01ca
 * Returns: SA_OK on success Or minus SA_OK on error.
Packit db01ca
 **/
Packit db01ca
SaErrorT oh_remove_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry;
Packit db01ca
        RDRecord *rdrecord;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return SA_ERR_HPI_NOT_PRESENT;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        rdrecord = get_rdrecord_by_id(rptentry, rdrid);
Packit db01ca
        if (!rdrecord) {
Packit db01ca
                return SA_ERR_HPI_NOT_PRESENT;
Packit db01ca
        } else {
Packit db01ca
                rptentry->rdrlist = g_slist_remove(rptentry->rdrlist, (gpointer)rdrecord);
Packit db01ca
                if (!rdrecord->owndata) g_free(rdrecord->data);
Packit db01ca
                g_hash_table_remove(rptentry->rdrtable, &(rdrecord->rdr.RecordId));
Packit db01ca
                g_free((gpointer)rdrecord);
Packit db01ca
                if (!rptentry->rdrlist) {
Packit db01ca
                        g_hash_table_destroy(rptentry->rdrtable);
Packit db01ca
                        rptentry->rdrtable = NULL;
Packit db01ca
                }
Packit db01ca
                ++rptentry->update_count;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return SA_OK;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_rdr_data
Packit db01ca
 * @table: Pointer to RPT table containig the RPT entry from which the RDR's data
Packit db01ca
 * will be read.
Packit db01ca
 * @rid: Id of the RPT entry from which the RDR's data will be read.
Packit db01ca
 * @rdrid: Record id of the RDR to read data from.
Packit db01ca
 *
Packit db01ca
 *
Packit db01ca
 * Get the private data associated to an RDR.
Packit db01ca
 * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR's data in the repository will be returned.
Packit db01ca
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
Packit db01ca
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
Packit db01ca
 *
Packit db01ca
 * Returns: A void pointer to the RDR data, or NULL if no data for that RDR was found or
Packit db01ca
 * the table pointer is NULL.
Packit db01ca
 **/
Packit db01ca
void *oh_get_rdr_data(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry;
Packit db01ca
        RDRecord *rdrecord;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return NULL; /* No resource found by that id */
Packit db01ca
        }
Packit db01ca
Packit db01ca
        rdrecord = get_rdrecord_by_id(rptentry, rdrid);
Packit db01ca
        if (!rdrecord) {
Packit db01ca
                /*DBG("Warning: RDR not found. Returning NULL.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return rdrecord->data;
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_rdr_by_id
Packit db01ca
 * @table: Pointer to RPT table containig the RPT entry tha has the RDR
Packit db01ca
 * being looked up.
Packit db01ca
 * @rid: Id of the RPT entry containing the RDR being looked up.
Packit db01ca
 * @rdrid: Record id of the RDR being looked up.
Packit db01ca
 *
Packit db01ca
 * Get a reference to an RDR by its record id.
Packit db01ca
 * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR in the repository will be returned.
Packit db01ca
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
Packit db01ca
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
Packit db01ca
 *
Packit db01ca
 * Returns:
Packit db01ca
 * Reference to the RDR looked up or NULL if no RDR was found.
Packit db01ca
 **/
Packit db01ca
SaHpiRdrT *oh_get_rdr_by_id(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry;
Packit db01ca
        RDRecord *rdrecord;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return NULL; /* No resource found by that id */
Packit db01ca
        }
Packit db01ca
Packit db01ca
        rdrecord = get_rdrecord_by_id(rptentry, rdrid);
Packit db01ca
        if (!rdrecord) {
Packit db01ca
                /*DBG("Warning: RDR not found. Returning NULL.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return &(rdrecord->rdr);
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_rdr_by_type
Packit db01ca
 * @table: Pointer to RPT table containig the RPT entry tha has the RDR
Packit db01ca
 * being looked up.
Packit db01ca
 * @rid: Id of the RPT entry containing the RDR being looked up.
Packit db01ca
 * @type: RDR Type of the RDR being looked up.
Packit db01ca
 * @num: RDR id within the RDR type for the specified RPT entry.
Packit db01ca
 *
Packit db01ca
 * Get a reference to an RDR by its type and number.
Packit db01ca
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
Packit db01ca
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
Packit db01ca
 *
Packit db01ca
 * Returns:
Packit db01ca
 * Reference to the RDR looked up or NULL if no RDR was found.
Packit db01ca
 **/
Packit db01ca
SaHpiRdrT *oh_get_rdr_by_type(RPTable *table, SaHpiResourceIdT rid,
Packit db01ca
                              SaHpiRdrTypeT type, SaHpiInstrumentIdT num)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry = NULL;
Packit db01ca
        RDRecord *rdrecord = NULL;
Packit db01ca
        SaHpiEntryIdT rdr_uid;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return NULL; /* No resource found by that id */
Packit db01ca
        }
Packit db01ca
        
Packit db01ca
        /* Get rdr_uid from type/num combination */
Packit db01ca
        rdr_uid = oh_get_rdr_uid(type, num);
Packit db01ca
        rdrecord = get_rdrecord_by_id(rptentry, rdr_uid);
Packit db01ca
        if (!rdrecord) {
Packit db01ca
                /*DBG("Warning: RDR not found. Returning NULL.");*/
Packit db01ca
                return NULL;
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return &(rdrecord->rdr);        
Packit db01ca
}
Packit db01ca
Packit db01ca
/**
Packit db01ca
 * oh_get_rdr_next
Packit db01ca
 * @table: Pointer to the RPT containing the RPT entry to look up the RDR in.
Packit db01ca
 * @rid: Id of the RPT entry containing the RDR being looked up.
Packit db01ca
 * @rdrid_prev: Record id of the RDR previous to the one being looked up, relative
Packit db01ca
 * to the specified RPT entry.
Packit db01ca
 *
Packit db01ca
 * Get the RDR next to the specified RDR in the specified
Packit db01ca
 * RPT entry's repository. If @rdrid_prev is %SAHPI_FIRST_ENTRY, the first RDR
Packit db01ca
 * in the repository will be returned.
Packit db01ca
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
Packit db01ca
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
Packit db01ca
 *
Packit db01ca
 * Returns:
Packit db01ca
 * Pointer to the RDR found or NULL if the previous RDR by that
Packit db01ca
 * id was not found. If the @rdrid_prev was %SAHPI_FIRST_ENTRY, the first RDR in the list
Packit db01ca
 * will be returned.
Packit db01ca
 **/
Packit db01ca
SaHpiRdrT *oh_get_rdr_next(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid_prev)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry = NULL;
Packit db01ca
        RDRecord *rdrecord = NULL;
Packit db01ca
        GSList *rdrnode = NULL;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return NULL; /* No resource found by that id */
Packit db01ca
        }
Packit db01ca
Packit db01ca
        if (rdrid_prev == SAHPI_FIRST_ENTRY) {
Packit db01ca
                rdrecord = get_rdrecord_by_id(rptentry, rdrid_prev);
Packit db01ca
        } else {
Packit db01ca
                rdrnode = get_rdrnode_by_id(rptentry, rdrid_prev);
Packit db01ca
                if (rdrnode && rdrnode->next) {
Packit db01ca
                        rdrecord = (RDRecord *)rdrnode->next->data;
Packit db01ca
                }
Packit db01ca
        }
Packit db01ca
Packit db01ca
        return rdrecord ? &(rdrecord->rdr) : NULL;
Packit db01ca
}
Packit db01ca
Packit db01ca
SaHpiRdrT *oh_get_rdr_by_type_first(RPTable *table, SaHpiResourceIdT rid,
Packit db01ca
                                    SaHpiRdrTypeT type)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry = NULL;
Packit db01ca
        RDRecord *rdrecord = NULL;
Packit db01ca
        GSList *node = NULL;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return NULL; /* No resource found by that id */
Packit db01ca
        }
Packit db01ca
        
Packit db01ca
        /* Get first RDR matching the type */
Packit db01ca
        for (node = rptentry->rdrlist; node; node = node->next) {
Packit db01ca
                RDRecord *temp = (RDRecord *)node->data;
Packit db01ca
                if (temp->rdr.RdrType == type) {
Packit db01ca
                        rdrecord = temp;
Packit db01ca
                        break;
Packit db01ca
                }
Packit db01ca
        }                
Packit db01ca
        if (!rdrecord) return NULL;
Packit db01ca
Packit db01ca
        return &(rdrecord->rdr);
Packit db01ca
}
Packit db01ca
Packit db01ca
SaHpiRdrT *oh_get_rdr_by_type_next(RPTable *table, SaHpiResourceIdT rid,
Packit db01ca
                                   SaHpiRdrTypeT type, SaHpiInstrumentIdT num)
Packit db01ca
{
Packit db01ca
        RPTEntry *rptentry = NULL;
Packit db01ca
        RDRecord *rdrecord = NULL;
Packit db01ca
        GSList *node = NULL;
Packit db01ca
Packit db01ca
        rptentry = get_rptentry_by_rid(table, rid);
Packit db01ca
        if (!rptentry) {
Packit db01ca
                return NULL; /* No resource found by that id */
Packit db01ca
        }
Packit db01ca
        
Packit db01ca
        /* Get rdr_uid from type/num combination */
Packit db01ca
        node = get_rdrnode_by_id(rptentry, oh_get_rdr_uid(type, num));
Packit db01ca
        if (!node) return NULL;
Packit db01ca
        
Packit db01ca
        for (node = node->next; node; node = node->next) {
Packit db01ca
                RDRecord *temp = (RDRecord *)node->data;
Packit db01ca
                if (temp->rdr.RdrType == type) {
Packit db01ca
                        rdrecord = temp;
Packit db01ca
                        break;
Packit db01ca
                }
Packit db01ca
        }
Packit db01ca
        if (!rdrecord) return NULL;
Packit db01ca
Packit db01ca
        return &(rdrecord->rdr);
Packit db01ca
}