Add new_method_errno interface to message and low-level interface

In order to properly return an sdbus error in an async execution path,
the low-level interface and message classes need to expose the
underlying sdbus set errno api.

Change-Id: I893ef587ecf8ae3936198375931e6747d71ad451
Signed-off-by: Vernon Mauery <vernon.mauery@linux.intel.com>
diff --git a/sdbusplus/message.hpp b/sdbusplus/message.hpp
index a989a48..eb2d49d 100644
--- a/sdbusplus/message.hpp
+++ b/sdbusplus/message.hpp
@@ -265,6 +265,24 @@
         return message(reply, std::false_type());
     }
 
+    /** @brief Create a 'method_error' type message from an existing message.
+     *
+     *  @param[in] error - integer error number
+     *  @return method-error message.
+     */
+    message new_method_errno(int error)
+    {
+        msgp_t reply = nullptr;
+        int r = _intf->sd_bus_message_new_method_errno(this->get(), &reply,
+                                                       error, nullptr);
+        if (r < 0)
+        {
+            throw exception::SdBusError(-r, "sd_bus_message_new_method_errno");
+        }
+
+        return message(reply, std::false_type());
+    }
+
     /** @brief Perform a 'method-return' response call. */
     void method_return()
     {
diff --git a/sdbusplus/sdbus.hpp b/sdbusplus/sdbus.hpp
index 74fe86d..46694e6 100644
--- a/sdbusplus/sdbus.hpp
+++ b/sdbusplus/sdbus.hpp
@@ -99,6 +99,10 @@
     virtual int sd_bus_message_new_method_return(sd_bus_message* call,
                                                  sd_bus_message** m) = 0;
 
+    virtual int sd_bus_message_new_method_errno(sd_bus_message* call,
+                                                sd_bus_message** m, int error,
+                                                const sd_bus_error* p) = 0;
+
     virtual int sd_bus_message_new_signal(sd_bus* bus, sd_bus_message** m,
                                           const char* path,
                                           const char* interface,
@@ -356,6 +360,13 @@
         return ::sd_bus_message_new_method_return(call, m);
     }
 
+    int sd_bus_message_new_method_errno(sd_bus_message* call,
+                                        sd_bus_message** m, int error,
+                                        const sd_bus_error* p) override
+    {
+        return ::sd_bus_message_new_method_errno(call, m, error, p);
+    }
+
     int sd_bus_message_new_signal(sd_bus* bus, sd_bus_message** m,
                                   const char* path, const char* interface,
                                   const char* member) override
diff --git a/sdbusplus/test/sdbus_mock.hpp b/sdbusplus/test/sdbus_mock.hpp
index ea96c0f..0079778 100644
--- a/sdbusplus/test/sdbus_mock.hpp
+++ b/sdbusplus/test/sdbus_mock.hpp
@@ -78,6 +78,10 @@
     MOCK_METHOD2(sd_bus_message_new_method_return,
                  int(sd_bus_message*, sd_bus_message**));
 
+    MOCK_METHOD4(sd_bus_message_new_method_errno,
+                 int(sd_bus_message* call, sd_bus_message** m, int error,
+                     const sd_bus_error* p));
+
     MOCK_METHOD5(sd_bus_message_new_signal,
                  int(sd_bus*, sd_bus_message**, const char*, const char*,
                      const char*));