diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..ea71ad6
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,99 @@
+---
+Language:        Cpp
+# BasedOnStyle:  LLVM
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlinesLeft: false
+AlignOperands:   true
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: true
+BinPackArguments: true
+BinPackParameters: true
+BraceWrapping:
+  AfterClass:      true
+  AfterControlStatement: true
+  AfterEnum:       true
+  AfterFunction:   true
+  AfterNamespace:  true
+  AfterObjCDeclaration: true
+  AfterStruct:     true
+  AfterUnion:      true
+  BeforeCatch:     true
+  BeforeElse:      true
+  IndentBraces:    false
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Custom
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: AfterColon
+ColumnLimit:     80
+CommentPragmas:  '^ IWYU pragma:'
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DerivePointerAlignment: false
+PointerAlignment: Left
+DisableFormat:   false
+ExperimentalAutoDetectBinPacking: false
+FixNamespaceComments: true
+ForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]
+IncludeBlocks: Regroup
+IncludeCategories:
+  - Regex:           '^[<"](gtest|gmock)'
+    Priority:        5
+  - Regex:           '^"config.h"'
+    Priority:        -1
+  - Regex:           '^".*\.hpp"'
+    Priority:        1
+  - Regex:           '^<.*\.h>'
+    Priority:        2
+  - Regex:           '^<.*'
+    Priority:        3
+  - Regex:           '.*'
+    Priority:        4
+IndentCaseLabels: true
+IndentWidth:     4
+IndentWrappedFunctionNames: true
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: ''
+MacroBlockEnd:   ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 60
+ReflowComments:  true
+SortIncludes:    true
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles:  false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard:        Cpp11
+TabWidth:        4
+UseTab:          Never
+...
+
diff --git a/argument.cpp b/argument.cpp
index a988ca5..f46206a 100644
--- a/argument.cpp
+++ b/argument.cpp
@@ -1,13 +1,14 @@
-#include <iostream>
-#include <iterator>
+#include "argument.hpp"
+
 #include <algorithm>
 #include <cassert>
-#include "argument.hpp"
+#include <iostream>
+#include <iterator>
 
 ArgumentParser::ArgumentParser(int argc, char** argv)
 {
     int option = 0;
-    while(-1 != (option = getopt_long(argc, argv, optionstr, options, NULL)))
+    while (-1 != (option = getopt_long(argc, argv, optionstr, options, NULL)))
     {
         if ((option == '?') || (option == 'h'))
         {
@@ -16,7 +17,8 @@
         }
 
         auto i = &options[0];
-        while ((i->val != option) && (i->val != 0)) ++i;
+        while ((i->val != option) && (i->val != 0))
+            ++i;
 
         if (i->val)
             arguments[i->name] = (i->has_arg ? optarg : true_string);
@@ -41,19 +43,17 @@
     std::cerr << "Usage: " << argv[0] << " [options]" << std::endl;
     std::cerr << "Options:" << std::endl;
     std::cerr << " --eeprom=<eeprom file path> Absolute file name of eeprom"
-        << std::endl;
+              << std::endl;
     std::cerr << " --fruid=<FRU ID>            valid fru id in integer"
-        << std::endl;
-    std::cerr << " --help                      display help"
-        << std::endl;
+              << std::endl;
+    std::cerr << " --help                      display help" << std::endl;
 }
 
-const option ArgumentParser::options[] =
-{
-    { "eeprom",   required_argument,  NULL, 'e' },
-    { "fruid",    required_argument,  NULL, 'f' },
-    { "help",     no_argument,        NULL, 'h' },
-    { 0, 0, 0, 0},
+const option ArgumentParser::options[] = {
+    {"eeprom", required_argument, NULL, 'e'},
+    {"fruid", required_argument, NULL, 'f'},
+    {"help", no_argument, NULL, 'h'},
+    {0, 0, 0, 0},
 };
 
 const char* ArgumentParser::optionstr = "e:f:?h";
diff --git a/argument.hpp b/argument.hpp
index bd3b0b2..849ccb5 100644
--- a/argument.hpp
+++ b/argument.hpp
@@ -1,27 +1,28 @@
 #ifndef __ARGUMENT_H
 #define __ARGUMENT_H
 #include <getopt.h>
+
 #include <map>
 #include <string>
 class ArgumentParser
 {
-    public:
-        ArgumentParser(int argc, char** argv);
-        const std::string& operator[](const std::string& opt);
+  public:
+    ArgumentParser(int argc, char** argv);
+    const std::string& operator[](const std::string& opt);
 
-        static void usage(char** argv);
+    static void usage(char** argv);
 
-        static const std::string true_string;
-        static const std::string empty_string;
+    static const std::string true_string;
+    static const std::string empty_string;
 
-    private:
-        std::map<const std::string, std::string> arguments;
+  private:
+    std::map<const std::string, std::string> arguments;
 
-        static const option options[];
-        static const char* optionstr;
+    static const option options[];
+    static const char* optionstr;
 
-    private:
-        ArgumentParser() {};
+  private:
+    ArgumentParser(){};
 };
 
 #endif
diff --git a/fru-area.hpp b/fru-area.hpp
index d040a9c..278b46f 100644
--- a/fru-area.hpp
+++ b/fru-area.hpp
@@ -1,154 +1,156 @@
 #ifndef __IPMI_FRU_AREA_H__
 #define __IPMI_FRU_AREA_H__
 
-#include <stdint.h>
-#include <stddef.h>
-#include <systemd/sd-bus.h>
-#include <string>
-#include <vector>
-#include <memory>
 #include "frup.hpp"
 #include "writefrudata.hpp"
 
+#include <stddef.h>
+#include <stdint.h>
+#include <systemd/sd-bus.h>
+
+#include <memory>
+#include <string>
+#include <vector>
+
 class ipmi_fru;
 typedef std::vector<std::unique_ptr<ipmi_fru>> fru_area_vec_t;
 
 class ipmi_fru
 {
-    private:
-        // Unique way of identifying a FRU
-        uint8_t iv_fruid = 0;
+  private:
+    // Unique way of identifying a FRU
+    uint8_t iv_fruid = 0;
 
-        // Type of the fru matching offsets in common header
-        ipmi_fru_area_type iv_type = IPMI_FRU_AREA_INTERNAL_USE;
+    // Type of the fru matching offsets in common header
+    ipmi_fru_area_type iv_type = IPMI_FRU_AREA_INTERNAL_USE;
 
-        // Name of the fru area. ( BOARD/CHASSIS/PRODUCT )
-        std::string iv_name;
+    // Name of the fru area. ( BOARD/CHASSIS/PRODUCT )
+    std::string iv_name;
 
-        // Length of a specific fru area.
-        size_t  iv_len = 0;
+    // Length of a specific fru area.
+    size_t iv_len = 0;
 
-        // Special bit for BMC readable eeprom only.
-        bool iv_bmc_fru = false;
+    // Special bit for BMC readable eeprom only.
+    bool iv_bmc_fru = false;
 
-        // If a FRU is physically present.
-        bool iv_present = false;
+    // If a FRU is physically present.
+    bool iv_present = false;
 
-        // Whether a particular area is valid ?
-        bool iv_valid = false;
+    // Whether a particular area is valid ?
+    bool iv_valid = false;
 
-        // Actual area data.
-        uint8_t *iv_data = nullptr;
+    // Actual area data.
+    uint8_t* iv_data = nullptr;
 
-        // fru inventory dbus name
-        std::string iv_bus_name;
+    // fru inventory dbus name
+    std::string iv_bus_name;
 
-        // fru inventory dbus object path
-        std::string iv_obj_path;
+    // fru inventory dbus object path
+    std::string iv_obj_path;
 
-        // fru inventory dbus interface name
-        std::string iv_intf_name;
+    // fru inventory dbus interface name
+    std::string iv_intf_name;
 
-        // sd_bus handle
-        sd_bus *iv_bus_type = nullptr;
+    // sd_bus handle
+    sd_bus* iv_bus_type = nullptr;
 
-        // Default constructor disabled.
-        ipmi_fru();
+    // Default constructor disabled.
+    ipmi_fru();
 
-    public:
-        // constructor
-        ipmi_fru(const uint8_t fruid, const ipmi_fru_area_type type,
-                 sd_bus *bus_type, bool bmc_fru = false);
+  public:
+    // constructor
+    ipmi_fru(const uint8_t fruid, const ipmi_fru_area_type type,
+             sd_bus* bus_type, bool bmc_fru = false);
 
-        // Destructor
-        virtual ~ipmi_fru();
+    // Destructor
+    virtual ~ipmi_fru();
 
-        // If a particular area has been marked valid / invalid
-        inline bool is_valid() const
-        {
-            return iv_valid;
-        }
+    // If a particular area has been marked valid / invalid
+    inline bool is_valid() const
+    {
+        return iv_valid;
+    }
 
-        // Sets the present bit
-        inline void set_present(const bool present)
-        {
-            iv_present = present;
-        }
+    // Sets the present bit
+    inline void set_present(const bool present)
+    {
+        iv_present = present;
+    }
 
-        // Sets the valid bit for a corresponding area.
-        inline void set_valid(const bool valid)
-        {
-            iv_valid = valid;
-        }
+    // Sets the valid bit for a corresponding area.
+    inline void set_valid(const bool valid)
+    {
+        iv_valid = valid;
+    }
 
-        // If a particular area accessible only by BMC
-        inline bool is_bmc_fru() const
-        {
-            return iv_bmc_fru;
-        }
+    // If a particular area accessible only by BMC
+    inline bool is_bmc_fru() const
+    {
+        return iv_bmc_fru;
+    }
 
-        // returns fru id;
-        uint8_t get_fruid() const
-        {
-            return iv_fruid;
-        }
+    // returns fru id;
+    uint8_t get_fruid() const
+    {
+        return iv_fruid;
+    }
 
-        // Returns the length.
-        size_t get_len() const
-        {
-            return iv_len;
-        }
+    // Returns the length.
+    size_t get_len() const
+    {
+        return iv_len;
+    }
 
-        // Returns the type of the current fru area
-        ipmi_fru_area_type get_type() const
-        {
-            return iv_type;
-        }
+    // Returns the type of the current fru area
+    ipmi_fru_area_type get_type() const
+    {
+        return iv_type;
+    }
 
-        // Returns the name
-        const char *get_name() const
-        {
-            return iv_name.c_str();
-        }
+    // Returns the name
+    const char* get_name() const
+    {
+        return iv_name.c_str();
+    }
 
-        // Returns SD bus name
-        const char *get_bus_name() const
-        {
-            return iv_bus_name.c_str();
-        }
+    // Returns SD bus name
+    const char* get_bus_name() const
+    {
+        return iv_bus_name.c_str();
+    }
 
-        // Retrns SD bus object path
-        const char *get_obj_path() const
-        {
-            return iv_obj_path.c_str();
-        }
+    // Retrns SD bus object path
+    const char* get_obj_path() const
+    {
+        return iv_obj_path.c_str();
+    }
 
-        // Returns SD bus interface name
-        const char *get_intf_name() const
-        {
-            return iv_intf_name.c_str();
-        }
+    // Returns SD bus interface name
+    const char* get_intf_name() const
+    {
+        return iv_intf_name.c_str();
+    }
 
-        // Returns the data portion
-        inline uint8_t *get_data() const
-        {
-           return iv_data;
-        }
+    // Returns the data portion
+    inline uint8_t* get_data() const
+    {
+        return iv_data;
+    }
 
-        // Returns the bus type.
-        inline sd_bus *get_bus_type() const
-        {
-            return iv_bus_type;
-        }
+    // Returns the bus type.
+    inline sd_bus* get_bus_type() const
+    {
+        return iv_bus_type;
+    }
 
-        // Sets up the sd_bus variables for the given AREA type
-        int setup_sd_bus_paths(void);
+    // Sets up the sd_bus variables for the given AREA type
+    int setup_sd_bus_paths(void);
 
-        // Accepts a pointer to data and sets it in the object.
-        void set_data(const uint8_t *, const size_t);
+    // Accepts a pointer to data and sets it in the object.
+    void set_data(const uint8_t*, const size_t);
 
-        // Sets the dbus parameters
-        void update_dbus_paths(const char *, const char *, const char *);
+    // Sets the dbus parameters
+    void update_dbus_paths(const char*, const char*, const char*);
 };
 
 #endif
diff --git a/frup.cpp b/frup.cpp
index 8009b3e..b3b2942 100644
--- a/frup.cpp
+++ b/frup.cpp
@@ -39,52 +39,53 @@
  *  You should have received a copy of the GNU General Public License along
  *  with Ipmi-fru.  If not, see <http://www.gnu.org/licenses/>.
 \*****************************************************************************/
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <time.h>
-#include <systemd/sd-bus.h>
-#include <ctype.h>
 #include "frup.hpp"
 
-#define TEXTSTR(a) #a
-# define ASSERT(x) \
-do { \
-if (0 == (x)) { \
-fprintf(stderr, \
-"Assertion failed: %s, " \
-"%d at \'%s\'\n", \
-__FILE__, \
-__LINE__, \
-TEXTSTR(a)); \
-return -1; \
-} \
-} while (0)
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <systemd/sd-bus.h>
+#include <time.h>
+#include <unistd.h>
 
-#define IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX            512
-#define IPMI_FRU_SENTINEL_VALUE                        0xC1
-#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK            0xC0
-#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT           0x06
+#define TEXTSTR(a) #a
+#define ASSERT(x)                                                              \
+    do                                                                         \
+    {                                                                          \
+        if (0 == (x))                                                          \
+        {                                                                      \
+            fprintf(stderr,                                                    \
+                    "Assertion failed: %s, "                                   \
+                    "%d at \'%s\'\n",                                          \
+                    __FILE__, __LINE__, TEXTSTR(a));                           \
+            return -1;                                                         \
+        }                                                                      \
+    } while (0)
+
+#define IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX 512
+#define IPMI_FRU_SENTINEL_VALUE 0xC1
+#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK 0xC0
+#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT 0x06
 #define IPMI_FRU_TYPE_LENGTH_NUMBER_OF_DATA_BYTES_MASK 0x3F
-#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_LANGUAGE_CODE   0x03
+#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_LANGUAGE_CODE 0x03
 
 /* OpenBMC defines for Parser */
-#define IPMI_FRU_AREA_INTERNAL_USE                     0x00
-#define IPMI_FRU_AREA_CHASSIS_INFO                     0x01
-#define IPMI_FRU_AREA_BOARD_INFO                       0x02
-#define IPMI_FRU_AREA_PRODUCT_INFO                     0x03
-#define IPMI_FRU_AREA_MULTI_RECORD                     0x04
-#define IPMI_FRU_AREA_TYPE_MAX                         0x05
+#define IPMI_FRU_AREA_INTERNAL_USE 0x00
+#define IPMI_FRU_AREA_CHASSIS_INFO 0x01
+#define IPMI_FRU_AREA_BOARD_INFO 0x02
+#define IPMI_FRU_AREA_PRODUCT_INFO 0x03
+#define IPMI_FRU_AREA_MULTI_RECORD 0x04
+#define IPMI_FRU_AREA_TYPE_MAX 0x05
 
-#define OPENBMC_VPD_KEY_LEN                            64
-#define OPENBMC_VPD_VAL_LEN                            512
+#define OPENBMC_VPD_KEY_LEN 64
+#define OPENBMC_VPD_VAL_LEN 512
 
 struct ipmi_fru_field
 {
-  uint8_t type_length_field[IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX];
-  /* store length of data stored in buffer */
-  unsigned int type_length_field_length;
+    uint8_t type_length_field[IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX];
+    /* store length of data stored in buffer */
+    unsigned int type_length_field_length;
 };
 
 typedef struct ipmi_fru_field ipmi_fru_field_t;
@@ -108,622 +109,523 @@
     uint8_t multirec;
 } __attribute__((packed)) ipmi_fru_common_hdr_t;
 
-const char* vpd_key_names [] =
-{
-  "Key Names Table Start",
-  "Type", /*OPENBMC_VPD_KEY_CHASSIS_TYPE*/
-  "Part Number", /*OPENBMC_VPD_KEY_CHASSIS_PART_NUM,*/
-  "Serial Number", /*OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,*/
-  "Custom Field 1", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM1,*/
-  "Custom Field 2", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM2,*/
-  "Custom Field 3", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM3,*/
-  "Custom Field 4", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM4,*/
-  "Custom Field 5", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM5,*/
-  "Custom Field 6", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM6,*/
-  "Custom Field 7", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM7,*/
-  "Custom Field 8", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,*/
+const char* vpd_key_names[] = {
+    "Key Names Table Start",
+    "Type",           /*OPENBMC_VPD_KEY_CHASSIS_TYPE*/
+    "Part Number",    /*OPENBMC_VPD_KEY_CHASSIS_PART_NUM,*/
+    "Serial Number",  /*OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,*/
+    "Custom Field 1", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM1,*/
+    "Custom Field 2", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM2,*/
+    "Custom Field 3", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM3,*/
+    "Custom Field 4", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM4,*/
+    "Custom Field 5", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM5,*/
+    "Custom Field 6", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM6,*/
+    "Custom Field 7", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM7,*/
+    "Custom Field 8", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,*/
 
-  "Mfg Date", /* OPENBMC_VPD_KEY_BOARD_MFG_DATE, */ /* not a type/len */
-  "Manufacturer", /* OPENBMC_VPD_KEY_BOARD_MFR, */
-  "Name", /* OPENBMC_VPD_KEY_BOARD_NAME, */
-  "Serial Number", /* OPENBMC_VPD_KEY_BOARD_SERIAL_NUM, */
-  "Part Number", /* OPENBMC_VPD_KEY_BOARD_PART_NUM, */
-  "FRU File ID", /* OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID, */
-  "Custom Field 1", /*OPENBMC_VPD_KEY_BOARD_CUSTOM1,*/
-  "Custom Field 2", /*OPENBMC_VPD_KEY_BOARD_CUSTOM2,*/
-  "Custom Field 3", /*OPENBMC_VPD_KEY_BOARD_CUSTOM3,*/
-  "Custom Field 4", /*OPENBMC_VPD_KEY_BOARD_CUSTOM4,*/
-  "Custom Field 5", /*OPENBMC_VPD_KEY_BOARD_CUSTOM5,*/
-  "Custom Field 6", /*OPENBMC_VPD_KEY_BOARD_CUSTOM6,*/
-  "Custom Field 7", /*OPENBMC_VPD_KEY_BOARD_CUSTOM7,*/
-  "Custom Field 8", /*OPENBMC_VPD_KEY_BOARD_CUSTOM8,*/
+    "Mfg Date",
+    /* OPENBMC_VPD_KEY_BOARD_MFG_DATE, */ /* not a type/len */
+    "Manufacturer",                       /* OPENBMC_VPD_KEY_BOARD_MFR, */
+    "Name",                               /* OPENBMC_VPD_KEY_BOARD_NAME, */
+    "Serial Number",  /* OPENBMC_VPD_KEY_BOARD_SERIAL_NUM, */
+    "Part Number",    /* OPENBMC_VPD_KEY_BOARD_PART_NUM, */
+    "FRU File ID",    /* OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID, */
+    "Custom Field 1", /*OPENBMC_VPD_KEY_BOARD_CUSTOM1,*/
+    "Custom Field 2", /*OPENBMC_VPD_KEY_BOARD_CUSTOM2,*/
+    "Custom Field 3", /*OPENBMC_VPD_KEY_BOARD_CUSTOM3,*/
+    "Custom Field 4", /*OPENBMC_VPD_KEY_BOARD_CUSTOM4,*/
+    "Custom Field 5", /*OPENBMC_VPD_KEY_BOARD_CUSTOM5,*/
+    "Custom Field 6", /*OPENBMC_VPD_KEY_BOARD_CUSTOM6,*/
+    "Custom Field 7", /*OPENBMC_VPD_KEY_BOARD_CUSTOM7,*/
+    "Custom Field 8", /*OPENBMC_VPD_KEY_BOARD_CUSTOM8,*/
 
-  "Manufacturer", /* OPENBMC_VPD_KEY_PRODUCT_MFR, */
-  "Name", /* OPENBMC_VPD_KEY_PRODUCT_NAME, */
-  "Model Number", /* OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM, */
-  "Version", /* OPENBMC_VPD_KEY_PRODUCT_VER, */
-  "Serial Number", /* OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM, */
-  "Asset Tag", /* OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG, */
-  "FRU File ID", /* OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID, */
-  "Custom Field 1", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM1,*/
-  "Custom Field 2", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM2,*/
-  "Custom Field 3", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM3,*/
-  "Custom Field 4", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM4,*/
-  "Custom Field 5", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM5,*/
-  "Custom Field 6", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM6,*/
-  "Custom Field 7", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM7,*/
-  "Custom Field 8", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,*/
+    "Manufacturer",   /* OPENBMC_VPD_KEY_PRODUCT_MFR, */
+    "Name",           /* OPENBMC_VPD_KEY_PRODUCT_NAME, */
+    "Model Number",   /* OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM, */
+    "Version",        /* OPENBMC_VPD_KEY_PRODUCT_VER, */
+    "Serial Number",  /* OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM, */
+    "Asset Tag",      /* OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG, */
+    "FRU File ID",    /* OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID, */
+    "Custom Field 1", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM1,*/
+    "Custom Field 2", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM2,*/
+    "Custom Field 3", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM3,*/
+    "Custom Field 4", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM4,*/
+    "Custom Field 5", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM5,*/
+    "Custom Field 6", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM6,*/
+    "Custom Field 7", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM7,*/
+    "Custom Field 8", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,*/
 
-  "Key Names Table End" /*OPENBMC_VPD_KEY_MAX,*/
+    "Key Names Table End" /*OPENBMC_VPD_KEY_MAX,*/
 };
 
-
 /*
  * --------------------------------------------------------------------
  *
  * --------------------------------------------------------------------
  */
 
-static size_t _to_time_str (uint32_t mfg_date_time, char* timestr, uint32_t len)
+static size_t _to_time_str(uint32_t mfg_date_time, char* timestr, uint32_t len)
 {
     struct tm tm;
     time_t t;
     size_t s;
 
-    ASSERT (timestr);
-    ASSERT (len);
+    ASSERT(timestr);
+    ASSERT(len);
 
-    memset (&tm, '\0', sizeof (struct tm));
+    memset(&tm, '\0', sizeof(struct tm));
 
     t = mfg_date_time;
-    gmtime_r (&t, &tm);
-    s = strftime (timestr, len, "%F - %H:%M:%S", &tm);
+    gmtime_r(&t, &tm);
+    s = strftime(timestr, len, "%F - %H:%M:%S", &tm);
 
     return s;
 }
 
 /* private method to parse type/length */
-static int
-_parse_type_length (const void *areabuf,
-                    unsigned int areabuflen,
-                    unsigned int current_area_offset,
-                    uint8_t *number_of_data_bytes,
-                    ipmi_fru_field_t *field)
+static int _parse_type_length(const void* areabuf, unsigned int areabuflen,
+                              unsigned int current_area_offset,
+                              uint8_t* number_of_data_bytes,
+                              ipmi_fru_field_t* field)
 {
-  const uint8_t *areabufptr = (const uint8_t*) areabuf;
-  uint8_t type_length;
-  uint8_t type_code;
+    const uint8_t* areabufptr = (const uint8_t*)areabuf;
+    uint8_t type_length;
+    uint8_t type_code;
 
-  ASSERT (areabuf);
-  ASSERT (areabuflen);
-  ASSERT (number_of_data_bytes);
+    ASSERT(areabuf);
+    ASSERT(areabuflen);
+    ASSERT(number_of_data_bytes);
 
-  type_length = areabufptr[current_area_offset];
+    type_length = areabufptr[current_area_offset];
 
-  /* ipmi workaround
-   *
-   * dell p weredge r610
-   *
-   * my reading of the fru spec is that all non-custom fields are
-   * required to be listed by the vendor.  however, on this
-   * motherboard, some areas list this, indicating that there is
-   * no more data to be parsed.  so now, for "required" fields, i
-   * check to see if the type-length field is a sentinel before
-   * calling this function.
-   */
+    /* ipmi workaround
+     *
+     * dell p weredge r610
+     *
+     * my reading of the fru spec is that all non-custom fields are
+     * required to be listed by the vendor.  however, on this
+     * motherboard, some areas list this, indicating that there is
+     * no more data to be parsed.  so now, for "required" fields, i
+     * check to see if the type-length field is a sentinel before
+     * calling this function.
+     */
 
-  ASSERT (type_length != IPMI_FRU_SENTINEL_VALUE);
+    ASSERT(type_length != IPMI_FRU_SENTINEL_VALUE);
 
-  type_code = (type_length & IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK) >> IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT;
-  (*number_of_data_bytes) = type_length & IPMI_FRU_TYPE_LENGTH_NUMBER_OF_DATA_BYTES_MASK;
+    type_code = (type_length & IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK) >>
+                IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT;
+    (*number_of_data_bytes) =
+        type_length & IPMI_FRU_TYPE_LENGTH_NUMBER_OF_DATA_BYTES_MASK;
 
-  /* special case: this shouldn't be a length of 0x01 (see type/length
-   * byte format in fru information storage definition).
-   */
-  if (type_code == IPMI_FRU_TYPE_LENGTH_TYPE_CODE_LANGUAGE_CODE
-      && (*number_of_data_bytes) == 0x01)
+    /* special case: this shouldn't be a length of 0x01 (see type/length
+     * byte format in fru information storage definition).
+     */
+    if (type_code == IPMI_FRU_TYPE_LENGTH_TYPE_CODE_LANGUAGE_CODE &&
+        (*number_of_data_bytes) == 0x01)
     {
-      return (-1);
+        return (-1);
     }
 
-  if ((current_area_offset + 1 + (*number_of_data_bytes)) > areabuflen)
+    if ((current_area_offset + 1 + (*number_of_data_bytes)) > areabuflen)
     {
-      return (-1);
+        return (-1);
     }
 
-  if (field)
+    if (field)
     {
-      memset (field->type_length_field,
-              '\0',
-              IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX);
-      memcpy (field->type_length_field,
-              &areabufptr[current_area_offset],
-              1 + (*number_of_data_bytes));
-      field->type_length_field_length = 1 + (*number_of_data_bytes);
+        memset(field->type_length_field, '\0',
+               IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX);
+        memcpy(field->type_length_field, &areabufptr[current_area_offset],
+               1 + (*number_of_data_bytes));
+        field->type_length_field_length = 1 + (*number_of_data_bytes);
     }
 
-  return (0);
+    return (0);
 }
 
-int
-ipmi_fru_chassis_info_area (const void *areabuf,
-			    unsigned int areabuflen,
-			    uint8_t *chassis_type,
-			    ipmi_fru_field_t *chassis_part_number,
-			    ipmi_fru_field_t *chassis_serial_number,
-			    ipmi_fru_field_t *chassis_custom_fields,
-			    unsigned int chassis_custom_fields_len)
+int ipmi_fru_chassis_info_area(const void* areabuf, unsigned int areabuflen,
+                               uint8_t* chassis_type,
+                               ipmi_fru_field_t* chassis_part_number,
+                               ipmi_fru_field_t* chassis_serial_number,
+                               ipmi_fru_field_t* chassis_custom_fields,
+                               unsigned int chassis_custom_fields_len)
 {
-  const uint8_t *areabufptr = (const uint8_t*) areabuf;
-  unsigned int area_offset = 0;
-  unsigned int custom_fields_index = 0;
-  uint8_t number_of_data_bytes;
-  int rv = -1;
+    const uint8_t* areabufptr = (const uint8_t*)areabuf;
+    unsigned int area_offset = 0;
+    unsigned int custom_fields_index = 0;
+    uint8_t number_of_data_bytes;
+    int rv = -1;
 
-  if (!areabuf || !areabuflen)
+    if (!areabuf || !areabuflen)
     {
-      return (-1);
+        return (-1);
     }
 
-  if (chassis_part_number)
-    memset (chassis_part_number,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (chassis_serial_number)
-    memset (chassis_serial_number,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (chassis_custom_fields && chassis_custom_fields_len)
-    memset (chassis_custom_fields,
-            '\0',
-            sizeof (ipmi_fru_field_t) * chassis_custom_fields_len);
+    if (chassis_part_number)
+        memset(chassis_part_number, '\0', sizeof(ipmi_fru_field_t));
+    if (chassis_serial_number)
+        memset(chassis_serial_number, '\0', sizeof(ipmi_fru_field_t));
+    if (chassis_custom_fields && chassis_custom_fields_len)
+        memset(chassis_custom_fields, '\0',
+               sizeof(ipmi_fru_field_t) * chassis_custom_fields_len);
 
-  if (chassis_type)
-    (*chassis_type) = areabufptr[area_offset];
-  area_offset++;
+    if (chassis_type)
+        (*chassis_type) = areabufptr[area_offset];
+    area_offset++;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          chassis_part_number) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, chassis_part_number) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          chassis_serial_number) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, chassis_serial_number) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  while (area_offset < areabuflen
-         && areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE)
+    while (area_offset < areabuflen &&
+           areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE)
     {
-      ipmi_fru_field_t *field_ptr = NULL;
+        ipmi_fru_field_t* field_ptr = NULL;
 
-      if (chassis_custom_fields && chassis_custom_fields_len)
+        if (chassis_custom_fields && chassis_custom_fields_len)
         {
-          if (custom_fields_index < chassis_custom_fields_len)
-            field_ptr = &chassis_custom_fields[custom_fields_index];
-          else
+            if (custom_fields_index < chassis_custom_fields_len)
+                field_ptr = &chassis_custom_fields[custom_fields_index];
+            else
             {
-              goto cleanup;
+                goto cleanup;
             }
         }
 
-      if (_parse_type_length (areabufptr,
-                              areabuflen,
-                              area_offset,
-                              &number_of_data_bytes,
-                              field_ptr) < 0)
-        goto cleanup;
+        if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                               &number_of_data_bytes, field_ptr) < 0)
+            goto cleanup;
 
-      area_offset += 1;          /* type/length byte */
-      area_offset += number_of_data_bytes;
-      custom_fields_index++;
+        area_offset += 1; /* type/length byte */
+        area_offset += number_of_data_bytes;
+        custom_fields_index++;
     }
 
-
- out:
-  rv = 0;
- cleanup:
-  return (rv);
+out:
+    rv = 0;
+cleanup:
+    return (rv);
 }
 
-int
-ipmi_fru_board_info_area (const void *areabuf,
-			  unsigned int areabuflen,
-			  uint8_t *language_code,
-			  uint32_t *mfg_date_time,
-			  ipmi_fru_field_t *board_manufacturer,
-			  ipmi_fru_field_t *board_product_name,
-			  ipmi_fru_field_t *board_serial_number,
-			  ipmi_fru_field_t *board_part_number,
-			  ipmi_fru_field_t *board_fru_file_id,
-			  ipmi_fru_field_t *board_custom_fields,
-			  unsigned int board_custom_fields_len)
+int ipmi_fru_board_info_area(
+    const void* areabuf, unsigned int areabuflen, uint8_t* language_code,
+    uint32_t* mfg_date_time, ipmi_fru_field_t* board_manufacturer,
+    ipmi_fru_field_t* board_product_name, ipmi_fru_field_t* board_serial_number,
+    ipmi_fru_field_t* board_part_number, ipmi_fru_field_t* board_fru_file_id,
+    ipmi_fru_field_t* board_custom_fields, unsigned int board_custom_fields_len)
 {
-  const uint8_t *areabufptr = (const uint8_t*) areabuf;
-  uint32_t mfg_date_time_tmp = 0;
-  unsigned int area_offset = 0;
-  unsigned int custom_fields_index = 0;
-  uint8_t number_of_data_bytes;
-  int rv = -1;
+    const uint8_t* areabufptr = (const uint8_t*)areabuf;
+    uint32_t mfg_date_time_tmp = 0;
+    unsigned int area_offset = 0;
+    unsigned int custom_fields_index = 0;
+    uint8_t number_of_data_bytes;
+    int rv = -1;
 
-  if (!areabuf || !areabuflen)
+    if (!areabuf || !areabuflen)
     {
-      return (-1);
+        return (-1);
     }
 
-  if (board_manufacturer)
-    memset (board_manufacturer,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (board_product_name)
-    memset (board_product_name,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (board_serial_number)
-    memset (board_serial_number,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (board_part_number)
-    memset (board_part_number,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (board_fru_file_id)
-    memset (board_fru_file_id,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (board_custom_fields && board_custom_fields_len)
-    memset (board_custom_fields,
-            '\0',
-            sizeof (ipmi_fru_field_t) * board_custom_fields_len);
+    if (board_manufacturer)
+        memset(board_manufacturer, '\0', sizeof(ipmi_fru_field_t));
+    if (board_product_name)
+        memset(board_product_name, '\0', sizeof(ipmi_fru_field_t));
+    if (board_serial_number)
+        memset(board_serial_number, '\0', sizeof(ipmi_fru_field_t));
+    if (board_part_number)
+        memset(board_part_number, '\0', sizeof(ipmi_fru_field_t));
+    if (board_fru_file_id)
+        memset(board_fru_file_id, '\0', sizeof(ipmi_fru_field_t));
+    if (board_custom_fields && board_custom_fields_len)
+        memset(board_custom_fields, '\0',
+               sizeof(ipmi_fru_field_t) * board_custom_fields_len);
 
-  if (language_code)
-    (*language_code) = areabufptr[area_offset];
-  area_offset++;
+    if (language_code)
+        (*language_code) = areabufptr[area_offset];
+    area_offset++;
 
-  if (mfg_date_time)
+    if (mfg_date_time)
     {
-      struct tm tm;
-      time_t t;
+        struct tm tm;
+        time_t t;
 
-      /* mfg_date_time is little endian - see spec */
-      mfg_date_time_tmp |= areabufptr[area_offset];
-      area_offset++;
-      mfg_date_time_tmp |= (areabufptr[area_offset] << 8);
-      area_offset++;
-      mfg_date_time_tmp |= (areabufptr[area_offset] << 16);
-      area_offset++;
+        /* mfg_date_time is little endian - see spec */
+        mfg_date_time_tmp |= areabufptr[area_offset];
+        area_offset++;
+        mfg_date_time_tmp |= (areabufptr[area_offset] << 8);
+        area_offset++;
+        mfg_date_time_tmp |= (areabufptr[area_offset] << 16);
+        area_offset++;
 
-      /* mfg_date_time is in minutes, so multiple by 60 to get seconds */
-      mfg_date_time_tmp *= 60;
+        /* mfg_date_time is in minutes, so multiple by 60 to get seconds */
+        mfg_date_time_tmp *= 60;
 
-      /* posix says individual calls need not clear/set all portions of
-       * 'struct tm', thus passing 'struct tm' between functions could
-       * have issues.  so we need to memset.
-       */
-      memset (&tm, '\0', sizeof(struct tm));
+        /* posix says individual calls need not clear/set all portions of
+         * 'struct tm', thus passing 'struct tm' between functions could
+         * have issues.  so we need to memset.
+         */
+        memset(&tm, '\0', sizeof(struct tm));
 
-      /* in fru, epoch is 0:00 hrs 1/1/96
-       *
-       * so convert into ansi epoch
-       */
+        /* in fru, epoch is 0:00 hrs 1/1/96
+         *
+         * so convert into ansi epoch
+         */
 
-      tm.tm_year = 96;          /* years since 1900 */
-      tm.tm_mon = 0;            /* months since january */
-      tm.tm_mday = 1;           /* 1-31 */
-      tm.tm_hour = 0;
-      tm.tm_min = 0;
-      tm.tm_sec = 0;
-      tm.tm_isdst = -1;
+        tm.tm_year = 96; /* years since 1900 */
+        tm.tm_mon = 0;   /* months since january */
+        tm.tm_mday = 1;  /* 1-31 */
+        tm.tm_hour = 0;
+        tm.tm_min = 0;
+        tm.tm_sec = 0;
+        tm.tm_isdst = -1;
 
-      if ((t = mktime (&tm)) == (time_t)-1)
+        if ((t = mktime(&tm)) == (time_t)-1)
         {
-          goto cleanup;
+            goto cleanup;
         }
 
-      mfg_date_time_tmp += (uint32_t)t;
-      (*mfg_date_time) = mfg_date_time_tmp;
+        mfg_date_time_tmp += (uint32_t)t;
+        (*mfg_date_time) = mfg_date_time_tmp;
     }
-  else
-    area_offset += 3;
+    else
+        area_offset += 3;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          board_manufacturer) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, board_manufacturer) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          board_product_name) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, board_product_name) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          board_serial_number) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, board_serial_number) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          board_part_number) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, board_part_number) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          board_fru_file_id) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, board_fru_file_id) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  while (area_offset < areabuflen
-         && areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE)
+    while (area_offset < areabuflen &&
+           areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE)
     {
-      ipmi_fru_field_t *field_ptr = NULL;
+        ipmi_fru_field_t* field_ptr = NULL;
 
-      if (board_custom_fields && board_custom_fields_len)
+        if (board_custom_fields && board_custom_fields_len)
         {
-          if (custom_fields_index < board_custom_fields_len)
-            field_ptr = &board_custom_fields[custom_fields_index];
-          else
+            if (custom_fields_index < board_custom_fields_len)
+                field_ptr = &board_custom_fields[custom_fields_index];
+            else
             {
-              goto cleanup;
+                goto cleanup;
             }
         }
 
-      if (_parse_type_length (areabufptr,
-                              areabuflen,
-                              area_offset,
-                              &number_of_data_bytes,
-                              field_ptr) < 0)
-        goto cleanup;
+        if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                               &number_of_data_bytes, field_ptr) < 0)
+            goto cleanup;
 
-      area_offset += 1;          /* type/length byte */
-      area_offset += number_of_data_bytes;
-      custom_fields_index++;
+        area_offset += 1; /* type/length byte */
+        area_offset += number_of_data_bytes;
+        custom_fields_index++;
     }
 
- out:
-  rv = 0;
- cleanup:
-  return (rv);
+out:
+    rv = 0;
+cleanup:
+    return (rv);
 }
 
-int
-ipmi_fru_product_info_area (const void *areabuf,
-			    unsigned int areabuflen,
-			    uint8_t *language_code,
-			    ipmi_fru_field_t *product_manufacturer_name,
-			    ipmi_fru_field_t *product_name,
-			    ipmi_fru_field_t *product_part_model_number,
-			    ipmi_fru_field_t *product_version,
-			    ipmi_fru_field_t *product_serial_number,
-			    ipmi_fru_field_t *product_asset_tag,
-			    ipmi_fru_field_t *product_fru_file_id,
-			    ipmi_fru_field_t *product_custom_fields,
-			    unsigned int product_custom_fields_len)
+int ipmi_fru_product_info_area(
+    const void* areabuf, unsigned int areabuflen, uint8_t* language_code,
+    ipmi_fru_field_t* product_manufacturer_name, ipmi_fru_field_t* product_name,
+    ipmi_fru_field_t* product_part_model_number,
+    ipmi_fru_field_t* product_version, ipmi_fru_field_t* product_serial_number,
+    ipmi_fru_field_t* product_asset_tag, ipmi_fru_field_t* product_fru_file_id,
+    ipmi_fru_field_t* product_custom_fields,
+    unsigned int product_custom_fields_len)
 {
-  const uint8_t *areabufptr = (const uint8_t*) areabuf;
-  unsigned int area_offset = 0;
-  unsigned int custom_fields_index = 0;
-  uint8_t number_of_data_bytes;
-  int rv = -1;
+    const uint8_t* areabufptr = (const uint8_t*)areabuf;
+    unsigned int area_offset = 0;
+    unsigned int custom_fields_index = 0;
+    uint8_t number_of_data_bytes;
+    int rv = -1;
 
-  if (!areabuf || !areabuflen)
+    if (!areabuf || !areabuflen)
     {
-      return (-1);
+        return (-1);
     }
 
-  if (product_manufacturer_name)
-    memset (product_manufacturer_name,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (product_name)
-    memset (product_name,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (product_part_model_number)
-    memset (product_part_model_number,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (product_version)
-    memset (product_version,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (product_serial_number)
-    memset (product_serial_number,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (product_asset_tag)
-    memset (product_asset_tag,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (product_fru_file_id)
-    memset (product_fru_file_id,
-            '\0',
-            sizeof (ipmi_fru_field_t));
-  if (product_custom_fields && product_custom_fields_len)
-    memset (product_custom_fields,
-            '\0',
-            sizeof (ipmi_fru_field_t) * product_custom_fields_len);
+    if (product_manufacturer_name)
+        memset(product_manufacturer_name, '\0', sizeof(ipmi_fru_field_t));
+    if (product_name)
+        memset(product_name, '\0', sizeof(ipmi_fru_field_t));
+    if (product_part_model_number)
+        memset(product_part_model_number, '\0', sizeof(ipmi_fru_field_t));
+    if (product_version)
+        memset(product_version, '\0', sizeof(ipmi_fru_field_t));
+    if (product_serial_number)
+        memset(product_serial_number, '\0', sizeof(ipmi_fru_field_t));
+    if (product_asset_tag)
+        memset(product_asset_tag, '\0', sizeof(ipmi_fru_field_t));
+    if (product_fru_file_id)
+        memset(product_fru_file_id, '\0', sizeof(ipmi_fru_field_t));
+    if (product_custom_fields && product_custom_fields_len)
+        memset(product_custom_fields, '\0',
+               sizeof(ipmi_fru_field_t) * product_custom_fields_len);
 
-  if (language_code)
-    (*language_code) = areabufptr[area_offset];
-  area_offset++;
+    if (language_code)
+        (*language_code) = areabufptr[area_offset];
+    area_offset++;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          product_manufacturer_name) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes,
+                           product_manufacturer_name) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          product_name) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, product_name) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          product_part_model_number) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes,
+                           product_part_model_number) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          product_version) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, product_version) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          product_serial_number) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, product_serial_number) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          product_asset_tag) < 0)
-    goto cleanup;
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, product_asset_tag) < 0)
+        goto cleanup;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
-    goto out;
+    if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE)
+        goto out;
 
-  if (_parse_type_length (areabufptr,
-                          areabuflen,
-                          area_offset,
-                          &number_of_data_bytes,
-                          product_fru_file_id) < 0)
-    goto cleanup;
+    if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                           &number_of_data_bytes, product_fru_file_id) < 0)
+        goto cleanup;
 
-  area_offset += 1;          /* type/length byte */
-  area_offset += number_of_data_bytes;
+    area_offset += 1; /* type/length byte */
+    area_offset += number_of_data_bytes;
 
-  while (area_offset < areabuflen
-         && areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE)
+    while (area_offset < areabuflen &&
+           areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE)
     {
-      ipmi_fru_field_t *field_ptr = NULL;
+        ipmi_fru_field_t* field_ptr = NULL;
 
-      if (product_custom_fields && product_custom_fields_len)
+        if (product_custom_fields && product_custom_fields_len)
         {
-          if (custom_fields_index < product_custom_fields_len)
-            field_ptr = &product_custom_fields[custom_fields_index];
-          else
+            if (custom_fields_index < product_custom_fields_len)
+                field_ptr = &product_custom_fields[custom_fields_index];
+            else
             {
-              goto cleanup;
+                goto cleanup;
             }
         }
 
-      if (_parse_type_length (areabufptr,
-                              areabuflen,
-                              area_offset,
-                              &number_of_data_bytes,
-                              field_ptr) < 0)
-        goto cleanup;
+        if (_parse_type_length(areabufptr, areabuflen, area_offset,
+                               &number_of_data_bytes, field_ptr) < 0)
+            goto cleanup;
 
-      area_offset += 1;          /* type/length byte */
-      area_offset += number_of_data_bytes;
-      custom_fields_index++;
+        area_offset += 1; /* type/length byte */
+        area_offset += number_of_data_bytes;
+        custom_fields_index++;
     }
 
-
- out:
-  rv = 0;
- cleanup:
-  return (rv);
+out:
+    rv = 0;
+cleanup:
+    return (rv);
 }
 
-void _append_to_dict (uint8_t vpd_key_id,
-                      uint8_t* vpd_key_val,
-                      IPMIFruInfo& info)
+void _append_to_dict(uint8_t vpd_key_id, uint8_t* vpd_key_val,
+                     IPMIFruInfo& info)
 {
     int type_length = vpd_key_val[0];
     int type_code = (type_length & IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK) >>
                     IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT;
     int vpd_val_len =
         type_length & IPMI_FRU_TYPE_LENGTH_NUMBER_OF_DATA_BYTES_MASK;
-    int sdr=0;
+    int sdr = 0;
 
     /* Needed to convert each uint8_t byte to a ascii */
     char bin_byte[3] = {0};
@@ -735,12 +637,12 @@
     char bin_in_ascii_len = vpd_val_len * 2 + 3;
 
     /* Binary converted to ascii in array */
-    char *bin_in_ascii = (char *)malloc(bin_in_ascii_len);
+    char* bin_in_ascii = (char*)malloc(bin_in_ascii_len);
 
     /* For reading byte from the area */
     int val = 0;
 
-    char *bin_copy = &((char *)bin_in_ascii)[2];
+    char* bin_copy = &((char*)bin_in_ascii)[2];
 
     switch (type_code)
     {
@@ -748,7 +650,7 @@
             memset(bin_in_ascii, 0x0, bin_in_ascii_len);
 
             /* Offset 1 is where actual data starts */
-            for(val = 1; val <= vpd_val_len ; val++)
+            for (val = 1; val <= vpd_val_len; val++)
             {
                 /* 2 bytes for data and 1 for terminating '\0' */
                 snprintf(bin_byte, 3, "%02x", vpd_key_val[val]);
@@ -758,174 +660,168 @@
             }
 
             /* We need the data represented as 0x...... */
-            if(vpd_val_len > 0)
+            if (vpd_val_len > 0)
             {
                 strncpy(bin_in_ascii, "0x", 2);
             }
 #if IPMI_FRU_PARSER_DEBUG
-            printf ("_append_to_dict: VPD Key = [%s] : Type Code = [BINARY] :"
-                    " Len = [%d] : Val = [%s]\n",
-                    vpd_key_names [vpd_key_id], vpd_val_len, bin_in_ascii);
+            printf("_append_to_dict: VPD Key = [%s] : Type Code = [BINARY] :"
+                   " Len = [%d] : Val = [%s]\n",
+                   vpd_key_names[vpd_key_id], vpd_val_len, bin_in_ascii);
 #endif
-            info[vpd_key_id] = std::make_pair(vpd_key_names[vpd_key_id],
-                                              bin_in_ascii);
+            info[vpd_key_id] =
+                std::make_pair(vpd_key_names[vpd_key_id], bin_in_ascii);
             break;
 
         case 3:
 #if IPMI_FRU_PARSER_DEBUG
-            printf ("_append_to_dict: VPD Key = [%s] : Type Code=[ASCII+Latin]"
-                    " : Len = [%d] : Val = [%s]\n",
-                    vpd_key_names [vpd_key_id], vpd_val_len, &vpd_key_val[1]);
+            printf("_append_to_dict: VPD Key = [%s] : Type Code=[ASCII+Latin]"
+                   " : Len = [%d] : Val = [%s]\n",
+                   vpd_key_names[vpd_key_id], vpd_val_len, &vpd_key_val[1]);
 #endif
             info[vpd_key_id] = std::make_pair(
-                                   vpd_key_names[vpd_key_id],
-                                   std::string(vpd_key_val + 1,
-                                               vpd_key_val + 1 + type_length));
+                vpd_key_names[vpd_key_id],
+                std::string(vpd_key_val + 1, vpd_key_val + 1 + type_length));
             break;
     }
 
-    if(bin_in_ascii)
+    if (bin_in_ascii)
     {
         free(bin_in_ascii);
         bin_in_ascii = NULL;
     }
 
-
     if (sdr < 0)
     {
 #if IPMI_FRU_PARSER_DEBUG
-        printf ("_append_to_dict : sd_bus_message_append Failed [ %d ] for [%s]\n", sdr, vpd_key_names[vpd_key_id]);
+        printf(
+            "_append_to_dict : sd_bus_message_append Failed [ %d ] for [%s]\n",
+            sdr, vpd_key_names[vpd_key_id]);
 #endif
     }
 }
 
-int parse_fru_area (const uint8_t area, const void* msgbuf,
-                    const size_t len, IPMIFruInfo& info)
+int parse_fru_area(const uint8_t area, const void* msgbuf, const size_t len,
+                   IPMIFruInfo& info)
 {
-  int rv = -1;
-  int i = 0;
+    int rv = -1;
+    int i = 0;
 
-  /* Chassis */
-  uint8_t chassis_type;
-  /* Board */
-  uint32_t mfg_date_time;
-  /* Product */
-  //unsigned int product_custom_fields_len;
+    /* Chassis */
+    uint8_t chassis_type;
+    /* Board */
+    uint32_t mfg_date_time;
+    /* Product */
+    // unsigned int product_custom_fields_len;
 
-  //ipmi_fru_area_info_t fru_area_info [ IPMI_FRU_AREA_TYPE_MAX ];
-  ipmi_fru_field_t vpd_info [ OPENBMC_VPD_KEY_MAX ];
-  char timestr [ OPENBMC_VPD_VAL_LEN ];
+    // ipmi_fru_area_info_t fru_area_info [ IPMI_FRU_AREA_TYPE_MAX ];
+    ipmi_fru_field_t vpd_info[OPENBMC_VPD_KEY_MAX];
+    char timestr[OPENBMC_VPD_VAL_LEN];
 
-  //uint8_t* ipmi_fru_field_str=NULL;
-  //ipmi_fru_common_hdr_t* chdr = NULL;
-  //uint8_t* hdr = NULL;
+    // uint8_t* ipmi_fru_field_str=NULL;
+    // ipmi_fru_common_hdr_t* chdr = NULL;
+    // uint8_t* hdr = NULL;
 
-  ASSERT (msgbuf);
+    ASSERT(msgbuf);
 
-  for (i=0; i<OPENBMC_VPD_KEY_MAX; i++)
-  {
-    memset (vpd_info[i].type_length_field, '\0',
-            IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX);
-    vpd_info[i].type_length_field_length = 0;
-  }
+    for (i = 0; i < OPENBMC_VPD_KEY_MAX; i++)
+    {
+        memset(vpd_info[i].type_length_field, '\0',
+               IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX);
+        vpd_info[i].type_length_field_length = 0;
+    }
 
-  switch (area)
-  {
-    case IPMI_FRU_AREA_CHASSIS_INFO:
+    switch (area)
+    {
+        case IPMI_FRU_AREA_CHASSIS_INFO:
 #if IPMI_FRU_PARSER_DEBUG
-          printf ("Chassis : Buf len = [%d]\n", len);
+            printf("Chassis : Buf len = [%d]\n", len);
 #endif
-        ipmi_fru_chassis_info_area ((uint8_t*)msgbuf+2,
-            len,
-            &chassis_type,
-            &vpd_info [OPENBMC_VPD_KEY_CHASSIS_PART_NUM],
-            &vpd_info [OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM],
-            &vpd_info [OPENBMC_VPD_KEY_CHASSIS_CUSTOM1],
-            OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
-
-          /* Populate VPD Table */
-          for (i=1; i<=OPENBMC_VPD_KEY_CHASSIS_MAX; i++)
-          {
-            if (i==OPENBMC_VPD_KEY_CHASSIS_TYPE)
-            {
-#if IPMI_FRU_PARSER_DEBUG
-                printf ("Chassis : Appending [%s] = [%d]\n",
-                         vpd_key_names[i], chassis_type);
-#endif
-                info[i] = std::make_pair(vpd_key_names[i],
-                                         std::to_string(chassis_type));
-                continue;
-            }
-            _append_to_dict (i, vpd_info[i].type_length_field, info);
-          }
-        break;
-    case IPMI_FRU_AREA_BOARD_INFO:
-#if IPMI_FRU_PARSER_DEBUG
-            printf ("Board : Buf len = [%d]\n", len);
-#endif
-            ipmi_fru_board_info_area ((uint8_t*)msgbuf+2,
-                len,
-                NULL,
-                &mfg_date_time,
-                &vpd_info [OPENBMC_VPD_KEY_BOARD_MFR],
-                &vpd_info [OPENBMC_VPD_KEY_BOARD_NAME],
-                &vpd_info [OPENBMC_VPD_KEY_BOARD_SERIAL_NUM],
-                &vpd_info [OPENBMC_VPD_KEY_BOARD_PART_NUM],
-                &vpd_info [OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID],
-                &vpd_info [OPENBMC_VPD_KEY_BOARD_CUSTOM1],
+            ipmi_fru_chassis_info_area(
+                (uint8_t*)msgbuf + 2, len, &chassis_type,
+                &vpd_info[OPENBMC_VPD_KEY_CHASSIS_PART_NUM],
+                &vpd_info[OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM],
+                &vpd_info[OPENBMC_VPD_KEY_CHASSIS_CUSTOM1],
                 OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
 
-          /* Populate VPD Table */
-            for (i=OPENBMC_VPD_KEY_BOARD_MFG_DATE;
-                 i<=OPENBMC_VPD_KEY_BOARD_MAX; i++)
+            /* Populate VPD Table */
+            for (i = 1; i <= OPENBMC_VPD_KEY_CHASSIS_MAX; i++)
             {
-                if (i==OPENBMC_VPD_KEY_BOARD_MFG_DATE)
+                if (i == OPENBMC_VPD_KEY_CHASSIS_TYPE)
                 {
-                    _to_time_str (mfg_date_time, timestr, OPENBMC_VPD_VAL_LEN);
 #if IPMI_FRU_PARSER_DEBUG
-                    printf ("Board : Appending [%s] = [%s]\n",
-                            vpd_key_names[i], timestr);
+                    printf("Chassis : Appending [%s] = [%d]\n",
+                           vpd_key_names[i], chassis_type);
 #endif
                     info[i] = std::make_pair(vpd_key_names[i],
-                                             std::string(timestr));
+                                             std::to_string(chassis_type));
                     continue;
                 }
-                _append_to_dict (i, vpd_info[i].type_length_field, info);
-
+                _append_to_dict(i, vpd_info[i].type_length_field, info);
             }
             break;
-    case IPMI_FRU_AREA_PRODUCT_INFO:
+        case IPMI_FRU_AREA_BOARD_INFO:
 #if IPMI_FRU_PARSER_DEBUG
-            printf ("Product : Buf len = [%d]\n", len);
+            printf("Board : Buf len = [%d]\n", len);
 #endif
-            ipmi_fru_product_info_area ((uint8_t*)msgbuf+2,
-                len,
-                NULL,
-                &vpd_info [OPENBMC_VPD_KEY_PRODUCT_MFR],
-                &vpd_info [OPENBMC_VPD_KEY_PRODUCT_NAME],
-                &vpd_info [OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM],
-                &vpd_info [OPENBMC_VPD_KEY_PRODUCT_VER],
-                &vpd_info [OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM],
-                &vpd_info [OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG],
-                &vpd_info [OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID],
-                &vpd_info [OPENBMC_VPD_KEY_PRODUCT_CUSTOM1],
+            ipmi_fru_board_info_area(
+                (uint8_t*)msgbuf + 2, len, NULL, &mfg_date_time,
+                &vpd_info[OPENBMC_VPD_KEY_BOARD_MFR],
+                &vpd_info[OPENBMC_VPD_KEY_BOARD_NAME],
+                &vpd_info[OPENBMC_VPD_KEY_BOARD_SERIAL_NUM],
+                &vpd_info[OPENBMC_VPD_KEY_BOARD_PART_NUM],
+                &vpd_info[OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID],
+                &vpd_info[OPENBMC_VPD_KEY_BOARD_CUSTOM1],
                 OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
 
-            for (i=OPENBMC_VPD_KEY_PRODUCT_MFR;
-                 i<=OPENBMC_VPD_KEY_PRODUCT_MAX;
-                 ++i)
+            /* Populate VPD Table */
+            for (i = OPENBMC_VPD_KEY_BOARD_MFG_DATE;
+                 i <= OPENBMC_VPD_KEY_BOARD_MAX; i++)
             {
-                _append_to_dict (i, vpd_info[i].type_length_field, info);
+                if (i == OPENBMC_VPD_KEY_BOARD_MFG_DATE)
+                {
+                    _to_time_str(mfg_date_time, timestr, OPENBMC_VPD_VAL_LEN);
+#if IPMI_FRU_PARSER_DEBUG
+                    printf("Board : Appending [%s] = [%s]\n", vpd_key_names[i],
+                           timestr);
+#endif
+                    info[i] =
+                        std::make_pair(vpd_key_names[i], std::string(timestr));
+                    continue;
+                }
+                _append_to_dict(i, vpd_info[i].type_length_field, info);
             }
             break;
-    default:
-    /* TODO: Parse Multi Rec / Internal use area */
-    break;
-  }
+        case IPMI_FRU_AREA_PRODUCT_INFO:
+#if IPMI_FRU_PARSER_DEBUG
+            printf("Product : Buf len = [%d]\n", len);
+#endif
+            ipmi_fru_product_info_area(
+                (uint8_t*)msgbuf + 2, len, NULL,
+                &vpd_info[OPENBMC_VPD_KEY_PRODUCT_MFR],
+                &vpd_info[OPENBMC_VPD_KEY_PRODUCT_NAME],
+                &vpd_info[OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM],
+                &vpd_info[OPENBMC_VPD_KEY_PRODUCT_VER],
+                &vpd_info[OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM],
+                &vpd_info[OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG],
+                &vpd_info[OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID],
+                &vpd_info[OPENBMC_VPD_KEY_PRODUCT_CUSTOM1],
+                OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
+
+            for (i = OPENBMC_VPD_KEY_PRODUCT_MFR;
+                 i <= OPENBMC_VPD_KEY_PRODUCT_MAX; ++i)
+            {
+                _append_to_dict(i, vpd_info[i].type_length_field, info);
+            }
+            break;
+        default:
+            /* TODO: Parse Multi Rec / Internal use area */
+            break;
+    }
 
 #if IPMI_FRU_PARSER_DEBUG
-    printf ("parse_fru_area : Dictionary Packing Complete\n");
+    printf("parse_fru_area : Dictionary Packing Complete\n");
 #endif
-  rv = 0;
-  return (rv);
+    rv = 0;
+    return (rv);
 }
diff --git a/frup.hpp b/frup.hpp
index 3f68acd..0a0dd76 100644
--- a/frup.hpp
+++ b/frup.hpp
@@ -2,9 +2,10 @@
 #define OPENBMC_IPMI_FRU_PARSER_H
 
 #include <systemd/sd-bus.h>
+
 #include <array>
-#include <string>
 #include <map>
+#include <string>
 #include <vector>
 
 enum ipmi_fru_area_type
@@ -17,64 +18,63 @@
     IPMI_FRU_AREA_TYPE_MAX
 };
 
-
 enum openbmc_vpd_key_id
 {
-  OPENBMC_VPD_KEY_CHASSIS_TYPE = 1, /* not a type/len */
-  OPENBMC_VPD_KEY_CHASSIS_PART_NUM,
-  OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,
-  OPENBMC_VPD_KEY_CHASSIS_CUSTOM1,
-  OPENBMC_VPD_KEY_CHASSIS_CUSTOM2,
-  OPENBMC_VPD_KEY_CHASSIS_CUSTOM3,
-  OPENBMC_VPD_KEY_CHASSIS_CUSTOM4,
-  OPENBMC_VPD_KEY_CHASSIS_CUSTOM5,
-  OPENBMC_VPD_KEY_CHASSIS_CUSTOM6,
-  OPENBMC_VPD_KEY_CHASSIS_CUSTOM7,
-  OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,
-  OPENBMC_VPD_KEY_CHASSIS_MAX = OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,
-  /* TODO: chassis_custom_fields */
+    OPENBMC_VPD_KEY_CHASSIS_TYPE = 1, /* not a type/len */
+    OPENBMC_VPD_KEY_CHASSIS_PART_NUM,
+    OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,
+    OPENBMC_VPD_KEY_CHASSIS_CUSTOM1,
+    OPENBMC_VPD_KEY_CHASSIS_CUSTOM2,
+    OPENBMC_VPD_KEY_CHASSIS_CUSTOM3,
+    OPENBMC_VPD_KEY_CHASSIS_CUSTOM4,
+    OPENBMC_VPD_KEY_CHASSIS_CUSTOM5,
+    OPENBMC_VPD_KEY_CHASSIS_CUSTOM6,
+    OPENBMC_VPD_KEY_CHASSIS_CUSTOM7,
+    OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,
+    OPENBMC_VPD_KEY_CHASSIS_MAX = OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,
+    /* TODO: chassis_custom_fields */
 
-  OPENBMC_VPD_KEY_BOARD_MFG_DATE, /* not a type/len */
-  OPENBMC_VPD_KEY_BOARD_MFR,
-  OPENBMC_VPD_KEY_BOARD_NAME,
-  OPENBMC_VPD_KEY_BOARD_SERIAL_NUM,
-  OPENBMC_VPD_KEY_BOARD_PART_NUM,
-  OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID,
-  OPENBMC_VPD_KEY_BOARD_CUSTOM1,
-  OPENBMC_VPD_KEY_BOARD_CUSTOM2,
-  OPENBMC_VPD_KEY_BOARD_CUSTOM3,
-  OPENBMC_VPD_KEY_BOARD_CUSTOM4,
-  OPENBMC_VPD_KEY_BOARD_CUSTOM5,
-  OPENBMC_VPD_KEY_BOARD_CUSTOM6,
-  OPENBMC_VPD_KEY_BOARD_CUSTOM7,
-  OPENBMC_VPD_KEY_BOARD_CUSTOM8,
-  OPENBMC_VPD_KEY_BOARD_MAX = OPENBMC_VPD_KEY_BOARD_CUSTOM8,
-  /* TODO: board_custom_fields */
+    OPENBMC_VPD_KEY_BOARD_MFG_DATE, /* not a type/len */
+    OPENBMC_VPD_KEY_BOARD_MFR,
+    OPENBMC_VPD_KEY_BOARD_NAME,
+    OPENBMC_VPD_KEY_BOARD_SERIAL_NUM,
+    OPENBMC_VPD_KEY_BOARD_PART_NUM,
+    OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID,
+    OPENBMC_VPD_KEY_BOARD_CUSTOM1,
+    OPENBMC_VPD_KEY_BOARD_CUSTOM2,
+    OPENBMC_VPD_KEY_BOARD_CUSTOM3,
+    OPENBMC_VPD_KEY_BOARD_CUSTOM4,
+    OPENBMC_VPD_KEY_BOARD_CUSTOM5,
+    OPENBMC_VPD_KEY_BOARD_CUSTOM6,
+    OPENBMC_VPD_KEY_BOARD_CUSTOM7,
+    OPENBMC_VPD_KEY_BOARD_CUSTOM8,
+    OPENBMC_VPD_KEY_BOARD_MAX = OPENBMC_VPD_KEY_BOARD_CUSTOM8,
+    /* TODO: board_custom_fields */
 
-  OPENBMC_VPD_KEY_PRODUCT_MFR,
-  OPENBMC_VPD_KEY_PRODUCT_NAME,
-  OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM,
-  OPENBMC_VPD_KEY_PRODUCT_VER,
-  OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM,
-  OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG,
-  OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID,
-  OPENBMC_VPD_KEY_PRODUCT_CUSTOM1,
-  OPENBMC_VPD_KEY_PRODUCT_CUSTOM2,
-  OPENBMC_VPD_KEY_PRODUCT_CUSTOM3,
-  OPENBMC_VPD_KEY_PRODUCT_CUSTOM4,
-  OPENBMC_VPD_KEY_PRODUCT_CUSTOM5,
-  OPENBMC_VPD_KEY_PRODUCT_CUSTOM6,
-  OPENBMC_VPD_KEY_PRODUCT_CUSTOM7,
-  OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,
-  OPENBMC_VPD_KEY_PRODUCT_MAX = OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,
+    OPENBMC_VPD_KEY_PRODUCT_MFR,
+    OPENBMC_VPD_KEY_PRODUCT_NAME,
+    OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM,
+    OPENBMC_VPD_KEY_PRODUCT_VER,
+    OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM,
+    OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG,
+    OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID,
+    OPENBMC_VPD_KEY_PRODUCT_CUSTOM1,
+    OPENBMC_VPD_KEY_PRODUCT_CUSTOM2,
+    OPENBMC_VPD_KEY_PRODUCT_CUSTOM3,
+    OPENBMC_VPD_KEY_PRODUCT_CUSTOM4,
+    OPENBMC_VPD_KEY_PRODUCT_CUSTOM5,
+    OPENBMC_VPD_KEY_PRODUCT_CUSTOM6,
+    OPENBMC_VPD_KEY_PRODUCT_CUSTOM7,
+    OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,
+    OPENBMC_VPD_KEY_PRODUCT_MAX = OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,
 
-  OPENBMC_VPD_KEY_MAX,
-  OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX=8,
+    OPENBMC_VPD_KEY_MAX,
+    OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX = 8,
 
 };
 
-using IPMIFruInfo = std::array<std::pair<std::string,std::string>,
-                           OPENBMC_VPD_KEY_MAX>;
+using IPMIFruInfo =
+    std::array<std::pair<std::string, std::string>, OPENBMC_VPD_KEY_MAX>;
 
 struct IPMIFruData
 {
@@ -104,10 +104,11 @@
 using FruId = uint32_t;
 using FruMap = std::map<FruId, FruInstanceVec>;
 
-/* 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);
+/* 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 size_t len, IPMIFruInfo& info);
+int parse_fru_area(const uint8_t area, const void* msgbuf, const size_t len,
+                   IPMIFruInfo& info);
 
 #endif
diff --git a/readeeprom.cpp b/readeeprom.cpp
index ef7e559..b8b2fd8 100644
--- a/readeeprom.cpp
+++ b/readeeprom.cpp
@@ -1,8 +1,9 @@
-#include <iostream>
-#include <memory>
 #include "argument.hpp"
 #include "writefrudata.hpp"
 
+#include <iostream>
+#include <memory>
+
 static void exit_with_error(const char* err, char** argv)
 {
     ArgumentParser::usage(argv);
@@ -14,13 +15,13 @@
 //--------------------------------------------------------------------------
 // This gets called by udev monitor soon after seeing hog plugs for EEPROMS.
 //--------------------------------------------------------------------------
-int main(int argc, char **argv)
+int main(int argc, char** argv)
 {
     int rc = 0;
     uint8_t fruid = 0;
 
     // Handle to per process system bus
-    sd_bus *bus_type = NULL;
+    sd_bus* bus_type = NULL;
 
     // Read the arguments.
     auto cli_options = std::make_unique<ArgumentParser>(argc, argv);
@@ -42,7 +43,7 @@
 
     // Extract the fruid
     fruid = strtol(fruid_str.c_str(), NULL, 16);
-    if(fruid == 0)
+    if (fruid == 0)
     {
         // User has not passed in the appropriate argument value
         exit_with_error("Invalid fruid.", argv);
@@ -55,14 +56,15 @@
     rc = sd_bus_open_system(&bus_type);
     if (rc < 0)
     {
-        fprintf(stderr, "Failed to connect to system bus: %s\n",strerror(-rc));
+        fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-rc));
     }
     else
     {
-        // Now that we have the file that contains the eeprom data, go read it and
-        // update the Inventory DB.
+        // Now that we have the file that contains the eeprom data, go read it
+        // and update the Inventory DB.
         bool bmc_fru = true;
-        rc = ipmi_validate_fru_area(fruid, eeprom_file.c_str(), bus_type, bmc_fru);
+        rc = ipmi_validate_fru_area(fruid, eeprom_file.c_str(), bus_type,
+                                    bmc_fru);
     }
 
     // Cleanup
diff --git a/strgfnhandler.cpp b/strgfnhandler.cpp
index 2cbbf4d..63e9bd6 100644
--- a/strgfnhandler.cpp
+++ b/strgfnhandler.cpp
@@ -1,8 +1,9 @@
+#include "writefrudata.hpp"
+
 #include <host-ipmid/ipmid-api.h>
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
-#include "writefrudata.hpp"
 
 void register_netfn_storage_write_fru() __attribute__((constructor));
 
@@ -12,18 +13,20 @@
 // 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)
+                                       ipmi_request_t request,
+                                       ipmi_response_t response,
+                                       ipmi_data_len_t data_len,
+                                       ipmi_context_t context)
 {
-    FILE *fp = NULL;
+    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;
+    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;
+    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);
@@ -34,33 +37,35 @@
     // 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);
+    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);
+           fru_file_name, offset, len);
 #endif
 
-
-    if( access( fru_file_name, F_OK ) == -1 ) {
+    if (access(fru_file_name, F_OK) == -1)
+    {
         mode = "wb";
-    } else {
+    }
+    else
+    {
         mode = "rb+";
     }
 
     if ((fp = fopen(fru_file_name, mode)) != NULL)
     {
-        if(fseek(fp, offset, SEEK_SET))
+        if (fseek(fp, offset, SEEK_SET))
         {
             perror("Error:");
             fclose(fp);
             return rc;
         }
 
-        if(fwrite(&reqptr->data, len, 1, fp) != 1)
+        if (fwrite(&reqptr->data, len, 1, fp) != 1)
         {
             perror("Error:");
             fclose(fp);
@@ -71,11 +76,11 @@
     }
     else
     {
-        fprintf(stderr, "Error trying to write to fru file %s\n",fru_file_name);
+        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);
@@ -83,7 +88,7 @@
     rc = IPMI_CC_OK;
 
     // Get the reference to global sd_bus object
-    sd_bus *bus_type = ipmid_get_sd_bus_connection();
+    sd_bus* bus_type = ipmid_get_sd_bus_connection();
 
     // 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
@@ -98,7 +103,8 @@
 //-------------------------------------------------------
 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,
-                           SYSTEM_INTERFACE);
+    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, SYSTEM_INTERFACE);
 }
diff --git a/types.hpp b/types.hpp
index 81caad6..e874960 100644
--- a/types.hpp
+++ b/types.hpp
@@ -1,25 +1,25 @@
 #pragma once
 
-#include <string>
 #include <map>
 #include <sdbusplus/server.hpp>
+#include <string>
 
 namespace ipmi
 {
 namespace vpd
 {
 
-    using Path = std::string;
+using Path = std::string;
 
-    using Property = std::string;
-    using Value = sdbusplus::message::variant<bool, int64_t, std::string>;
-    using PropertyMap = std::map<Property, Value>;
+using Property = std::string;
+using Value = sdbusplus::message::variant<bool, int64_t, std::string>;
+using PropertyMap = std::map<Property, Value>;
 
-    using Interface = std::string;
-    using InterfaceMap = std::map<Interface, PropertyMap>;
+using Interface = std::string;
+using InterfaceMap = std::map<Interface, PropertyMap>;
 
-    using Object = sdbusplus::message::object_path;
-    using ObjectMap = std::map<Object, InterfaceMap>;
+using Object = sdbusplus::message::object_path;
+using ObjectMap = std::map<Object, InterfaceMap>;
 
-} //namespace vpd
-} //namespace ipmi
+} // namespace vpd
+} // namespace ipmi
diff --git a/writefrudata.cpp b/writefrudata.cpp
index 46c7729..371fa6c 100644
--- a/writefrudata.cpp
+++ b/writefrudata.cpp
@@ -1,22 +1,24 @@
-#include <exception>
-#include <vector>
-#include <stdlib.h>
+#include "fru-area.hpp"
+#include "frup.hpp"
+#include "types.hpp"
+
 #include <dlfcn.h>
 #include <errno.h>
+#include <host-ipmid/ipmid-api.h>
+#include <mapper.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <systemd/sd-bus.h>
 #include <unistd.h>
-#include <host-ipmid/ipmid-api.h>
+
+#include <algorithm>
+#include <exception>
+#include <fstream>
 #include <iostream>
 #include <memory>
-#include <algorithm>
-#include <fstream>
-#include <sstream>
-#include <mapper.h>
-#include "types.hpp"
-#include "frup.hpp"
-#include "fru-area.hpp"
 #include <sdbusplus/server.hpp>
+#include <sstream>
+#include <vector>
 
 using namespace ipmi::vpd;
 
@@ -27,7 +29,7 @@
 // Constructor
 //----------------------------------------------------------------
 ipmi_fru::ipmi_fru(const uint8_t fruid, const ipmi_fru_area_type type,
-                   sd_bus *bus_type, bool bmc_fru)
+                   sd_bus* bus_type, bool bmc_fru)
 {
     iv_fruid = fruid;
     iv_type = type;
@@ -37,30 +39,30 @@
     iv_data = NULL;
     iv_present = false;
 
-    if(iv_type == IPMI_FRU_AREA_INTERNAL_USE)
+    if (iv_type == IPMI_FRU_AREA_INTERNAL_USE)
     {
         iv_name = "INTERNAL_";
     }
-    else if(iv_type == IPMI_FRU_AREA_CHASSIS_INFO)
+    else if (iv_type == IPMI_FRU_AREA_CHASSIS_INFO)
     {
         iv_name = "CHASSIS_";
     }
-    else if(iv_type == IPMI_FRU_AREA_BOARD_INFO)
+    else if (iv_type == IPMI_FRU_AREA_BOARD_INFO)
     {
         iv_name = "BOARD_";
     }
-    else if(iv_type == IPMI_FRU_AREA_PRODUCT_INFO)
+    else if (iv_type == IPMI_FRU_AREA_PRODUCT_INFO)
     {
         iv_name = "PRODUCT_";
     }
-    else if(iv_type == IPMI_FRU_AREA_MULTI_RECORD)
+    else if (iv_type == IPMI_FRU_AREA_MULTI_RECORD)
     {
         iv_name = "MULTI_";
     }
     else
     {
         iv_name = IPMI_FRU_AREA_TYPE_MAX;
-        fprintf(stderr, "ERROR: Invalid Area type :[%d]\n",iv_type);
+        fprintf(stderr, "ERROR: Invalid Area type :[%d]\n", iv_type);
     }
 }
 
@@ -68,7 +70,7 @@
 // For a FRU area type, accepts the data and updates
 // area specific data.
 //-----------------------------------------------------
-void ipmi_fru::set_data(const uint8_t *data, const size_t len)
+void ipmi_fru::set_data(const uint8_t* data, const size_t len)
 {
     iv_len = len;
     iv_data = new uint8_t[len];
@@ -78,8 +80,8 @@
 //-----------------------------------------------------
 // Sets the dbus parameters
 //-----------------------------------------------------
-void ipmi_fru::update_dbus_paths(const char *bus_name,
-                      const char *obj_path, const char *intf_name)
+void ipmi_fru::update_dbus_paths(const char* bus_name, const char* obj_path,
+                                 const char* intf_name)
 {
     iv_bus_name = bus_name;
     iv_obj_path = obj_path;
@@ -91,9 +93,9 @@
 //-------------------
 ipmi_fru::~ipmi_fru()
 {
-    if(iv_data != NULL)
+    if (iv_data != NULL)
     {
-        delete [] iv_data;
+        delete[] iv_data;
         iv_data = NULL;
     }
 }
@@ -103,17 +105,17 @@
 // and returns the 8 bit checksum
 // This algo is per IPMI V2.0 spec
 //-------------------------------------------------
-unsigned char calculate_crc(const unsigned char *data, size_t len)
+unsigned char calculate_crc(const unsigned char* data, size_t len)
 {
     char crc = 0;
     size_t byte = 0;
 
-    for(byte = 0; byte < len; byte++)
+    for (byte = 0; byte < len; byte++)
     {
         crc += *data++;
     }
 
-    return(-crc);
+    return (-crc);
 }
 
 //---------------------------------------------------------------------
@@ -123,7 +125,7 @@
 {
     ipmi_fru_area_type type = IPMI_FRU_AREA_TYPE_MAX;
 
-    switch(area_offset)
+    switch (area_offset)
     {
         case IPMI_FRU_INTERNAL_OFFSET:
             type = IPMI_FRU_AREA_INTERNAL_USE;
@@ -155,31 +157,32 @@
 ///-----------------------------------------------
 // Validates the data for crc and mandatory fields
 ///-----------------------------------------------
-int verify_fru_data(const uint8_t *data, const size_t len)
+int verify_fru_data(const uint8_t* data, const size_t len)
 {
     uint8_t checksum = 0;
     int rc = -1;
 
     // Validate for first byte to always have a value of [1]
-    if(data[0] != IPMI_FRU_HDR_BYTE_ZERO)
+    if (data[0] != IPMI_FRU_HDR_BYTE_ZERO)
     {
-        fprintf(stderr, "Invalid entry:[%d] in byte-0\n",data[0]);
+        fprintf(stderr, "Invalid entry:[%d] in byte-0\n", data[0]);
         return rc;
     }
 #ifdef __IPMI_DEBUG__
     else
     {
-        printf("SUCCESS: Validated [0x%X] in entry_1 of fru_data\n",data[0]);
+        printf("SUCCESS: Validated [0x%X] in entry_1 of fru_data\n", data[0]);
     }
 #endif
 
     // See if the calculated CRC matches with the embedded one.
     // CRC to be calculated on all except the last one that is CRC itself.
     checksum = calculate_crc(data, len - 1);
-    if(checksum != data[len-1])
+    if (checksum != data[len - 1])
     {
 #ifdef __IPMI_DEBUG__
-        fprintf(stderr, "Checksum mismatch."
+        fprintf(stderr,
+                "Checksum mismatch."
                 " Calculated:[0x%X], Embedded:[0x%X]\n",
                 checksum, data[len]);
 #endif
@@ -188,7 +191,7 @@
 #ifdef __IPMI_DEBUG__
     else
     {
-        printf("SUCCESS: Checksum matches:[0x%X]\n",checksum);
+        printf("SUCCESS: Checksum matches:[0x%X]\n", checksum);
     }
 #endif
 
@@ -200,10 +203,8 @@
 // FRU dictionary is parsed fru data for all the sections.
 //------------------------------------------------------------------------
 
-std::string getFRUValue(const std::string& section,
-                        const std::string& key,
-                        const std::string& delimiter,
-                        IPMIFruInfo& fruData)
+std::string getFRUValue(const std::string& section, const std::string& key,
+                        const std::string& delimiter, IPMIFruInfo& fruData)
 {
 
     auto minIndexValue = 0;
@@ -218,7 +219,6 @@
     {
         minIndexValue = OPENBMC_VPD_KEY_PRODUCT_MFR;
         maxIndexValue = OPENBMC_VPD_KEY_PRODUCT_MAX;
-
     }
     else if (section == "Chassis")
     {
@@ -229,42 +229,39 @@
     auto first = fruData.cbegin() + minIndexValue;
     auto last = first + (maxIndexValue - minIndexValue) + 1;
 
-    auto itr = std::find_if(first, last,
-            [&key](auto& e){ return key == e.first; });
+    auto itr =
+        std::find_if(first, last, [&key](auto& e) { return key == e.first; });
 
     if (itr != last)
     {
         fruValue = itr->second;
     }
 
-    //if the key is custom property then the value could be in two formats.
-    //1) custom field 2 = "value".
-    //2) custom field 2 =  "key:value".
-    //if delimiter length = 0 i.e custom field 2 = "value"
+    // if the key is custom property then the value could be in two formats.
+    // 1) custom field 2 = "value".
+    // 2) custom field 2 =  "key:value".
+    // if delimiter length = 0 i.e custom field 2 = "value"
 
     constexpr auto customProp = "Custom Field";
     if (key.find(customProp) != std::string::npos)
     {
-       if (delimiter.length() > 0)
-       {
-           size_t delimiterpos = fruValue.find(delimiter);
-           if (delimiterpos != std::string::npos)
-               fruValue = fruValue.substr(delimiterpos + 1);
-       }
+        if (delimiter.length() > 0)
+        {
+            size_t delimiterpos = fruValue.find(delimiter);
+            if (delimiterpos != std::string::npos)
+                fruValue = fruValue.substr(delimiterpos + 1);
+        }
     }
     return fruValue;
-
 }
-//Get the inventory service from the mapper.
-auto getService(sdbusplus::bus::bus& bus,
-                         const std::string& intf,
-                         const std::string& path)
+// Get the inventory service from the mapper.
+auto getService(sdbusplus::bus::bus& bus, const std::string& intf,
+                const std::string& path)
 {
-    auto mapperCall = bus.new_method_call(
-            "xyz.openbmc_project.ObjectMapper",
-            "/xyz/openbmc_project/object_mapper",
-            "xyz.openbmc_project.ObjectMapper",
-            "GetObject");
+    auto mapperCall =
+        bus.new_method_call("xyz.openbmc_project.ObjectMapper",
+                            "/xyz/openbmc_project/object_mapper",
+                            "xyz.openbmc_project.ObjectMapper", "GetObject");
 
     mapperCall.append(path);
     mapperCall.append(std::vector<std::string>({intf}));
@@ -326,7 +323,7 @@
     std::string service;
     try
     {
-        service = getService(bus,intf,path);
+        service = getService(bus, intf, path);
     }
     catch (const std::runtime_error& e)
     {
@@ -357,7 +354,7 @@
 
         for (auto& interfaceList : instance.interfaces)
         {
-            PropertyMap props;//store all the properties
+            PropertyMap props; // store all the properties
             for (auto& properties : interfaceList.second)
             {
                 std::string value;
@@ -371,13 +368,13 @@
                 props.emplace(std::move(properties.first), std::move(value));
             }
             // Check and update extra properties
-            if(extras.end() != extrasIter)
+            if (extras.end() != extrasIter)
             {
                 const auto& propsIter =
                     (extrasIter->second).find(interfaceList.first);
-                if((extrasIter->second).end() != propsIter)
+                if ((extrasIter->second).end() != propsIter)
                 {
-                    for(const auto& map : propsIter->second)
+                    for (const auto& map : propsIter->second)
                     {
                         props.emplace(map.first, map.second);
                     }
@@ -390,24 +387,21 @@
         // Call the inventory manager
         sdbusplus::message::object_path path = instance.path;
         // Check and update extra properties
-        if(extras.end() != extrasIter)
+        if (extras.end() != extrasIter)
         {
-            for(const auto& entry : extrasIter->second)
+            for (const auto& entry : extrasIter->second)
             {
-                if(interfaces.end() == interfaces.find(entry.first))
+                if (interfaces.end() == interfaces.find(entry.first))
                 {
                     interfaces.emplace(entry.first, entry.second);
                 }
             }
         }
-        objects.emplace(path,interfaces);
+        objects.emplace(path, interfaces);
     }
 
-    auto pimMsg = bus.new_method_call(
-                          service.c_str(),
-                          path.c_str(),
-                          intf.c_str(),
-                          "Notify");
+    auto pimMsg = bus.new_method_call(service.c_str(), path.c_str(),
+                                      intf.c_str(), "Notify");
     pimMsg.append(std::move(objects));
     auto inventoryMgrResponseMsg = bus.call(pimMsg);
     if (inventoryMgrResponseMsg.is_method_error())
@@ -421,10 +415,10 @@
 ///----------------------------------------------------
 // Checks if a particular fru area is populated or not
 ///----------------------------------------------------
-bool remove_invalid_area(const std::unique_ptr<ipmi_fru> &fru_area)
+bool remove_invalid_area(const std::unique_ptr<ipmi_fru>& fru_area)
 {
     // Filter the ones that are empty
-    if(!(fru_area->get_len()))
+    if (!(fru_area->get_len()))
     {
         return true;
     }
@@ -435,8 +429,8 @@
 // Populates various FRU areas
 // @prereq : This must be called only after validating common header.
 ///----------------------------------------------------------------------------------
-int ipmi_populate_fru_areas(uint8_t *fru_data, const size_t data_len,
-                            fru_area_vec_t & fru_area_vec)
+int ipmi_populate_fru_areas(uint8_t* fru_data, const size_t data_len,
+                            fru_area_vec_t& fru_area_vec)
 {
     int rc = -1;
 
@@ -444,72 +438,76 @@
     // offset mentioned by the common_hdr. If the file size is less than the
     // offset of any if the fru areas mentioned in the common header, then we do
     // not have a complete file.
-    for(uint8_t fru_entry = IPMI_FRU_INTERNAL_OFFSET;
-            fru_entry < (sizeof(struct common_header) -2); fru_entry++)
+    for (uint8_t fru_entry = IPMI_FRU_INTERNAL_OFFSET;
+         fru_entry < (sizeof(struct common_header) - 2); fru_entry++)
     {
         rc = -1;
         // Actual offset in the payload is the offset mentioned in common header
         // multiplied by 8. Common header is always the first 8 bytes.
         size_t area_offset = fru_data[fru_entry] * IPMI_EIGHT_BYTES;
-        if(area_offset && (data_len < (area_offset + 2)))
+        if (area_offset && (data_len < (area_offset + 2)))
         {
             // Our file size is less than what it needs to be. +2 because we are
             // using area len that is at 2 byte off area_offset
-            fprintf(stderr, "fru file is incomplete. Size:[%zd]\n",data_len);
+            fprintf(stderr, "fru file is incomplete. Size:[%zd]\n", data_len);
             return rc;
         }
-        else if(area_offset)
+        else if (area_offset)
         {
             // Read 2 bytes to know the actual size of area.
             uint8_t area_hdr[2] = {0};
-            memcpy(area_hdr, &((uint8_t *)fru_data)[area_offset], sizeof(area_hdr));
+            memcpy(area_hdr, &((uint8_t*)fru_data)[area_offset],
+                   sizeof(area_hdr));
 
             // Size of this area will be the 2nd byte in the fru area header.
-            size_t  area_len = area_hdr[1] * IPMI_EIGHT_BYTES;
+            size_t area_len = area_hdr[1] * IPMI_EIGHT_BYTES;
             uint8_t area_data[area_len] = {0};
 
             printf("fru data size:[%zd], area offset:[%zd], area_size:[%zd]\n",
-                    data_len, area_offset, area_len);
+                   data_len, area_offset, area_len);
 
             // See if we really have that much buffer. We have area offset amd
             // from there, the actual len.
-            if(data_len < (area_len + area_offset))
+            if (data_len < (area_len + area_offset))
             {
-                fprintf(stderr, "Incomplete Fru file.. Size:[%zd]\n",data_len);
+                fprintf(stderr, "Incomplete Fru file.. Size:[%zd]\n", data_len);
                 return rc;
             }
 
             // Save off the data.
-            memcpy(area_data, &((uint8_t *)fru_data)[area_offset], area_len);
+            memcpy(area_data, &((uint8_t*)fru_data)[area_offset], area_len);
 
             // Validate the crc
             rc = verify_fru_data(area_data, area_len);
-            if(rc < 0)
+            if (rc < 0)
             {
-                fprintf(stderr, "Error validating fru area. offset:[%zd]\n",area_offset);
+                fprintf(stderr, "Error validating fru area. offset:[%zd]\n",
+                        area_offset);
                 return rc;
             }
             else
             {
-                printf("Successfully verified area checksum. offset:[%zd]\n",area_offset);
+                printf("Successfully verified area checksum. offset:[%zd]\n",
+                       area_offset);
             }
 
             // We already have a vector that is passed to us containing all
             // of the fields populated. Update the data portion now.
-            for(auto& iter : fru_area_vec)
+            for (auto& iter : fru_area_vec)
             {
-                if((iter)->get_type() == get_fru_area_type(fru_entry))
+                if ((iter)->get_type() == get_fru_area_type(fru_entry))
                 {
                     (iter)->set_data(area_data, area_len);
                 }
             }
         } // If we have fru data present
-    } // Walk common_hdr
+    }     // Walk common_hdr
 
     // Not all the fields will be populated in a fru data. Mostly all cases will
     // not have more than 2 or 3.
     fru_area_vec.erase(std::remove_if(fru_area_vec.begin(), fru_area_vec.end(),
-                       remove_invalid_area), fru_area_vec.end());
+                                      remove_invalid_area),
+                       fru_area_vec.end());
 
     return EXIT_SUCCESS;
 }
@@ -518,12 +516,12 @@
 // Validates the fru data per ipmi common header constructs.
 // Returns with updated common_hdr and also file_size
 //----------------------------------------------------------
-int ipmi_validate_common_hdr(const uint8_t *fru_data, const size_t data_len)
+int ipmi_validate_common_hdr(const uint8_t* fru_data, const size_t data_len)
 {
     int rc = -1;
 
     uint8_t common_hdr[sizeof(struct common_header)] = {0};
-    if(data_len >= sizeof(common_hdr))
+    if (data_len >= sizeof(common_hdr))
     {
         memcpy(common_hdr, fru_data, sizeof(common_hdr));
     }
@@ -535,7 +533,7 @@
 
     // Verify the crc and size
     rc = verify_fru_data(common_hdr, sizeof(common_hdr));
-    if(rc < 0)
+    if (rc < 0)
     {
         fprintf(stderr, "Failed to validate common header\n");
         return rc;
@@ -547,27 +545,27 @@
 //------------------------------------------------------------
 // Cleanup routine
 //------------------------------------------------------------
-int cleanup_error(FILE *fru_fp, fru_area_vec_t & fru_area_vec)
+int cleanup_error(FILE* fru_fp, fru_area_vec_t& fru_area_vec)
 {
-    if(fru_fp != NULL)
+    if (fru_fp != NULL)
     {
         fclose(fru_fp);
         fru_fp = NULL;
     }
 
-    if(!(fru_area_vec.empty()))
+    if (!(fru_area_vec.empty()))
     {
         fru_area_vec.clear();
     }
 
-    return  -1;
+    return -1;
 }
 
 ///-----------------------------------------------------
 // Accepts the filename and validates per IPMI FRU spec
 //----------------------------------------------------
-int ipmi_validate_fru_area(const uint8_t fruid, const char *fru_file_name,
-                           sd_bus *bus_type, const bool bmc_fru)
+int ipmi_validate_fru_area(const uint8_t fruid, const char* fru_file_name,
+                           sd_bus* bus_type, const bool bmc_fru)
 {
     size_t data_len = 0;
     size_t bytes_read = 0;
@@ -577,12 +575,12 @@
     // are not used, keeping it here for completeness.
     fru_area_vec_t fru_area_vec;
 
-    for(uint8_t fru_entry = IPMI_FRU_INTERNAL_OFFSET;
-        fru_entry < (sizeof(struct common_header) -2); fru_entry++)
+    for (uint8_t fru_entry = IPMI_FRU_INTERNAL_OFFSET;
+         fru_entry < (sizeof(struct common_header) - 2); fru_entry++)
     {
         // Create an object and push onto a vector.
-        std::unique_ptr<ipmi_fru> fru_area = std::make_unique<ipmi_fru>
-                         (fruid, get_fru_area_type(fru_entry), bus_type, bmc_fru);
+        std::unique_ptr<ipmi_fru> fru_area = std::make_unique<ipmi_fru>(
+            fruid, get_fru_area_type(fru_entry), bus_type, bmc_fru);
 
         // Physically being present
         bool present = access(fru_file_name, F_OK) == 0;
@@ -591,16 +589,16 @@
         fru_area_vec.emplace_back(std::move(fru_area));
     }
 
-    FILE *fru_fp = fopen(fru_file_name,"rb");
-    if(fru_fp == NULL)
+    FILE* fru_fp = fopen(fru_file_name, "rb");
+    if (fru_fp == NULL)
     {
-        fprintf(stderr, "ERROR: opening:[%s]\n",fru_file_name);
+        fprintf(stderr, "ERROR: opening:[%s]\n", fru_file_name);
         perror("Error:");
         return cleanup_error(fru_fp, fru_area_vec);
     }
 
     // Get the size of the file to see if it meets minimum requirement
-    if(fseek(fru_fp, 0, SEEK_END))
+    if (fseek(fru_fp, 0, SEEK_END))
     {
         perror("Error:");
         return cleanup_error(fru_fp, fru_area_vec);
@@ -612,9 +610,10 @@
 
     rewind(fru_fp);
     bytes_read = fread(fru_data, data_len, 1, fru_fp);
-    if(bytes_read != 1)
+    if (bytes_read != 1)
     {
-        fprintf(stderr, "Failed reading fru data. Bytes_read=[%zd]\n",bytes_read);
+        fprintf(stderr, "Failed reading fru data. Bytes_read=[%zd]\n",
+                bytes_read);
         perror("Error:");
         return cleanup_error(fru_fp, fru_area_vec);
     }
@@ -624,30 +623,31 @@
     fru_fp = NULL;
 
     rc = ipmi_validate_common_hdr(fru_data, data_len);
-    if(rc < 0)
+    if (rc < 0)
     {
         return cleanup_error(fru_fp, fru_area_vec);
     }
 
-    // Now that we validated the common header, populate various fru sections if we have them here.
+    // Now that we validated the common header, populate various fru sections if
+    // we have them here.
     rc = ipmi_populate_fru_areas(fru_data, data_len, fru_area_vec);
-    if(rc < 0)
+    if (rc < 0)
     {
-        fprintf(stderr,"Populating FRU areas failed for:[%d]\n",fruid);
+        fprintf(stderr, "Populating FRU areas failed for:[%d]\n", fruid);
         return cleanup_error(fru_fp, fru_area_vec);
     }
     else
     {
-        printf("SUCCESS: Populated FRU areas for:[%s]\n",fru_file_name);
+        printf("SUCCESS: Populated FRU areas for:[%s]\n", fru_file_name);
     }
 
 #ifdef __IPMI_DEBUG__
-    for(auto& iter : fru_area_vec)
+    for (auto& iter : fru_area_vec)
     {
-        printf("FRU ID : [%d]\n",(iter)->get_fruid());
-        printf("AREA NAME : [%s]\n",(iter)->get_name());
-        printf("TYPE : [%d]\n",(iter)->get_type());
-        printf("LEN : [%d]\n",(iter)->get_len());
+        printf("FRU ID : [%d]\n", (iter)->get_fruid());
+        printf("AREA NAME : [%s]\n", (iter)->get_name());
+        printf("TYPE : [%d]\n", (iter)->get_type());
+        printf("LEN : [%d]\n", (iter)->get_len());
         printf("BUS NAME : [%s]\n", (iter)->get_bus_name());
         printf("OBJ PATH : [%s]\n", (iter)->get_obj_path());
         printf("INTF NAME :[%s]\n", (iter)->get_intf_name());
@@ -656,14 +656,14 @@
 
     // If the vector is populated with everything, then go ahead and update the
     // inventory.
-    if(!(fru_area_vec.empty()))
+    if (!(fru_area_vec.empty()))
     {
 
 #ifdef __IPMI_DEBUG__
-        printf("\n SIZE of vector is : [%d] \n",fru_area_vec.size());
+        printf("\n SIZE of vector is : [%d] \n", fru_area_vec.size());
 #endif
         rc = ipmi_update_inventory(fru_area_vec, bus_type);
-        if(rc <0)
+        if (rc < 0)
         {
             fprintf(stderr, "Error updating inventory\n");
         }
diff --git a/writefrudata.hpp b/writefrudata.hpp
index c65c21b..6b5ed47 100644
--- a/writefrudata.hpp
+++ b/writefrudata.hpp
@@ -1,8 +1,8 @@
 #ifndef __IPMI_WRITE_FRU_DATA_H__
 #define __IPMI_WRITE_FRU_DATA_H__
 
-#include <stdint.h>
 #include <stddef.h>
+#include <stdint.h>
 #include <systemd/sd-bus.h>
 
 #ifndef __cplusplus
@@ -18,11 +18,11 @@
 // Format of write fru data command
 struct write_fru_data_t
 {
-    uint8_t  frunum;
-    uint8_t  offsetls;
-    uint8_t  offsetms;
-    uint8_t  data;
-}__attribute__ ((packed));
+    uint8_t frunum;
+    uint8_t offsetls;
+    uint8_t offsetms;
+    uint8_t data;
+} __attribute__((packed));
 
 // Per IPMI v2.0 FRU specification
 struct common_header
@@ -35,23 +35,23 @@
     uint8_t multi_offset;
     uint8_t pad;
     uint8_t crc;
-}__attribute__((packed));
+} __attribute__((packed));
 
 // first byte in header is 1h per IPMI V2 spec.
-#define IPMI_FRU_HDR_BYTE_ZERO   1
+#define IPMI_FRU_HDR_BYTE_ZERO 1
 #define IPMI_FRU_INTERNAL_OFFSET offsetof(struct common_header, internal_offset)
-#define IPMI_FRU_CHASSIS_OFFSET  offsetof(struct common_header, chassis_offset)
-#define IPMI_FRU_BOARD_OFFSET    offsetof(struct common_header, board_offset)
-#define IPMI_FRU_PRODUCT_OFFSET  offsetof(struct common_header, product_offset)
-#define IPMI_FRU_MULTI_OFFSET    offsetof(struct common_header, multi_offset)
-#define IPMI_FRU_HDR_CRC_OFFSET  offsetof(struct common_header, crc)
-#define IPMI_EIGHT_BYTES         8
+#define IPMI_FRU_CHASSIS_OFFSET offsetof(struct common_header, chassis_offset)
+#define IPMI_FRU_BOARD_OFFSET offsetof(struct common_header, board_offset)
+#define IPMI_FRU_PRODUCT_OFFSET offsetof(struct common_header, product_offset)
+#define IPMI_FRU_MULTI_OFFSET offsetof(struct common_header, multi_offset)
+#define IPMI_FRU_HDR_CRC_OFFSET offsetof(struct common_header, crc)
+#define IPMI_EIGHT_BYTES 8
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-int ipmi_validate_fru_area(const uint8_t, const char *, sd_bus *, const bool);
+int ipmi_validate_fru_area(const uint8_t, const char*, sd_bus*, const bool);
 
 #ifdef __cplusplus
 } // extern C
