[PATCH] [RFC] Enhance handling of association's references

# HG changeset patch # User Heidi Eckhart <heidieck@linux.vnet.ibm.com> # Date 1196160333 -3600 # Node ID 16ac621eb3b34d11caca00100901d27bede7a7c7 # Parent bf54de6af2e210bef57d74cf12e4872f6ba2da4f [RFC] Enhance handling of association's references The source and target classnames of std_assoc are now lists, containing all supported classnames. This approach frees the provider from listing all possible combinations as instances of std_assoc. Signed-off-by: Heidi Eckhart <heidieck@linux.vnet.ibm.com> diff -r bf54de6af2e2 -r 16ac621eb3b3 std_association.c --- a/std_association.c Tue Nov 20 16:24:27 2007 -0800 +++ b/std_association.c Tue Nov 27 11:45:33 2007 +0100 @@ -61,18 +61,44 @@ static bool match_class(const CMPIBroker static bool match_class(const CMPIBroker *broker, const char *ns, const char *test_class, - const char *comp_class) + char **comp_class_list) { CMPIObjectPath *rop; + char *comp_class; + int i; rop = CMNewObjectPath(broker, ns, test_class, NULL); - if ((test_class == NULL) || - (comp_class == NULL) || - match_op(broker, rop, comp_class)) - return true; - else - return false; + 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)) + return true; + } + + return false; +} + +static bool match_source_class(const CMPIBroker *broker, + const CMPIObjectPath *ref, + struct std_assoc *ptr) +{ + int i; + char *source_class; + + for (i = 0; ptr->source_class[i]; i++) { + source_class = ptr->source_class[i]; + + if (CMClassPathIsA(broker, + ref, + source_class, + NULL)) + return true; + } + + return false; } static CMPIStatus filter_results(struct inst_list *list, @@ -113,13 +139,13 @@ std_assoc_get_handler(const struct std_a std_assoc_get_handler(const struct std_assoc_ctx *ctx, const CMPIObjectPath *ref) { - struct std_assoc *ptr; + struct std_assoc *ptr = NULL; int i; for (i = 0; ctx->handlers[i]; i++) { ptr = ctx->handlers[i]; - if (CMClassPathIsA(ctx->brkr, ref, ptr->source_class, NULL)) + if (match_source_class(ctx->brkr, ref, ptr)) return ptr; } @@ -144,9 +170,6 @@ static CMPIStatus do_assoc(struct std_as handler = std_assoc_get_handler(ctx, ref); if (handler == NULL) { CU_DEBUG("No handler found."); - cu_statusf(ctx->brkr, &s, - CMPI_RC_ERR_FAILED, - "Unable to handle this association"); goto out; } @@ -243,9 +266,7 @@ static CMPIStatus do_ref(struct std_asso handler = std_assoc_get_handler(ctx, ref); if (handler == NULL) { - cu_statusf(ctx->brkr, &s, - CMPI_RC_ERR_FAILED, - "Unable to handle this association"); + CU_DEBUG("No handler found."); goto out; } diff -r bf54de6af2e2 -r 16ac621eb3b3 std_association.h --- a/std_association.h Tue Nov 20 16:24:27 2007 -0800 +++ b/std_association.h Tue Nov 27 11:45:33 2007 +0100 @@ -37,13 +37,13 @@ typedef CMPIInstance *(*make_ref_t)(cons struct std_assoc *); struct std_assoc { - char *source_class; + char **source_class; char *source_prop; - char *target_class; + char **target_class; char *target_prop; - char *assoc_class; + char **assoc_class; assoc_handler_t handler; make_ref_t make_ref;

HE> # HG changeset patch HE> # User Heidi Eckhart <heidieck@linux.vnet.ibm.com> HE> # Date 1196160333 -3600 HE> # Node ID 16ac621eb3b34d11caca00100901d27bede7a7c7 HE> # Parent bf54de6af2e210bef57d74cf12e4872f6ba2da4f HE> [RFC] Enhance handling of association's references Thanks for making those changes. I think this is okay now. I'd like to hold off committing it until we have a patch set against libvirt-cim to use the new API. Thanks! -- Dan Smith IBM Linux Technology Center Open Hypervisor Team email: danms@us.ibm.com
participants (2)
-
Dan Smith
-
Heidi Eckhart