>From a0fe9eb748301ed5df475ff55e375ba2bcd75f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Mon, 12 May 2014 19:00:36 +0200 Subject: [PATCH 2/6] SBUS: Utility function sbus_request_return_array_as_variant Adds a utility function that returns an array of types values, each of a given size, with a given type in a variant. This utility function will be used by the GetAll property call. --- src/sbus/sssd_dbus.h | 6 +++ src/sbus/sssd_dbus_request.c | 103 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h index efb0296813e9946f2b2fa1fd867592315cc4ee4f..a19f1d9c65656ce38e0e587b6cf71c3c947f4593 100644 --- a/src/sbus/sssd_dbus.h +++ b/src/sbus/sssd_dbus.h @@ -250,6 +250,12 @@ int sbus_request_return_as_variant(struct sbus_request *dbus_req, int type, const void *value); +int sbus_request_return_array_as_variant(struct sbus_request *dbus_req, + int type, + uint8_t *values, + const int len, + const size_t item_size); + /* * 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 af439b284024b2b335adc0119f131dd6046c61bc..f2870077d6dc96b94c083ccdc9fc9a4c00c0428d 100644 --- a/src/sbus/sssd_dbus_request.c +++ b/src/sbus/sssd_dbus_request.c @@ -182,6 +182,109 @@ done: } +int sbus_request_return_array_as_variant(struct sbus_request *dbus_req, + int type, + uint8_t *values, + const int len, + const size_t item_size) +{ + TALLOC_CTX *tmp_ctx = NULL; + DBusMessage *reply = NULL; + dbus_bool_t dbret; + DBusMessageIter iter; + DBusMessageIter variant_iter; + DBusMessageIter array_iter; + char *variant_type = NULL; + char *array_type = NULL; + void *addr = NULL; + int ret; + int i; + + tmp_ctx = talloc_new(NULL); + if (tmp_ctx == NULL) { + return ENOMEM; + } + + variant_type = talloc_asprintf(tmp_ctx, DBUS_TYPE_ARRAY_AS_STRING "%c", + type); + if (variant_type == NULL) { + ret = ENOMEM; + goto done; + } + + array_type = talloc_asprintf(tmp_ctx, "%c", type); + if (array_type == NULL) { + ret = ENOMEM; + goto done; + } + + 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); + ret = ENOMEM; + goto done; + } + + dbus_message_iter_init_append(reply, &iter); + dbret = dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, + variant_type, &variant_iter); + if (!dbret) { + sbus_request_finish(dbus_req, NULL); + ret = EINVAL; + goto done; + } + + /* Open container for values */ + dbret = dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, + array_type, &array_iter); + if (!dbret) { + sbus_request_finish(dbus_req, NULL); + ret = EINVAL; + goto done; + } + + for (i = 0; i < len; i++) { + addr = values + i * item_size; + dbret = dbus_message_iter_append_basic(&array_iter, type, addr); + if (!dbret) { + sbus_request_finish(dbus_req, NULL); + ret = ENOMEM; + goto done; + } + } + + dbret = dbus_message_iter_close_container(&variant_iter, &array_iter); + if (!dbret) { + sbus_request_finish(dbus_req, NULL); + ret = EINVAL; + goto done; + } + + dbret = dbus_message_iter_close_container(&iter, &variant_iter); + if (!dbret) { + sbus_request_finish(dbus_req, NULL); + ret = EINVAL; + goto done; + } + + if (dbret) { + ret = sbus_request_finish(dbus_req, reply); + } else { + DEBUG(SSSDBG_CRIT_FAILURE, "Couldn't build DBus message\n"); + sbus_request_finish(dbus_req, NULL); + ret = EINVAL; + } + +done: + if (reply != NULL) { + dbus_message_unref(reply); + } + + talloc_free(tmp_ctx); + return ret; +} + int sbus_request_fail_and_finish(struct sbus_request *dbus_req, const DBusError *error) { -- 1.9.0