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*));