freeipmi-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Freeipmi-devel] hello-sensors.c


From: Anand Babu
Subject: [Freeipmi-devel] hello-sensors.c
Date: Tue, 23 Mar 2004 05:34:46 -0800
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040113

Hi Robin,
I have attached "hello-sensors.c" example for IPMI Sensors subsystem.
I will work with Albert  in interfacing FreeIPMI with LLNL's SNMP based
monitoring system.

Notes:
hello-sensors.c attempts to demonstrate every feature of IPMI sensors.
(I mean very verbose mode). You wont need most of it. I have added them
just for reference.

Flow is simple:
    main ( )
     -> display_very_verbose_current_sensor
          switch
              case IPMI_SDR_FORMAT_FULL_RECORD:
                  -> display_verbose_current_threshold_sensor_full_record
              case IPMI_SENSOR_CLASS_THRESHOLD:
                  -> display_verbose_current_threshold_sensor_full_record
               ...
               ...

  Just replace  "display_*" functions with your "snmp_feed... " functions.


You can also find the same source under CVS:libfreeipmi/doc/examples/

--
Anand Babu
Free as in Freedom <www.gnu.org>

#include <freeipmi/freeipmi.h>
#include <string.h>
#include <stdlib.h>

#ifdef __ia64__
#define SMS_IO_BASE IPMI_KCS_SMS_IO_BASE_SR870BN4
#else
#define SMS_IO_BASE IPMI_KCS_SMS_IO_BASE_DEFAULT
#endif

int 
get_sdr_total_records (sdr_repo_cache_t *sdr_repo_cache)
{
  return (sdr_repo_cache->total_records);
}

void 
display_verbose_current_threshold_sensor_full_record (sdr_repo_cache_t 
*sdr_repo_cache)
{
  u_int64_t val;
  
  /* requires to decode values */
  short b;
  short m;
  char r_exponent;
  char b_exponent;
  u_int8_t linear;
  u_int8_t is_signed;
  
  u_int8_t base_unit;
  
  u_int8_t sensor_number;
  u_int8_t sensor_type;
  u_int8_t event_reading_type_code;
  double normal_min;
  double normal_max;
  
  fiid_obj_t obj_hdr_rs;
  fiid_obj_t obj_data_rs;
  u_int8_t status;
  
  u_int8_t record_length;
  
  double sensor_reading;
  
  u_int8_t alert_flag = 0;
  
  obj_hdr_rs = alloca (fiid_obj_len_bytes (tmpl_hdr_kcs));
  obj_data_rs = alloca (fiid_obj_len_bytes 
(tmpl_get_sensor_threshold_reading_rs));
  
  ipmi_sensor_get_decode_params (sdr_repo_cache->cache_curr, 
                                 &is_signed, &r_exponent, &b_exponent, 
                                 &linear, &b, &m);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_base_unit", 
                &val);
  base_unit = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "event_reading_type", 
                &val);
  event_reading_type_code = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_number", 
                &val);
  sensor_number = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_type", 
                &val);
  sensor_type = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "normal_min",
                &val);
  normal_min = ipmi_sensor_decode_value (r_exponent,
                                         b_exponent,
                                         m,
                                         b,
                                         linear,
                                         is_signed,
                                         val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "normal_max",
                &val);
  normal_max = ipmi_sensor_decode_value (r_exponent,
                                         b_exponent,
                                         m,
                                         b,
                                         linear,
                                         is_signed,
                                         val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "record_id",
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  {
    char *sensor_name = NULL;
    sensor_name = strndup ((char *) sdr_repo_cache->cache_curr + 48, 
                           (record_length - 48));
    
    printf ("Sensor type: %s (%s)\n", 
            sensor_name, 
            ipmi_get_sensor_group (sensor_type));
    free (sensor_name);
  }
  
  printf ("Sensor number: #%d\n", sensor_number);
  
  printf ("Event/Reading type code: %02Xh\n", event_reading_type_code);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_non_recoverable_threshold",
                &val);
  printf ("Lower non-recoverable threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_non_recoverable_threshold",
                &val);
  printf ("Upper non-recoverable threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_critical_threshold",
                &val);
  printf ("Lower Critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_critical_threshold",
                &val);
  printf ("Upper Critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_non_critical_threshold",
                &val);
  printf ("Lower non-critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_non_critical_threshold",
                &val);
  printf ("Upper non-critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "sensor_min_reading",
                &val);
  printf ("Sensor min. reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "sensor_max_reading",
                &val);
  printf ("Sensor max. reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  printf ("Normal min.: %.2f %s\n", 
          normal_min, 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "nominal_reading", 
                &val);
  printf ("Nominal reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "normal_max",
                &val);
  printf ("Normal max: %.2f %s\n",
          normal_max, 
          ipmi_sensor_units[base_unit]);
  
  status = ipmi_kcs_get_threshold_reading (SMS_IO_BASE, 
                                           sensor_number, 
                                           obj_hdr_rs, 
                                           obj_data_rs);
  
  if (IPMI_COMP_CODE(obj_data_rs) != IPMI_COMMAND_SUCCESS)
    {
      /*       char err_msg[IPMI_ERR_STR_MAX_LEN]; */
      /*       ipmi_strerror_cmd_r (obj_data_rs, err_msg, 
IPMI_ERR_STR_MAX_LEN); */
      status = -1;
    }
  
  if (status == 0)
    {
      fiid_obj_get (obj_data_rs, 
                    tmpl_get_sensor_threshold_reading_rs, 
                    "sensor_reading", 
                    &val);
      sensor_reading = ipmi_sensor_decode_value (r_exponent, 
                                                 b_exponent, 
                                                 m, 
                                                 b, 
                                                 linear, 
                                                 is_signed, 
                                                 (u_int8_t) val);
      printf ("Sensor reading: %.2f %s\n", 
              sensor_reading, 
              ipmi_sensor_units[base_unit]);
      
      fiid_obj_get (obj_data_rs, 
                    tmpl_get_sensor_threshold_reading_rs, 
                    "status_comparison_lower_non_critical_threshold", 
                    &val);
      if (val == 1)
        {
          printf ("Sensor status: at or below (<=) lower non-critical 
threshold\n");
          alert_flag = 1;
        }
      
      fiid_obj_get (obj_data_rs, 
                    tmpl_get_sensor_threshold_reading_rs, 
                    "status_comparison_lower_critical_threshold", 
                    &val);
      if (val == 1)
        {
          printf ("Sensor status: at or below (<=) lower critical threshold\n");
          alert_flag = 1;
        }
      
      fiid_obj_get (obj_data_rs, 
                    tmpl_get_sensor_threshold_reading_rs, 
                    "status_comparison_lower_non_recoverable_threshold", 
                    &val);
      if (val == 1)
        {
          printf ("Sensor status: at or below (<=) lower non-recoverable 
threshold\n");
          alert_flag = 1;
        }
      
      fiid_obj_get (obj_data_rs, 
                    tmpl_get_sensor_threshold_reading_rs, 
                    "status_comparison_upper_non_critical_threshold", 
                    &val);
      if (val == 1)
        {
          printf ("Sensor status: at or above (>=) upper non-critical 
threshold\n");
          alert_flag = 1;
        }
      
      fiid_obj_get (obj_data_rs, 
                    tmpl_get_sensor_threshold_reading_rs, 
                    "status_comparison_upper_critical_threshold", 
                    &val);
      if (val == 1)
        {
          printf ("Sensor status: at or above (>=) upper critical threshold\n");
          alert_flag = 1;
        }
      
      fiid_obj_get (obj_data_rs, 
                    tmpl_get_sensor_threshold_reading_rs, 
                    "status_comparison_upper_non_recoverable_threshold", 
                    &val);
      if (val == 1)
        {
          printf ("Sensor status: at or above (>=) upper non-recoverable 
threshold\n");
          alert_flag = 1;
        }
      
      if (sensor_reading < normal_min || sensor_reading > normal_max)
        alert_flag = 1;
      
      if (alert_flag)
        printf ("Sensor status: ALERT\n");
      else 
        printf ("Sensor status: OK\n");
    }
  else 
    {
      printf ("Sensor reading: N/A\n");
      printf ("Sensor status: FAILED\n");
    }
}

void 
display_verbose_current_digital_discrete_sensor_full_record (sdr_repo_cache_t 
*sdr_repo_cache)
{
  u_int64_t val;
  int i;
  
  /* requires to decode values */
  short b;
  short m;
  char r_exponent;
  char b_exponent;
  u_int8_t linear;
  u_int8_t is_signed;
  
  u_int8_t base_unit;
  
  u_int8_t sensor_number;
  u_int8_t sensor_type;
  u_int8_t event_reading_type_code;
  
  fiid_obj_t obj_hdr_rs;
  fiid_obj_t obj_data_rs;
  u_int8_t status;
  
  u_int8_t record_length;
  
  char *status_message = NULL;
  
  obj_hdr_rs = alloca (fiid_obj_len_bytes (tmpl_hdr_kcs));
  obj_data_rs = alloca (fiid_obj_len_bytes 
(tmpl_get_sensor_discrete_reading_rs));
  
  ipmi_sensor_get_decode_params (sdr_repo_cache->cache_curr, 
                                 &is_signed, &r_exponent, &b_exponent, 
                                 &linear, &b, &m);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_base_unit", 
                &val);
  base_unit = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "event_reading_type", 
                &val);
  event_reading_type_code = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_number", 
                &val);
  sensor_number = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_type", 
                &val);
  sensor_type = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "record_id",
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  {
    char *sensor_name = NULL;
    sensor_name = strndup ((char *) sdr_repo_cache->cache_curr + 48,
                           (record_length - 48));

    printf ("Sensor type: %s (%s)\n",
            sensor_name,
            ipmi_get_sensor_group (sensor_type));
    free (sensor_name);
  }
  
  printf ("Sensor number: #%d\n", sensor_number);
  
  printf ("Event/Reading type code: %02Xh\n", event_reading_type_code);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_non_recoverable_threshold",
                &val);
  printf ("Lower non-recoverable threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_non_recoverable_threshold",
                &val);
  printf ("Upper non-recoverable threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_critical_threshold",
                &val);
  printf ("Lower Critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_critical_threshold",
                &val);
  printf ("Upper Critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_non_critical_threshold",
                &val);
  printf ("Lower non-critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_non_critical_threshold",
                &val);
  printf ("Upper non-critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "sensor_min_reading",
                &val);
  printf ("Sensor min. reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "sensor_max_reading",
                &val);
  printf ("Sensor max. reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "normal_min",
                &val);
  printf ("Normal min.: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "nominal_reading", 
                &val);
  printf ("Nominal reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "normal_max",
                &val);
  printf ("Normal max: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  printf ("Sensor reading: N/A\n");
  
  status = ipmi_kcs_get_discrete_reading (SMS_IO_BASE, 
                                          sensor_number, 
                                          obj_hdr_rs, 
                                          obj_data_rs);
  
  if (IPMI_COMP_CODE(obj_data_rs) != IPMI_COMMAND_SUCCESS)
    {
      /*       char err_msg[IPMI_ERR_STR_MAX_LEN]; */
      /*       ipmi_strerror_cmd_r (obj_data_rs, err_msg, 
IPMI_ERR_STR_MAX_LEN); */
      status = -1;
    }
  
  if (status == 0)
    {
      char key[65];
      
      for (i = 0; 
           ipmi_event_reading_type_code_desc_ptr[event_reading_type_code][i] != 
NULL; 
           i++)
        {
          if (strcasecmp 
(ipmi_event_reading_type_code_desc_ptr[event_reading_type_code][i], 
                          "reserved") == 0)
            continue;
          
          snprintf (key, 64, "state_%d_asserted", i);
          fiid_obj_get (obj_data_rs, 
                        tmpl_get_sensor_discrete_reading_rs, 
                        key, 
                        &val);
          
          if (val == 1)
            {
              status_message = (char 
*)ipmi_event_reading_type_code_desc_ptr[event_reading_type_code][i];
              break;
            }
        }
      if (status_message == NULL)
        status_message = strdupa ("OK");
    }
  else 
    status_message = strdupa ("FAILED");
  
  printf ("Sensor status: [%s]\n", status_message);
}

void 
display_verbose_current_digital_discrete_sensor_compact_record 
(sdr_repo_cache_t *sdr_repo_cache)
{
  u_int64_t val;
  int i;
  
  u_int8_t base_unit;
  
  u_int8_t sensor_number;
  u_int8_t sensor_type;
  u_int8_t event_reading_type_code;
  
  fiid_obj_t obj_hdr_rs;
  fiid_obj_t obj_data_rs;
  u_int8_t status;
  
  u_int8_t record_length;
  
  char *status_message = NULL;
  
  obj_hdr_rs = alloca (fiid_obj_len_bytes (tmpl_hdr_kcs));
  obj_data_rs = alloca (fiid_obj_len_bytes 
(tmpl_get_sensor_discrete_reading_rs));
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "sensor_base_unit", 
                &val);
  base_unit = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "event_reading_type", 
                &val);
  event_reading_type_code = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "sensor_number", 
                &val);
  sensor_number = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "sensor_type", 
                &val);
  sensor_type = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "record_id",
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  {
    char *sensor_name = NULL;
    sensor_name = strndup ((char *) sdr_repo_cache->cache_curr + 48,
                           (record_length - 48));

    printf ("Sensor type: %s (%s)\n",
            sensor_name,
            ipmi_get_sensor_group (sensor_type));
    free (sensor_name);
  }
  
  printf ("Sensor number: #%d\n", sensor_number);
  
  printf ("Event/Reading type code: %02Xh\n", event_reading_type_code);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "positive_hysteresis", 
                &val);
  printf ("Hysteresis +ve: %d\n", (u_int8_t) val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "negative_hysteresis", 
                &val);
  printf ("Hysteresis -ve: %d\n", (u_int8_t) val);
  
  status = ipmi_kcs_get_discrete_reading (SMS_IO_BASE, 
                                          sensor_number, 
                                          obj_hdr_rs, 
                                          obj_data_rs);
  
  if (IPMI_COMP_CODE(obj_data_rs) != IPMI_COMMAND_SUCCESS)
    {
      /*       char err_msg[IPMI_ERR_STR_MAX_LEN]; */
      /*       ipmi_strerror_cmd_r (obj_data_rs, err_msg, 
IPMI_ERR_STR_MAX_LEN); */
      status = -1;
    }
  
  if (status == 0)
    {
      char key[65];
      
      for (i = 0; 
           ipmi_event_reading_type_code_desc_ptr[event_reading_type_code][i] != 
NULL; 
           i++)
        {
          if (strcasecmp 
(ipmi_event_reading_type_code_desc_ptr[event_reading_type_code][i], 
                          "reserved") == 0)
            continue;
          
          snprintf (key, 64, "state_%d_asserted", i);
          fiid_obj_get (obj_data_rs, 
                        tmpl_get_sensor_discrete_reading_rs, 
                        key, 
                        &val);
          
          if (val == 1)
            {
              status_message = (char *) 
ipmi_event_reading_type_code_desc_ptr[event_reading_type_code][i];
              break;
            }
        }
      if (status_message == NULL)
        status_message = strdupa ("OK");
    }
  else 
    status_message = strdupa ("FAILED");
  
  printf ("Sensor status: [%s]\n", status_message);
}

void 
display_verbose_current_discrete_sensor_full_record (sdr_repo_cache_t 
*sdr_repo_cache)
{
  u_int64_t val;
  int i;
  
  /* requires to decode values */
  short b;
  short m;
  char r_exponent;
  char b_exponent;
  u_int8_t linear;
  u_int8_t is_signed;
  
  u_int8_t base_unit;
  
  u_int8_t sensor_number;
  u_int8_t sensor_type;
  u_int8_t event_reading_type_code;
  
  fiid_obj_t obj_hdr_rs;
  fiid_obj_t obj_data_rs;
  u_int8_t status;
  
  u_int8_t record_length;
  
  char *status_message = NULL;
  
  obj_hdr_rs = alloca (fiid_obj_len_bytes (tmpl_hdr_kcs));
  obj_data_rs = alloca (fiid_obj_len_bytes 
(tmpl_get_sensor_discrete_reading_rs));
  
  ipmi_sensor_get_decode_params (sdr_repo_cache->cache_curr, 
                                 &is_signed, &r_exponent, &b_exponent, 
                                 &linear, &b, &m);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_base_unit", 
                &val);
  base_unit = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "event_reading_type", 
                &val);
  event_reading_type_code = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_number", 
                &val);
  sensor_number = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "sensor_type", 
                &val);
  sensor_type = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "record_id",
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  {
    char *sensor_name = NULL;
    sensor_name = strndup ((char *) sdr_repo_cache->cache_curr + 48,
                           (record_length - 48));

    printf ("Sensor type: %s (%s)\n",
            sensor_name,
            ipmi_get_sensor_group (sensor_type));
    free (sensor_name);
  }
  
  printf ("Sensor number: #%d\n", sensor_number);
  
  printf ("Event/Reading type code: %02Xh\n", event_reading_type_code);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_non_recoverable_threshold",
                &val);
  printf ("Lower non-recoverable threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_non_recoverable_threshold",
                &val);
  printf ("Upper non-recoverable threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_critical_threshold",
                &val);
  printf ("Lower Critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_critical_threshold",
                &val);
  printf ("Upper Critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "lower_non_critical_threshold",
                &val);
  printf ("Lower non-critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "upper_non_critical_threshold",
                &val);
  printf ("Upper non-critical threshold: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "sensor_min_reading",
                &val);
  printf ("Sensor min. reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "sensor_max_reading",
                &val);
  printf ("Sensor max. reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val),
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "normal_min",
                &val);
  printf ("Normal min.: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "nominal_reading", 
                &val);
  printf ("Nominal reading: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record,
                "normal_max",
                &val);
  printf ("Normal max: %.2f %s\n",
          ipmi_sensor_decode_value (r_exponent,
                                    b_exponent,
                                    m,
                                    b,
                                    linear,
                                    is_signed,
                                    val), 
          ipmi_sensor_units[base_unit]);
  
  printf ("Sensor reading: N/A\n");
  
  status = ipmi_kcs_get_discrete_reading (SMS_IO_BASE, 
                                          sensor_number, 
                                          obj_hdr_rs, 
                                          obj_data_rs);
  
  if (IPMI_COMP_CODE(obj_data_rs) != IPMI_COMMAND_SUCCESS)
    {
      /*       char err_msg[IPMI_ERR_STR_MAX_LEN]; */
      /*       ipmi_strerror_cmd_r (obj_data_rs, err_msg, 
IPMI_ERR_STR_MAX_LEN); */
      status = -1;
    }
  
  if (status == 0)
    {
      char key[65];
      struct ipmi_discrete_desc *discrete_sensor_desc;
      
      discrete_sensor_desc = (struct ipmi_discrete_desc *) 
        ipmi_sensor_type_desc_ptr[sensor_type];
      
      for (i = 0; discrete_sensor_desc[i].message != NULL; i++)
        {
          if (strcasecmp (discrete_sensor_desc[i].message, "reserved") == 0)
            continue;
          
          snprintf (key, 64, "state_%d_asserted", i);
          fiid_obj_get (obj_data_rs, 
                        tmpl_get_sensor_discrete_reading_rs, 
                        key, 
                        &val);
          
          printf ("%s: [%s]\n", discrete_sensor_desc[i].message, 
                  ((discrete_sensor_desc[i].normal_code == val) ? "OK": 
"ALERT"));
        }
      return;
    }
  else 
    status_message = strdupa ("FAILED");
  
  printf ("Sensor status: [%s]\n", status_message);
}

void 
display_verbose_current_discrete_sensor_compact_record (sdr_repo_cache_t 
*sdr_repo_cache)
{
  u_int64_t val;
  int i;
  
  u_int8_t base_unit;
  
  u_int8_t sensor_number;
  u_int8_t sensor_type;
  u_int8_t event_reading_type_code;
  
  fiid_obj_t obj_hdr_rs;
  fiid_obj_t obj_data_rs;
  u_int8_t status;
  
  u_int8_t record_length;
  
  char *status_message = NULL;
  
  obj_hdr_rs = alloca (fiid_obj_len_bytes (tmpl_hdr_kcs));
  obj_data_rs = alloca (fiid_obj_len_bytes 
(tmpl_get_sensor_discrete_reading_rs));
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "sensor_base_unit", 
                &val);
  base_unit = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_full_sensor_record, 
                "event_reading_type", 
                &val);
  event_reading_type_code = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "sensor_number", 
                &val);
  sensor_number = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "sensor_type", 
                &val);
  sensor_type = val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "record_id",
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  {
    char *sensor_name = NULL;
    sensor_name = strndup ((char *) sdr_repo_cache->cache_curr + 48,
                           (record_length - 48));

    printf ("Sensor type: %s (%s)\n",
            sensor_name,
            ipmi_get_sensor_group (sensor_type));
    free (sensor_name);
  }
  
  printf ("Sensor number: #%d\n", sensor_number);
  
  printf ("Event/Reading type code: %02Xh\n", event_reading_type_code);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "positive_hysteresis", 
                &val);
  printf ("Hysteresis +ve: %d\n", (u_int8_t) val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_compact_sensor_record, 
                "negative_hysteresis", 
                &val);
  printf ("Hysteresis -ve: %d\n", (u_int8_t) val);
  
  status = ipmi_kcs_get_discrete_reading (SMS_IO_BASE, 
                                          sensor_number, 
                                          obj_hdr_rs, 
                                          obj_data_rs);
  
  if (IPMI_COMP_CODE(obj_data_rs) != IPMI_COMMAND_SUCCESS)
    {
      /*       char err_msg[IPMI_ERR_STR_MAX_LEN]; */
      /*       ipmi_strerror_cmd_r (obj_data_rs, err_msg, 
IPMI_ERR_STR_MAX_LEN); */
      status = -1;
    }
  
  if (status == 0)
    {
      char key[65];
      struct ipmi_discrete_desc *discrete_sensor_desc;
      
      discrete_sensor_desc = (struct ipmi_discrete_desc *) 
        ipmi_sensor_type_desc_ptr[sensor_type];
      
      for (i = 0; discrete_sensor_desc[i].message != NULL; i++)
        {
          if (strcasecmp (discrete_sensor_desc[i].message, "reserved") == 0)
            continue;
          
          snprintf (key, 64, "state_%d_asserted", i);
          fiid_obj_get (obj_data_rs, 
                        tmpl_get_sensor_discrete_reading_rs, 
                        key, 
                        &val);
          
          printf ("%s: [%s]\n", discrete_sensor_desc[i].message, 
                  ((discrete_sensor_desc[i].normal_code == val) ? "OK": 
"ALERT"));
        }
      return;
    }
  else 
    status_message = strdupa ("FAILED");
  
  printf ("Sensor status: [%s]\n", status_message);
}

void 
display_verbose_current_oem_sensor_full_record (sdr_repo_cache_t 
*sdr_repo_cache)
{
  /* TODO:: OEM specification is required for implementation */
}

void 
display_verbose_current_oem_sensor_compact_record (sdr_repo_cache_t 
*sdr_repo_cache)
{
  /* TODO:: OEM specification is required for implementation */
}

void 
display_very_verbose_entity_association_record (sdr_repo_cache_t 
*sdr_repo_cache)
{
  u_int64_t val;
  
  u_int8_t record_length;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_entity_association_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_entity_association_sensor_record, 
                "record_id", 
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  printf ("Sensor Number: NONE\n");
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_entity_association_sensor_record, 
                "container_entity_id", 
                &val);
  printf ("Container entity ID: %02Xh\n", (u_int8_t) val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_entity_association_sensor_record, 
                "container_entity_instance", 
                &val);
  printf ("Container entity instance: %02Xh\n", (u_int8_t) val);
}

void 
display_very_verbose_fru_dev_locator_record (sdr_repo_cache_t *sdr_repo_cache)
{
  u_int64_t val;
  int i;
  
  u_int8_t record_length;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_logical_fru_device_locator_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_logical_fru_device_locator_sensor_record, 
                "record_id", 
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  printf ("Sensor Number: NONE\n");
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_logical_fru_device_locator_sensor_record, 
                "device_type", 
                &val);
  printf ("Device type: %02Xh\n", (u_int8_t) val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_logical_fru_device_locator_sensor_record, 
                "device_type_modifier", 
                &val);
  printf ("Device type modifier: %02Xh\n", (u_int8_t) val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_logical_fru_device_locator_sensor_record, 
                "fru_entity_id", 
                &val);
  printf ("FRU entity ID: %02Xh\n", (u_int8_t) val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_logical_fru_device_locator_sensor_record, 
                "fru_entity_instance", 
                &val);
  printf ("FRU entity instance: %02Xh\n", (u_int8_t) val);
  
  printf ("Device name: ");
  for (i = 16; i < record_length; i++)
    printf ("%c", sdr_repo_cache->cache_curr[i]);
  printf ("\n");
}

void 
display_very_verbose_mgmt_control_dev_locator_record (sdr_repo_cache_t 
*sdr_repo_cache)
{
  u_int64_t val;
  int i;
  
  u_int8_t record_length;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_management_controller_device_locator_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_management_controller_device_locator_sensor_record, 
                "record_id", 
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  printf ("Sensor Number: NONE\n");
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_management_controller_device_locator_sensor_record, 
                "entity_id", 
                &val);
  printf ("Entity ID: %02Xh\n", (u_int8_t) val);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_management_controller_device_locator_sensor_record, 
                "entity_instance", 
                &val);
  printf ("Entity instance: %02Xh\n", (u_int8_t) val);
  
  printf ("Device name: ");
  for (i = 16; i < record_length; i++)
    printf ("%c", sdr_repo_cache->cache_curr[i]);
  printf ("\n");
}

void 
display_very_verbose_oem_record (sdr_repo_cache_t *sdr_repo_cache)
{
  u_int64_t val;
  int i;
  
  u_int8_t record_length;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_oem_sensor_record, 
                "record_length", 
                &val);
  record_length = val;
  record_length += fiid_obj_len_bytes (tmpl_sdr_sensor_record_header);
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_oem_sensor_record, 
                "record_id", 
                &val);
  printf ("Record ID: %d\n", (u_int16_t) val);
  
  printf ("Sensor Number: NONE\n");
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_oem_sensor_record, 
                "manufacturer_id", 
                &val);
  printf ("Manufacturer ID: %06Xh\n", (u_int32_t) val);
  
  printf ("OEM Data: ");
  for (i = 8; i < record_length; i++)
    printf ("%02X ", sdr_repo_cache->cache_curr[i]);
  printf ("\n");
}

u_int8_t 
display_very_verbose_current_sensor (sdr_repo_cache_t *sdr_repo_cache)
{
  u_int64_t val;
  
  fiid_obj_get (sdr_repo_cache->cache_curr, 
                tmpl_sdr_sensor_record_header, 
                "record_type", 
                &val);
  
  switch (val)
    {
    case IPMI_SDR_FORMAT_FULL_RECORD:
      switch (ipmi_sdr_repo_cache_sensor_classify (sdr_repo_cache))
        {
        case IPMI_SENSOR_CLASS_THRESHOLD:
          display_verbose_current_threshold_sensor_full_record (sdr_repo_cache);
          fflush (stdout);
          break;
        case IPMI_SENSOR_CLASS_DIGITAL_DISCRETE:
          display_verbose_current_digital_discrete_sensor_full_record 
(sdr_repo_cache);
          fflush (stdout);
          break;
        case IPMI_SENSOR_CLASS_DISCRETE:
          display_verbose_current_discrete_sensor_full_record (sdr_repo_cache);
          fflush (stdout);
          break;
        case IPMI_SENSOR_CLASS_OEM:
          display_verbose_current_oem_sensor_full_record (sdr_repo_cache);
          fflush (stdout);
          break;
        }
      break;
      
    case IPMI_SDR_FORMAT_COMPACT_RECORD:
      switch (ipmi_sdr_repo_cache_sensor_classify (sdr_repo_cache))
        {
        case IPMI_SENSOR_CLASS_DIGITAL_DISCRETE:
          display_verbose_current_digital_discrete_sensor_compact_record 
(sdr_repo_cache);
          fflush (stdout);
          break;
        case IPMI_SENSOR_CLASS_DISCRETE:
          display_verbose_current_discrete_sensor_compact_record 
(sdr_repo_cache);
          fflush (stdout);
          break;
        case IPMI_SENSOR_CLASS_OEM:
          display_verbose_current_oem_sensor_compact_record (sdr_repo_cache);
          fflush (stdout);
          break;
        }
      break;
      
    case IPMI_SDR_FORMAT_ENTITY_ASSO_RECORD:
      display_very_verbose_entity_association_record (sdr_repo_cache);
      fflush (stdout);
      break;
      
    case IPMI_SDR_FORMAT_FRU_DEV_LOCATOR_RECORD:
      display_very_verbose_fru_dev_locator_record (sdr_repo_cache);
      fflush (stdout);
      break;
      
    case IPMI_SDR_FORMAT_MGMT_CNTRLR_DEV_LOCATOR_RECORD:
      display_very_verbose_mgmt_control_dev_locator_record (sdr_repo_cache);
      fflush (stdout);
      break;
      
    case IPMI_SDR_FORMAT_OEM_RECORD:
      display_very_verbose_oem_record (sdr_repo_cache);
      fflush (stdout);
      break;
      
    case IPMI_SDR_FORMAT_EVENT_ONLY_RECORD:
    case IPMI_SDR_FORMAT_DEV_ENTITY_ASSO_RECORD:
    case IPMI_SDR_FORMAT_GEN_DEV_LOCATOR_RECORD:
    case IPMI_SDR_FORMAT_MGMT_CNTRLR_CONFIRMATION_RECORD:
    case IPMI_SDR_FORMAT_BMC_MSG_CHANNEL_INFO_RECORD:
      /* TODO:: needs to implement in libfreeipmi*/
      break;
    }
  return true;
}

int 
main ()
{
  sdr_repo_cache_t sdr_repo_cache;
  char cache_filename[] = "/tmp/sdr-repo.cache";
  int retval;
  int total_records;
  int rec_id;
  
  /* init kcs */
  if (ipmi_kcs_io_init (SMS_IO_BASE, IPMI_KCS_SLEEP_USECS) != 0)
    {
      perror ("ipmi_kcs_io_init");
      exit (-1);
    }
  
  /* creating SDR cache */
  printf ("creating SDR cache file %s\n", cache_filename);
  retval = ipmi_sdr_cache_create (SMS_IO_BASE, cache_filename);
  if (retval)
    {
      fprintf (stderr, "error: ipmi_sdr_cache_create failed\n");
      exit (-1);
    }
  
  sdr_repo_cache.filename = cache_filename;
  
  /* load SDR cache */
  if (ipmi_sdr_repo_cache_load (&sdr_repo_cache))
    {
      fprintf (stderr, "error: ipmi_sdr_repo_cache_load failed\n");
      exit (-1);
    }
  
  /* get total records */
  total_records = get_sdr_total_records (&sdr_repo_cache);
  printf ("Total SDR records: %d\n", total_records);
  
  /* display all records */
  for (rec_id = 1; rec_id <= total_records; rec_id++)
    {
      if (ipmi_sdr_repo_cache_seek (&sdr_repo_cache, rec_id))
        {
          fprintf (stderr, 
                   "error: ipmi_sdr_repo_cache_seek failed on rec_id %d\n", 
                   rec_id);
          break;
        }
      
      display_very_verbose_current_sensor (&sdr_repo_cache);
      printf ("\n\n");
    }
  
  /* alternative way using first/next approach */
  /* 
     if (ipmi_sdr_repo_cache_first (&sdr_repo_cache))
     {
     fprintf (stderr,
     "error: ipmi_sdr_repo_cache_seek failed on rec_id %d\n",
     rec_id);
     if (ipmi_sdr_repo_cache_unload (&sdr_repo_cache))
     {
     fprintf (stderr, "error: ipmi_sdr_repo_cache_unload failed\n");
     exit (-1);
     }
     }
     do
     {
     display_very_verbose_current_sensor (&sdr_repo_cache);
     }
     while (ipmi_sdr_repo_cache_next (&sdr_repo_cache) == 0);
  */
  
  if (ipmi_sdr_repo_cache_unload (&sdr_repo_cache))
    {
      fprintf (stderr, "error: ipmi_sdr_repo_cache_unload failed\n");
      exit (-1);
    }
  
  exit (0);
}
OBJS = hello-sensors
CC = gcc
CFLAGS = -Wall -g -D_GNU_SOURCE
LDFLAGS = -lfreeipmi

all: $(OBJS)

$(OBJS): %: %.c
        $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@

clean:
        rm -f $(OBJS)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]