Adding host control signal monitoring support

Adds in support to subscribe and monitor for the signal
indicating the host command has been processed

Change-Id: Icab302fc5bd75ecd1d6804d7ab3196e6cceda3b1
Signed-off-by: Andrew Geissler <andrewg@us.ibm.com>
diff --git a/host_check_main.cpp b/host_check_main.cpp
index 6dab9cb..f4e895c 100644
--- a/host_check_main.cpp
+++ b/host_check_main.cpp
@@ -1,20 +1,77 @@
 #include <cstdlib>
+#include <unistd.h>
 #include <sdbusplus/bus.hpp>
+#include <sdbusplus/bus/match.hpp>
 #include <phosphor-logging/log.hpp>
+#include <xyz/openbmc_project/Control/Host/server.hpp>
 
 using namespace phosphor::logging;
+using namespace sdbusplus::xyz::openbmc_project::Control::server;
+
+
+bool cmdDone     = false;
+bool hostRunning = false;
+
+// Function called on host control signals
+static int hostControlSignal(sd_bus_message* msg,
+                             void* userData,
+                             sd_bus_error* retError)
+{
+    std::string cmdCompleted{};
+    std::string cmdStatus{};
+
+    auto sdPlusMsg = sdbusplus::message::message(msg);
+    sdPlusMsg.read(cmdCompleted, cmdStatus);
+
+    log<level::DEBUG>("Host control signal values",
+            entry("COMMAND=%s",cmdCompleted.c_str()),
+            entry("STATUS=%s",cmdStatus.c_str()));
+
+    // Verify it's the command this code is interested in and then check status
+    if(Host::convertCommandFromString(cmdCompleted) == Host::Command::Heartbeat)
+    {
+        cmdDone = true;
+
+        if(Host::convertResultFromString(cmdStatus) == Host::Result::Success)
+        {
+            hostRunning = true;
+        }
+    }
+
+    return 0;
+}
 
 int main(int argc, char *argv[])
 {
     log<level::INFO>("Check if host is running");
 
-    // Setup Signal Handler
+    auto bus = sdbusplus::bus::new_default();
 
-    // Initiate heartbeat command
+    // Setup Signal Handler
+    sdbusplus::bus::match::match hostControlSignals(bus,
+                               "type='signal',"
+                               "member='CommandComplete',"
+                               "path='/xyz/openbmc_project/control/host0',"
+                               "interface='xyz.openbmc_project.Control.Host'",
+                               hostControlSignal,
+                               nullptr);
+
+    // TODO Initiate heartbeat command
 
     // Wait for signal
+    while(!cmdDone)
+    {
+        bus.process_discard();
+        if (cmdDone) break;
+        bus.wait();
+    }
 
     // If host running then create file
+    if(hostRunning)
+    {
+        // TODO - Add file creation
+        log<level::INFO>("Host is running!");
+    }
 
     return 0;
 }