|
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 |
}
|