diff options
author | Pavel Březina <pbrezina@redhat.com> | 2014-05-21 16:41:13 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2014-05-27 10:43:30 +0200 |
commit | 2965f42fed62b77a5b0e7f6cd01c4be1072484f5 (patch) | |
tree | b0ef623609bca28dafd9dc4c3e9724736c022fb5 /src/sbus | |
parent | c43ed56bc5d29e189e529235a3ba4bc17cd1a95f (diff) | |
download | sssd-2965f42fed62b77a5b0e7f6cd01c4be1072484f5.tar.gz sssd-2965f42fed62b77a5b0e7f6cd01c4be1072484f5.tar.xz sssd-2965f42fed62b77a5b0e7f6cd01c4be1072484f5.zip |
SBUS: Add utility function sbus_add_array_as_variant_to_dict
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
Diffstat (limited to 'src/sbus')
-rw-r--r-- | src/sbus/sssd_dbus.h | 7 | ||||
-rw-r--r-- | src/sbus/sssd_dbus_properties.c | 76 |
2 files changed, 83 insertions, 0 deletions
diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h index b2b6dd4a3..372521a35 100644 --- a/src/sbus/sssd_dbus.h +++ b/src/sbus/sssd_dbus.h @@ -278,6 +278,13 @@ int sbus_add_variant_to_dict(DBusMessageIter *iter_dict, int type, const void *value); +int sbus_add_array_as_variant_to_dict(DBusMessageIter *iter_dict, + const char *key, + int type, + uint8_t *values, + const int len, + const unsigned int item_size); + int sbus_request_return_as_variant(struct sbus_request *dbus_req, int type, const void *value); diff --git a/src/sbus/sssd_dbus_properties.c b/src/sbus/sssd_dbus_properties.c index 07b33297b..a85f0d6e2 100644 --- a/src/sbus/sssd_dbus_properties.c +++ b/src/sbus/sssd_dbus_properties.c @@ -91,6 +91,82 @@ int sbus_add_variant_to_dict(DBusMessageIter *iter_dict, return EOK; } +int sbus_add_array_as_variant_to_dict(DBusMessageIter *iter_dict, + const char *key, + int type, + uint8_t *values, + const int len, + const unsigned int item_size) +{ + DBusMessageIter iter_dict_entry; + DBusMessageIter iter_variant; + DBusMessageIter iter_array; + dbus_bool_t dbret; + char variant_type[] = {DBUS_TYPE_ARRAY, type, '\0'}; + char array_type[] = {type, '\0'}; + void *addr = NULL; + int i; + + dbret = dbus_message_iter_open_container(iter_dict, + DBUS_TYPE_DICT_ENTRY, NULL, + &iter_dict_entry); + if (!dbret) { + return ENOMEM; + } + + /* Start by appending the key */ + dbret = dbus_message_iter_append_basic(&iter_dict_entry, + DBUS_TYPE_STRING, &key); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_open_container(&iter_dict_entry, + DBUS_TYPE_VARIANT, + variant_type, + &iter_variant); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_open_container(&iter_variant, + DBUS_TYPE_ARRAY, + array_type, + &iter_array); + if (!dbret) { + return ENOMEM; + } + + /* Now add the value */ + for (i = 0; i < len; i++) { + addr = values + i * item_size; + dbret = dbus_message_iter_append_basic(&iter_array, type, addr); + if (!dbret) { + return ENOMEM; + } + } + + dbret = dbus_message_iter_close_container(&iter_variant, + &iter_array); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_close_container(&iter_dict_entry, + &iter_variant); + if (!dbret) { + return ENOMEM; + } + + dbret = dbus_message_iter_close_container(iter_dict, + &iter_dict_entry); + if (!dbret) { + return ENOMEM; + } + + return EOK; +} + static int dispatch_properties_set(struct sbus_connection *conn, struct sbus_interface *intf, |