[Libvirt-cim] [PATCH] Enhance handling of input parameter of std_association logic

Heidi Eckhart heidieck at linux.vnet.ibm.com
Fri Nov 23 11:37:03 UTC 2007


# HG changeset patch
# User Heidi Eckhart <heidieck at linux.vnet.ibm.com>
# Date 1195821409 -3600
# Node ID 07ab148e7311656c997bcc8f5ad6249fdc7b42bc
# Parent  db20c6206fb6decb484035bec81d7c7f2be75eae
Enhance handling of input parameter of std_association logic
Signed-off-by: Heidi Eckhart <heidieck at linux.vnet.ibm.com>

diff -r db20c6206fb6 -r 07ab148e7311 std_association.c
--- a/std_association.c	Fri Nov 23 13:02:51 2007 +0100
+++ b/std_association.c	Fri Nov 23 13:36:49 2007 +0100
@@ -67,14 +67,17 @@ static bool match_class(const CMPIBroker
         char *comp_class;
         int i;
 
-        rop = CMNewObjectPath(broker, ns, test_class, NULL);
+        if (test_class == NULL)
+                return true;
+
+        if (comp_class_list == NULL)
+                return true;
 
         for (i = 0; comp_class_list[i]; i++) {
                 comp_class = comp_class_list[i];
-
-                if ((test_class == NULL) ||
-                    (comp_class == NULL) ||
-                    match_op(broker, rop, comp_class))
+                rop = CMNewObjectPath(broker, ns,comp_class , NULL);
+
+                if (match_op(broker, rop, test_class))
                         return true;
         }
 
@@ -117,11 +120,16 @@ out:
 
 static struct std_assoc *
 std_assoc_get_handler(const struct std_assoc_ctx *ctx,
+                      struct std_assoc_info *info,
                       const CMPIObjectPath *ref)
 {
         struct std_assoc *hdl = NULL;
         char *source_class;
         int i, j;
+        bool rc;
+
+        CU_DEBUG("Calling Provider: '%s'",
+                 info->provider_name);
 
         for (i = 0; ctx->handlers[i]; i++) {
                 hdl = ctx->handlers[i];
@@ -141,9 +149,66 @@ std_assoc_get_handler(const struct std_a
                         break;
         }
 
-        if (hdl)
+        if (hdl) {
+                if (info->assoc_class) {
+                        CU_DEBUG("Check client's assocClass: '%s'",
+                                 info->assoc_class);
+                        
+                        rc = match_class(ctx->brkr, 
+                                         NAMESPACE(ref),  
+                                         info->assoc_class,
+                                         hdl->assoc_class);
+                        
+                        if (!rc) {
+                                CU_DEBUG("AssocClass not valid.");
+                                goto out;
+                        }
+                        CU_DEBUG("AssocClass valid.");
+                }
+                
+                if (info->result_class) {
+                        CU_DEBUG("Check client's resultClass: '%s'",
+                                 info->result_class);
+                        
+                        rc = match_class(ctx->brkr, 
+                                         NAMESPACE(ref), 
+                                         info->result_class, 
+                                         hdl->target_class);
+                        
+                        if (!rc) {
+                                CU_DEBUG("ResultClass not valid.");
+                                goto out;
+                        }
+                        CU_DEBUG("ResultClass valid.");
+                }
+
+                if (info->role) {
+                        CU_DEBUG("Check client's role: '%s'",
+                                 info->role);
+
+                        if (!STREQC(info->role, hdl->source_prop)) {
+                                CU_DEBUG("Role not valid.");
+                                goto out;
+                        }
+                        CU_DEBUG("Role valid.");
+                }
+
+
+                if (info->result_role) {
+                        CU_DEBUG("Check client's resultRole: '%s'",
+                                 info->result_role);
+
+                        if (!STREQC(info->result_role, hdl->target_prop)) {
+                                CU_DEBUG("ResultRole not valid.");
+                                goto out;
+                        }
+                        CU_DEBUG("ResultRole valid.");
+                }
+                
                 return hdl;
-
+        }
+
+ out:
         return NULL;
 }
 
@@ -153,57 +218,21 @@ static CMPIStatus do_assoc(struct std_as
                            const CMPIObjectPath *ref,
                            bool names_only)
 {
+        CMPIStatus s = {CMPI_RC_OK, NULL};
         struct inst_list list;
-        CMPIStatus s;
         struct std_assoc *handler;
-        bool rc;
 
         inst_list_init(&list);
 
         CU_DEBUG("Getting handler...");
-
-        handler = std_assoc_get_handler(ctx, ref);
+        handler = std_assoc_get_handler(ctx, info, ref);
         if (handler == NULL) {
                 CU_DEBUG("No handler found.");
                 goto out;
         }
-
-        CU_DEBUG("OK.\n\tsource: '%s'\n\ttarget: '%s'\n\tassoc_class: '%s'",
-              handler->source_class, 
-              handler->target_class, 
-              handler->assoc_class);
-        CU_DEBUG("Calling match_class: \n\tinfo->result_class: '%s'",
-              info->result_class);
-
-        rc = match_class(ctx->brkr, 
-                        NAMESPACE(ref), 
-                        info->result_class, 
-                        handler->target_class);
-        if (!rc) {
-                CU_DEBUG("Match_class failed.");
-                cu_statusf(ctx->brkr, &s,
-                           CMPI_RC_ERR_FAILED,
-                           "Result class is not valid for this association");
-                goto out;
-        }
-        CU_DEBUG("Match_class succeeded.");
-
-        CU_DEBUG("Calling match_class: \n\tinfo->assoc_class: '%s'",
-              info->assoc_class);
-        rc = match_class(ctx->brkr, 
-                        NAMESPACE(ref), 
-                        info->assoc_class, 
-                        handler->assoc_class);
-        if (!rc) {
-                CU_DEBUG("Match_class failed.");
-                cu_statusf(ctx->brkr, &s,
-                           CMPI_RC_ERR_FAILED,
-                           "Association class given is not valid for"
-                           "this association");
-                goto out;
-        }
-        CU_DEBUG("Match_class succeeded, calling handler->handler...");
-
+        CU_DEBUG("Getting handler succeeded.");
+
+        CU_DEBUG("Calling handler->handler...");
         s = handler->handler(ref, info, &list);
         
         if (s.rc != CMPI_RC_OK) {
@@ -251,32 +280,22 @@ static CMPIStatus do_ref(struct std_asso
                          const CMPIObjectPath *ref,
                          bool names_only)
 {
+        CMPIStatus s = {CMPI_RC_OK, NULL};
         struct inst_list list;
-        CMPIStatus s;
+        struct std_assoc *handler;
         int i;
-        struct std_assoc *handler;
-        bool rc;
 
         inst_list_init(&list);
 
-        handler = std_assoc_get_handler(ctx, ref);
+        CU_DEBUG("Getting handler...");
+        handler = std_assoc_get_handler(ctx, info, ref);
         if (handler == NULL) {
                 CU_DEBUG("No handler found.");
                 goto out;
         }
-
-        rc = match_class(ctx->brkr, 
-                        NAMESPACE(ref), 
-                        info->result_class, 
-                        handler->assoc_class);
-        if (!rc) {
-                cu_statusf(ctx->brkr, &s,
-                           CMPI_RC_ERR_FAILED,
-                           "Result class is not valid for this association");
-                goto out;
-        }
-
-
+        CU_DEBUG("Getting handler succeeded.");
+
+        CU_DEBUG("Calling handler->handler...");
         s = handler->handler(ref, info, &list);
         if ((s.rc != CMPI_RC_OK) || (list.list == NULL))
                 goto out;




More information about the Libvirt-cim mailing list