/* 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); }