summaryrefslogtreecommitdiffstats
path: root/src/sssd/LMI_SSSDAvailableDomainProvider.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sssd/LMI_SSSDAvailableDomainProvider.c')
-rw-r--r--src/sssd/LMI_SSSDAvailableDomainProvider.c59
1 files changed, 55 insertions, 4 deletions
diff --git a/src/sssd/LMI_SSSDAvailableDomainProvider.c b/src/sssd/LMI_SSSDAvailableDomainProvider.c
index bba3f6d..af63a84 100644
--- a/src/sssd/LMI_SSSDAvailableDomainProvider.c
+++ b/src/sssd/LMI_SSSDAvailableDomainProvider.c
@@ -1,10 +1,14 @@
#include <konkret/konkret.h>
+#include <dbus/dbus.h>
+#include <sss_dbus.h>
#include "LMI_SSSDAvailableDomain.h"
+#include "utils.h"
static const CMPIBroker* _cb;
-static void LMI_SSSDAvailableDomainInitialize()
+static void LMI_SSSDAvailableDomainInitialize(const CMPIContext *ctx)
{
+ lmi_init(PROVIDER_NAME, _cb, ctx, NULL);
}
static CMPIStatus LMI_SSSDAvailableDomainCleanup(
@@ -32,7 +36,54 @@ static CMPIStatus LMI_SSSDAvailableDomainEnumInstances(
const CMPIObjectPath* cop,
const char** properties)
{
- CMReturn(CMPI_RC_OK);
+ const char *namespace = KNameSpace(cop);
+ LMI_SSSDAvailableDomain association;
+ LMI_SSSDServiceRef ref_sssd;
+ 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;
+ CMPIrc ret;
+ int i;
+
+ LMI_SSSDService_Get_Ref(_cb, namespace, &ref_sssd);
+
+ 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_attr(dbus_ctx, paths[i], SSS_DBUS_IFACE_DOMAINS,
+ "name", &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);
+
+ LMI_SSSDDomainRef_Init(&ref_domain, _cb, namespace);
+ LMI_SSSDDomainRef_Set_Name(&ref_domain, name);
+
+ LMI_SSSDAvailableDomain_Init(&association, _cb, namespace);
+ LMI_SSSDAvailableDomain_Set_SSSD(&association, &ref_sssd);
+ LMI_SSSDAvailableDomain_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_SSSDAvailableDomainGetInstance(
@@ -187,13 +238,13 @@ CMInstanceMIStub(
LMI_SSSDAvailableDomain,
LMI_SSSDAvailableDomain,
_cb,
- LMI_SSSDAvailableDomainInitialize())
+ LMI_SSSDAvailableDomainInitialize(ctx))
CMAssociationMIStub(
LMI_SSSDAvailableDomain,
LMI_SSSDAvailableDomain,
_cb,
- LMI_SSSDAvailableDomainInitialize())
+ LMI_SSSDAvailableDomainInitialize(ctx))
KONKRET_REGISTRATION(
"root/cimv2",