>From bea087eade8cc132a5e1db6788b1344cd53dda00 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Mon, 12 May 2014 18:59:35 +0200 Subject: [PATCH 1/8] SBUS: Utility function sbus_request_return_as_variant Adds a utility function that returns a single value with a given type in a variant. This utility function will be used by the Get property call. --- src/sbus/sssd_dbus.h | 4 +++ src/sbus/sssd_dbus_request.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h index 15ca521184f82c7424549907b7afa912f891c3ad..efb0296813e9946f2b2fa1fd867592315cc4ee4f 100644 --- a/src/sbus/sssd_dbus.h +++ b/src/sbus/sssd_dbus.h @@ -246,6 +246,10 @@ int sbus_request_return_and_finish(struct sbus_request *dbus_req, int first_arg_type, ...); +int sbus_request_return_as_variant(struct sbus_request *dbus_req, + int type, + const void *value); + /* * Return an error for a DBus method call request. The @error is a normal * DBusError. diff --git a/src/sbus/sssd_dbus_request.c b/src/sbus/sssd_dbus_request.c index 2d23931aa07a83c15c30b31615d5db7cfee11a0a..6c0cb4dac1e544114d7d6b2853826c44abe1d9b8 100644 --- a/src/sbus/sssd_dbus_request.c +++ b/src/sbus/sssd_dbus_request.c @@ -125,6 +125,70 @@ int sbus_request_return_and_finish(struct sbus_request *dbus_req, return ret; } +int sbus_request_return_as_variant(struct sbus_request *dbus_req, + int type, + const void *value) +{ + DBusMessage *reply; + dbus_bool_t dbret; + DBusMessageIter iter; + DBusMessageIter valiter; + char strtype[2]; + int ret; + + snprintf(strtype, 2, "%c", type); + + reply = dbus_message_new_method_return(dbus_req->message); + if (reply == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory allocating DBus message\n"); + sbus_request_finish(dbus_req, NULL); + return ENOMEM; + } + + dbus_message_iter_init_append(reply, &iter); + dbret = dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, + strtype, &valiter); + if (!dbret) { + sbus_request_fail_and_finish( + dbus_req, + sbus_error_new(dbus_req, + DBUS_ERROR_FAILED, + "Could not open variant for [%s]\n", + strtype)); + ret = EINVAL; + goto done; + } + + dbret = dbus_message_iter_append_basic(&valiter, type, value); + if (!dbret) { + sbus_request_fail_and_finish( + dbus_req, + sbus_error_new(dbus_req, + DBUS_ERROR_FAILED, + "Could not append [%s] to variant\n", + strtype)); + ret = EINVAL; + goto done; + } + + dbret = dbus_message_iter_close_container(&iter, &valiter); + if (dbret) { + ret = sbus_request_finish(dbus_req, reply); + } else { + sbus_request_fail_and_finish( + dbus_req, + sbus_error_new(dbus_req, + DBUS_ERROR_FAILED, + "Could not close variant\n")); + ret = EINVAL; + } + +done: + dbus_message_unref(reply); + return ret; +} + + int sbus_request_fail_and_finish(struct sbus_request *dbus_req, const DBusError *error) { -- 1.9.0