summaryrefslogtreecommitdiffstats
path: root/src/sssd/LMI_SSSDBackendDomainProvider.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sssd/LMI_SSSDBackendDomainProvider.c')
-rw-r--r--src/sssd/LMI_SSSDBackendDomainProvider.c67
1 files changed, 63 insertions, 4 deletions
diff --git a/src/sssd/LMI_SSSDBackendDomainProvider.c b/src/sssd/LMI_SSSDBackendDomainProvider.c
index e189918..fec48e3 100644
--- a/src/sssd/LMI_SSSDBackendDomainProvider.c
+++ b/src/sssd/LMI_SSSDBackendDomainProvider.c
@@ -1,10 +1,14 @@
#include <konkret/konkret.h>
+#include <dbus/dbus.h>
+#include <sss_dbus.h>
#include "LMI_SSSDBackendDomain.h"
+#include "utils.h"
static const CMPIBroker* _cb;
-static void LMI_SSSDBackendDomainInitialize()
+static void LMI_SSSDBackendDomainInitialize(const CMPIContext *ctx)
{
+ lmi_init(PROVIDER_NAME, _cb, ctx, NULL);
}
static CMPIStatus LMI_SSSDBackendDomainCleanup(
@@ -32,7 +36,62 @@ static CMPIStatus LMI_SSSDBackendDomainEnumInstances(
const CMPIObjectPath* cop,
const char** properties)
{
- CMReturn(CMPI_RC_OK);
+ const char *namespace = KNameSpace(cop);
+ LMI_SSSDBackendDomain association;
+ LMI_SSSDBackendRef ref_backend;
+ LMI_SSSDDomainRef ref_domain;
+ sss_dbus_ctx *dbus_ctx = NULL;
+ sss_dbus_attr **attrs = NULL;
+ sss_dbus_error error;
+ char **paths = NULL;
+ const char *name = NULL;
+ sss_dbus_bool is_subdomain;
+ CMPIrc ret;
+ 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_DOMAINS, &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_DOMAINS, &attrs);
+ check_sss_dbus_error(error, ret, CMPI_RC_ERR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_string(attrs, "name", &name);
+ check_sss_dbus_error(error, ret, CMPI_RC_ERR_FAILED, done);
+
+ error = sss_dbus_find_attr_as_bool(attrs, "subdomain", &is_subdomain);
+ check_sss_dbus_error(error, ret, CMPI_RC_ERR_FAILED, done);
+
+ if (!is_subdomain) {
+ LMI_SSSDBackendRef_Init(&ref_backend, _cb, namespace);
+ LMI_SSSDBackendRef_Set_Name(&ref_backend, name);
+
+ LMI_SSSDDomainRef_Init(&ref_domain, _cb, namespace);
+ LMI_SSSDDomainRef_Set_Name(&ref_domain, name);
+
+ LMI_SSSDBackendDomain_Init(&association, _cb, namespace);
+ LMI_SSSDBackendDomain_Set_Backend(&association, &ref_backend);
+ LMI_SSSDBackendDomain_Set_Domain(&association, &ref_domain);
+
+
+ KReturnInstance(cr, association);
+ }
+
+ sss_dbus_free_attrs(dbus_ctx, &attrs);
+ }
+
+ ret = CMPI_RC_OK;
+
+done:
+ sss_dbus_free_string_array(dbus_ctx, &paths);
+ sss_dbus_free_attrs(dbus_ctx, &attrs);
+ sss_dbus_free(&dbus_ctx);
+ CMReturn(ret);
}
static CMPIStatus LMI_SSSDBackendDomainGetInstance(
@@ -187,13 +246,13 @@ CMInstanceMIStub(
LMI_SSSDBackendDomain,
LMI_SSSDBackendDomain,
_cb,
- LMI_SSSDBackendDomainInitialize())
+ LMI_SSSDBackendDomainInitialize(ctx))
CMAssociationMIStub(
LMI_SSSDBackendDomain,
LMI_SSSDBackendDomain,
_cb,
- LMI_SSSDBackendDomainInitialize())
+ LMI_SSSDBackendDomainInitialize(ctx))
KONKRET_REGISTRATION(
"root/cimv2",