Пример #1
0
/* 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);
}
Пример #2
0
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,
				     &timestamp) < 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);
}