[PATCH ipmi-fru-parser] keeping fru files forever

OpenBMC Patches patches at stwcx.xyz
Sun Nov 1 23:21:58 AEDT 2015


From: Chris Austen <austenc at us.ibm.com>

added correct ipmi response buffer
cleaned up a incorrect rc
---
 frup.h         |  7 ++++++-
 writefrudata.C | 45 ++++++++++++++++++++-------------------------
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/frup.h b/frup.h
index 3286260..ef473a8 100644
--- a/frup.h
+++ b/frup.h
@@ -5,7 +5,12 @@
 
 /* Parse an IPMI write fru data message into a dictionary containing name value pair of VPD entries.*/
 int parse_fru (const void* msgbuf, sd_bus_message* vpdtbl);
-int parse_fru_area (const uint8_t area, const void* msgbuf, const uint8_t len, sd_bus_message* vpdtbl);
+
+extern "C" {
+    int parse_fru_area (const uint8_t area, const void* msgbuf, const uint8_t len, sd_bus_message* vpdtbl);
+};
+
+
 
 enum ipmi_fru_area_type
 {
diff --git a/writefrudata.C b/writefrudata.C
index 30ba39a..69bbb47 100644
--- a/writefrudata.C
+++ b/writefrudata.C
@@ -1,4 +1,4 @@
-#include <ipmid-api.h>
+#include <host-ipmid/ipmid-api.h>
 #include <vector>
 #include <stdlib.h>
 #include <dlfcn.h>
@@ -7,6 +7,8 @@
 #include "frup.h"
 #include "writefrudata.H"
 #include <systemd/sd-bus.h>
+#include <unistd.h>
+
 
 void register_netfn_storage_write_fru() __attribute__((constructor));
 
@@ -481,15 +483,11 @@ ipmi_ret_t ipmi_storage_write_fru_data(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
     uint8_t offset = 0;
     uint16_t len = 0;
     ipmi_ret_t rc = IPMI_CC_INVALID;
-    int validate_rc = 0;
     const char *mode = NULL;
 
     // From the payload, extract the header that has fruid and the offsets
     write_fru_data_t *reqptr = (write_fru_data_t*)request;
 
-    // There is no response data for this command.
-    *data_len = 0;
-
     // Maintaining a temporary file to pump the data
     sprintf(fru_file_name, "%s%02x", "/tmp/ipmifru", reqptr->frunum);
 
@@ -500,25 +498,23 @@ ipmi_ret_t ipmi_storage_write_fru_data(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
     // the data (so didn't need to worry about word/byte boundaries)
     // hence the -1...
     len = ((uint16_t)*data_len) - (sizeof(write_fru_data_t)-1);
+
+    // On error there is no response data for this command.
+    *data_len = 0;
     
 #ifdef __IPMI__DEBUG__
     printf("IPMI WRITE-FRU-DATA for [%s]  Offset = [%d] Length = [%d]\n",
             fru_file_name, offset, len);
 #endif
 
-    // offset would be zero if the cmd payload is targeting a new fru
-    if (offset == 0)
-    {
+
+    if( access( fru_file_name, F_OK ) == -1 ) {
         mode = "wb";
-    } 
-    else 
-    {
-        // offset would be non-zero if the cmd payload is continued for prev
-        // fru
+    } else {
         mode = "rb+";
     }
 
-    if ((fp = fopen(fru_file_name, mode)) != NULL) 
+    if ((fp = fopen(fru_file_name, mode)) != NULL)
     {
         if(fseek(fp, offset, SEEK_SET))
         {
@@ -541,18 +537,17 @@ ipmi_ret_t ipmi_storage_write_fru_data(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
         fprintf(stderr, "Error trying to write to fru file %s\n",fru_file_name);
         return rc;
     }
-    
-    // We received some bytes. It may be full or partial. Run a validator.
-    validate_rc = ipmi_validate_fru_area(reqptr->frunum, fru_file_name);
-    if(validate_rc != -1)
-    {
-        // Success validating _and_ updating the Inventory. We no longer need
-        // this file.
-        remove(fru_file_name);
-    }
 
-    // convert the rc per ipmi spec   
-    rc = (validate_rc != -1) ? IPMI_CC_OK : IPMI_CC_INVALID;
+
+    // If we got here then set the resonse byte
+    // to the number of bytes written
+    memcpy(response, &len, 1);
+    *data_len = 1;
+    rc = IPMI_CC_OK;
+
+    // We received some bytes. It may be full or partial. Send a valid
+    // FRU file to the inventory controller on DBus for the correct number
+    ipmi_validate_fru_area(reqptr->frunum, fru_file_name);
 
     return rc;
 }
-- 
2.6.0




More information about the openbmc mailing list