From: Duncan L. <ice...@us...> - 2004-03-26 21:49:11
|
Update of /cvsroot/ipmitool/ipmitool/lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv774/lib Modified Files: ipmi_sdr.c ipmi_sensor.c Log Message: - determine maximum buffer length for SDR reading dynamically - add support for "sensor get" command - let sensor get and sensor thresh use sensor id as well as name - build list of sdrs when searching, for use in xref of sel data - fix memory leak during sensor list Index: ipmi_sdr.c =================================================================== RCS file: /cvsroot/ipmitool/ipmitool/lib/ipmi_sdr.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** ipmi_sdr.c 10 Mar 2004 15:42:48 -0000 1.18 --- ipmi_sdr.c 26 Mar 2004 21:38:10 -0000 1.19 *************** *** 48,51 **** --- 48,58 ---- extern int verbose; + static int sdr_max_read_len = GET_SDR_ENTIRE_RECORD; + + struct sdr_records_full { + struct sdr_record_full_sensor * record; + struct sdr_records_full * next; + }; + static struct sdr_records_full * sdr_list_head = NULL; /* convert unsigned value to 2's complement signed */ *************** *** 946,955 **** req.msg.data_len = sizeof(sdr_rq); ! /* read SDR record with partial (30 byte) reads ! * because a full read (0xff) exceeds the maximum * transport buffer size. (completion code 0xca) */ while (i < len) { ! sdr_rq.length = (len-i < GET_SDR_MAX_LEN) ? len-i : GET_SDR_MAX_LEN; sdr_rq.offset = i+5; /* 5 header bytes */ if (verbose > 1) --- 953,962 ---- req.msg.data_len = sizeof(sdr_rq); ! /* read SDR record with partial reads ! * because a full read usually exceeds the maximum * transport buffer size. (completion code 0xca) */ while (i < len) { ! sdr_rq.length = (len-i < sdr_max_read_len) ? len-i : sdr_max_read_len; sdr_rq.offset = i+5; /* 5 header bytes */ if (verbose > 1) *************** *** 963,969 **** } ! if (rsp->ccode == 0xc5) { if (verbose > 1) ! printf("SDR reserveration canceled. Sleeping a bit and retrying...\n"); sleep (rand () & 3); --- 970,983 ---- } ! switch (rsp->ccode) { ! case 0xca: ! /* read too many bytes at once */ ! sdr_max_read_len = (sdr_max_read_len >> 1) - 1; ! continue; ! case 0xc5: ! /* lost reservation */ if (verbose > 1) ! printf("SDR reserveration canceled. " ! "Sleeping a bit and retrying...\n"); sleep (rand () & 3); *************** *** 978,987 **** if (!rsp->data_len || rsp->ccode) { ! free (data); return NULL; } memcpy(data+i, rsp->data+2, sdr_rq.length); ! i+=GET_SDR_MAX_LEN; } --- 992,1001 ---- if (!rsp->data_len || rsp->ccode) { ! free(data); return NULL; } memcpy(data+i, rsp->data+2, sdr_rq.length); ! i += sdr_max_read_len; } *************** *** 995,1021 **** } struct sdr_record_full_sensor * ! ipmi_sdr_find_sdr(struct ipmi_intf * intf, char * id) { ! struct sdr_get_rs * header; ! struct ipmi_sdr_iterator * itr; ! itr = ipmi_sdr_start(intf); ! if (!itr) ! { ! printf("Unable to open SDR for reading\n"); ! return; ! } ! while (header = ipmi_sdr_get_next_header(intf, itr)) ! { ! struct sdr_record_full_sensor * sdr; ! if (header->type != SDR_RECORD_TYPE_FULL_SENSOR) ! continue; ! sdr = (struct sdr_record_full_sensor *)ipmi_sdr_get_record(intf, header, itr); ! if (sdr && !strncmp(sdr->id_string, id, sdr->id_code & 0x3f)) ! return sdr; ! } ! return NULL; } --- 1009,1106 ---- } + int ipmi_sdr_list_fill(struct ipmi_intf * intf) + { + struct sdr_get_rs * header; + struct ipmi_sdr_iterator * itr; + static struct sdr_records_full * 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)) { + struct sdr_record_full_sensor * sdr; + struct sdr_records_full * sdrr; + + if (header->type != SDR_RECORD_TYPE_FULL_SENSOR) + continue; + + sdr = (struct sdr_record_full_sensor *)ipmi_sdr_get_record(intf, header, itr); + if (!sdr) + continue; + + sdrr = malloc(sizeof(struct sdr_records_full)); + memset(sdrr, 0, sizeof(struct sdr_records_full)); + + sdrr->record = sdr; + + if (!sdr_list_head) + sdr_list_head = sdrr; + else + sdr_list_tail->next = sdrr; + sdr_list_tail = sdrr; + + if (verbose > 3) + printf("added list entry %x\n", sdrr->record->keys.sensor_num); + } + + ipmi_sdr_end(intf, itr); + + return 0; + } + struct sdr_record_full_sensor * ! ipmi_sdr_find_sdr_byid(struct ipmi_intf * intf, char * id) { ! static struct sdr_records_full * e; ! if (!sdr_list_head) ! ipmi_sdr_list_fill(intf); ! e = sdr_list_head; ! while (e) { ! if (!strncmp(e->record->id_string, id, e->record->id_code & 0x3f)) ! return e->record; ! e = e->next; ! } ! ! return NULL; ! } ! ! struct sdr_record_full_sensor * ! ipmi_sdr_find_sdr_bynum(struct ipmi_intf * intf, unsigned char num) ! { ! static struct sdr_records_full * e; ! ! if (!sdr_list_head) ! ipmi_sdr_list_fill(intf); ! ! e = sdr_list_head; ! ! while (e) { ! if (e->record->keys.sensor_num == num) ! return e->record; ! e = e->next; ! } ! ! return NULL; ! } ! ! void ipmi_sdr_list_empty(void) ! { ! struct sdr_records_full *list, *next; ! ! list = sdr_list_head; ! while (list) { ! if (verbose > 3) ! printf("cleared sdr entry %x\n", list->record->keys.sensor_num); ! if (list->record) ! free(list->record); ! next = list->next; ! free(list); ! list = next; ! } } Index: ipmi_sensor.c =================================================================== RCS file: /cvsroot/ipmitool/ipmitool/lib/ipmi_sensor.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ipmi_sensor.c 3 Mar 2004 21:26:00 -0000 1.3 --- ipmi_sensor.c 26 Mar 2004 21:38:10 -0000 1.4 *************** *** 429,434 **** } ! static void ! ipmi_sensor_print_full(struct ipmi_intf * intf, struct sdr_record_full_sensor * sensor) { --- 429,433 ---- } ! void ipmi_sensor_print_full(struct ipmi_intf * intf, struct sdr_record_full_sensor * sensor) { *************** *** 439,444 **** } ! static void ! ipmi_sensor_print_compact(struct ipmi_intf * intf, struct sdr_record_compact_sensor * sensor) { --- 438,442 ---- } ! void ipmi_sensor_print_compact(struct ipmi_intf * intf, struct sdr_record_compact_sensor * sensor) { *************** *** 597,605 **** ipmi_sensor_print_compact(intf, (struct sdr_record_compact_sensor *) rec); break; - default: - continue; - break; } } } --- 595,602 ---- ipmi_sensor_print_compact(intf, (struct sdr_record_compact_sensor *) rec); break; } + free(rec); } + ipmi_sdr_end(intf, itr); } *************** *** 627,631 **** { printf("sensor thresh <id> <threshold> <setting>\n"); ! printf(" id : name of the sensor for which threshold is to be set\n"); printf(" threshold : which threshold to set\n"); printf(" unr = upper non-recoverable\n"); --- 624,628 ---- { printf("sensor thresh <id> <threshold> <setting>\n"); ! printf(" id : name or number of the sensor for which threshold is to be set\n"); printf(" threshold : which threshold to set\n"); printf(" unr = upper non-recoverable\n"); *************** *** 673,681 **** printf("Locating sensor record...\n"); ! sdr = ipmi_sdr_find_sdr(intf, id); if (sdr) { printf("Setting sensor \"%s\" %s threshold to %.3f\n", ! id, val2str(settingMask, threshold_vals), setting); rsp = ipmi_sensor_set_sensor_thresholds(intf, sdr->keys.sensor_num, --- 670,685 ---- printf("Locating sensor record...\n"); ! /* lookup by sensor name */ ! sdr = ipmi_sdr_find_sdr_byid(intf, id); ! if (!sdr) ! { ! /* lookup by sensor number */ ! unsigned char num = (unsigned char)strtol(id, NULL, 0); ! sdr = ipmi_sdr_find_sdr_bynum(intf, num); ! } if (sdr) { printf("Setting sensor \"%s\" %s threshold to %.3f\n", ! sdr->id_string, val2str(settingMask, threshold_vals), setting); rsp = ipmi_sensor_set_sensor_thresholds(intf, sdr->keys.sensor_num, *************** *** 688,693 **** { printf("Sensor data record not found!\n"); - return; } } --- 692,727 ---- { printf("Sensor data record not found!\n"); } + + ipmi_sdr_list_empty(); + } + + static void ipmi_sensor_get(struct ipmi_intf * intf, char * id) + { + struct sdr_record_full_sensor * sdr; + + if (!id || !strncmp(id, "help", 4)) { + printf("sensor get <id>\n"); + printf(" id : name or number desired sensor\n"); + return; + } + printf("Locating sensor record...\n"); + + /* lookup by sensor name */ + sdr = ipmi_sdr_find_sdr_byid(intf, id); + if (!sdr) { + /* lookup by sensor number */ + unsigned char num = (unsigned char)strtol(id, NULL, 0); + sdr = ipmi_sdr_find_sdr_bynum(intf, num); + } + + if (sdr) { + verbose = verbose ? : 1; + ipmi_sensor_print_full(intf, sdr); + } else { + printf("Sensor data record not found!\n"); + } + + ipmi_sdr_list_empty(); } *************** *** 698,702 **** ipmi_sensor_list(intf); else if (!strncmp(argv[0], "help", 4)) { ! printf("Sensor Commands: list thresh\n"); } else if (!strncmp(argv[0], "list", 4)) { --- 732,736 ---- ipmi_sensor_list(intf); else if (!strncmp(argv[0], "help", 4)) { ! printf("Sensor Commands: list thresh get\n"); } else if (!strncmp(argv[0], "list", 4)) { *************** *** 706,709 **** --- 740,746 ---- ipmi_sensor_set_threshold(intf, argc-1, &argv[1]); } + else if (!strncmp(argv[0], "get", 3)) { + ipmi_sensor_get(intf, argv[1]); + } else printf("Invalid sensor command: %s\n", argv[0]); |