Add FFDC collection

Add a class to watch for the presence of SBEFIFO FFDC reported up
through the OCC hwmon driver.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
Change-Id: Ia8bf6eddb037aec547b72ecce39c1a977d9374bc
diff --git a/occ_ffdc.hpp b/occ_ffdc.hpp
new file mode 100644
index 0000000..a4c882d
--- /dev/null
+++ b/occ_ffdc.hpp
@@ -0,0 +1,74 @@
+#pragma once
+
+#include "config.h"
+
+#include "occ_errors.hpp"
+
+namespace open_power
+{
+namespace occ
+{
+
+/** @class FFDC
+ *  @brief Monitors for SBE FFDC availability
+ */
+class FFDC : public Error
+{
+  public:
+    FFDC() = delete;
+    FFDC(const FFDC&) = delete;
+    FFDC& operator=(const FFDC&) = delete;
+    FFDC(FFDC&&) = default;
+    FFDC& operator=(FFDC&&) = default;
+
+    /** @brief Constructs the FFDC object
+     *
+     *  @param[in] event    - reference to sd_event unique_ptr
+     *  @param[in] file     - File used by driver to communicate FFDC data
+     *  @param[in] instance - OCC instance number
+     */
+    FFDC(EventPtr& event, const fs::path& file, unsigned int instance) :
+        Error(event, file, nullptr), instance(instance)
+    {
+        // Nothing to do here.
+    }
+
+    ~FFDC()
+    {
+        for (auto&& it : temporaryFiles)
+        {
+            close(it.second);
+            fs::remove(it.first);
+        }
+    }
+
+    /** @brief Helper function to create a PEL with the OpenPower DBus
+     *         interface
+     *
+     * @param[in] path - the DBus error path
+     * @param[in] src6 - the SBE error SRC6 word
+     * @param[in] msg - the error message
+     * @param[in] fd - the file descriptor for any FFDC
+     */
+    static uint32_t createPEL(const char* path, uint32_t src6, const char* msg,
+                              int fd = -1);
+
+  private:
+    /** @brief OCC instance number. Ex, 0,1, etc */
+    unsigned int instance;
+
+    /** @brief Stores the temporary files and file descriptors
+     *         in usage. They will be cleaned up when the class
+     *         is destroyed (when the application exits).
+     */
+    std::vector<std::pair<fs::path, int>> temporaryFiles;
+
+    /** @brief When the error event is received, analyzes it
+     *         and makes a callback to error handler if the
+     *         content denotes an error condition
+     */
+    void analyzeEvent() override;
+};
+
+} // namespace occ
+} // namespace open_power