static int ipmi_sensor_get(struct ipmi_intf *intf, int argc, char **argv) { struct sdr_record_list *sdr; int i, v; int rc = 0; if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { lprintf(LOG_NOTICE, "sensor get <id> ... [id]"); lprintf(LOG_NOTICE, " id : name of desired sensor"); return -1; } printf("Locating sensor record...\n"); /* lookup by sensor name */ for (i = 0; i < argc; i++) { int r = 0; sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); if (sdr == NULL) { lprintf(LOG_ERR, "Sensor data record \"%s\" not found!", argv[i]); rc = -1; continue; } /* need to set verbose level to 1 */ v = verbose; verbose = 1; switch (sdr->type) { case SDR_RECORD_TYPE_FULL_SENSOR: case SDR_RECORD_TYPE_COMPACT_SENSOR: r = ipmi_sensor_print_fc(intf, sdr->record.common, sdr->type); break; case SDR_RECORD_TYPE_EVENTONLY_SENSOR: r = ipmi_sdr_print_sensor_eventonly(intf, sdr->record. eventonly); break; case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR: r = ipmi_sdr_print_sensor_fru_locator(intf, sdr->record. fruloc); break; case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: r = ipmi_sdr_print_sensor_mc_locator(intf, sdr->record.mcloc); break; } verbose = v; /* save errors */ rc = (r == 0) ? rc : r; } return rc; }
static int ipmi_sensor_list(struct ipmi_intf *intf) { struct sdr_get_rs *header; struct ipmi_sdr_iterator *itr; int rc = 0; lprintf(LOG_DEBUG, "Querying SDR for sensor list"); itr = ipmi_sdr_start(intf, 0); if (itr == NULL) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return -1; } while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) { uint8_t *rec; rec = ipmi_sdr_get_record(intf, header, itr); if (rec == NULL) { lprintf(LOG_DEBUG, "rec == NULL"); continue; } switch (header->type) { case SDR_RECORD_TYPE_FULL_SENSOR: case SDR_RECORD_TYPE_COMPACT_SENSOR: ipmi_sensor_print_fc(intf, (struct sdr_record_common_sensor *) rec, header->type); break; } free(rec); rec = NULL; /* fix for CR6604909: */ /* mask failure of individual reads in sensor list command */ /* rc = (r == 0) ? rc : r; */ } ipmi_sdr_end(intf, itr); return rc; }