/* return -1 on failout error, 0 on invalid data */
static int
_sel_parse_err_handle (pstdout_state_t pstate,
                       ipmi_sel_ctx_t sel_ctx,
                       int debug,
                       const char *func)
{
  assert (sel_ctx);
  assert (func);
  
  if (ipmi_sel_ctx_errnum (sel_ctx) == IPMI_SEL_ERR_INVALID_SEL_ENTRY)
    {
      /* most likely bad event data from remote system or user input */
      if (debug)
        PSTDOUT_FPRINTF (pstate,
                         stderr,
                         "Invalid data\n");

      return (0);
    }
  
  PSTDOUT_FPRINTF (pstate,
                   stderr,
                   "%s: %s\n",
                   func,
                   ipmi_sel_ctx_errormsg (sel_ctx));
  return (-1);
}
int
ipmi_monitoring_get_sel (ipmi_monitoring_ctx_t c,
                         unsigned int sel_flags,
                         unsigned int *record_ids,
                         unsigned int record_ids_len,
                         unsigned int *sensor_types,
                         unsigned int sensor_types_len,
                         unsigned int *date_begin,
                         unsigned int *date_end)
{
  struct sel_parse_data spd;
  uint16_t *record_ids_tmp = NULL;
  unsigned int i;
  int rv = -1;

  assert (c);
  assert (c->magic == IPMI_MONITORING_MAGIC);
  assert (c->ipmi_ctx);
  assert (c->sel_parse_ctx);
  assert (c->sel_records);

  spd.c = c;
  spd.sel_flags = sel_flags;

  if (record_ids
      && record_ids_len)
    {
      /* ipmi_sel_parse takes uint16_t */

      if (!((record_ids_tmp = malloc (sizeof (uint16_t) * record_ids_len))))
        {
          IPMI_MONITORING_DEBUG (("malloc: %s", strerror (errno)));
          c->errnum = IPMI_MONITORING_ERR_OUT_OF_MEMORY;
          goto cleanup;
        }

      memset (record_ids_tmp, '\0', sizeof (uint16_t) * record_ids_len);

      for (i = 0; i < record_ids_len; i++)
        record_ids_tmp[i] = record_ids[i];
      
      if (ipmi_sel_parse_record_ids (c->sel_parse_ctx,
                                     record_ids_tmp,
                                     record_ids_len,
                                     _ipmi_monitoring_sel_parse_record_id,
                                     &spd) < 0)
        {
          IPMI_MONITORING_DEBUG (("ipmi_sel_parse: %s",
                                  ipmi_sel_ctx_errormsg (c->sel_parse_ctx)));
          _sel_parse_ctx_error_convert (c);
          goto cleanup;
        }
    }
  else if (sensor_types
           && sensor_types_len)
    {
      spd.sensor_types = sensor_types;
      spd.sensor_types_len = sensor_types_len;

      if (ipmi_sel_parse (c->sel_parse_ctx,
                          IPMI_SEL_RECORD_ID_FIRST,
                          IPMI_SEL_RECORD_ID_LAST,
                          _ipmi_monitoring_sel_parse_sensor_types,
                          &spd) < 0)
        {
          IPMI_MONITORING_DEBUG (("ipmi_sel_parse: %s",
                                  ipmi_sel_ctx_errormsg (c->sel_parse_ctx)));
          _sel_parse_ctx_error_convert (c);
          goto cleanup;
        }
    }
  else if (date_begin
           && date_end)
    {
      spd.date_begin = (*date_begin);
      spd.date_end = (*date_end);

      if (ipmi_sel_parse (c->sel_parse_ctx,
                          IPMI_SEL_RECORD_ID_FIRST,
                          IPMI_SEL_RECORD_ID_LAST,
                          _ipmi_monitoring_sel_parse_date_range,
                          &spd) < 0)
        {
          IPMI_MONITORING_DEBUG (("ipmi_sel_parse: %s",
                                  ipmi_sel_ctx_errormsg (c->sel_parse_ctx)));
          _sel_parse_ctx_error_convert (c);
          goto cleanup;
        }
    }
  else
    {
      if (ipmi_sel_parse (c->sel_parse_ctx,
                          IPMI_SEL_RECORD_ID_FIRST,
                          IPMI_SEL_RECORD_ID_LAST,
                          _ipmi_monitoring_sel_parse_record_id,
                          &spd) < 0)
        {
          IPMI_MONITORING_DEBUG (("ipmi_sel_parse: %s",
                                  ipmi_sel_ctx_errormsg (c->sel_parse_ctx)));
          _sel_parse_ctx_error_convert (c);
          goto cleanup;
        }
    }

  rv = 0;
 cleanup:
  free (record_ids_tmp);
  return (rv);
}