summaryrefslogtreecommitdiffstats
path: root/src/sbus/sssd_dbus_request.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sbus/sssd_dbus_request.c')
-rw-r--r--src/sbus/sssd_dbus_request.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/sbus/sssd_dbus_request.c b/src/sbus/sssd_dbus_request.c
index c45f3a9fd..1546f0ddf 100644
--- a/src/sbus/sssd_dbus_request.c
+++ b/src/sbus/sssd_dbus_request.c
@@ -20,10 +20,13 @@
#include "util/util.h"
#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_private.h"
#include <sys/time.h>
#include <dbus/dbus.h>
+static const DBusError error_internal = { DBUS_ERROR_FAILED, "Internal Error" };
+
static int sbus_request_destructor(struct sbus_request *dbus_req)
{
dbus_message_unref(dbus_req->message);
@@ -51,6 +54,33 @@ sbus_new_request(struct sbus_connection *conn,
return dbus_req;
}
+void
+sbus_request_invoke_or_finish(struct sbus_request *dbus_req,
+ sbus_msg_handler_fn handler_fn,
+ void *handler_data,
+ sbus_method_invoker_fn invoker_fn)
+{
+ int ret;
+
+ if (invoker_fn) {
+ ret = invoker_fn(dbus_req, handler_fn);
+ } else {
+ ret = handler_fn(dbus_req, handler_data);
+ }
+
+ switch(ret) {
+ case EOK:
+ return;
+ case ENOMEM:
+ DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory handling DBus message\n");
+ sbus_request_finish(dbus_req, NULL);
+ break;
+ default:
+ sbus_request_fail_and_finish(dbus_req, &error_internal);
+ break;
+ }
+}
+
int sbus_request_finish(struct sbus_request *dbus_req,
DBusMessage *reply)
{