image manager: add inotify watch

Add an inotify watch to the known software image location.

Hook the inotify fd with sd-event, so that on callback, version d-bus
objects can be created based on the newly added software image.

Resolves openbmc/openbmc#1444.

Change-Id: I5c460f820c8d3a851b8ddc969f26d38870c36991
Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
diff --git a/image_manager_main.cpp b/image_manager_main.cpp
index bd41b63..66f31f6 100644
--- a/image_manager_main.cpp
+++ b/image_manager_main.cpp
@@ -1,27 +1,38 @@
-#include <iostream>
 #include <cstdlib>
 #include <exception>
 #include <sdbusplus/bus.hpp>
+#include <phosphor-logging/log.hpp>
 #include "config.h"
 #include "version_software_manager.hpp"
+#include "watch.hpp"
 
 int main(int argc, char* argv[])
 {
     auto bus = sdbusplus::bus::new_default();
 
-    // Add sdbusplus ObjectManager.
+    sd_event* loop = nullptr;
+    sd_event_default(&loop);
+
     sdbusplus::server::manager::manager objManager(bus,
             SOFTWARE_OBJPATH);
-
     phosphor::software::manager::Version manager(bus,
             SOFTWARE_OBJPATH);
-
     bus.request_name(VERSION_BUSNAME);
 
-    while (true)
+    try
     {
-        bus.process_discard();
-        bus.wait();
+        phosphor::software::manager::Watch watch(loop);
+        bus.attach_event(loop, SD_EVENT_PRIORITY_NORMAL);
+        sd_event_loop(loop);
     }
+    catch (std::exception& e)
+    {
+        using namespace phosphor::logging;
+        log<level::ERR>(e.what());
+        return -1;
+    }
+
+    sd_event_unref(loop);
+
     return 0;
 }