bus: Add explicit flush and close operations

This change exposes explicit flush and close operations on the bus for
users who require bus termination at a specific checkpoint instead of
program termination.

Change-Id: I0e2edce8586956ab286d75d1eb13eeca4309e370
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/sdbusplus/bus.hpp.in b/sdbusplus/bus.hpp.in
index 66961ee..587d10b 100644
--- a/sdbusplus/bus.hpp.in
+++ b/sdbusplus/bus.hpp.in
@@ -155,6 +155,22 @@
         return _bus.release();
     }
 
+    /** @brief Flush all of the outstanding work on the bus. */
+    void flush()
+    {
+        int r = _intf->sd_bus_flush(_bus.get());
+        if (r < 0)
+        {
+            throw exception::SdBusError(-r, "sd_bus_flush");
+        }
+    }
+
+    /** @brief Close the connection to the dbus daemon. */
+    void close()
+    {
+        _intf->sd_bus_close(_bus.get());
+    }
+
     /** @brief Wait for new dbus messages or signals.
      *
      *  @param[in] timeout_us - Timeout in usec.
diff --git a/sdbusplus/sdbus.hpp b/sdbusplus/sdbus.hpp
index f5d732f..acc5f3f 100644
--- a/sdbusplus/sdbus.hpp
+++ b/sdbusplus/sdbus.hpp
@@ -139,6 +139,9 @@
     virtual sd_bus* sd_bus_unref(sd_bus* bus) = 0;
     virtual sd_bus* sd_bus_flush_close_unref(sd_bus* bus) = 0;
 
+    virtual int sd_bus_flush(sd_bus* bus) = 0;
+    virtual void sd_bus_close(sd_bus* bus) = 0;
+
     virtual int sd_bus_wait(sd_bus* bus, uint64_t timeout_usec) = 0;
 };
 
@@ -456,6 +459,16 @@
         return ::sd_bus_flush_close_unref(bus);
     }
 
+    int sd_bus_flush(sd_bus* bus) override
+    {
+        return ::sd_bus_flush(bus);
+    }
+
+    void sd_bus_close(sd_bus* bus) override
+    {
+        ::sd_bus_close(bus);
+    }
+
     int sd_bus_wait(sd_bus* bus, uint64_t timeout_usec) override
     {
         return ::sd_bus_wait(bus, timeout_usec);
diff --git a/sdbusplus/test/sdbus_mock.hpp b/sdbusplus/test/sdbus_mock.hpp
index 7264482..36a8598 100644
--- a/sdbusplus/test/sdbus_mock.hpp
+++ b/sdbusplus/test/sdbus_mock.hpp
@@ -107,6 +107,8 @@
     MOCK_METHOD3(sd_bus_send, int(sd_bus*, sd_bus_message*, uint64_t*));
     MOCK_METHOD1(sd_bus_unref, sd_bus*(sd_bus*));
     MOCK_METHOD1(sd_bus_flush_close_unref, sd_bus*(sd_bus*));
+    MOCK_METHOD1(sd_bus_flush, int(sd_bus*));
+    MOCK_METHOD1(sd_bus_close, void(sd_bus*));
     MOCK_METHOD2(sd_bus_wait, int(sd_bus*, uint64_t));
 };