eeprom read CLI
diff --git a/writefrudata.C b/writefrudata.C
index 91aef45..ae0d1eb 100644
--- a/writefrudata.C
+++ b/writefrudata.C
@@ -1,4 +1,3 @@
-#include <host-ipmid/ipmid-api.h>
#include <vector>
#include <stdlib.h>
#include <dlfcn.h>
@@ -8,17 +7,15 @@
#include "writefrudata.H"
#include <systemd/sd-bus.h>
#include <unistd.h>
-
-
-void register_netfn_storage_write_fru() __attribute__((constructor));
+#include <host-ipmid/ipmid-api.h>
// Needed to be passed into fru parser alorithm
typedef std::vector<fru_area_t> fru_area_vec_t;
// OpenBMC System Manager dbus framework
-const char *bus_name = "org.openbmc.managers.System";
-const char *object_name = "/org/openbmc/managers/System";
-const char *intf_name = "org.openbmc.managers.System";
+const char *sys_bus_name = "org.openbmc.managers.System";
+const char *sys_object_name = "/org/openbmc/managers/System";
+const char *sys_intf_name = "org.openbmc.managers.System";
//------------------------------------------------
// Takes the pointer to stream of bytes and length
@@ -78,7 +75,7 @@
// Inventory
//------------------------------------------------------------------------
int ipmi_update_inventory(const uint8_t fruid, const uint8_t *fru_data,
- fru_area_vec_t & area_vec)
+ fru_area_vec_t & area_vec, sd_bus *bus_type)
{
// Now, use this fru dictionary object and connect with FRU Inventory Dbus
// and update the data for this FRU ID.
@@ -90,9 +87,6 @@
// SD Bus error report mechanism.
sd_bus_error bus_error = SD_BUS_ERROR_NULL;
- // Gets a hook onto either a SYSTEM or SESSION bus
- sd_bus *bus_type = ipmid_get_sd_bus_connection();
-
// Req message contains the specifics about which method etc that we want to
// access on which bus, object
sd_bus_message *response = NULL;
@@ -145,9 +139,9 @@
// We want to call a method "getObjectFromId" on System Bus that is
// made available over OpenBmc system services.
rc = sd_bus_call_method(bus_type, // On the System Bus
- bus_name, // Service to contact
- object_name, // Object path
- intf_name, // Interface name
+ sys_bus_name, // Service to contact
+ sys_object_name, // Object path
+ sys_intf_name, // Interface name
"getObjectFromId", // Method to be called
&bus_error, // object to return error
&response, // Response message on success
@@ -240,7 +234,8 @@
// Validates the CRC and if found good, calls fru areas parser and calls
// Inventory Dbus with the dictionary of Name:Value for updating.
//-------------------------------------------------------------------------
-int ipmi_validate_and_update_inventory(const uint8_t fruid, const uint8_t *fru_data)
+int ipmi_validate_and_update_inventory(const uint8_t fruid, const uint8_t *fru_data,
+ sd_bus *bus_type)
{
// Used for generic checksum calculation
uint8_t checksum = 0;
@@ -249,7 +244,7 @@
uint8_t fru_entry;
// A generic offset locator for any FRU record.
- uint8_t area_offset = 0;
+ size_t area_offset = 0;
// First 2 bytes in the record.
uint8_t fru_area_hdr[2] = {0};
@@ -389,7 +384,7 @@
if(!(fru_area_vec.empty()))
{
- rc = ipmi_update_inventory(fruid, fru_data, fru_area_vec);
+ rc = ipmi_update_inventory(fruid, fru_data, fru_area_vec, bus_type);
}
// We are done with this FRU write packet.
@@ -401,7 +396,8 @@
///-----------------------------------------------------
// Accepts the filename and validates per IPMI FRU spec
//----------------------------------------------------
-int ipmi_validate_fru_area(const uint8_t fruid, const char *fru_file_name)
+int ipmi_validate_fru_area(const uint8_t fruid, const char *fru_file_name,
+ sd_bus *bus_type)
{
int file_size = 0;
uint8_t *fru_data = NULL;
@@ -445,7 +441,7 @@
}
fclose(fru_file);
- rc = ipmi_validate_and_update_inventory(fruid, fru_data);
+ rc = ipmi_validate_and_update_inventory(fruid, fru_data, bus_type);
if(rc == -1)
{
printf("ERROR: Validation failed for:[%d]\n",fruid);
@@ -464,89 +460,3 @@
return rc;
}
-///-------------------------------------------------------
-// Called by IPMI netfn router for write fru data command
-//--------------------------------------------------------
-ipmi_ret_t ipmi_storage_write_fru_data(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
- ipmi_request_t request, ipmi_response_t response,
- ipmi_data_len_t data_len, ipmi_context_t context)
-{
- FILE *fp = NULL;
- char fru_file_name[16] = {0};
- uint8_t offset = 0;
- uint16_t len = 0;
- ipmi_ret_t rc = IPMI_CC_INVALID;
- 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;
-
- // Maintaining a temporary file to pump the data
- sprintf(fru_file_name, "%s%02x", "/tmp/ipmifru", reqptr->frunum);
-
- offset = ((uint16_t)reqptr->offsetms) << 8 | reqptr->offsetls;
-
- // Length is the number of request bytes minus the header itself.
- // The header contains an extra byte to indicate the start of
- // 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
-
-
- if( access( fru_file_name, F_OK ) == -1 ) {
- mode = "wb";
- } else {
- mode = "rb+";
- }
-
- if ((fp = fopen(fru_file_name, mode)) != NULL)
- {
- if(fseek(fp, offset, SEEK_SET))
- {
- perror("Error:");
- fclose(fp);
- return rc;
- }
-
- if(fwrite(&reqptr->data, len, 1, fp) != 1)
- {
- perror("Error:");
- fclose(fp);
- return rc;
- }
-
- fclose(fp);
- }
- else
- {
- fprintf(stderr, "Error trying to write to fru file %s\n",fru_file_name);
- return rc;
- }
-
-
- // 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;
-}
-
-void register_netfn_storage_write_fru()
-{
- printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_STORAGE, IPMI_CMD_WRITE_FRU_DATA);
- ipmi_register_callback(NETFUN_STORAGE, IPMI_CMD_WRITE_FRU_DATA, NULL, ipmi_storage_write_fru_data);
-}