summaryrefslogtreecommitdiffstats
path: root/src/sssd/LMI_SSSDBackendProviderProvider.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sssd/LMI_SSSDBackendProviderProvider.c')
-rw-r--r--src/sssd/LMI_SSSDBackendProviderProvider.c96
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",