GCOV Execution Analysis for rpt_utils.c

The left column is the number of times the code was executed during the unit test suites.

Exec CodeLine #
 
Source:rpt_utils.c
1
 
Object:t/rpt/rpt_utils.bb
2
 
/*      -*- linux-c -*-
3
 
 *
4
 
 * (C) Copyright IBM Corp. 2003, 2005
5
 
 *
6
 
 * This program is distributed in the hope that it will be useful,
7
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  This
9
 
 * file and program are licensed under a BSD style license.  See
10
 
 * the Copying file included with the OpenHPI distribution for
11
 
 * full licensing terms.
12
 
 *
13
 
 * Author(s):
14
 
 *      Renier Morales < address removed >
15
 
 */
16
 
17
 
#include <string.h>
18
 
#include <sys/time.h>
19
 
20
 
#include <oh_utils.h>
21
 
22
 
static RPTEntry *get_rptentry_by_rid(RPTable *table, SaHpiResourceIdT rid)
23
10654 
{
24
10654 
        RPTEntry *rptentry = NULL;
25
 
26
10654 
        if (!table) {
27
0 
                dbg("ERROR: Cannot work on a null table pointer.");
28
0 
                return NULL;
29
 
        }
30
 
31
10654 
        if (!(table->rptlist)) {
32
 
                /*dbg("Info: RPT is empty.");*/
33
80 
                return NULL;
34
 
        }
35
 
36
10574 
        if (rid == SAHPI_FIRST_ENTRY) {
37
123 
                rptentry = (RPTEntry *) (table->rptlist->data);
38
 
        } else {
39
10451 
                rptentry = (RPTEntry *)g_hash_table_lookup(table->rptable, &rid);
40
 
        }
41
 
42
10574 
        return rptentry;
43
 
}
44
 
45
 
static RDRecord *get_rdrecord_by_id(RPTEntry *rptentry, SaHpiEntryIdT id)
46
212 
{
47
212 
        RDRecord *rdrecord = NULL;
48
 
49
212 
        if (!rptentry) {
50
0 
                dbg("ERROR: Cannot lookup rdr inside null resource.");
51
0 
                return NULL;
52
 
        }
53
 
54
212 
        if (!rptentry->rdrlist) {
55
 
                /*dbg("Info: RDR repository is empty.");*/
56
52 
                return NULL;
57
 
        }
58
 
59
160 
        if (id == SAHPI_FIRST_ENTRY) {
60
49 
                rdrecord = (RDRecord *) (rptentry->rdrlist->data);
61
 
        } else {
62
111 
                rdrecord = (RDRecord *)g_hash_table_lookup(rptentry->rdrtable, &id);
63
 
        }
64
 
65
160 
        return rdrecord;
66
 
}
67
 
68
 
static int check_instrument_id(SaHpiRptEntryT *rptentry, SaHpiRdrT *rdr)
69
131 
{
70
131 
        int result = 0;
71
131 
        static const SaHpiInstrumentIdT SENSOR_AGGREGATE_MAX = 0x0000010F;
72
 
        
73
131 
        switch (rdr->RdrType) {
74
 
                case SAHPI_SENSOR_RDR:
75
131 
                        if (rdr->RdrTypeUnion.SensorRec.Num >= SAHPI_STANDARD_SENSOR_MIN &&
76
 
                            rdr->RdrTypeUnion.SensorRec.Num <= SAHPI_STANDARD_SENSOR_MAX) {
77
2 
                                if (rdr->RdrTypeUnion.SensorRec.Num > SENSOR_AGGREGATE_MAX) {
78
1 
                                        result = -1;
79
1 
                                } else if (rptentry->ResourceCapabilities &
80
 
                                           SAHPI_CAPABILITY_AGGREGATE_STATUS) {
81
0 
                                        result = 0;                                        
82
 
                                } else {
83
1 
                                        result = -1;
84
 
                                }
85
 
                        } else {
86
129 
                                result = 0;
87
 
                        }
88
129 
                        break;
89
 
                default:
90
0 
                        result = 0;
91
 
        }
92
 
        
93
131 
        return result;
94
 
}
95
 
96
 
static SaHpiInstrumentIdT get_rdr_type_num(SaHpiRdrT *rdr)
97
129 
{
98
129 
        SaHpiInstrumentIdT num = 0;
99
 
100
129 
        switch (rdr->RdrType) {
101
 
                case SAHPI_CTRL_RDR:
102
0 
                        num = rdr->RdrTypeUnion.CtrlRec.Num;
103
0 
                        break;
104
 
                case SAHPI_SENSOR_RDR:
105
129 
                        num = rdr->RdrTypeUnion.SensorRec.Num;
106
129 
                        break;
107
 
                case SAHPI_INVENTORY_RDR:
108
0 
                        num = rdr->RdrTypeUnion.InventoryRec.IdrId;
109
0 
                        break;
110
 
                case SAHPI_WATCHDOG_RDR:
111
0 
                        num = rdr->RdrTypeUnion.WatchdogRec.WatchdogNum;
112
0 
                        break;
113
 
                case SAHPI_ANNUNCIATOR_RDR:
114
0 
                        num = rdr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum;
115
0 
                        break;
116
 
                default:
117
0 
                        num = 0;
118
 
        }
119
 
120
129 
        return num;
121
 
}
122
 
123
10375 
static void update_rptable(RPTable *table) {
124
10375 
        struct timeval tv;
125
10375 
        SaHpiTimeT time;
126
 
127
10375 
        if (!table) {
128
0 
                dbg("ERROR: Cannot work on a null table pointer.");
129
0 
                return;
130
 
        }
131
 
132
10375 
        gettimeofday(&tv, NULL);
133
10375 
        time = (SaHpiTimeT) tv.tv_sec * 1000000000 + tv.tv_usec * 1000;
134
 
135
10375 
        table->update_timestamp = time;
136
10375 
        table->update_count++;
137
 
}
138
 
139
 
/**
140
 
 * get_rdr_uid
141
 
 * @type: type of rdr
142
 
 * @num: id number of the RDR unique withing the RDR type for that resource
143
 
 *
144
 
 * Helper function to derive the Record id of an rdr from its @type and @num
145
 
 *
146
 
 * Returns: a derived Record Id used to identify RDRs within Resources
147
 
 */
148
 
SaHpiEntryIdT get_rdr_uid(SaHpiRdrTypeT type, SaHpiInstrumentIdT num)
149
148 
{
150
148 
        SaHpiEntryIdT uid;
151
 
152
148 
        uid = ((SaHpiEntryIdT)type) << 16;
153
148 
        uid = uid + (SaHpiEntryIdT)num;
154
 
155
148 
        return uid;
156
 
}
157
 
158
 
/**
159
 
 * General RPT calls
160
 
 **/
161
 
162
 
/**
163
 
 * oh_init_rpt
164
 
 * @table: Pointer to RPTable structure to be initialized.
165
 
 *
166
 
 *
167
 
 * Returns: SA_OK on success Or minus SA_OK on error.
168
 
 **/
169
 
SaErrorT oh_init_rpt(RPTable *table)
170
82 
{
171
82 
        if (!table) {
172
1 
                dbg("ERROR: Cannot work on a null table pointer.");
173
1 
                return SA_ERR_HPI_INVALID_PARAMS;
174
 
        }
175
 
176
81 
        table->update_timestamp = SAHPI_TIME_UNSPECIFIED;
177
81 
        table->update_count = 0;
178
81 
        table->rptlist = NULL;
179
81 
        table->rptable = NULL;        
180
 
181
81 
        return SA_OK;
182
 
}
183
 
 
184
 
/**
185
 
 * oh_flush_rpt
186
 
 * @table: Pointer to the RPT to flush.
187
 
 *
188
 
 * Cleans RPT from all entries and RDRs and frees the memory
189
 
 * associated with them.
190
 
 *
191
 
 * Returns: SA_OK on success Or minus SA_OK on error.
192
 
 **/
193
 
SaErrorT oh_flush_rpt(RPTable *table)
194
2 
{
195
2 
        SaHpiRptEntryT *tmp_entry;
196
 
197
2 
        if (!table) {
198
1 
                dbg("ERROR: Cannot work on a null table pointer.");
199
1 
                return SA_ERR_HPI_INVALID_PARAMS;
200
 
        }
201
 
202
11 
        while ((tmp_entry = oh_get_resource_by_id(table, SAHPI_FIRST_ENTRY)) != NULL) {
203
10 
                oh_remove_resource(table, SAHPI_FIRST_ENTRY);
204
 
        }
205
 
206
1 
        return SA_OK;
207
 
}
208
 
209
 
/**
210
 
 * rpt_diff
211
 
 * @cur_rpt: IN. Pointer to RPTable that represents the current state of resources
212
 
 * and rdrs.
213
 
 * @new_rpt: IN. Pointer to RPTable that contains rpt entries and rdrs just recently
214
 
 * discovered.
215
 
 * @res_new: OUT. List of new or changed rpt entries
216
 
 * @rdr_new: OUT. List of new or changed rdrs
217
 
 * @res_gone: OUT. List of old and not present resources.
218
 
 * @rdr_gone: OUT. List of old and not present rdrs.
219
 
 *
220
 
 * Extracts from current the resources and rdrs that are not found
221
 
 * in new and puts them in res_gone and rdr_gone. Also, puts in res_new and rdr_new
222
 
 * the resources and rdrs that are not already in current Or that are not identical
223
 
 * to the ones in current.
224
 
 *
225
 
 * Returns: void.
226
 
 **/
227
 
void rpt_diff(RPTable *cur_rpt, RPTable *new_rpt,
228
 
              GSList **res_new, GSList **rdr_new,
229
6 
              GSList **res_gone, GSList **rdr_gone) {
230
 
231
6 
        SaHpiRptEntryT *res = NULL;
232
 
233
6 
	if (!cur_rpt || !new_rpt ||
234
1 
            !res_new || !rdr_new || !res_gone || !rdr_gone) return;
235
 
236
 
        /* Look for absent resources and rdrs */
237
0 
        for (res = oh_get_resource_by_id(cur_rpt, SAHPI_FIRST_ENTRY);
238
 
             res != NULL;
239
 
             res = oh_get_resource_next(cur_rpt, res->ResourceId)) {
240
 
241
0 
                SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(new_rpt, res->ResourceId);
242
 
243
0 
                if (tmp_res == NULL) *res_gone = g_slist_append(*res_gone, (gpointer)res);
244
 
                else {
245
0 
                        SaHpiRdrT *rdr = NULL;
246
 
247
0 
                        for (rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, SAHPI_FIRST_ENTRY);
248
 
                             rdr != NULL;
249
 
                             rdr = oh_get_rdr_next(cur_rpt, res->ResourceId, rdr->RecordId)) {
250
 
251
0 
                                SaHpiRdrT *tmp_rdr =
252
0 
                                        oh_get_rdr_by_id(new_rpt, res->ResourceId, rdr->RecordId);
253
 
254
0 
                                if (tmp_rdr == NULL)
255
0 
                                        *rdr_gone = g_slist_append(*rdr_gone, (gpointer)rdr);
256
 
                        }
257
 
                }
258
 
        }
259
 
260
 
        /* Look for new resources and rdrs*/
261
0 
        for (res = oh_get_resource_by_id(new_rpt, SAHPI_FIRST_ENTRY);
262
 
             res != NULL;
263
 
             res = oh_get_resource_next(new_rpt, res->ResourceId)) {
264
 
265
0 
                SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(cur_rpt, res->ResourceId);
266
0 
                SaHpiRdrT *rdr = NULL;
267
0 
                if (tmp_res == NULL || memcmp(res, tmp_res, sizeof(SaHpiRptEntryT))) {
268
0 
                        *res_new = g_slist_append(*res_new, (gpointer)res);
269
 
                }
270
 
271
0 
                for (rdr = oh_get_rdr_by_id(new_rpt, res->ResourceId, SAHPI_FIRST_ENTRY);
272
 
                     rdr != NULL;
273
 
                     rdr = oh_get_rdr_next(new_rpt, res->ResourceId, rdr->RecordId)) {
274
 
275
0 
                        SaHpiRdrT *tmp_rdr = NULL;
276
 
277
0 
                        if (tmp_res != NULL)
278
0 
                                tmp_rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, rdr->RecordId);
279
 
280
0 
                        if (tmp_rdr == NULL || memcmp(rdr, tmp_rdr, sizeof(SaHpiRdrT)))
281
0 
                                *rdr_new = g_slist_append(*rdr_new, (gpointer)rdr);
282
 
283
 
                }
284
 
        }
285
 
}
286
 
287
 
/**
288
 
 * oh_get_rpt_info
289
 
 * @table: pointer to RPT
290
 
 * @update_count: pointer of where to place the rpt's update count
291
 
 * @update_timestamp: pointer of where to place the rpt's update timestamp
292
 
 *
293
 
 * Returns: SA_OK on success Or minus SA_OK on error.
294
 
 **/
295
 
SaErrorT oh_get_rpt_info(RPTable *table,
296
 
                         SaHpiUint32T *update_count,
297
 
                         SaHpiTimeT *update_timestamp)
298
4 
{
299
4 
        if (!table || !update_count || !update_timestamp) {
300
1 
                dbg("ERROR: Invalid parameters.");
301
1 
                return SA_ERR_HPI_INVALID_PARAMS;
302
 
        }
303
 
304
3 
        *update_count = table->update_count;
305
3 
        *update_timestamp = table->update_timestamp;
306
 
307
3 
        return SA_OK;
308
 
}
309
 
310
 
/**
311
 
 * Resource interface functions
312
 
 */
313
 
314
 
/**
315
 
 * oh_add_resource
316
 
 * @table: Pointer to the RPT to which the RPT entry will be added.
317
 
 * @entry: The RPT entry (resource) to be added to the RPT.
318
 
 * @data: Pointer to private data for storing along with the RPT entry.
319
 
 * @owndata: boolean flag. true (%KEEP_RPT_DATA) to tell the interface *not*
320
 
 * to free the data when the resource is removed. false (%FREE_RPT_DATA) to tell
321
 
 * the interface to free the data when the resource is removed.
322
 
 *
323
 
 * Add a RPT entry to the RPT along with some private data.
324
 
 * If an RPT entry with the same resource id exists int the RPT, it will be
325
 
 * overlayed with the new RPT entry. Also, this function will assign the
326
 
 * resource id as its entry id since it is expected to be unique for the table.
327
 
 * The update count and timestamp will not be updated if the entry being added 
328
 
 * already existed in the table and was the same.
329
 
 * 
330
 
 * Returns: SA_OK on success Or minus SA_OK on error. SA_ERR_HPI_INVALID_PARAMS will
331
 
 * be returned if @table is NULL, @entry is NULL, ResourceId in @entry equals
332
 
 * SAHPI_FIRST_ENTRY, ResourceId in @entry equals SAHPI_UNSPECIFIED_RESOURCE_ID,
333
 
 * or ResourceEntity in @entry has a malformed entity path (look at the
334
 
 * entity path utils documentation).
335
 
 **/
336
 
SaErrorT oh_add_resource(RPTable *table, SaHpiRptEntryT *entry, void *data, int owndata)
337
10367 
{
338
10367 
        RPTEntry *rptentry;
339
10367 
        int update_info = 0;
340
 
341
10367 
        if (!table) {
342
2 
                dbg("ERROR: Cannot work on a null table pointer.");
343
2 
                return SA_ERR_HPI_INVALID_PARAMS;
344
10365 
        } else if (!entry) {
345
1 
                dbg("Failed to add. RPT entry is NULL.");
346
1 
                return SA_ERR_HPI_INVALID_PARAMS;
347
10364 
        } else if (entry->ResourceId == SAHPI_FIRST_ENTRY) {
348
1 
                dbg("Failed to add. RPT entry needs a resource id before being added");
349
1 
                return SA_ERR_HPI_INVALID_PARAMS;
350
10363 
        } else if (entry->ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) {
351
1 
                dbg("Failed to add. RPT entry has an invalid/reserved id assigned. (SAHPI_UNSPECIFIED_RESOURCE_ID)");
352
1 
                return SA_ERR_HPI_INVALID_PARAMS;
353
10362 
        } else if (!oh_valid_ep(&(entry->ResourceEntity))) {
354
0 
                dbg("Failed to add RPT entry. Entity path does not contain root element.");
355
0 
                return SA_ERR_HPI_INVALID_PARAMS;
356
 
        }
357
 
358
10362 
        entry->EntryId = entry->ResourceId;
359
 
        /* Check to see if the entry is in the RPTable already */
360
10362 
        rptentry = get_rptentry_by_rid(table, entry->ResourceId);
361
 
        /* If not, create new RPTEntry */
362
10362 
        if (!rptentry) {
363
10361 
                rptentry = (RPTEntry *)g_malloc0(sizeof(RPTEntry));
364
10361 
                if (!rptentry) {
365
0 
                        dbg("Not enough memory to add RPT entry.");
366
0 
                        return SA_ERR_HPI_OUT_OF_MEMORY;
367
 
                }
368
10361 
                update_info = 1; /* Have a new changed entry */
369
 
                /* Put new RPTEntry in RPTable */
370
10361 
                table->rptlist = g_slist_append(table->rptlist, (gpointer)rptentry);
371
 
372
 
                /* Add to rpt hash table */
373
10361 
                if (!table->rptable) /* Create hash table if it doesn't exist */
374
78 
                        table->rptable = g_hash_table_new(g_int_hash, g_int_equal);
375
 
376
10361 
                rptentry->rpt_entry.EntryId = entry->ResourceId;
377
10361 
                g_hash_table_insert(table->rptable,
378
 
                                    &(rptentry->rpt_entry.EntryId),
379
 
                                    rptentry);
380
 
        }
381
 
        /* Else, modify existing RPTEntry */
382
10362 
        if (rptentry->data && rptentry->data != data && !rptentry->owndata)
383
0 
                g_free(rptentry->data);
384
10362 
        rptentry->data = data;
385
10362 
        rptentry->owndata = owndata;
386
 
        /* Check if we really have a new/changed entry */
387
10362 
        if (update_info || memcmp(entry, &(rptentry->rpt_entry), sizeof(SaHpiRptEntryT))) {
388
10361 
                update_info = 1;
389
10361 
                rptentry->rpt_entry = *entry;
390
 
        }
391
 
        
392
10362 
        if (update_info) update_rptable(table);
393
 
394
10362 
        return SA_OK;
395
 
}
396
 
397
 
/**
398
 
 * oh_remove_resource
399
 
 * @table: Pointer to the RPT from which an RPT entry will be removed.
400
 
 * @rid: Resource id of the RPT entry to be removed.
401
 
 *
402
 
 * Remove a resource from the RPT. If the @rid is
403
 
 * %SAHPI_FIRST_ENTRY, the first RPT entry in the table will be removed.
404
 
 * The void data will be freed if @owndata was false (%FREE_RPT_DATA) when adding
405
 
 * the resource, otherwise if @owndata was true (%KEEP_RPT_DATA) it will not be freed.
406
 
 *
407
 
 * Returns: SA_OK on success Or minus SA_OK on error.
408
 
 **/
409
 
SaErrorT oh_remove_resource(RPTable *table, SaHpiResourceIdT rid)
410
17 
{
411
17 
        RPTEntry *rptentry;
412
 
413
17 
        if (!table) {
414
1 
                dbg("ERROR: Cannot work on a null table pointer.");
415
1 
                return SA_ERR_HPI_INVALID_PARAMS;
416
 
        }
417
 
418
16 
        rptentry = get_rptentry_by_rid(table, rid);
419
16 
        if (!rptentry) {
420
2 
                dbg("Failed to remove RPT entry. No Resource found by that id");
421
2 
                return SA_ERR_HPI_NOT_PRESENT;
422
 
        } else {
423
36 
                SaHpiRdrT *tmp_rdr;
424
 
                /* Remove all RDRs for the resource first */
425
36 
                while ((tmp_rdr = oh_get_rdr_by_id(table, rid, SAHPI_FIRST_ENTRY)) != NULL) {
426
22 
                        oh_remove_rdr(table, rid, SAHPI_FIRST_ENTRY);
427
 
                }
428
 
                /* then remove the resource itself. */
429
14 
                table->rptlist = g_slist_remove(table->rptlist, (gpointer)rptentry);
430
14 
                if (!rptentry->owndata) g_free(rptentry->data);
431
14 
                g_hash_table_remove(table->rptable, &(rptentry->rpt_entry.EntryId));
432
14 
                g_free((gpointer)rptentry);
433
14 
                if (!table->rptlist) {
434
1 
                        g_hash_table_destroy(table->rptable);
435
1 
                        table->rptable = NULL;
436
 
                }
437
 
        }
438
 
439
14 
        update_rptable(table);
440
 
441
14 
        return SA_OK;
442
 
}
443
 
444
 
/**
445
 
 * oh_get_resource_data
446
 
 * @table: Pointer to the RPT for looking up the RPT entry's private data.
447
 
 * @rid: Resource id of the RPT entry that holds the private data.
448
 
 *
449
 
 * Get the private data for a RPT entry.  If the @rid is
450
 
 * %SAHPI_FIRST_ENTRY, the first RPT entry's data in the table will be returned.
451
 
 *
452
 
 * Returns: A void pointer to the private data for the RPT entry requested, or NULL
453
 
 * if the RPT entry was not found or the table was a NULL pointer.
454
 
 **/
455
 
void *oh_get_resource_data(RPTable *table, SaHpiResourceIdT rid)
456
15 
{
457
 
458
15 
        RPTEntry *rptentry;
459
 
460
15 
        if (!table) {
461
1 
                dbg("ERROR: Cannot work on a null table pointer.");
462
1 
                return NULL;
463
 
        }
464
 
465
14 
        rptentry = get_rptentry_by_rid(table, rid);
466
14 
        if (!rptentry) {
467
 
                /*dbg("Warning: RPT entry not found. Returning NULL.");*/
468
1 
                return NULL;
469
 
        }
470
 
471
13 
        return rptentry->data;
472
 
}
473
 
474
 
/**
475
 
 * oh_get_resource_by_id
476
 
 * @table: Pointer to the RPT for looking up the RPT entry.
477
 
 * @rid: Resource id of the RPT entry to be looked up.
478
 
 *
479
 
 * Get a RPT entry from the RPT by using the resource id.
480
 
 * If @rid is %SAHPI_FIRST_ENTRY, the first RPT entry in the table will be returned.
481
 
 *
482
 
 * Returns:
483
 
 * Pointer to the RPT entry found or NULL if an RPT entry by that
484
 
 * id was not found or the table was a NULL pointer.
485
 
 **/
486
 
SaHpiRptEntryT *oh_get_resource_by_id(RPTable *table, SaHpiResourceIdT rid)
487
31 
{
488
31 
        RPTEntry *rptentry;
489
 
490
31 
        if (!table) {
491
1 
                dbg("ERROR: Cannot work on a null table pointer.");
492
1 
                return NULL;
493
 
        }
494
 
495
30 
        rptentry = get_rptentry_by_rid(table, rid);
496
30 
        if (!rptentry) {
497
 
                /*dbg("Warning: RPT entry not found. Returning NULL.");*/
498
4 
                return NULL;
499
 
        }
500
 
501
26 
        return &(rptentry->rpt_entry);
502
 
}
503
 
504
 
/**
505
 
 * oh_get_resource_by_ep
506
 
 * @table: Pointer to the RPT for looking up the RPT entry.
507
 
 * @ep: Entity path of the RPT entry to be looked up.
508
 
 *
509
 
 * Get a RPT entry from the RPT by using the entity path.
510
 
 *
511
 
 * Returns:
512
 
 * Pointer to the RPT entry found or NULL if an RPT entry by that
513
 
 * entity path was not found or the table was a NULL pointer.
514
 
 **/
515
 
SaHpiRptEntryT *oh_get_resource_by_ep(RPTable *table, SaHpiEntityPathT *ep)
516
15 
{
517
15 
        RPTEntry *rptentry = NULL;
518
15 
        GSList *node;
519
 
520
15 
        if (!(table)) {
521
1 
                dbg("ERROR: Cannot work on a null table pointer.");
522
1 
                return NULL;
523
 
        }
524
 
525
10069 
        for (node = table->rptlist; node != NULL; node = node->next) {
526
10067 
                rptentry = (RPTEntry *) node->data;
527
10067 
                if (oh_cmp_ep(&(rptentry->rpt_entry.ResourceEntity), ep))
528
12 
                        break;
529
10055 
                else rptentry = NULL;
530
 
        }
531
 
532
14 
        if (!rptentry) {
533
 
                /*dbg("Warning: RPT entry not found. Returning NULL.");*/
534
2 
                return NULL;
535
 
        }
536
 
537
12 
        return &(rptentry->rpt_entry);
538
 
}
539
 
540
 
/**
541
 
 * oh_get_resource_next
542
 
 * @table: Pointer to the RPT for looking up the RPT entry.
543
 
 * @rid_prev: Resource id of the RPT entry previous to the one being looked up.
544
 
 *
545
 
 * Get the RPT entry next to the specified RPT entry
546
 
 * from the RPT. If @rid_prev is %SAHPI_FIRST_ENTRY, the first RPT entry
547
 
 * in the table will be returned.
548
 
 *
549
 
 * Returns:
550
 
 * Pointer to the RPT entry found or NULL if the previous RPT entry by that
551
 
 * id was not found or the table was a NULL pointer.
552
 
 **/
553
 
SaHpiRptEntryT *oh_get_resource_next(RPTable *table, SaHpiResourceIdT rid_prev)
554
35 
{
555
35 
        RPTEntry *rptentry = NULL;
556
35 
        GSList *node;
557
 
558
35 
        if (!(table)) {
559
1 
                dbg("ERROR: Cannot work on a null table pointer.");
560
1 
                return NULL;
561
 
        }
562
 
563
34 
        if (rid_prev == SAHPI_FIRST_ENTRY) {
564
1 
                if (table->rptlist) {
565
1 
                        rptentry = (RPTEntry *)(table->rptlist->data);
566
 
                } else {
567
 
                        /*dbg("Info: RPT is empty. Returning NULL.");*/
568
0 
                        return NULL;
569
 
                }
570
 
        } else {
571
195 
                for (node = table->rptlist; node != NULL; node = node->next) {
572
194 
                        rptentry = (RPTEntry *) node->data;
573
194 
                        if (rptentry->rpt_entry.ResourceId == rid_prev) {
574
32 
                                if (node->next) rptentry = (RPTEntry *)(node->next->data);
575
 
                                else {
576
 
                                        /*dbg("Info: Reached end of RPT.");*/
577
5 
                                        return NULL;
578
 
                                }
579
162 
                                break;
580
162 
                        } else rptentry = NULL;
581
 
                }
582
 
        }
583
 
584
29 
        if (!rptentry) {
585
 
                /*dbg("Warning: RPT entry not found. Returning NULL.");*/
586
1 
                return NULL;
587
 
        }
588
 
589
28 
        return &(rptentry->rpt_entry);
590
 
}
591
 
592
 
/**
593
 
 * RDR interface functions
594
 
 */
595
 
596
 
/**
597
 
 * oh_add_rdr
598
 
 * @table: Pointer to RPT table containig the RPT entry to which the RDR will belong.
599
 
 * @rid: Id of the RPT entry that will own the RDR to be added.
600
 
 * @rdr: RDR to be added to an RPT entry's RDR repository.
601
 
 * @data: Pointer to private data belonging to the RDR that is being added.
602
 
 * @owndata: boolean flag. true (%KEEP_RPT_DATA) to tell the interface *not*
603
 
 * to free the data when the rdr is removed. false (%FREE_RPT_DATA) to tell
604
 
 * the interface to free the data when the rdr is removed.
605
 
 *
606
 
 * Add an RDR to a RPT entry's RDR repository.
607
 
 * If an RDR is found with the same record id as the one being added, the RDR being
608
 
 * added will overlay the existing one. Also, a unique record id will be assigned
609
 
 * to it based on the RDR type and its type's numeric id.
610
 
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
611
 
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
612
 
 *
613
 
 * Returns: SA_OK on success Or minus SA_OK on error. Will return
614
 
 * SA_ERR_HPI_INVALID_PARAMS if instrument id is invalid. An invalid
615
 
 * intrument id for a sensor is in the range of 0x100-0x1FF. An aggregate type
616
 
 * of sensor can have its instrument id in the range of 0x100-0x10F, but
617
 
 * the resource must have the aggregate sensor capabilitiy bit set.
618
 
 **/
619
 
SaErrorT oh_add_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrT *rdr, void *data, int owndata)
620
135 
{
621
135 
        RPTEntry *rptentry;
622
135 
        RDRecord *rdrecord;
623
135 
        SaHpiInstrumentIdT type_num;
624
 
625
135 
        if (!table) {
626
2 
                dbg("Error: Cannot work on a null table pointer.");
627
2 
                return SA_ERR_HPI_INVALID_PARAMS;
628
133 
        } else if (!rdr) {
629
1 
                dbg("Failed to add. RDR is NULL.");
630
1 
                return SA_ERR_HPI_INVALID_PARAMS;
631
 
        }
632
 
633
132 
        rptentry = get_rptentry_by_rid(table, rid);
634
132 
        if (!rptentry){
635
1 
                dbg("Failed to add RDR. Parent RPT entry was not found in table.");
636
1 
                return SA_ERR_HPI_NOT_PRESENT;
637
 
        }
638
 
        
639
131 
        if (check_instrument_id(&(rptentry->rpt_entry), rdr)) {
640
2 
                dbg("Invalid instrument id found in RDR.");
641
2 
                return SA_ERR_HPI_INVALID_PARAMS;
642
 
        }
643
 
644
129 
        type_num = get_rdr_type_num(rdr);
645
 
646
 
        /* Form correct RecordId. */
647
129 
        rdr->RecordId = get_rdr_uid(rdr->RdrType, type_num);
648
 
        /* Check if record exists */
649
129 
        rdrecord = get_rdrecord_by_id(rptentry, rdr->RecordId);
650
 
        /* If not, create new rdr */
651
129 
        if (!rdrecord) {
652
129 
                rdrecord = (RDRecord *)g_malloc0(sizeof(RDRecord));
653
129 
                if (!rdrecord) {
654
0 
                        dbg("Not enough memory to add RDR.");
655
0 
                        return SA_ERR_HPI_OUT_OF_MEMORY;
656
 
                }
657
 
                /* Put new rdrecord in rdr repository */
658
129 
                rptentry->rdrlist = g_slist_append(rptentry->rdrlist, (gpointer)rdrecord);
659
 
                /* Create rdr hash table if first rdr here */
660
129 
                if (!rptentry->rdrtable)
661
38 
                        rptentry->rdrtable = g_hash_table_new(g_int_hash, g_int_equal);
662
 
663
129 
                rdrecord->rdr.RecordId = rdr->RecordId;
664
129 
                g_hash_table_insert(rptentry->rdrtable,
665
 
                                    &(rdrecord->rdr.RecordId),
666
 
                                    rdrecord);
667
 
        }
668
 
        /* Else, modify existing rdrecord */
669
129 
        if (rdrecord->data && rdrecord->data != data && !rdrecord->owndata)
670
0 
                g_free(rdrecord->data);
671
129 
        rdrecord->data = data;
672
129 
        rdrecord->owndata = owndata;
673
129 
        rdrecord->rdr = *rdr;
674
 
675
129 
        return SA_OK;
676
 
}
677
 
678
 
/**
679
 
 * oh_remove_rdr
680
 
 * @table: Pointer to RPT table containig the RPT entry from which the RDR will
681
 
 * be removed.
682
 
 * @rid: Id of the RPT entry from which the RDR will be removed.
683
 
 * @rdrid: Record id of the RDR to remove.
684
 
 *
685
 
 *
686
 
 * Remove an RDR from a RPT entry's RDR repository.
687
 
 * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR in the repository will be removed.
688
 
 * If @owndata was set to false (%FREE_RPT_DATA) on the rdr when it was added,
689
 
 * the data will be freed, otherwise if it was set to true (%KEEP_RPT_DATA),
690
 
 * it will not be freed.
691
 
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
692
 
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
693
 
 *
694
 
 * Returns: SA_OK on success Or minus SA_OK on error.
695
 
 **/
696
 
SaErrorT oh_remove_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid)
697
29 
{
698
29 
        RPTEntry *rptentry;
699
29 
        RDRecord *rdrecord;
700
 
701
29 
        if (!table) {
702
1 
                dbg("Error: Cannot work on a null table pointer.");
703
1 
                return SA_ERR_HPI_INVALID_PARAMS;
704
 
        }
705
 
706
28 
        rptentry = get_rptentry_by_rid(table, rid);
707
28 
        if (!rptentry) {
708
1 
                dbg("Failed to remove RDR. Parent RPT entry was not found.");
709
1 
                return SA_ERR_HPI_NOT_PRESENT;
710
 
        }
711
 
712
27 
        rdrecord = get_rdrecord_by_id(rptentry, rdrid);
713
27 
        if (!rdrecord) {
714
1 
                dbg("Failed to remove RDR. Could not be found.");
715
1 
                return SA_ERR_HPI_NOT_PRESENT;
716
 
        } else {
717
26 
                rptentry->rdrlist = g_slist_remove(rptentry->rdrlist, (gpointer)rdrecord);
718
26 
                if (!rdrecord->owndata) g_free(rdrecord->data);
719
26 
                g_hash_table_remove(rptentry->rdrtable, &(rdrecord->rdr.RecordId));
720
26 
                g_free((gpointer)rdrecord);
721
26 
                if (!rptentry->rdrlist) {
722
6 
                        g_hash_table_destroy(rptentry->rdrtable);
723
6 
                        rptentry->rdrtable = NULL;
724
 
                }
725
 
        }
726
 
727
26 
        return SA_OK;
728
 
}
729
 
730
 
/**
731
 
 * oh_get_rdr_data
732
 
 * @table: Pointer to RPT table containig the RPT entry from which the RDR's data
733
 
 * will be read.
734
 
 * @rid: Id of the RPT entry from which the RDR's data will be read.
735
 
 * @rdrid: Record id of the RDR to read data from.
736
 
 *
737
 
 *
738
 
 * Get the private data associated to an RDR.
739
 
 * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR's data in the repository will be returned.
740
 
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
741
 
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
742
 
 *
743
 
 * Returns: A void pointer to the RDR data, or NULL if no data for that RDR was found or
744
 
 * the table pointer is NULL.
745
 
 **/
746
 
void *oh_get_rdr_data(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid)
747
4 
{
748
4 
        RPTEntry *rptentry;
749
4 
        RDRecord *rdrecord;
750
 
751
4 
        if (!table) {
752
1 
                dbg("Error: Cannot work on a null table pointer.");
753
1 
                return NULL;
754
 
        }
755
 
756
3 
        rptentry = get_rptentry_by_rid(table, rid);
757
3 
        if (!rptentry) {
758
1 
                dbg("Warning: RPT entry not found. Cannot find RDR.");
759
1 
                return NULL; /* No resource found by that id */
760
 
        }
761
 
762
2 
        rdrecord = get_rdrecord_by_id(rptentry, rdrid);
763
2 
        if (!rdrecord) {
764
 
                /*dbg("Warning: RDR not found. Returning NULL.");*/
765
1 
                return NULL;
766
 
        }
767
 
768
1 
        return rdrecord->data;
769
 
}
770
 
771
 
/**
772
 
 * oh_get_rdr_by_id
773
 
 * @table: Pointer to RPT table containig the RPT entry tha has the RDR
774
 
 * being looked up.
775
 
 * @rid: Id of the RPT entry containing the RDR being looked up.
776
 
 * @rdrid: Record id of the RDR being looked up.
777
 
 *
778
 
 * Get a reference to an RDR by its record id.
779
 
 * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR in the repository will be returned.
780
 
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
781
 
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
782
 
 *
783
 
 * Returns:
784
 
 * Reference to the RDR looked up or NULL if no RDR was found.
785
 
 **/
786
 
SaHpiRdrT *oh_get_rdr_by_id(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid)
787
49 
{
788
49 
        RPTEntry *rptentry;
789
49 
        RDRecord *rdrecord;
790
 
791
49 
        if (!table) {
792
1 
                dbg("Error: Cannot work on a null table pointer.");
793
1 
                return NULL;
794
 
        }
795
 
796
48 
        rptentry = get_rptentry_by_rid(table, rid);
797
48 
        if (!rptentry) {
798
1 
                dbg("Warning: RPT entry not found. Cannot find RDR.");
799
1 
                return NULL; /* No resource found by that id */
800
 
        }
801
 
802
47 
        rdrecord = get_rdrecord_by_id(rptentry, rdrid);
803
47 
        if (!rdrecord) {
804
 
                /*dbg("Warning: RDR not found. Returning NULL.");*/
805
16 
                return NULL;
806
 
        }
807
 
808
31 
        return &(rdrecord->rdr);
809
 
}
810
 
811
 
/**
812
 
 * oh_get_rdr_by_type
813
 
 * @table: Pointer to RPT table containig the RPT entry tha has the RDR
814
 
 * being looked up.
815
 
 * @rid: Id of the RPT entry containing the RDR being looked up.
816
 
 * @type: RDR Type of the RDR being looked up.
817
 
 * @num: RDR id within the RDR type for the specified RPT entry.
818
 
 *
819
 
 * Get a reference to an RDR by its type and number.
820
 
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
821
 
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
822
 
 *
823
 
 * Returns:
824
 
 * Reference to the RDR looked up or NULL if no RDR was found.
825
 
 **/
826
 
SaHpiRdrT *oh_get_rdr_by_type(RPTable *table, SaHpiResourceIdT rid,
827
 
                              SaHpiRdrTypeT type, SaHpiInstrumentIdT num)
828
9 
{
829
9 
        RPTEntry *rptentry;
830
9 
        RDRecord *rdrecord;
831
9 
        SaHpiEntryIdT rdr_uid;
832
 
833
9 
        if (!table) {
834
1 
                dbg("Error: Cannot work on a null table pointer.");
835
1 
                return NULL;
836
 
        }
837
 
838
8 
        rptentry = get_rptentry_by_rid(table, rid);
839
8 
        if (!rptentry) {
840
1 
                dbg("Warning: RPT entry not found. Cannot find RDR.");
841
1 
                return NULL; /* No resource found by that id */
842
 
        }
843
 
844
 
        /* Get rdr_uid from type/num combination */
845
7 
        rdr_uid = get_rdr_uid(type, num);
846
7 
        rdrecord = get_rdrecord_by_id(rptentry, rdr_uid);
847
7 
        if (!rdrecord) {
848
 
                /*dbg("Warning: RDR not found. Returning NULL.");*/
849
1 
                return NULL;
850
 
        }
851
 
852
6 
        return &(rdrecord->rdr);
853
 
}
854
 
855
 
/**
856
 
 * oh_get_rdr_next
857
 
 * @table: Pointer to the RPT containing the RPT entry to look up the RDR in.
858
 
 * @rid: Id of the RPT entry containing the RDR being looked up.
859
 
 * @rdrid_prev: Record id of the RDR previous to the one being looked up, relative
860
 
 * to the specified RPT entry.
861
 
 *
862
 
 * Get the RDR next to the specified RDR in the specified
863
 
 * RPT entry's repository. If @rdrid_prev is %SAHPI_FIRST_ENTRY, the first RDR
864
 
 * in the repository will be returned.
865
 
 * All rdr interface funtions, except oh_add_rdr() will act in the context of
866
 
 * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY.
867
 
 *
868
 
 * Returns:
869
 
 * Pointer to the RDR found or NULL if the previous RDR by that
870
 
 * id was not found. If the @rdrid_prev was %SAHPI_FIRST_ENTRY, the first RDR in the list
871
 
 * will be returned.
872
 
 **/
873
 
SaHpiRdrT *oh_get_rdr_next(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid_prev)
874
14 
{
875
14 
        RPTEntry *rptentry;
876
14 
        RDRecord *rdrecord = NULL;
877
14 
        GSList *node;
878
 
879
14 
        if (!table) {
880
1 
                dbg("Error: Cannot work on a null table pointer.");
881
1 
                return NULL;
882
 
        }
883
 
884
13 
        rptentry = get_rptentry_by_rid(table, rid);
885
13 
        if (!rptentry) {
886
1 
                dbg("Warning: RPT entry not found. Cannot find RDR.");
887
1 
                return NULL; /* No resource found by that id */
888
 
        }
889
 
890
12 
        if (rdrid_prev == SAHPI_FIRST_ENTRY) {
891
1 
                if (rptentry->rdrlist) {
892
1 
                        rdrecord = (RDRecord *)(rptentry->rdrlist->data);
893
 
                } else {
894
 
                        /*dbg("Info: RDR repository is empty. Returning NULL.");*/
895
0 
                        return NULL;
896
 
                }
897
 
        } else {
898
36 
                for (node = rptentry->rdrlist; node != NULL; node = node->next) {
899
35 
                        rdrecord = (RDRecord *)node->data;
900
35 
                        if (rdrecord->rdr.RecordId == rdrid_prev) {
901
10 
                                if (node->next) rdrecord = (RDRecord *)(node->next->data);
902
 
                                else {
903
 
                                        /*dbg("Info: Reached end of RDR repository.")*/
904
3 
                                        return NULL;
905
 
                                }
906
25 
                                break;
907
 
                        }
908
25 
                        else rdrecord = NULL;
909
 
                }
910
 
        }
911
 
912
9 
        if (!rdrecord) {
913
 
                /*dbg("Warning: RDR not found. Returning NULL.");*/
914
1 
                return NULL;
915
 
        }
916
 
917
8 
        return &(rdrecord->rdr);
918
 
}
919