diff options
author | Pavel Březina <pbrezina@redhat.com> | 2015-03-18 13:01:07 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2015-05-22 15:57:05 +0200 |
commit | ac744223411099a862a747e7168a30255c003bf7 (patch) | |
tree | 3205b9f9f5efcc420988f61380a62be32abc3eff /src/sbus/sssd_dbus_invokers.c | |
parent | 10a28f461c25d788ff4dcffefa881e7aa724a25d (diff) | |
download | sssd-ac744223411099a862a747e7168a30255c003bf7.tar.gz sssd-ac744223411099a862a747e7168a30255c003bf7.tar.xz sssd-ac744223411099a862a747e7168a30255c003bf7.zip |
sbus: add a{sas} get invoker
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Diffstat (limited to 'src/sbus/sssd_dbus_invokers.c')
-rw-r--r-- | src/sbus/sssd_dbus_invokers.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/sbus/sssd_dbus_invokers.c b/src/sbus/sssd_dbus_invokers.c index df9104f63..f4d4ba3a6 100644 --- a/src/sbus/sssd_dbus_invokers.c +++ b/src/sbus/sssd_dbus_invokers.c @@ -303,6 +303,124 @@ int sbus_invoke_get_ao(DBusMessageIter *iter, DBUS_TYPE_OBJECT_PATH, iter); } +int sbus_invoke_get_aDOsasDE(DBusMessageIter *iter, + struct sbus_request *sbus_req, + void *function_ptr) +{ + void (*handler_fn)(struct sbus_request *, void *, hash_table_t **); + DBusMessageIter it_array; + DBusMessageIter it_dict; + DBusMessageIter it_values; + hash_table_t *table; + struct hash_iter_context_t *table_iter = NULL; + hash_entry_t *entry; + const char **values; + dbus_bool_t dbret; + errno_t ret; + int i; + + handler_fn = function_ptr; + handler_fn(sbus_req, sbus_req->intf->handler_data, &table); + + dbret = dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_ARRAY_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &it_array); + if (!dbret) { + ret = EIO; + goto done; + } + + /* iterate over keys */ + + if (table == NULL) { + dbret = dbus_message_iter_close_container(iter, &it_array); + if (!dbret) { + ret = EIO; + goto done; + } + + ret = EOK; + goto done; + } + + table_iter = new_hash_iter_context(table); + while ((entry = table_iter->next(table_iter)) != NULL) { + if (entry->key.type != HASH_KEY_STRING || entry->key.str == NULL + || entry->value.type != HASH_VALUE_PTR + || entry->value.ptr == NULL) { + continue; + } + + dbret = dbus_message_iter_open_container(&it_array, + DBUS_TYPE_DICT_ENTRY, NULL, + &it_dict); + if (!dbret) { + ret = EIO; + goto done; + } + + /* append key as dict entry key */ + + dbret = dbus_message_iter_append_basic(&it_dict, + DBUS_TYPE_STRING, + &entry->key.str); + if (!dbret) { + ret = EIO; + goto done; + } + + /* iterate over values */ + + dbret = dbus_message_iter_open_container(&it_dict, + DBUS_TYPE_ARRAY, + DBUS_TYPE_STRING_AS_STRING, + &it_values); + if (!dbret) { + ret = EIO; + goto done; + } + + values = entry->value.ptr; + for (i = 0; values[i] != NULL; i++) { + /* append value into array */ + dbret = dbus_message_iter_append_basic(&it_values, + DBUS_TYPE_STRING, + &values[i]); + if (!dbret) { + ret = EIO; + goto done; + } + } + + dbret = dbus_message_iter_close_container(&it_dict, &it_values); + if (!dbret) { + ret = EIO; + goto done; + } + + dbret = dbus_message_iter_close_container(&it_array, &it_dict); + if (!dbret) { + ret = EIO; + goto done; + } + } + + dbret = dbus_message_iter_close_container(iter, &it_array); + if (!dbret) { + ret = EIO; + goto done; + } + + ret = EOK; + +done: + talloc_free(table_iter); + return ret; +} + void sbus_invoke_get(struct sbus_request *sbus_req, const char *type, sbus_get_invoker_fn invoker_fn, |