Delay opening OCC device until bind

Fixes openbmc/openbmc#2118

Change-Id: If9e2610fe7443daa2196b0e5989f81bc544266b2
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/occ_pass_through.hpp b/occ_pass_through.hpp
index f2f78c7..205fc04 100644
--- a/occ_pass_through.hpp
+++ b/occ_pass_through.hpp
@@ -4,7 +4,6 @@
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server/object.hpp>
 #include <org/open_power/OCC/PassThrough/server.hpp>
-#include "file.hpp"
 
 namespace open_power
 {
@@ -14,6 +13,9 @@
 using Iface = sdbusplus::server::object::object<
     sdbusplus::org::open_power::OCC::server::PassThrough>;
 
+// For waiting on signals
+namespace sdbusRule = sdbusplus::bus::match::rules;
+
 /** @class PassThrough
  *  @brief Implements org.open_power.OCC.PassThrough
  */
@@ -21,7 +23,6 @@
 {
     public:
         PassThrough() = delete;
-        ~PassThrough() = default;
         PassThrough(const PassThrough&) = delete;
         PassThrough& operator=(const PassThrough&) = delete;
         PassThrough(PassThrough&&) = default;
@@ -34,6 +35,11 @@
         PassThrough(sdbusplus::bus::bus& bus,
                     const char* path);
 
+        ~PassThrough()
+        {
+            closeDevice();
+        }
+
         /** @brief Pass through command to OCC
          *  @param[in] command - command to pass-through
          *  @returns OCC response as an array
@@ -48,17 +54,33 @@
         /** @brief OCC device path
          *  For now, here is the hard-coded mapping until
          *  the udev rule is in.
-         *  occ0 --> /dev/occfifo1
-         *  occ1 --> /dev/occfifo2
+         *  occ0 --> /dev/occ1
+         *  occ1 --> /dev/occ2
          *  ...
          */
-        std::string devicePath = "/dev/occ";
+        std::string devicePath;
 
-        /** @brief File descriptor manager */
-        FileDescriptor fd;
+        /** brief file descriptor associated with occ device */
+        int fd = -1;
 
-        /** Opens devicePath and returns file descritor */
-        int openDevice();
+        /** @brief Subscribe to OCC Status signal
+         *
+         *  Once the OCC status gets to active, only then we will get /dev/occ2
+         *  populated and hence need to wait on that before opening that
+         */
+        sdbusplus::bus::match_t activeStatusSignal;
+
+        /** Opens devicePath and populates file descritor */
+        void openDevice();
+
+        /** Closed the fd associated with opened device */
+        void closeDevice();
+
+        /** @brief Callback function on OCC Status change signals
+         *
+         *  @param[in]  msg - Data associated with subscribed signal
+         */
+        void activeStatusEvent(sdbusplus::message::message& msg);
 };
 
 } // namespace occ