From 0b3db22dab029e4e326e6b278505a2ab9ef247dc Mon Sep 17 00:00:00 2001 From: Duncan Laurie Date: Wed, 31 Mar 2004 18:34:59 +0000 Subject: [PATCH] don't read entire sdr into memory before returning found entry, instead continue reading where we left of with next call. add support for getting multiple sensors by name --- ipmitool/doc/ipmitool.1.in | 4 +- ipmitool/include/ipmitool/ipmi_sdr.h | 2 +- ipmitool/lib/ipmi_sdr.c | 140 +++++++++++++++------------ ipmitool/lib/ipmi_sensor.c | 57 +++++------ 4 files changed, 110 insertions(+), 93 deletions(-) diff --git a/ipmitool/doc/ipmitool.1.in b/ipmitool/doc/ipmitool.1.in index 9af477d..28897c0 100644 --- a/ipmitool/doc/ipmitool.1.in +++ b/ipmitool/doc/ipmitool.1.in @@ -301,8 +301,8 @@ This command will read the SDR and extract sensor information, then query each s .I list This command will list sensors and thresholds in a wide table format. .TP -\fIget\fP <\fBid\fR> -This command will print info for a single sensor specified by or name. +\fIget\fP <\fBid\fR> ... [\fBid\fR] +This command will print info for sensors specified by name. .TP \fIthresh\fP <\fBid\fR> <\fBthreshold\fR> <\fBsetting\fR> This allows you to set a particular sensor threshold value. The sensor is specified by name. diff --git a/ipmitool/include/ipmitool/ipmi_sdr.h b/ipmitool/include/ipmitool/ipmi_sdr.h index 1fc1efa..b2f0346 100644 --- a/ipmitool/include/ipmitool/ipmi_sdr.h +++ b/ipmitool/include/ipmitool/ipmi_sdr.h @@ -650,6 +650,6 @@ void ipmi_sdr_print_fru_locator(struct ipmi_intf * intf, struct sdr_record_fru_l void ipmi_sdr_print_mc_locator(struct ipmi_intf * intf, struct sdr_record_mc_locator * mc); struct sdr_record_list * ipmi_sdr_find_sdr_byid(struct ipmi_intf * intf, char * id); -void ipmi_sdr_list_empty(void); +void ipmi_sdr_list_empty(struct ipmi_intf * intf); #endif /* IPMI_SDR_H */ diff --git a/ipmitool/lib/ipmi_sdr.c b/ipmitool/lib/ipmi_sdr.c index 1bd8a7c..67cded0 100644 --- a/ipmitool/lib/ipmi_sdr.c +++ b/ipmitool/lib/ipmi_sdr.c @@ -50,6 +50,7 @@ extern int verbose; static int sdr_max_read_len = GET_SDR_ENTIRE_RECORD; static struct sdr_record_list * sdr_list_head = NULL; +static struct ipmi_sdr_iterator * sdr_list_itr = NULL; /* convert unsigned value to 2's complement signed */ int utos(unsigned val, unsigned bits) @@ -998,74 +999,23 @@ ipmi_sdr_end(struct ipmi_intf * intf, struct ipmi_sdr_iterator * itr) free (itr); } -int ipmi_sdr_list_fill(struct ipmi_intf * intf) -{ - struct sdr_get_rs * header; - struct ipmi_sdr_iterator * itr; - static struct sdr_record_list * sdr_list_tail; - - itr = ipmi_sdr_start(intf); - if (!itr) { - printf("Unable to open SDR for reading\n"); - return -1; - } - - while (header = ipmi_sdr_get_next_header(intf, itr)) { - unsigned char * rec; - struct sdr_record_full_sensor * full; - struct sdr_record_compact_sensor * compact; - struct sdr_record_list * sdrr; - - sdrr = malloc(sizeof(struct sdr_record_list)); - memset(sdrr, 0, sizeof(struct sdr_record_list)); - sdrr->id = header->id; - sdrr->type = header->type; - - rec = ipmi_sdr_get_record(intf, header, itr); - if (!rec) - continue; - - switch (header->type) { - case SDR_RECORD_TYPE_FULL_SENSOR: - sdrr->record.full = (struct sdr_record_full_sensor *)rec; - break; - case SDR_RECORD_TYPE_COMPACT_SENSOR: - sdrr->record.compact = (struct sdr_record_compact_sensor *)rec; - break; - case SDR_RECORD_TYPE_EVENTONLY_SENSOR: - sdrr->record.eventonly = (struct sdr_record_eventonly_sensor *)rec; - break; - case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR: - sdrr->record.fruloc = (struct sdr_record_fru_locator *)rec; - break; - case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: - sdrr->record.mcloc = (struct sdr_record_mc_locator *)rec; - break; - default: - free(rec); - continue; - } - - if (!sdr_list_head) - sdr_list_head = sdrr; - else - sdr_list_tail->next = sdrr; - sdr_list_tail = sdrr; - } - - ipmi_sdr_end(intf, itr); - - return 0; -} - struct sdr_record_list * ipmi_sdr_find_sdr_byid(struct ipmi_intf * intf, char * id) { + struct sdr_get_rs * header; + static struct sdr_record_list * sdr_list_tail; static struct sdr_record_list * e; + int found = 0; - if (!sdr_list_head) - ipmi_sdr_list_fill(intf); + if (!sdr_list_itr) { + sdr_list_itr = ipmi_sdr_start(intf); + if (!sdr_list_itr) { + printf("Unable to open SDR for reading\n"); + return NULL; + } + } + /* check what we've already read */ e = sdr_list_head; while (e) { switch (e->type) { @@ -1098,13 +1048,77 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf * intf, char * id) e = e->next; } + /* now keep looking */ + while (header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) { + unsigned char * rec; + struct sdr_record_full_sensor * full; + struct sdr_record_compact_sensor * compact; + struct sdr_record_list * sdrr; + + sdrr = malloc(sizeof(struct sdr_record_list)); + memset(sdrr, 0, sizeof(struct sdr_record_list)); + sdrr->id = header->id; + sdrr->type = header->type; + + rec = ipmi_sdr_get_record(intf, header, sdr_list_itr); + if (!rec) + continue; + + switch (header->type) { + case SDR_RECORD_TYPE_FULL_SENSOR: + sdrr->record.full = (struct sdr_record_full_sensor *)rec; + if (!strncmp(sdrr->record.full->id_string, id, + sdrr->record.full->id_code & 0x1f)) + found = 1; + break; + case SDR_RECORD_TYPE_COMPACT_SENSOR: + sdrr->record.compact = (struct sdr_record_compact_sensor *)rec; + if (!strncmp(sdrr->record.compact->id_string, id, + sdrr->record.compact->id_code & 0x1f)) + found = 1; + break; + case SDR_RECORD_TYPE_EVENTONLY_SENSOR: + sdrr->record.eventonly = (struct sdr_record_eventonly_sensor *)rec; + if (!strncmp(sdrr->record.eventonly->id_string, id, + sdrr->record.eventonly->id_code & 0x1f)) + found = 1; + break; + case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR: + sdrr->record.fruloc = (struct sdr_record_fru_locator *)rec; + if (!strncmp(sdrr->record.fruloc->id_string, id, + sdrr->record.fruloc->id_code & 0x1f)) + found = 1; + break; + case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: + sdrr->record.mcloc = (struct sdr_record_mc_locator *)rec; + if (!strncmp(sdrr->record.mcloc->id_string, id, + sdrr->record.mcloc->id_code & 0x1f)) + found = 1; + break; + default: + free(rec); + continue; + } + + if (!sdr_list_head) + sdr_list_head = sdrr; + else + sdr_list_tail->next = sdrr; + sdr_list_tail = sdrr; + + if (found) + return sdrr; + } + return NULL; } -void ipmi_sdr_list_empty(void) +void ipmi_sdr_list_empty(struct ipmi_intf * intf) { struct sdr_record_list *list, *next; + ipmi_sdr_end(intf, sdr_list_itr); + list = sdr_list_head; while (list) { switch (list->type) { diff --git a/ipmitool/lib/ipmi_sensor.c b/ipmitool/lib/ipmi_sensor.c index b87f384..b326724 100644 --- a/ipmitool/lib/ipmi_sensor.c +++ b/ipmitool/lib/ipmi_sensor.c @@ -694,46 +694,49 @@ ipmi_sensor_set_threshold(struct ipmi_intf * intf, int argc, char ** argv) printf("Sensor data record not found!\n"); } - ipmi_sdr_list_empty(); + ipmi_sdr_list_empty(intf); } -static void ipmi_sensor_get(struct ipmi_intf * intf, char * id) +static void ipmi_sensor_get(struct ipmi_intf * intf, int argc, char ** argv) { struct sdr_record_list * sdr; + int i; - if (!id || !strncmp(id, "help", 4)) { - printf("sensor get \n"); + if (argc < 1 || !strncmp(argv[0], "help", 4)) { + printf("sensor get ... [id]\n"); printf(" id : name of desired sensor\n"); return; } printf("Locating sensor record...\n"); /* lookup by sensor name */ - sdr = ipmi_sdr_find_sdr_byid(intf, id); - if (sdr) { - verbose = verbose ? : 1; - switch (sdr->type) { - case SDR_RECORD_TYPE_FULL_SENSOR: - ipmi_sensor_print_full(intf, sdr->record.full); - break; - case SDR_RECORD_TYPE_COMPACT_SENSOR: - ipmi_sensor_print_compact(intf, sdr->record.compact); - break; - case SDR_RECORD_TYPE_EVENTONLY_SENSOR: - ipmi_sdr_print_sensor_eventonly(intf, sdr->record.eventonly); - break; - case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR: - ipmi_sdr_print_fru_locator(intf, sdr->record.fruloc); - break; - case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: - ipmi_sdr_print_mc_locator(intf, sdr->record.mcloc); - break; + for (i=0; itype) { + case SDR_RECORD_TYPE_FULL_SENSOR: + ipmi_sensor_print_full(intf, sdr->record.full); + break; + case SDR_RECORD_TYPE_COMPACT_SENSOR: + ipmi_sensor_print_compact(intf, sdr->record.compact); + break; + case SDR_RECORD_TYPE_EVENTONLY_SENSOR: + ipmi_sdr_print_sensor_eventonly(intf, sdr->record.eventonly); + break; + case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR: + ipmi_sdr_print_fru_locator(intf, sdr->record.fruloc); + break; + case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: + ipmi_sdr_print_mc_locator(intf, sdr->record.mcloc); + break; + } + } else { + printf("Sensor data record \"%s\" not found!\n", argv[i]); } - } else { - printf("Sensor data record not found!\n"); } - ipmi_sdr_list_empty(); + ipmi_sdr_list_empty(intf); } int @@ -751,7 +754,7 @@ ipmi_sensor_main(struct ipmi_intf * intf, int argc, char ** argv) ipmi_sensor_set_threshold(intf, argc-1, &argv[1]); } else if (!strncmp(argv[0], "get", 3)) { - ipmi_sensor_get(intf, argv[1]); + ipmi_sensor_get(intf, argc-1, &argv[1]); } else printf("Invalid sensor command: %s\n", argv[0]);