[ipmitool] support setting OS name and Hostname on BMC (#857878)

aledvink aledvink at fedoraproject.org
Wed Oct 17 14:09:30 UTC 2012


commit 8ff094c6f4f628c0afcdb1515e894705739ccc0a
Author: Ales Ledvinka <aledvink at redhat.com>
Date:   Wed Oct 17 16:09:19 2012 +0200

    support setting OS name and Hostname on BMC (#857878)

 ipmitool-cvs-mc-sysinfo-dell.patch | 1655 ++++++++++++++++++++++++++++++++++++
 ipmitool.spec                      |    7 +-
 2 files changed, 1661 insertions(+), 1 deletions(-)
---
diff --git a/ipmitool-cvs-mc-sysinfo-dell.patch b/ipmitool-cvs-mc-sysinfo-dell.patch
new file mode 100644
index 0000000..7070717
--- /dev/null
+++ b/ipmitool-cvs-mc-sysinfo-dell.patch
@@ -0,0 +1,1655 @@
+--- ipmitool-1.8.12/doc/ipmitool.1	2012-05-17 10:52:35.000000000 -0500
++++ ipmitool/doc/ipmitool.1	2012-08-13 13:48:38.000000000 -0500
+@@ -350,6 +350,30 @@ OEM\-Defined option #1
+ .br 
+ 
+ OEM\-Defined option #2
++
++.RE
++.TP
++\fIgetsysinfo\fP <\fBargument\fP>
++Retrieves system info from bmc for given argument.
++.br
++See \fIsetsysinfo\fP for argument definitions
++.TP
++\fIsetsysinfo\fP  <\fBargument\fP> <\fBstring\fP>
++Stores system info string to bmc for given argument
++.RS
++.TP
++Possible arguments are:
++.RS
++.TP
++\fIprimary_os_name\fP     Primary Operating System Name
++.TP
++\fIos_name\fP             Operating System Name
++.TP
++\fIsystem_name\fP         System Name of Server
++.TP
++\fIdelloem_os_version\fP Running versin of operating system
++.TP
++\fIdelloem_URL\fP        URL of BMC Webserver
+ .RE
+ .RE
+ .TP 
+--- ipmitool-1.8.12/lib/ipmi_delloem.c	2012-08-03 12:07:07.000000000 -0500
++++ ipmitool/lib/ipmi_delloem.c	2012-08-14 12:46:30.000000000 -0500
+@@ -216,8 +216,6 @@ static int ipmi_print_power_consmpt_hist
+ static int ipmi_get_power_cap(struct ipmi_intf* intf,IPMI_POWER_CAP* ipmipowercap );
+ static int ipmi_print_power_cap(struct ipmi_intf* intf,uint8_t unit );
+ static int ipmi_set_power_cap(struct ipmi_intf* intf,int unit,int val );
+-static int getpowersupplyfruinfo(struct ipmi_intf *intf, uint8_t id, 
+-                       struct fru_header header, struct fru_info fru);
+ static void ipmi_powermonitor_usage(void);
+ 
+ /* vFlash Function prototypes */
+@@ -663,45 +661,35 @@ ipmi_lcd_get_platform_model_name (struct
+     struct ipmi_rs * rsp = NULL;
+     struct ipmi_rq req = {0};
+     uint8_t data[4];
+-    IPMI_DELL_LCD_STRING * lcdstringblock;
++    IPMI_DELL_LCD_STRING lcdstringblock;
+     int lcdstring_len = 0;
+     int bytes_copied = 0;
++    int rc;
+ 
+     int ii;
+ 
+     for (ii = 0; ii < 4; ii++)
+     {
+         int bytes_to_copy;
+-		memset (&req,0,sizeof(req));
+-        req.msg.netfn = IPMI_NETFN_APP;
+-        req.msg.lun = 0;
+-        req.msg.cmd = IPMI_GET_SYS_INFO;
+-        req.msg.data_len = 4;
+-        req.msg.data = data;
+-        data[0] = 0;                            /* get parameter*/
+-        data[1] = field_type;
+-        data[2] = ii;
+-        data[3] = 0;
+-
+ 
+-        rsp = intf->sendrecv(intf, &req);
+-        if (rsp == NULL) {
++	rc = ipmi_getsysinfo(intf, field_type, ii, 0, 
++			     sizeof(lcdstringblock),
++			     &lcdstringblock);
++        if (rc < 0) {
+             lprintf(LOG_ERR, " Error getting platform model name");
+-        } else if (rsp->ccode > 0) {
++        } else if (rc > 0) {
+             lprintf(LOG_ERR, " Error getting platform model name: %s",
+-                val2str(rsp->ccode, completion_code_vals));
++                val2str(rc, completion_code_vals));
+         }
+ 
+-        lcdstringblock = (IPMI_DELL_LCD_STRING *) (void *) rsp->data;
+-
+         /* first block is different - 14 bytes*/
+         if (0 == ii) {
+-            lcdstring_len = lcdstringblock->lcd_string.selector_0_string.length;
++            lcdstring_len = lcdstringblock.lcd_string.selector_0_string.length;
+ 
+             lcdstring_len = MIN (lcdstring_len,max_length);
+ 
+             bytes_to_copy = MIN(lcdstring_len, IPMI_DELL_LCD_STRING1_SIZE);
+-            memcpy (lcdstring, lcdstringblock->lcd_string.selector_0_string.data, bytes_to_copy);
++            memcpy (lcdstring, lcdstringblock.lcd_string.selector_0_string.data, bytes_to_copy);
+         } else {
+             int string_offset;
+ 
+@@ -709,7 +697,7 @@ ipmi_lcd_get_platform_model_name (struct
+             if (bytes_to_copy < 1)
+                 break;
+             string_offset = IPMI_DELL_LCD_STRING1_SIZE + IPMI_DELL_LCD_STRINGN_SIZE * (ii-1);
+-            memcpy (lcdstring+string_offset, lcdstringblock->lcd_string.selector_n_data, bytes_to_copy);
++            memcpy (lcdstring+string_offset, lcdstringblock.lcd_string.selector_n_data, bytes_to_copy);
+         }
+ 
+ 
+@@ -737,37 +725,25 @@ ipmi_lcd_get_platform_model_name (struct
+ static int
+ ipmi_idracvalidator_command (struct ipmi_intf * intf)
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-
+-    memset (&req,0,sizeof(req));
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;
+-    data[1] = IPMI_DELL_IDRAC_VALIDATOR;
+-    data[2] = 2;
+-    data[3] = 0;
++    int rc;
++    uint8_t data[11];
+ 
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) {
++    rc = ipmi_getsysinfo(intf, IPMI_DELL_IDRAC_VALIDATOR, 2, 0, sizeof(data), data);
++    if (rc < 0) {
+         /*lprintf(LOG_ERR, " Error getting IMC type"); */
+         return -1;
+-    } else if (rsp->ccode > 0) {
++    } else if (rc > 0) {
+         /*lprintf(LOG_ERR, " Error getting IMC type: %s",
+         val2str(rsp->ccode, completion_code_vals));  */
+         return -1;
+ 	}
+ 	/* Support the 11G Monolithic, modular, Maisy and Coaster */
+-	if( (IMC_IDRAC_11G_MONOLITHIC == rsp->data[10]) || (IMC_IDRAC_11G_MODULAR ==rsp->data[10])  ||
+-		(IMC_MASER_LITE_BMC == rsp->data[10]) || (IMC_MASER_LITE_NU ==rsp->data[10])	)
++    if( (IMC_IDRAC_11G_MONOLITHIC == data[10]) || (IMC_IDRAC_11G_MODULAR == data[10])  ||
++	(IMC_MASER_LITE_BMC == data[10]) || (IMC_MASER_LITE_NU == data[10])	)
+     {
+ 		iDRAC_FLAG=IDRAC_11G;
+     }
+-	else if( (IMC_IDRAC_12G_MONOLITHIC == rsp->data[10]) || (IMC_IDRAC_12G_MODULAR==rsp->data[10]) )
++    else if( (IMC_IDRAC_12G_MONOLITHIC == data[10]) || (IMC_IDRAC_12G_MODULAR == data[10]) )
+     {
+ 		iDRAC_FLAG=IDRAC_12G;
+     }
+@@ -775,7 +751,7 @@ ipmi_idracvalidator_command (struct ipmi
+     {
+         iDRAC_FLAG=0;
+     }       
+-    IMC_Type = rsp->data[10];
++    IMC_Type = data[10];
+     
+     return 0;
+ }
+@@ -797,35 +773,20 @@ ipmi_idracvalidator_command (struct ipmi
+ static int
+ ipmi_lcd_get_configure_command_wh (struct ipmi_intf * intf)
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+     uint8_t data[4];
++    int rc;
+ 
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;
+-    data[1] = IPMI_DELL_LCD_CONFIG_SELECTOR;
+-    data[2] = 0;
+-    data[3] = 0;
+-
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) {
++    rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_CONFIG_SELECTOR, 0, 0, sizeof(lcd_mode), &lcd_mode);
++    if (rc < 0) {
+         lprintf(LOG_ERR, " Error getting LCD configuration");
+         return -1;
+-    }else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)){
+-
++    } else if ((rc == 0xc1)||(rc == 0xcb)){
+         lprintf(LOG_ERR, " Error getting LCD configuration: Command not supported on this system."); 
+-
+-    } else if (rsp->ccode > 0) {
++    } else if (rc > 0) {
+         lprintf(LOG_ERR, " Error getting LCD configuration: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+-
+-    lcd_mode= *((LCD_MODE*)(rsp->data));
+     return 0;
+ }
+ 
+@@ -846,40 +807,29 @@ static int
+ ipmi_lcd_get_configure_command (struct ipmi_intf * intf,
+                                 uint8_t *command)
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+     uint8_t data[4];
++    int rc;
+ 
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;
+-    data[1] = IPMI_DELL_LCD_CONFIG_SELECTOR;
+-    data[2] = 0;
+-    data[3] = 0;
+-
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL)
++    rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_CONFIG_SELECTOR, 0, 0, sizeof(data), data);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error getting LCD configuration");
+         return -1;
+     }
+-    else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb))
++    else if ((rc == 0xc1)||(rc == 0xcb))
+     {
+         lprintf(LOG_ERR, " Error getting LCD configuration: Command not supported on this system."); 
+         return -1;
+     }
+-    else if (rsp->ccode > 0) 
++    else if (rc > 0) 
+     {
+         lprintf(LOG_ERR, " Error getting LCD configuration: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+ 
+     /* rsp->data[0] is the rev */
+-    *command = rsp->data[1];
++    *command = data[1];
+ 
+     return 0;
+ }
+@@ -900,35 +850,26 @@ static int
+ ipmi_lcd_set_configure_command (struct ipmi_intf * intf, int command)
+ {
+ #define LSCC_DATA_LEN 2
+-
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+     uint8_t data[2];
++    int rc;
+ 
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_SET_SYS_INFO;
+-    req.msg.data_len = 2;
+-    req.msg.data = data;
+     data[0] = IPMI_DELL_LCD_CONFIG_SELECTOR;
+     data[1] = command;                      /* command - custom, default, none */
+ 
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) 
++    rc = ipmi_setsysinfo(intf, 2, data);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error setting LCD configuration");
+         return -1;
+     }
+-    else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb))
++    else if ((rc == 0xc1)||(rc == 0xcb))
+     {
+         lprintf(LOG_ERR, " Error setting LCD configuration: Command not supported on this system."); 
+-
+     }
+-    else if (rsp->ccode > 0) 
++    else if (rc > 0) 
+     {
+         lprintf(LOG_ERR, " Error setting LCD configuration: %s",
+-            val2str(rsp->ccode, completion_code_vals));
+-
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+ 
+@@ -955,17 +896,10 @@ ipmi_lcd_set_configure_command_wh (struc
+                                    uint8_t errordisp)
+ {
+ #define LSCC_DATA_LEN 2
+-
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+     uint8_t data[13];
++    int rc;
+ 
+     ipmi_lcd_get_configure_command_wh(intf);
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_SET_SYS_INFO;
+-    req.msg.data_len = 13;
+-    req.msg.data = data;
+     data[0] = IPMI_DELL_LCD_CONFIG_SELECTOR;
+ 
+     if(mode!=0xFF)
+@@ -1016,20 +950,21 @@ ipmi_lcd_set_configure_command_wh (struc
+     {
+         data[11]=lcd_mode.error_display;
+     }
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) 
++
++    rc = ipmi_setsysinfo(intf, 13, data);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error setting LCD configuration");
+         return -1;
+     }
+-    else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb))
++    else if ((rc == 0xc1)||(rc == 0xcb))
+     {
+         lprintf(LOG_ERR, " Error setting LCD configuration: Command not supported on this system."); 
+     }
+-    else if (rsp->ccode > 0) 
++    else if (rc > 0) 
+     {
+         lprintf(LOG_ERR, " Error setting LCD configuration: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+ 
+         return -1;
+     }
+@@ -1054,49 +989,34 @@ ipmi_lcd_set_configure_command_wh (struc
+ static int
+ ipmi_lcd_get_single_line_text (struct ipmi_intf * intf, char* lcdstring, uint8_t max_length)
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-    IPMI_DELL_LCD_STRING * lcdstringblock;
++    IPMI_DELL_LCD_STRING lcdstringblock;
+     int lcdstring_len = 0;
+     int bytes_copied = 0;
+-    int ii;
++    int ii, rc;
+ 
+     for (ii = 0; ii < 4; ii++) {
+         int bytes_to_copy;
+ 
+-        req.msg.netfn = IPMI_NETFN_APP;
+-        req.msg.lun = 0;
+-        req.msg.cmd = IPMI_GET_SYS_INFO;
+-        req.msg.data_len = 4;
+-        req.msg.data = data;
+-        data[0] = 0;                            /* get parameter*/
+-        data[1] = IPMI_DELL_LCD_STRING_SELECTOR;
+-        data[2] = ii;                           /* block selector*/
+-        data[3] = 00;                           /* set selector (n/a)*/
+-
+-        rsp = intf->sendrecv(intf, &req);
+-        if (rsp == NULL) {
++	rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_STRING_SELECTOR, ii, 0, sizeof(lcdstringblock), &lcdstringblock);
++	if (rc < 0) {
+             lprintf(LOG_ERR, " Error getting text data");
+             return -1;
+-        } else if (rsp->ccode > 0) {
++        } else if (rc > 0) {
+             lprintf(LOG_ERR, " Error getting text data: %s",
+-                val2str(rsp->ccode, completion_code_vals));
++                val2str(rc, completion_code_vals));
+             return -1;
+         }
+ 
+-        lcdstringblock = (IPMI_DELL_LCD_STRING *) (void *) rsp->data;
+-
+         /* first block is different - 14 bytes*/
+         if (0 == ii)
+         {
+-            lcdstring_len = lcdstringblock->lcd_string.selector_0_string.length;
++            lcdstring_len = lcdstringblock.lcd_string.selector_0_string.length;
+ 
+             if (lcdstring_len < 1 || lcdstring_len > max_length)
+                 break;
+ 
+             bytes_to_copy = MIN(lcdstring_len, IPMI_DELL_LCD_STRING1_SIZE);
+-            memcpy (lcdstring, lcdstringblock->lcd_string.selector_0_string.data, bytes_to_copy);
++            memcpy (lcdstring, lcdstringblock.lcd_string.selector_0_string.data, bytes_to_copy);
+         }
+         else
+         {
+@@ -1106,7 +1026,7 @@ ipmi_lcd_get_single_line_text (struct ip
+             if (bytes_to_copy < 1)
+                 break;
+             string_offset = IPMI_DELL_LCD_STRING1_SIZE + IPMI_DELL_LCD_STRINGN_SIZE * (ii-1);
+-            memcpy (lcdstring+string_offset, lcdstringblock->lcd_string.selector_n_data, bytes_to_copy);
++            memcpy (lcdstring+string_offset, lcdstringblock.lcd_string.selector_n_data, bytes_to_copy);
+         }
+ 
+         bytes_copied += bytes_to_copy;
+@@ -1130,14 +1050,10 @@ static int
+ ipmi_lcd_get_info_wh(struct ipmi_intf * intf)
+ 
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-    IPMI_DELL_LCD_CAPS* lcd_caps;
++    IPMI_DELL_LCD_CAPS lcd_caps;
+     char lcdstring[IPMI_DELL_LCD_STRING_LENGTH_MAX+1] = {0};
+     int rc;
+ 
+-
+     printf("LCD info\n");
+ 
+     if (ipmi_lcd_get_configure_command_wh (intf) != 0) 
+@@ -1165,41 +1081,28 @@ ipmi_lcd_get_info_wh(struct ipmi_intf * 
+         }
+         else if (lcd_mode.lcdmode == IPMI_DELL_LCD_CONFIG_USER_DEFINED) 
+         {
+-            req.msg.netfn = IPMI_NETFN_APP;
+-            req.msg.lun = 0;
+-            req.msg.cmd = IPMI_GET_SYS_INFO;
+-            req.msg.data_len = 4;
+-            req.msg.data = data;
+-            data[0] = 0;                            /* get parameter*/
+-            data[1] = IPMI_DELL_LCD_GET_CAPS_SELECTOR;
+-            data[2] = 0;                            /* set selector (n/a)*/
+-            data[3] = 0;                            /* block selector (n/a)*/
+-
+             printf("    Setting: User defined\n");
+-
+-            rsp = intf->sendrecv(intf, &req);
+-            if (rsp == NULL)
++	    rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_GET_CAPS_SELECTOR, 0, 0, sizeof(lcd_caps), &lcd_caps);
++            if (rc < 0)
+             {
+                 lprintf(LOG_ERR, " Error getting LCD capabilities.");
+                 return -1;
+             }
+-            else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb))
++            else if ((rc == 0xc1)||(rc == 0xcb))
+             {
+                 lprintf(LOG_ERR, " Error getting LCD capabilities: Command not supported on this system.");
+             }
+-            else if (rsp->ccode > 0) 
++            else if (rc > 0) 
+             {
+                 lprintf(LOG_ERR, " Error getting LCD capabilities: %s",
+-                    val2str(rsp->ccode, completion_code_vals));
++                    val2str(rc, completion_code_vals));
+                 return -1;
+             }
+-
+-            lcd_caps = (IPMI_DELL_LCD_CAPS *)rsp->data;
+-            if (lcd_caps->number_lines > 0) 
++            if (lcd_caps.number_lines > 0) 
+             {
+                 memset(lcdstring, 0, IPMI_DELL_LCD_STRING_LENGTH_MAX+1);
+ 
+-                rc = ipmi_lcd_get_single_line_text (intf, lcdstring, lcd_caps->max_chars[0]);
++                rc = ipmi_lcd_get_single_line_text (intf, lcdstring, lcd_caps.max_chars[0]);
+                 printf("    Text:    %s\n", lcdstring);
+             }
+             else 
+@@ -1269,10 +1172,7 @@ ipmi_lcd_get_info_wh(struct ipmi_intf * 
+ ******************************************************************/
+ static int ipmi_lcd_get_info(struct ipmi_intf * intf)
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-    IPMI_DELL_LCD_CAPS * lcd_caps;
++    IPMI_DELL_LCD_CAPS lcd_caps;
+     uint8_t command = 0;
+     char lcdstring[IPMI_DELL_LCD_STRING_LENGTH_MAX+1] = {0};
+     int rc; 
+@@ -1301,40 +1201,28 @@ static int ipmi_lcd_get_info(struct ipmi
+         }
+         else if (command == IPMI_DELL_LCD_CONFIG_USER_DEFINED)
+         {
+-            req.msg.netfn = IPMI_NETFN_APP;
+-            req.msg.lun = 0;
+-            req.msg.cmd = IPMI_GET_SYS_INFO;
+-            req.msg.data_len = 4;
+-            req.msg.data = data;
+-            data[0] = 0;                            /* get parameter */
+-            data[1] = IPMI_DELL_LCD_GET_CAPS_SELECTOR;
+-            data[2] = 0;                            /* set selector (n/a) */
+-            data[3] = 0;                            /* block selector (n/a) */
+-
+             printf("    Setting: custom\n");
+ 
+-            rsp = intf->sendrecv(intf, &req);
+-            if (rsp == NULL)
++            rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_GET_CAPS_SELECTOR, 0, 0, sizeof(lcd_caps), &lcd_caps);
++            if (rc < 0)
+             {
+                 lprintf(LOG_ERR, " Error getting LCD capabilities.");
+                 return -1;
+             }
+-            else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb))
++            else if ((rc == 0xc1)||(rc == 0xcb))
+             {
+                 lprintf(LOG_ERR, " Error getting LCD capabilities: Command not supported on this system.");
+             }
+-            else if (rsp->ccode > 0)
++            else if (rc > 0)
+             {
+                 lprintf(LOG_ERR, " Error getting LCD capabilities: %s",
+-                    val2str(rsp->ccode, completion_code_vals));
++                    val2str(rc, completion_code_vals));
+                 return -1;
+             }
+-
+-            lcd_caps = (IPMI_DELL_LCD_CAPS *)(void *)rsp->data;
+-            if (lcd_caps->number_lines > 0)
++            if (lcd_caps.number_lines > 0)
+             {
+                 memset (lcdstring,0,IPMI_DELL_LCD_STRING_LENGTH_MAX+1);
+-                rc = ipmi_lcd_get_single_line_text (intf, lcdstring, lcd_caps->max_chars[0]);
++                rc = ipmi_lcd_get_single_line_text (intf, lcdstring, lcd_caps.max_chars[0]);
+                 printf("    Text:    %s\n", lcdstring);
+             }
+             else
+@@ -1360,44 +1248,26 @@ static int ipmi_lcd_get_info(struct ipmi
+ static int
+ ipmi_lcd_get_status_val(struct ipmi_intf * intf, LCD_STATUS* lcdstatus)
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-
++    int rc;
+ 
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;                            /* get parameter */
+-    data[1] = IPMI_DELL_LCD_STATUS_SELECTOR;
+-    data[2] = 0;                            /* block selector */
+-    data[3] = 0;            
+-    /* set selector (n/a) */
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) 
++    rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_STATUS_SELECTOR, 0, 0, sizeof(*lcdstatus), lcdstatus);
++    printf("lcd %x %x\n", lcdstatus->vKVM_status, lcdstatus->lock_status);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error getting LCD Status");
+         return -1;
+     }
+-    else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) 
++    else if ((rc == 0xc1)||(rc == 0xcb)) 
+     {
+         lprintf(LOG_ERR, " Error getting LCD status: Command not supported on this system.");
+         return -1;
+     }
+-    else if (rsp->ccode > 0) 
++    else if (rc > 0) 
+     {
+         lprintf(LOG_ERR, " Error getting LCD Status: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+-
+-    /*lcdstatus= (LCD_STATUS* ) rsp->data; */
+-
+-    lcdstatus->vKVM_status=rsp->data[1];
+-    lcdstatus->lock_status=rsp->data[2];
+-
+     return 0;
+ }
+ 
+@@ -1427,36 +1297,13 @@ static int IsLCDSupported ()
+ ******************************************************************/
+ static void CheckLCDSupport(struct ipmi_intf * intf)
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
++    int rc;
+ 
+     LcdSupported = 0;
+-
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;                            /* get parameter */
+-    data[1] = IPMI_DELL_LCD_STATUS_SELECTOR;
+-    data[2] = 0;                            /* block selector */
+-    data[3] = 0;            
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) 
+-    {
+-        return;
+-    }
+-    else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) 
+-    {
+-        return;
+-    }
+-    else if (rsp->ccode > 0) 
+-    {
+-        return;
+-    }
++    rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_STATUS_SELECTOR, 0, 0, 0, NULL);
++    if (rc == 0) {
+     LcdSupported = 1;       
+-
++    }
+ }
+ 
+ /*****************************************************************
+@@ -1644,8 +1491,6 @@ ipmi_lcd_set_lock(struct ipmi_intf * int
+ static int 
+ ipmi_lcd_set_single_line_text (struct ipmi_intf * intf, char * text)
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+     uint8_t data[18];
+     int bytes_to_store = strlen(text);
+     int bytes_stored = 0;
+@@ -1667,11 +1512,6 @@ ipmi_lcd_set_single_line_text (struct ip
+                     MIN((bytes_to_store - bytes_stored), IPMI_DELL_LCD_STRING1_SIZE);
+                 if (size_of_copy < 0)           /* allow 0 string length*/
+                     break;
+-                req.msg.netfn = IPMI_NETFN_APP;
+-                req.msg.lun = 0;
+-                req.msg.cmd = IPMI_SET_SYS_INFO;
+-                req.msg.data_len = size_of_copy + 4; /* chars, selectors and sizes*/
+-                req.msg.data = data;
+                 data[0] = IPMI_DELL_LCD_STRING_SELECTOR;
+                 data[1] = ii;                           /* block number to use (0)*/
+                 data[2] = 0;                            /*string encoding*/
+@@ -1683,24 +1523,18 @@ ipmi_lcd_set_single_line_text (struct ip
+                     MIN((bytes_to_store - bytes_stored), IPMI_DELL_LCD_STRINGN_SIZE);
+                 if (size_of_copy <= 0)
+                     break;
+-                req.msg.netfn = IPMI_NETFN_APP;
+-                req.msg.lun = 0;
+-                req.msg.cmd = IPMI_SET_SYS_INFO;
+-                req.msg.data_len = size_of_copy + 2;
+-                req.msg.data = data;
+                 data[0] = IPMI_DELL_LCD_STRING_SELECTOR;
+                 data[1] = ii;                           /* block number to use (1,2,3)*/
+                 memcpy (data+2, text+bytes_stored, size_of_copy);
+                 bytes_stored += size_of_copy;
+             }
+-
+-            rsp = intf->sendrecv(intf, &req);
+-            if (rsp == NULL) {
++	    rc = ipmi_setsysinfo(intf, 18, data);
++            if (rc < 0) {
+                 lprintf(LOG_ERR, " Error setting text data");
+                 rc = -1;
+-            } else if (rsp->ccode > 0) {
++            } else if (rc > 0) {
+                 lprintf(LOG_ERR, " Error setting text data: %s",
+-                    val2str(rsp->ccode, completion_code_vals));
++                    val2str(rc, completion_code_vals));
+                 rc = -1;
+             }
+         }
+@@ -1726,46 +1560,29 @@ static int
+ ipmi_lcd_set_text(struct ipmi_intf * intf, char * text, int line_number)
+ {
+     int rc = 0;
++    IPMI_DELL_LCD_CAPS lcd_caps;
+ 
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-    IPMI_DELL_LCD_CAPS * lcd_caps;
+-
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;                            /* get parameter*/
+-    data[1] = IPMI_DELL_LCD_GET_CAPS_SELECTOR;
+-    data[2] = 0;                            /* set selector (n/a)*/
+-    data[3] = 0;                            /* block selector (n/a)*/
+-
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) 
++    rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_GET_CAPS_SELECTOR, 0, 0, sizeof(lcd_caps), &lcd_caps);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error getting LCD capabilities");
+         return -1;
+     }
+-    else if (rsp->ccode > 0) 
++    else if (rc > 0)
+     {
+         lprintf(LOG_ERR, " Error getting LCD capabilities: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+ 
+         return -1;
+     }
+ 
+-    lcd_caps = (IPMI_DELL_LCD_CAPS *)(void *)rsp->data;
+-
+-    if (lcd_caps->number_lines > 0) {
++    if (lcd_caps.number_lines > 0) {
+         rc = ipmi_lcd_set_single_line_text (intf, text);
+     } else {
+         lprintf(LOG_ERR, "LCD does not have any lines that can be set");
+         rc = -1;
+     }
+ 
+-
+     return rc;
+ }
+ 
+@@ -2209,7 +2026,6 @@ static int ipmi_macinfo_10g (struct ipmi
+     req.msg.cmd = IPMI_GET_SYS_INFO;
+     req.msg.data = msg_data;
+ 
+-
+     req.msg.data_len = input_length;
+ 
+     rsp = intf->sendrecv(intf, &req);
+@@ -3980,52 +3796,40 @@ static int ipmi_print_get_power_consmpt_
+ ******************************************************************/
+ static int ipmi_get_avgpower_consmpt_history(struct ipmi_intf* intf,IPMI_AVGPOWER_CONSUMP_HISTORY* pavgpower )
+ {
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;
+-    data[1] = 0xeb;
+-    data[2] = 0;
+-    data[3] = 0;
+-
+-    rsp = intf->sendrecv(intf, &req);
++    int rc;
++    uint8_t *rdata;
+ 
+-    if (rsp == NULL)
++    rc = ipmi_getsysinfo(intf, 0xeb, 0, 0, sizeof(*pavgpower), pavgpower);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error getting average power consumption history data .\n");
+         return -1;
+     } 
+-	else if((iDRAC_FLAG == IDRAC_12G) &&  (rsp->ccode == LICENSE_NOT_SUPPORTED)) {
++    else if((iDRAC_FLAG == IDRAC_12G) &&  (rc == LICENSE_NOT_SUPPORTED)) {
+ 		printf("FM001 : A required license is missing or expired\n");
+ 		return -1;	
+-	} else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb))
++    } else if ((rc == 0xc1)||(rc == 0xcb))
+     {
+         lprintf(LOG_ERR, "  Error getting average power consumption  history data: Command not supported on this system.");
+         return -1;
+     }
+-    else if (rsp->ccode != 0)
++    else if (rc != 0)
+     {
+         lprintf(LOG_ERR, "  Error getting average power consumption historydata: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+ 
+         return -1;
+     }
+ 
+     if (verbose > 1)
+     {
++	rdata = (void *)pavgpower;
++
+         printf("Average power consumption history  Data               :%x %x %x %x %x %x %x\n\n",
+-            rsp->data[0], rsp->data[1], rsp->data[2], rsp->data[3], 
+-            rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7]);
++            rdata[0], rdata[1], rdata[2], rdata[3], 
++            rdata[4], rdata[5], rdata[6], rdata[7]);
+ 
+     }
+-
+-    *pavgpower = *( (IPMI_AVGPOWER_CONSUMP_HISTORY*) rsp->data);
+ #if WORDS_BIGENDIAN
+     pavgpower->lastminutepower = BSWAP_16(pavgpower->lastminutepower);
+     pavgpower->lasthourpower = BSWAP_16(pavgpower->lasthourpower);
+@@ -4048,56 +3852,44 @@ static int ipmi_get_avgpower_consmpt_his
+ ******************************************************************/
+ static int ipmi_get_peakpower_consmpt_history(struct ipmi_intf* intf,IPMI_POWER_CONSUMP_HISTORY * pstPeakpower)
+ {
++    uint8_t *rdata;
++    int rc;
+ 
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;
+-    data[1] = 0xec;
+-    data[2] = 0;
+-    data[3] = 0;
+-
+-    rsp = intf->sendrecv(intf, &req);
+-
+-    if (rsp == NULL)
++    rc = ipmi_getsysinfo(intf, 0xEC, 0, 0, sizeof(*pstPeakpower), pstPeakpower);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error getting  peak power consumption history data .\n");
+         return -1;
+     }
+-	else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) {
++    else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) {
+ 		printf("FM001 : A required license is missing or expired\n");
+ 		return -1;	
+-	} else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb))
++    } else if ((rc == 0xc1)||(rc == 0xcb))
+     {
+         lprintf(LOG_ERR, "  Error getting peak power consumption history data: Command not supported on this system.");
+         return -1;
+     }
+-    else if (rsp->ccode != 0)
++    else if (rc != 0)
+     {
+         lprintf(LOG_ERR, "  Error getting peak power consumption history data: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+ 
+     if (verbose > 1)
+     {
++	rdata = (void *)pstPeakpower;
++
+         printf("Peak power consmhistory  Data               : %x %x %x %x %x %x %x %x %x %x\n   %x %x %x %x %x %x %x %x %x %x %x %x %x\n\n",
+-            rsp->data[0], rsp->data[1], rsp->data[2], rsp->data[3], 
+-            rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-            rsp->data[8], rsp->data[9], rsp->data[10], rsp->data[11], 
+-            rsp->data[12], rsp->data[13], rsp->data[14], rsp->data[15], 
+-            rsp->data[16], rsp->data[17], rsp->data[18], rsp->data[19],  
+-            rsp->data[20], rsp->data[21], rsp->data[22], rsp->data[23]
++	       rdata[0], rdata[1], rdata[2], rdata[3], 
++	       rdata[4], rdata[5], rdata[6], rdata[7], 
++	       rdata[8], rdata[9], rdata[10], rdata[11], 
++	       rdata[12], rdata[13], rdata[14], rdata[15], 
++	       rdata[16], rdata[17], rdata[18], rdata[19],  
++	       rdata[20], rdata[21], rdata[22], rdata[23]
+         );
+ 
+     }
+-    *pstPeakpower =* ((IPMI_POWER_CONSUMP_HISTORY*)rsp->data);
+ #if WORDS_BIGENDIAN
+     pstPeakpower->lastminutepower = BSWAP_16(pstPeakpower->lastminutepower);
+     pstPeakpower->lasthourpower = BSWAP_16(pstPeakpower->lasthourpower);
+@@ -4124,56 +3916,43 @@ static int ipmi_get_peakpower_consmpt_hi
+ ******************************************************************/
+ static int ipmi_get_minpower_consmpt_history(struct ipmi_intf* intf,IPMI_POWER_CONSUMP_HISTORY * pstMinpower)
+ {
++    uint8_t *rdata;
++    int rc;
+ 
+-    struct ipmi_rs * rsp = NULL;
+-    struct ipmi_rq req = {0};
+-    uint8_t data[4];
+-
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    data[0] = 0;
+-    data[1] = 0xed;
+-    data[2] = 0;
+-    data[3] = 0;
+-
+-    rsp = intf->sendrecv(intf, &req);
+-
+-    if (rsp == NULL)
++    rc = ipmi_getsysinfo(intf, 0xED, 0, 0, sizeof(*pstMinpower), pstMinpower);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error getting  peak power consumption history data .\n");
+         return -1;
+     }
+-	else if((iDRAC_FLAG == IDRAC_12G) &&  (rsp->ccode == LICENSE_NOT_SUPPORTED)) {
++    else if((iDRAC_FLAG == IDRAC_12G) &&  (rc == LICENSE_NOT_SUPPORTED)) {
+ 		printf("FM001 : A required license is missing or expired\n");
+ 		return -1;	
+-	} else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb))
+-    {
++    } else if ((rc == 0xc1)||(rc == 0xcb)) {
+         lprintf(LOG_ERR, "  Error getting peak power consumption history data: Command not supported on this system.");
+         return -1;
+     }
+-    else if (rsp->ccode != 0)
++    else if (rc != 0)
+     {
+         lprintf(LOG_ERR, "  Error getting peak power consumption history data: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+ 
+     if (verbose > 1)
+     {
++	rdata = (void *)pstMinpower;
++
+         printf("Peak power consmhistory  Data               : %x %x %x %x %x %x %x %x %x %x\n   %x %x %x %x %x %x %x %x %x %x %x %x %x\n\n",
+-            rsp->data[0], rsp->data[1], rsp->data[2], rsp->data[3], 
+-            rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-            rsp->data[8], rsp->data[9], rsp->data[10], rsp->data[11], 
+-            rsp->data[12], rsp->data[13], rsp->data[14], rsp->data[15], 
+-            rsp->data[16], rsp->data[17], rsp->data[18], rsp->data[19],  
+-            rsp->data[20], rsp->data[21], rsp->data[22], rsp->data[23]
++            rdata[0], rdata[1], rdata[2], rdata[3], 
++            rdata[4], rdata[5], rdata[6], rdata[7], 
++            rdata[8], rdata[9], rdata[10], rdata[11], 
++            rdata[12], rdata[13], rdata[14], rdata[15], 
++            rdata[16], rdata[17], rdata[18], rdata[19],  
++            rdata[20], rdata[21], rdata[22], rdata[23]
+         );
+ 
+     }
+-    *pstMinpower =* ((IPMI_POWER_CONSUMP_HISTORY*)rsp->data);
+ #if WORDS_BIGENDIAN
+     pstMinpower->lastminutepower = BSWAP_16(pstMinpower->lastminutepower);
+     pstMinpower->lasthourpower = BSWAP_16(pstMinpower->lasthourpower);
+@@ -4355,70 +4134,35 @@ static int ipmi_print_power_consmpt_hist
+ 
+ static int ipmi_get_power_cap(struct ipmi_intf* intf,IPMI_POWER_CAP* ipmipowercap )
+ {
+-    struct ipmi_rs * rsp=NULL;
+-    struct ipmi_rq req={0};
+     uint64_t tempbtuphrconv;
+-    uint8_t data[4];
+-
+-    /* power supply rating command*/
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-
+-    data[0] = 0;
+-    data[1] = IPMI_DELL_POWER_CAP;
+-    data[2] = 0;
+-    data[3] = 0;
+-
+-
+-    rsp = intf->sendrecv(intf, &req);
++    uint8_t *rdata;
++    int rc;
+ 
+-    if (rsp == NULL) {
++    rc = ipmi_getsysinfo(intf, IPMI_DELL_POWER_CAP, 0, 0, sizeof(*ipmipowercap), ipmipowercap);
++    if (rc < 0) {
+         lprintf(LOG_ERR, " Error getting power cap  .\n");
+-        if (verbose > 1){
+-            printf("power cap  Data               :%x %x %x %x %x %x %x %x %x %x ",
+-                rsp->data[1], rsp->data[2], rsp->data[3], 
+-                rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-                rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]);
+-        }
+         return -1;
+ 
+-	} else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) {
++    } else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) {
+ 		printf("FM001 : A required license is missing or expired\n");
+ 		return -1;	
+-    } else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) {
+-
++    } else if ((rc == 0xc1)||(rc == 0xcb)) {
+         lprintf(LOG_ERR, "  Error getting power cap: Command not supported on this system.");
+-        if (verbose > 1){
+-            printf("power cap  Data               :%x %x %x %x %x %x %x %x %x %x ",
+-                rsp->data[1], rsp->data[2], rsp->data[3], 
+-                rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-                rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]);
+-
+-        }
+         return -1;
+-    } else if (rsp->ccode != 0){
++    } else if (rc != 0){
+         lprintf(LOG_ERR, "  Error getting power cap: %s",
+-            val2str(rsp->ccode, completion_code_vals));
+-        if (verbose > 1){
+-            printf("power cap  Data               :%x %x %x %x %x %x %x %x %x %x ",
+-                rsp->data[1], rsp->data[2], rsp->data[3], 
+-                rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-                rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]);
+-        }
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+     if (verbose > 1){
++	rdata = (void*)ipmipowercap;
++
+         printf("power cap  Data               :%x %x %x %x %x %x %x %x %x %x ",
+-            rsp->data[1], rsp->data[2], rsp->data[3], 
+-            rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-            rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]);
++            rdata[1], rdata[2], rdata[3], 
++            rdata[4], rdata[5], rdata[6], rdata[7], 
++            rdata[8], rdata[9], rdata[10],rdata[11]);
+ 
+     }
+-
+-    * ipmipowercap = *((IPMI_POWER_CAP*)(rsp->data));
+ #if WORDS_BIGENDIAN
+     ipmipowercap->PowerCap = BSWAP_16(ipmipowercap->PowerCap);
+     ipmipowercap->MaximumPowerConsmp = BSWAP_16(ipmipowercap->MaximumPowerConsmp);
+@@ -4485,9 +4229,8 @@ static int ipmi_print_power_cap(struct i
+ ******************************************************************/
+ static int ipmi_set_power_cap(struct ipmi_intf* intf,int unit,int val )
+ {
+-    struct ipmi_rs *rsp = NULL;
+-    struct ipmi_rq req={0};;
+-    uint8_t data[13];
++    int rc;
++    uint8_t data[13], *rdata;
+     uint16_t powercapval;
+     uint64_t maxpowerbtuphr;
+     uint64_t maxpowerbtuphr1;
+@@ -4508,86 +4251,48 @@ static int ipmi_set_power_cap(struct ipm
+         return -1;
+     }
+ 
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    memset(data, 0, 4);
+-    req.msg.data = data;
+-
+-    data[0] = 0;
+-    data[1] = IPMI_DELL_POWER_CAP;
+-    data[2] = 0;
+-    data[3] = 0;
+-
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) 
++    rc = ipmi_getsysinfo(intf, IPMI_DELL_POWER_CAP, 0, 0, sizeof(ipmipowercap), &ipmipowercap);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error getting power cap  .\n");
+-        if (verbose > 1)
+-        {
+-            printf("power cap  Data               :%x %x %x %x %x %x %x %x %x %x ",
+-                rsp->data[1], rsp->data[2], rsp->data[3], 
+-                rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-                rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]);
+-        }
+         return -1;
+-			
+ 	}
+-	else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) {
++    else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) {
+ 		printf("FM001 : A required license is missing or expired\n");
+ 		return -1;	
+ 	} 
+-    else if (rsp->ccode == 0xc1) 
++    else if (rc == 0xc1) 
+     {
+-
+         lprintf(LOG_ERR, "  Error getting power cap, command not supported on this system.\n");
+-        if (verbose > 1){
+-            printf("power cap  Data               :%x %x %x %x %x %x %x %x %x %x ",
+-                rsp->data[1], rsp->data[2], rsp->data[3], 
+-                rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-                rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]);
+-
+-        }
+         return -1;
+     }
+-    else if (rsp->ccode != 0)
++    else if (rc != 0)
+     {
+         lprintf(LOG_ERR, "  Error getting power cap: %s",
+-            val2str(rsp->ccode, completion_code_vals));
+-        if (verbose > 1)
+-        {
+-            printf("power cap  Data               :%x %x %x %x %x %x %x %x %x %x ",
+-                rsp->data[1], rsp->data[2], rsp->data[3], 
+-                rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-                rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]);
+-        }
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+     if (verbose > 1)
+     {
++	rdata = (void *)&ipmipowercap;
+         printf("power cap  Data               :%x %x %x %x %x %x %x %x %x %x ",
+-            rsp->data[1], rsp->data[2], rsp->data[3], 
+-            rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], 
+-            rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]);
++            rdata[1], rdata[2], rdata[3], 
++            rdata[4], rdata[5], rdata[6], rdata[7], 
++            rdata[8], rdata[9], rdata[10],rdata[11]);
+ 
+     }
+-
+-    ipmipowercap.PowerCap=((rsp->data[1]<<8)+rsp->data[2]);
+-    ipmipowercap.unit=rsp->data[3];
+-    ipmipowercap.MaximumPowerConsmp=((rsp->data[4]<<8)+rsp->data[5]);
+-    ipmipowercap.MinimumPowerConsmp=((rsp->data[6]<<8)+rsp->data[7]);
++#if WORDS_BIGENDIAN
++    ipmipowercap.PowerCap = BSWAP_16(ipmipowercap.PowerCap);
++    ipmipowercap.MaximumPowerConsump = BSWAP_16(ipmipowercap.MaximumPowerConsump);
++    ipmipowercap.MinumumPowerConsump = BSWAP_16(ipmipowercap.MinimumPowerConsump);
++    ipmipowercap.AvailablePower = BSWAP_16(ipmipowercap.AvailablePower);
++    ipmipowercap.totalnumpowersupp = BSWP_16(ipmipowercap.totalnumpowersupp);
++#endif
+ 
+     memset(data, 0, 13);
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_SET_SYS_INFO;
+-    req.msg.data_len = 13;
+-    req.msg.data = data;
+     data[0] = IPMI_DELL_POWER_CAP;
+     powercapval=val;
+ 
+-
+     data[1] = (powercapval&0XFF);                   
+     data[2] = ((powercapval&0XFF00)>>8);
+     data[3] = unit;
+@@ -4602,9 +4307,6 @@ static int ipmi_set_power_cap(struct ipm
+     data[11]=(ipmipowercap.SystemThrottling);
+     data[12]=0x00;
+ 
+-    ipmipowercap.MaximumPowerConsmp = BSWAP_16(ipmipowercap.MaximumPowerConsmp);
+-    ipmipowercap.MinimumPowerConsmp = BSWAP_16(ipmipowercap.MinimumPowerConsmp);
+-    ipmipowercap.PowerCap = BSWAP_16(ipmipowercap.PowerCap);
+     if(unit==btuphr)
+     {
+         val = btuphr_to_watt_conversion(val);
+@@ -4641,123 +4343,30 @@ static int ipmi_set_power_cap(struct ipm
+ 
+         return -1;
+     }
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) 
++    rc = ipmi_setsysinfo(intf, 13, data);
++    if (rc < 0)
+     {
+         lprintf(LOG_ERR, " Error setting power cap");
+         return -1;
+     }
+-	else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) {
++    else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) {
+ 		printf("FM001 : A required license is missing or expired\n");
+ 		return -1;	
+ 	} 
+-    else if (rsp->ccode > 0) 
++    else if (rc > 0) 
+     {
+         lprintf(LOG_ERR, " Error setting power cap: %s",
+-            val2str(rsp->ccode, completion_code_vals));
++            val2str(rc, completion_code_vals));
+         return -1;
+     }
+     if (verbose > 1)
+     {
+-        printf("CC for setpowercap :%d ",rsp->ccode);
++        printf("CC for setpowercap :%d ",rc);
+     }
+     return 0;
+ }
+ 
+ /*****************************************************************
+-* Function Name:    getpowersupplyfruinfo
+-*
+-* Description:      This function retrieves the FRU header
+-* Input:            intf    - ipmi interface
+-*                   header  - watt / btuphr
+-*                   fru     - FRU information
+-* Output:           header  - FRU header
+-* Return:           
+-*
+-******************************************************************/
+-static int getpowersupplyfruinfo(struct ipmi_intf *intf, uint8_t id, 
+-                         struct fru_header header, struct fru_info fru)
+-{
+-    struct ipmi_rs * rsp;
+-    struct ipmi_rq req;
+-
+-    uint8_t msg_data[4];
+-
+-    memset(&fru, 0, sizeof(struct fru_info));
+-    memset(&header, 0, sizeof(struct fru_header));
+-
+-    /*
+-    * get info about this FRU
+-    */
+-    memset(msg_data, 0, 4);
+-    msg_data[0] = id;
+-
+-    memset(&req, 0, sizeof(req));
+-    req.msg.netfn = IPMI_NETFN_STORAGE;
+-    req.msg.lun = 0;
+-    req.msg.cmd = GET_FRU_INFO;
+-    req.msg.data = msg_data;
+-    req.msg.data_len = 1;
+-
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) {
+-        printf(" Device not present (No Response)\n");
+-        return -1;
+-    }
+-    if (rsp->ccode > 0) {
+-        printf(" Device not present (%s)\n",
+-            val2str(rsp->ccode, completion_code_vals));
+-        return -1;
+-    }
+-
+-    fru.size = (rsp->data[1] << 8) | rsp->data[0];
+-    fru.access = rsp->data[2] & 0x1;
+-
+-    lprintf(LOG_DEBUG, "fru.size = %d bytes (accessed by %s)",
+-        fru.size, fru.access ? "words" : "bytes");
+-
+-    if (fru.size < 1) {
+-        lprintf(LOG_ERR, " Invalid FRU size %d", fru.size);
+-        return -1;
+-    }
+-
+-    /*
+-    * retrieve the FRU header
+-    */
+-    msg_data[0] = id;
+-    msg_data[1] = 0;
+-    msg_data[2] = 0;
+-    msg_data[3] = 8;
+-
+-    memset(&req, 0, sizeof(req));
+-    req.msg.netfn = IPMI_NETFN_STORAGE;
+-    req.msg.lun = 0;
+-    req.msg.cmd = GET_FRU_DATA;
+-    req.msg.data = msg_data;
+-    req.msg.data_len = 4;
+-
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp == NULL) {
+-        printf(" Device not present (No Response)\n");
+-        return 1;
+-    }
+-    if (rsp->ccode > 0) {
+-        printf(" Device not present (%s)\n",
+-            val2str(rsp->ccode, completion_code_vals));
+-        return 1;
+-    }
+-
+-    if (verbose > 1)
+-        printbuf(rsp->data, rsp->data_len, "FRU DATA");
+-
+-    memcpy(&header, rsp->data + 1, 8);
+-
+-	return 0;
+-
+-
+-}
+-
+-/*****************************************************************
+ * Function Name:   ipmi_powermonitor_usage
+ *
+ * Description:     This function prints help message for powermonitor command
+@@ -5291,53 +4900,3 @@ ipmi_delloem_setled_main(struct ipmi_int
+     /* Set drive LEDs */
+     return ipmi_setled_state (intf, bayId, slotId, mask);
+ }
+-
+-
+-/*****************************************************************
+- * Function Name:       ipmi_getsysinfo
+- *
+- * Description:         This function processes the IPMI Get System Info command
+- * Input:               intf    - ipmi interface
+- *                      param   - Parameter # (0xC0..0xFF = OEM)
+- *                      block/set - Block/Set number of parameter
+- *                      len     - Length of buffer
+- *                      buffer  - Pointer to buffer
+- * Output:        
+- *
+- * Return:              return code     0 - success
+- *                         -1 - failure
+- *                         other = IPMI ccode
+- *
+- ******************************************************************/
+-static int
+-ipmi_getsysinfo(struct ipmi_intf * intf, int param, int block, int set, int len, void *buffer)
+-{
+-    uint8_t data[4];
+-    struct ipmi_rs *rsp = NULL;
+-    struct ipmi_rq req={0};
+-
+-    memset(buffer, 0, len);
+-    memset(data, 0, 4);
+-    req.msg.netfn = IPMI_NETFN_APP;
+-    req.msg.lun = 0;
+-    req.msg.cmd = IPMI_GET_SYS_INFO;
+-    req.msg.data_len = 4;
+-    req.msg.data = data;
+-    
+-    data[0] = 0; // get/set
+-    data[1] = param;
+-    data[2] = block;
+-    data[3] = set;
+-
+-    rsp = intf->sendrecv(intf, &req);
+-    if (rsp != NULL) {
+-        if (rsp->ccode == 0) {
+-            if (len > rsp->data_len)
+-                len = rsp->data_len;
+-            if (len && buffer)
+-                memcpy(buffer, rsp->data, len);
+-        }
+-        return rsp->ccode;
+-    }
+-    return -1;
+-}
+--- ipmitool-1.8.12/lib/ipmi_mc.c	2010-05-04 09:44:19.000000000 -0500
++++ ipmitool/lib/ipmi_mc.c	2012-08-13 13:48:38.000000000 -0500
+@@ -45,6 +45,8 @@
+ 
+ extern int verbose;
+ 
++static int ipmi_sysinfo_main(struct ipmi_intf *intf, int argc, char ** argv);
++
+ /* ipmi_mc_reset  -  attempt to reset an MC
+  *
+  * @intf:	ipmi interface
+@@ -168,10 +170,17 @@ printf_mc_usage(void)
+ 	printf("  selftest\n");
+ 	printf("  getenables\n");
+ 	printf("  setenables <option=on|off> ...\n");
+-
+ 	for (bf = mc_enables_bf; bf->name != NULL; bf++) {
+ 		printf("    %-20s  %s\n", bf->name, bf->desc);
+ 	}
++	printf("  getsysinfo argument\n");
++	printf("  setsysinfo argument string\n");
++	printf("    Valid arguments are:\n");
++        printf("        primary_os_name     Primary operating system name\n");
++        printf("        os_name             Operating system name\n");
++        printf("        system_name         System Name of server (vendor dependent\n");
++        printf("        delloem_os_version  Running version of operating system\n");
++        printf("        delloem_url         Url of bmc webserver\n");
+ }
+ 
+ 
+@@ -793,9 +802,237 @@ ipmi_mc_main(struct ipmi_intf * intf, in
+ 			print_watchdog_usage();
+ 		}
+ 	}
++	else if (!strncmp(argv[0], "getsysinfo", 10) ||
++		 !strncmp(argv[0], "setsysinfo", 10)) {
++	    rc = ipmi_sysinfo_main(intf, argc, argv);
++	}
+ 	else {
+ 		lprintf(LOG_ERR, "Invalid mc/bmc command: %s", argv[0]);
+ 		rc = -1;
+ 	}
+ 	return rc;
+ }
++
++
++static int sysinfo_param(struct ipmi_intf *intf, const char *str, int *maxset)
++{
++    *maxset = 4;
++    if (!strcmp(str, "system_name"))
++	return IPMI_SYSINFO_HOSTNAME;
++    if (!strcmp(str, "primary_os_name"))
++	return IPMI_SYSINFO_PRIMARY_OS_NAME;
++    if (!strcmp(str, "os_name"))
++	return IPMI_SYSINFO_OS_NAME;
++
++    if (!strcmp(str, "delloem_os_version")) {
++	*maxset = 4;
++	return IPMI_SYSINFO_DELL_OS_VERSION;
++    }
++    if (!strcmp(str, "delloem_url")) {
++	*maxset = 2;
++	return IPMI_SYSINFO_DELL_URL;
++    }
++    return strtoul(str, 0, 0);
++    return -1;
++}
++
++static void ipmi_sysinfo_usage()
++{
++    lprintf(LOG_NOTICE, "usage:");
++    lprintf(LOG_NOTICE, "  getsysinfo argument");
++    lprintf(LOG_NOTICE, "    Retrieves system info from bmc for given argument");
++    lprintf(LOG_NOTICE, "  setsysinfo argument string");
++    lprintf(LOG_NOTICE, "    Stores system info string for given argument to bmc");
++    lprintf(LOG_NOTICE, "");
++    lprintf(LOG_NOTICE, "      Valid arguments are:");
++    lprintf(LOG_NOTICE, "        primary_os_name     Primary operating system name");
++    lprintf(LOG_NOTICE, "        os_name             Operating system name");
++    lprintf(LOG_NOTICE, "        system_name         System Name of server (vendor dependent");
++    lprintf(LOG_NOTICE, "        delloem_os_version  Running version of operating system");
++    lprintf(LOG_NOTICE, "        delloem_url         Url of bmc webserver");
++
++    lprintf(LOG_NOTICE, "");
++}
++
++/*****************************************************************
++ * Function Name:       ipmi_getsysinfo
++ *
++ * Description:         This function processes the IPMI Get System Info command
++ * Input:               intf    - ipmi interface
++ *                      param   - Parameter # (0xC0..0xFF = OEM)
++ *                      block/set - Block/Set number of parameter
++ *                      len     - Length of buffer
++ *                      buffer  - Pointer to buffer
++ * Output:        
++ *
++ * Return:              return code     0 - success
++ *                         -1 - failure
++ *                         other = IPMI ccode
++ *
++ ******************************************************************/
++int
++ipmi_getsysinfo(struct ipmi_intf * intf, int param, int block, int set, 
++		int len, void *buffer)
++{
++    uint8_t data[4];
++    struct ipmi_rs *rsp = NULL;
++    struct ipmi_rq req={0};
++
++    memset(buffer, 0, len);
++    memset(data, 0, 4);
++    req.msg.netfn = IPMI_NETFN_APP;
++    req.msg.lun = 0;
++    req.msg.cmd = IPMI_GET_SYS_INFO;
++    req.msg.data_len = 4;
++    req.msg.data = data;
++
++    if (verbose > 1)
++	printf("getsysinfo: %.2x/%.2x/%.2x\n", param, block, set);
++    data[0] = 0; // get/set
++    data[1] = param;
++    data[2] = block;
++    data[3] = set;
++
++    // Format of get output is: 
++    //   u8 param_rev
++    //   u8 selector
++    //   u8 encoding  bit[0-3];
++    //   u8 length
++    //   u8 data0[14]
++    rsp = intf->sendrecv(intf, &req);
++    if (rsp != NULL) {
++        if (rsp->ccode == 0) {
++            if (len > rsp->data_len)
++                len = rsp->data_len;
++            if (len && buffer)
++                memcpy(buffer, rsp->data, len);
++        }
++        return rsp->ccode;
++    }
++    return -1;
++}
++
++/*****************************************************************
++ * Function Name:       ipmi_setsysinfo
++ *
++ * Description:         This function processes the IPMI Set System Info command
++ * Input:               intf    - ipmi interface
++ *                      len     - Length of buffer
++ *                      buffer  - Pointer to buffer
++ * Output:
++ *
++ * Return:              return code     0 - success
++ *                         -1 - failure
++ *                         other = IPMI ccode
++ *
++ ******************************************************************/
++int
++ipmi_setsysinfo(struct ipmi_intf * intf, int len, void *buffer)
++{
++    struct ipmi_rs *rsp = NULL;
++    struct ipmi_rq req={0};
++
++    req.msg.netfn = IPMI_NETFN_APP;
++    req.msg.lun = 0;
++    req.msg.cmd = IPMI_SET_SYS_INFO;
++    req.msg.data_len = len;
++    req.msg.data = buffer;
++    
++    // Format of set input:
++    //   u8 param rev
++    //   u8 selector
++    //   u8 data1[16]
++    rsp = intf->sendrecv(intf, &req);
++    if (rsp != NULL) {
++        return rsp->ccode;
++    }
++    return -1;
++}
++
++
++static int ipmi_sysinfo_main(struct ipmi_intf *intf, int argc, char ** argv)
++{
++    int param, isset;
++    char *str;
++    unsigned char  infostr[256];
++    unsigned char  paramdata[18];
++    int   pos, set, rc, maxset, len;
++
++    /* Is this a setsysinfo or getsysinfo */
++    isset = !strncmp(argv[0], "setsysinfo\0",11);
++
++    if (argc == 1 || strcmp(argv[1], "help") == 0 ||
++	argc < (isset ? 3 : 2)) {
++	ipmi_sysinfo_usage();
++	return 0;
++    }
++    memset(infostr, 0, sizeof(infostr));
++
++    /* Get Parameters */
++    param = sysinfo_param(intf, argv[1], &maxset);
++    if (param < 0) {
++	ipmi_sysinfo_usage();
++	return 0;
++    }
++
++    rc  = 0;
++    if (isset) {
++	str = argv[2];
++	set = pos = 0;
++	len = strlen(str);
++
++	/* first block holds 14 bytes, all others hold 16 */
++	if (((len + 2) + 15) / 16 >= maxset)
++	    len = maxset * 16 - 2;
++	do {
++	    memset(paramdata, 0, sizeof(paramdata));
++	    paramdata[0] = param;
++	    paramdata[1] = set;
++	    if (set == 0) {
++		/* First block is special case */
++		paramdata[2] = 0;   // ascii encoding
++		paramdata[3] = len; // length;
++		strncpy(paramdata+4, str+pos, IPMI_SYSINFO_SET0_SIZE);
++		pos += IPMI_SYSINFO_SET0_SIZE;
++	    } else {
++		strncpy(paramdata+2, str+pos, IPMI_SYSINFO_SETN_SIZE);
++		pos += IPMI_SYSINFO_SETN_SIZE;
++	    }
++	    rc = ipmi_setsysinfo(intf, 18, paramdata);
++	    if (rc)
++		break;
++	    set++;
++	} while (pos < len);
++    } else {
++	/* Read blocks of data */
++	pos = 0;
++	for (set=0; set<maxset; set++) {
++	    rc = ipmi_getsysinfo(intf, param, set, 0, 18, paramdata);
++	    if (rc)
++		break;
++	    if (set == 0) {
++		/* First block is special case */
++		if ((paramdata[2] & 0xF) == 0) {
++		    /* Determine max number of blocks to read */
++		    maxset = ((paramdata[3] + 2) + 15) / 16;
++		}
++		memcpy(infostr+pos, paramdata+4, IPMI_SYSINFO_SET0_SIZE);
++		pos += IPMI_SYSINFO_SET0_SIZE;
++	    } else {
++		memcpy(infostr+pos, paramdata+2, IPMI_SYSINFO_SETN_SIZE);
++		pos += IPMI_SYSINFO_SETN_SIZE;
++	    }
++	}
++	printf("%s\n", infostr);
++    }
++    if (rc < 0) {
++	lprintf(LOG_ERR, "%s %s set %d command failed", argv[0], argv[1], set);
++    } 
++    else if (rc == 0x80) {
++	lprintf(LOG_ERR, "%s %s parameter not supported", argv[0], argv[1]);
++    } 
++    else if (rc > 0) {
++	lprintf(LOG_ERR, "%s %s", argv[0], val2str(rc, completion_code_vals));
++    }
++    return rc;
++}
+--- ipmitool-1.8.12/include/ipmitool/ipmi_delloem.h	2012-07-27 10:21:55.000000000 -0500
++++ ipmitool/include/ipmitool/ipmi_delloem.h	2012-08-14 12:50:18.000000000 -0500
+@@ -39,10 +39,6 @@ POSSIBILITY OF SUCH DAMAGE. 
+ #define MAX(a,b) ((a) > (b) ? (a) : (b))
+ 
+ 
+-/* IPMI 2.0 command for system information*/
+-#define IPMI_SET_SYS_INFO                  0x58
+-#define IPMI_GET_SYS_INFO                  0x59
+-
+ /* Dell selector for LCD control - get and set unless specified */
+ #define IPMI_DELL_LCD_STRING_SELECTOR       0xC1        /* RW get/set the user string */
+ #define IPMI_DELL_LCD_CONFIG_SELECTOR       0xC2        /* RW set to user/default/none */
+@@ -139,6 +135,7 @@ typedef struct _tag_ipmi_dell_lcd_string
+ 
+ typedef struct _lcd_status
+ {
++      char parametersel;
+       char vKVM_status;
+       char lock_status;
+       char Resv1;
+--- ipmitool-1.8.12/include/ipmitool/ipmi_mc.h	2009-06-09 10:38:09.000000000 -0500
++++ ipmitool/include/ipmitool/ipmi_mc.h	2012-08-13 13:48:38.000000000 -0500
+@@ -151,4 +151,20 @@ struct ipm_get_watchdog_rsp {
+ #define IPM_WATCHDOG_CLEAR_BIOS_POST	0x04
+ #define IPM_WATCHDOG_CLEAR_BIOS_FRB2	0x02
+ 
++/* IPMI 2.0 command for system information*/
++#define IPMI_SET_SYS_INFO                  0x58
++#define IPMI_GET_SYS_INFO                  0x59
++#define IPMI_SYSINFO_SET0_SIZE             14
++#define IPMI_SYSINFO_SETN_SIZE             16
++
++#define IPMI_SYSINFO_HOSTNAME		0x02
++#define IPMI_SYSINFO_PRIMARY_OS_NAME	0x03
++#define IPMI_SYSINFO_OS_NAME		0x04
++#define IPMI_SYSINFO_DELL_OS_VERSION	0xe4
++#define IPMI_SYSINFO_DELL_URL		0xde
++
++int ipmi_getsysinfo(struct ipmi_intf * intf, int param, int block, int set, 
++		    int len, void *buffer);
++int ipmi_setsysinfo(struct ipmi_intf * intf, int len, void *buffer);
++
+ #endif				/*IPMI_MC_H */
diff --git a/ipmitool.spec b/ipmitool.spec
index 8455fbf..b49a05e 100644
--- a/ipmitool.spec
+++ b/ipmitool.spec
@@ -1,7 +1,7 @@
 Name:         ipmitool
 Summary:      Utility for IPMI control
 Version:      1.8.12
-Release:      3%{?dist}
+Release:      4%{?dist}
 License:      BSD
 Group:        System Environment/Base
 URL:          http://ipmitool.sourceforge.net/
@@ -23,6 +23,7 @@ Patch3: ipmitool-1.8.11-remove-umask0.patch
 Patch4: ipmitool-1.8.11-systemd.patch
 # https://sourceforge.net/tracker/index.php?func=detail&aid=3564701&group_id=95200&atid=610550
 Patch5: ipmitool-1.8.12-bigendian.patch
+Patch6: ipmitool-cvs-mc-sysinfo-dell.patch
 
 %description
 This package contains a utility for interfacing with devices that support
@@ -47,6 +48,7 @@ setting LAN configuration, and chassis power control.
 %patch3 -p1 -b .umask
 %patch4 -p1 -b .systemd
 %patch5 -p1 -b .bigendian
+%patch6 -p1 -b .mcsysinfodell
 
 for f in AUTHORS ChangeLog; do
     iconv -f iso-8859-1 -t utf8 < ${f} > ${f}.utf8
@@ -97,6 +99,9 @@ install -Dpm 644 %{SOURCE1} %{buildroot}%{_sysconfdir}/sysconfig/ipmievd
 
 
 %changelog
+* Wed Oct 17 2012 Ales Ledvinka <aledvink at redhat.cz> 1.8.12-4
+- support setting OS name and Hostname on BMC
+
 * Tue Sep 04 2012 Dan HorĂ¡k <dan[at]danny.cz> - 1.8.12-3
 - fix build on big endian arches
 


More information about the scm-commits mailing list