/* return -1 on failout error, 0 on invalid data, 1 otherwise */ static int _sel_parse_record_string (pstdout_state_t pstate, ipmi_sel_ctx_t sel_ctx, uint8_t *sel_record, unsigned int sel_record_len, int debug, unsigned int flags, char outbuf[EVENT_OUTPUT_BUFLEN + 1], int *outbuf_len, const char *fmt) { assert (sel_ctx); assert (outbuf); assert (outbuf_len); memset (outbuf, '\0', EVENT_OUTPUT_BUFLEN+1); if ((*outbuf_len = ipmi_sel_parse_read_record_string (sel_ctx, fmt, sel_record, sel_record_len, outbuf, EVENT_OUTPUT_BUFLEN, flags)) < 0) { if (_sel_parse_err_handle (pstate, sel_ctx, debug, "ipmi_sel_parse_format_record_string") < 0) return (-1); return (0); } return (1); }
static int _ipmi_monitoring_sel_parse_system_event_record (ipmi_monitoring_ctx_t c, struct ipmi_monitoring_sel_record *s, unsigned int sel_flags) { uint32_t timestamp; uint8_t sel_sensor_type; uint8_t sensor_number; uint8_t event_direction; uint8_t event_offset; uint8_t event_type_code; uint8_t event_data1; uint8_t event_data2; uint8_t event_data3; char event_offset_string[IPMI_MONITORING_SEL_EVENT_OFFSET_STRING_MAX + 1]; int sensor_type; unsigned int sel_string_flags; int ret; assert (c); assert (c->magic == IPMI_MONITORING_MAGIC); assert (s); if (ipmi_sel_parse_read_timestamp (c->sel_parse_ctx, NULL, 0, ×tamp) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_timestamp: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } s->timestamp = timestamp; if (ipmi_sel_parse_read_sensor_type (c->sel_parse_ctx, NULL, 0, &sel_sensor_type) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_sensor_type: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } if ((sensor_type = ipmi_monitoring_get_sensor_type (c, sel_sensor_type)) < 0) return (-1); s->sensor_type = sensor_type; if (ipmi_sel_parse_read_sensor_number (c->sel_parse_ctx, NULL, 0, &sensor_number) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_sensor_number: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } s->sensor_number = sensor_number; if (ipmi_sel_parse_read_event_direction (c->sel_parse_ctx, NULL, 0, &event_direction) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_event_direction: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } if (event_direction == IPMI_SEL_RECORD_ASSERTION_EVENT) s->event_direction = IPMI_MONITORING_SEL_EVENT_DIRECTION_ASSERTION; else s->event_direction = IPMI_MONITORING_SEL_EVENT_DIRECTION_DEASSERTION; if (ipmi_sel_parse_read_event_data1_offset_from_event_reading_type_code (c->sel_parse_ctx, NULL, 0, &event_offset) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_event_data1_offset_from_event_reading_type_code: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } s->event_offset = event_offset; if (ipmi_sel_parse_read_event_type_code (c->sel_parse_ctx, NULL, 0, &event_type_code) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_event_type_code: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } s->event_type_code = event_type_code; if ((s->event_offset_type = _get_event_offset_type (c, event_type_code, sel_sensor_type)) < 0) return (-1); if (ipmi_sel_parse_read_event_data1 (c->sel_parse_ctx, NULL, 0, &event_data1) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_event_data1: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } s->event_data1 = event_data1; if (ipmi_sel_parse_read_event_data2 (c->sel_parse_ctx, NULL, 0, &event_data2) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_event_data2: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } s->event_data2 = event_data2; if (ipmi_sel_parse_read_event_data3 (c->sel_parse_ctx, NULL, 0, &event_data3) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_event_data3: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } s->event_data3 = event_data3; sel_string_flags = IPMI_SEL_STRING_FLAGS_IGNORE_UNAVAILABLE_FIELD | IPMI_SEL_STRING_FLAGS_OUTPUT_NOT_AVAILABLE; if (sel_flags & IPMI_MONITORING_SEL_FLAGS_ENTITY_SENSOR_NAMES) sel_string_flags |= IPMI_SEL_STRING_FLAGS_ENTITY_SENSOR_NAMES; if (ipmi_sel_parse_read_record_string (c->sel_parse_ctx, "%s", NULL, 0, s->sensor_name, IPMI_MONITORING_MAX_SENSOR_NAME_LENGTH, sel_string_flags) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_record_string: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } memset (event_offset_string, '\0', IPMI_MONITORING_SEL_EVENT_OFFSET_STRING_MAX + 1); sel_string_flags = IPMI_SEL_STRING_FLAGS_IGNORE_UNAVAILABLE_FIELD | IPMI_SEL_STRING_FLAGS_OUTPUT_NOT_AVAILABLE; if ((ret = ipmi_sel_parse_read_record_string (c->sel_parse_ctx, "%e", NULL, 0, event_offset_string, IPMI_MONITORING_SEL_EVENT_OFFSET_STRING_MAX, sel_string_flags)) < 0) { IPMI_MONITORING_DEBUG (("ipmi_sel_parse_read_record_string: %s", ipmi_sel_ctx_errnum (c->sel_parse_ctx))); _sel_parse_ctx_error_convert (c); return (-1); } if (ret) { if (!(s->event_offset_string = strdup (event_offset_string))) { IPMI_MONITORING_DEBUG (("strdup: %s", strerror (errno))); c->errnum = IPMI_MONITORING_ERR_OUT_OF_MEMORY; return (-1); } } else { /* return empty string */ if (!(s->event_offset_string = strdup (""))) { IPMI_MONITORING_DEBUG (("strdup: %s", strerror (errno))); c->errnum = IPMI_MONITORING_ERR_OUT_OF_MEMORY; return (-1); } } return (0); }