From e871517a0bfb806cb2fddc76ff2f59360437a73c Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Mon, 12 May 2014 18:59:35 +0200 Subject: SBUS: Utility function sbus_request_return_as_variant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. Reviewed-by: Stef Walter Reviewed-by: Pavel Březina --- src/sbus/sssd_dbus.h | 4 +++ src/sbus/sssd_dbus_request.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) (limited to 'src') diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h index 15ca52118..efb029681 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 2d23931aa..6c0cb4dac 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) { -- cgit