PEL: Close PEL FD after getPEL call

To close the file descriptor returned from the getPEL D-Bus method call,
use the 'Defer' sdeventplus object to schedule it to happen from the
event loop.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I2b850a1c92215e7f66166cc5440d7071663065c0
diff --git a/extensions/openpower-pels/manager.cpp b/extensions/openpower-pels/manager.cpp
index aec5053..a705e67 100644
--- a/extensions/openpower-pels/manager.cpp
+++ b/extensions/openpower-pels/manager.cpp
@@ -18,6 +18,8 @@
 #include "additional_data.hpp"
 #include "pel.hpp"
 
+#include <unistd.h>
+
 #include <filesystem>
 #include <fstream>
 #include <xyz/openbmc_project/Common/error.hpp>
@@ -182,9 +184,25 @@
         throw common_error::InvalidArgument();
     }
 
+    scheduleFDClose(*fd);
+
     return *fd;
 }
 
+void Manager::scheduleFDClose(int fd)
+{
+    _fdCloserEventSource = std::make_unique<sdeventplus::source::Defer>(
+        _logManager.getBus().get_event(),
+        std::bind(std::mem_fn(&Manager::closeFD), this, fd,
+                  std::placeholders::_1));
+}
+
+void Manager::closeFD(int fd, sdeventplus::source::EventBase& source)
+{
+    close(fd);
+    _fdCloserEventSource.reset();
+}
+
 std::vector<uint8_t> Manager::getPELFromOBMCID(uint32_t obmcLogID)
 {
     Repository::LogID id{Repository::LogID::Obmc(obmcLogID)};