diff options
Diffstat (limited to 'src/sssd/LMI_SSSDBackendProviderProvider.c')
-rw-r--r-- | src/sssd/LMI_SSSDBackendProviderProvider.c | 96 |
1 files changed, 92 insertions, 4 deletions
diff --git a/src/sssd/LMI_SSSDBackendProviderProvider.c b/src/sssd/LMI_SSSDBackendProviderProvider.c index 9e25834..0ecf0b6 100644 --- a/src/sssd/LMI_SSSDBackendProviderProvider.c +++ b/src/sssd/LMI_SSSDBackendProviderProvider.c @@ -1,10 +1,15 @@ +#include <stdlib.h> +#include <string.h> #include <konkret/konkret.h> +#include <sss_dbus.h> #include "LMI_SSSDBackendProvider.h" +#include "utils.h" static const CMPIBroker* _cb; -static void LMI_SSSDBackendProviderInitialize() +static void LMI_SSSDBackendProviderInitialize(const CMPIContext *ctx) { + lmi_init(PROVIDER_NAME, _cb, ctx, NULL); } static CMPIStatus LMI_SSSDBackendProviderCleanup( @@ -32,7 +37,90 @@ static CMPIStatus LMI_SSSDBackendProviderEnumInstances( const CMPIObjectPath* cop, const char** properties) { - CMReturn(CMPI_RC_OK); + LMI_SSSDBackendProvider association; + LMI_SSSDBackendRef ref_backend; + LMI_SSSDProviderRef ref_provider; + const char *namespace = KNameSpace(cop); + sss_dbus_ctx *dbus_ctx = NULL; + sss_dbus_attr **attrs = NULL; + sss_dbus_error error; + char **paths = NULL; + const char *backend_name = NULL; + const char * const *providers = NULL; + char *provider_type = NULL; + char *provider_module = NULL; + unsigned int num_providers; + CMPIrc ret; + unsigned int j; + int i; + + error = sss_dbus_init(&dbus_ctx); + check_sss_dbus_error(error, ret, CMPI_RC_ERR_FAILED, done); + + error = sss_dbus_invoke_list(dbus_ctx, SSSD_DBUS_LIST_BACKENDS, &paths, + DBUS_TYPE_INVALID); + check_sss_dbus_error(error, ret, CMPI_RC_ERR_FAILED, done); + + for (i = 0; paths[i] != NULL; i++) { + error = sss_dbus_fetch_all_attrs(dbus_ctx, paths[i], + SSS_DBUS_IFACE_COMPONENTS, &attrs); + check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done); + + error = sss_dbus_find_attr_as_string(attrs, "name", &backend_name); + check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done); + + error = sss_dbus_find_attr_as_string_array(attrs, "providers", + &num_providers, &providers); + check_sss_dbus_error(error, ret, SSSD_METHOD_ERROR_IO, done); + + if (num_providers == 0) { + sss_dbus_free_attrs(dbus_ctx, &attrs); + continue; + } + + LMI_SSSDBackendRef_Init(&ref_backend, _cb, namespace); + LMI_SSSDBackendRef_Set_Name(&ref_backend, backend_name); + + for (j = 0; j < num_providers; j++) { + /* provider is a key=value pair */ + provider_type = strdup(providers[j]); + if (provider_type == NULL) { + goto done; + } + + provider_module = strchr(provider_type, '='); + if (provider_module == NULL) { + provider_module = ""; + } else { + *provider_module = '\0'; + provider_module++; + } + + LMI_SSSDProviderRef_Init(&ref_provider, _cb, namespace); + LMI_SSSDProviderRef_Set_Type(&ref_provider, provider_type); + LMI_SSSDProviderRef_Set_Module(&ref_provider, provider_module); + free(provider_type); + + LMI_SSSDBackendProvider_Init(&association, _cb, namespace); + LMI_SSSDBackendProvider_Set_Backend(&association, &ref_backend); + LMI_SSSDBackendProvider_Set_Provider(&association, &ref_provider); + + KReturnInstance(cr, association); + } + + sss_dbus_free_attrs(dbus_ctx, &attrs); + } + + ret = CMPI_RC_OK; + +done: + if (attrs != NULL) { + sss_dbus_free_attrs(dbus_ctx, &attrs); + } + + sss_dbus_free_string_array(dbus_ctx, &paths); + sss_dbus_free(&dbus_ctx); + CMReturn(ret); } static CMPIStatus LMI_SSSDBackendProviderGetInstance( @@ -187,13 +275,13 @@ CMInstanceMIStub( LMI_SSSDBackendProvider, LMI_SSSDBackendProvider, _cb, - LMI_SSSDBackendProviderInitialize()) + LMI_SSSDBackendProviderInitialize(ctx)) CMAssociationMIStub( LMI_SSSDBackendProvider, LMI_SSSDBackendProvider, _cb, - LMI_SSSDBackendProviderInitialize()) + LMI_SSSDBackendProviderInitialize(ctx)) KONKRET_REGISTRATION( "root/cimv2", |