[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-cim] [RFC] Rework of association providers
Attached is a patch (applies cleanly to tip) for the association abstraction work we have been discussing. Only 2 associations (Xen_CSElementSettingData and Xen_ProcessorPoolComponent) have been ported to the new common code in cmpiutil. I would like everyone to agree to this new approach before porting the remaining association providers. The only issue I have with the patch at this point is whether to place the common code (_CMPIGetTargetEndpoints and its related structures) in cmpiutil or in a new file. As you can see, it currently resides in cmpiutil.[ch]. If there are no objections I will port the remaining association providers and commit to the repository within a few days. Thanks, Jim diff -r 7c937c187b5e configure.ac --- a/configure.ac Fri Oct 20 13:20:15 2006 -0600 +++ b/configure.ac Tue Oct 17 14:27:15 2006 -0600 @@ -167,8 +167,8 @@ AC_CONFIG_HEADER([config.h]) # Autogenerate the Makefiles AC_CONFIG_FILES([Makefile - src/Makefile]) - + src/Makefile + src/provider_common.h]) AM_INIT_AUTOMAKE # Check for the required C compiler diff -r 7c937c187b5e src/Xen_CSElementSettingData.c --- a/src/Xen_CSElementSettingData.c Fri Oct 20 13:20:15 2006 -0600 +++ b/src/Xen_CSElementSettingData.c Tue Oct 17 14:27:33 2006 -0600 @@ -15,8 +15,8 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // ============================================================================ // Authors: Dr. Gareth S. Bestor, <bestor@xxxxxxxxxx> -// Contributors: -// Description: +// Contributors: Jim Fehlig, <jfehlig@xxxxxxxxxx> +// Description: Association provider for Xen_CSElementSettingData. // ============================================================================ #include <string.h> @@ -40,6 +40,9 @@ static CMPIBroker *_BROKER; /* Include _SBLIM_TRACE() logging support */ #include "cmpitrace.h" +/* Include common provider definitions */ +#include "provider_common.h" + // ============================================================================ // CMPI ASSOCIATION PROVIDER FUNCTION TABLE @@ -48,15 +51,61 @@ static CMPIBroker *_BROKER; // ---------------------------------------------------------------------------- // Info for the class supported by the association provider // ---------------------------------------------------------------------------- - -/* Name of the left and right hand side classes of this association. */ + +/* Name of the left and right hand side classes, properties, namespaces, and + * key names of this association. */ static char * _ASSOCCLASS = "Xen_CSElementSettingData"; static char * _LHSCLASSNAME = "Xen_ComputerSystemSettingData"; static char * _RHSCLASSNAME = "Xen_ComputerSystem"; static char * _LHSPROPERTYNAME = "SettingData"; static char * _RHSPROPERTYNAME = "ManagedElement"; +static char * _LHSNAMESPACE = XEN_INSTRUMENTATION_NS; +static char * _RHSNAMESPACE = XEN_INSTRUMENTATION_NS; static char * _LHSKEYNAME = "InstanceID"; static char * _RHSKEYNAME = "Name"; + + +/* + * Determine if object path op is a match as defined by the request + * parameters incapsulated in assocInfo and assocFilter. + */ +static int assocMatch(_CMPIAssocIdentity *assocInfo, + CMPIObjectPath *op, + _CMPIAssocFilter *assocFilter) +{ + char *sourceClass = CMGetCharPtr(CMGetClassName(assocInfo->knownEndpoint, NULL)); + char *targetClass = CMGetCharPtr(CMGetClassName(op, NULL)); + char *sourceKeyName; + char *targetKeyName; + char *sourceName; + + if (CMClassPathIsA(_BROKER, assocInfo->knownEndpoint, _LHSCLASSNAME, NULL)) { + sourceKeyName = _LHSKEYNAME; + targetKeyName = _RHSKEYNAME; + } + else { + sourceKeyName = _RHSKEYNAME; + targetKeyName = _LHSKEYNAME; + } + + CMPIData nameData = CMGetKey(assocInfo->knownEndpoint, sourceKeyName, NULL); + sourceName = CMGetCharPtr(nameData.value.string); + + _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourceName)); + + /* Ignore possible instances of source class. */ + if (strcmp(targetClass, sourceClass) && + (assocFilter->resultClass == NULL || CMClassPathIsA(_BROKER, op, assocFilter->resultClass, NULL))) { + /* Only return entries whose name matches the reference. */ + nameData = CMGetKey(op, targetKeyName, NULL); + char *resultName = CMGetCharPtr(nameData.value.string); + if (strcmp(sourceName, resultName) == 0) + return 1; + } + + return 0; +} + // ---------------------------------------------------------------------------- // AssociationCleanup() @@ -93,12 +142,9 @@ static CMPIStatus AssociatorNames( const char * resultRole) { CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ - char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target namespace. */ - char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ - char *targetclass; /* Class of the target object(s). */ - - char *sourcekeyname; - char *targetkeyname; + char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ + _CMPIAssocIdentity assocInfo; + _CMPIAssocFilter assocFilter; _SBLIM_ENTER("AssociatorNames"); _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName)); @@ -108,69 +154,24 @@ static CMPIStatus AssociatorNames( _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass)); _SBLIM_TRACE(2, ("--- role=\"%s\"", role)); _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole)); - _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace)); - _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); - - /* Check that the requested association class, if any, is supported. */ - if (assocClass != NULL) { - CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, NULL); - if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) { - _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); - goto exit; - } - } - - /* Check that the reference matches the required role, if any. */ - if ((role != NULL) && strcmp(role, sourceclass) != 0) { - _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); - goto exit; - } - - /* Determine the target class from the source class. */ - if (strcmp(sourceclass, _LHSCLASSNAME) == 0) { - sourcekeyname = _LHSKEYNAME; - targetclass = _RHSCLASSNAME; - targetkeyname = _RHSKEYNAME; - } else if (strcmp(sourceclass, _RHSCLASSNAME) == 0) { - sourcekeyname = _RHSKEYNAME; - targetclass = _LHSCLASSNAME; - targetkeyname = _LHSKEYNAME; - } else { - _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); - goto exit; - } - _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); - - CMPIData namedata = CMGetKey(reference, sourcekeyname, NULL); - char * sourcename = CMGetCharPtr(namedata.value.string); - _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourcename)); - - /* Create an object path for the result class. */ - CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, targetclass, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Get the list of all target class object paths from the CIMOM. */ - CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, objectpath, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) { - _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate target class"); - goto exit; - } - - /* Return all object paths that exactly match the target class and resultClass, if specified. */ - while (CMHasNext(objectpaths, NULL)) { - CMPIData data = CMGetNext(objectpaths, NULL); - char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL)); - if ((strcmp(class,targetclass) == 0) && ((resultClass == NULL) || (strcmp(class,resultClass) == 0))) { - /* Only return entries whose name matches the reference. */ - namedata = CMGetKey(data.value.ref, targetkeyname, &status); - char * resultname = CMGetCharPtr(namedata.value.string); - if (strcmp(sourcename, resultname) == 0) CMReturnObjectPath(results, data.value.ref); - } + _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); + + assocInfo.knownEndpoint = reference; + assocInfo.assocClassName = _ASSOCCLASS; + assocInfo.lhsClassName = _LHSCLASSNAME; + assocInfo.lhsNamespace = _LHSNAMESPACE; + assocInfo.rhsClassName = _RHSCLASSNAME; + assocInfo.rhsNamespace = _RHSNAMESPACE; + assocInfo.opCode = _CMPI_ASSOC_OP_AN; + + assocFilter.assocClass = assocClass; + assocFilter.resultClass = resultClass; + assocFilter.role = role; + assocFilter.resultRole = resultRole; + + if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, assocMatch, results, &status)) { + _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", CMGetCharPtr(status.msg))); + goto exit; } CMReturnDone(results); @@ -192,15 +193,12 @@ static CMPIStatus Associators( const char *resultClass, const char *role, const char *resultRole, - char ** properties) /* [in] List of desired properties (NULL=all). */ -{ - CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ - char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target namespace. */ - char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ - char *targetclass; /* Class of the target object(s). */ - - char *sourcekeyname; - char *targetkeyname; + const char ** properties) /* [in] List of desired properties (NULL=all). */ +{ + CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ + char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ + _CMPIAssocIdentity assocInfo; + _CMPIAssocFilter assocFilter; _SBLIM_ENTER("Associators"); _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName)); @@ -210,72 +208,25 @@ static CMPIStatus Associators( _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass)); _SBLIM_TRACE(2, ("--- role=\"%s\"", role)); _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole)); - _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace)); - _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); - - /* Check that the requested association class, if any, is supported. */ - if (assocClass != NULL) { - CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, NULL); - if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) { - _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); - goto exit; - } - } - - /* Check that the reference matches the required role, if any. */ - if ((role != NULL) && strcmp(role, sourceclass) != 0) { - _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); - goto exit; - } - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_SUPPORTED, NULL); - - /* Determine the target class from the source class. */ - if (strcmp(sourceclass, _LHSCLASSNAME) == 0) { - sourcekeyname = _LHSKEYNAME; - targetclass = _RHSCLASSNAME; - targetkeyname = _RHSKEYNAME; - } else if (strcmp(sourceclass, _RHSCLASSNAME) == 0) { - sourcekeyname = _RHSKEYNAME; - targetclass = _LHSCLASSNAME; - targetkeyname = _LHSKEYNAME; - } else { - _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); - goto exit; - } - _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); - - CMPIData namedata = CMGetKey(reference, sourcekeyname, NULL); - char * sourcename = CMGetCharPtr(namedata.value.string); - _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourcename)); - - /* Create an object path for the result class. */ - CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, targetclass, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Get the list of all target class instances from the CIMOM. */ - CMPIEnumeration * instances = CBEnumInstances(_BROKER, context, objectpath, NULL, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(instances)) { - _SBLIM_TRACE(1,("--- CBEnumInstances() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate target class"); - goto exit; - } - - /* Return all instances that exactly match the target class and resultClass, if specified. */ - while (CMHasNext(instances, NULL)) { - CMPIData data = CMGetNext(instances, NULL); - char *class = CMGetCharPtr(CMGetClassName(CMGetObjectPath(data.value.inst,NULL), NULL)); - if ((strcmp(class,targetclass) == 0) && ((resultClass == NULL) || (strcmp(class,resultClass) == 0))) { - /* Only return entries whose name matches the reference. */ - namedata = CMGetProperty(data.value.inst, targetkeyname, NULL); - char * resultname = CMGetCharPtr(namedata.value.string); -// BUG - returning data causes crash !?! -_SBLIM_TRACE(2, ("--- data.value.inst=\"%s\"", CMGetCharPtr(CDToString(_BROKER, data.value.inst, NULL)))); -// if (strcmp(sourcename, resultname) == 0) CMReturnInstance(results, data.value.inst); - } + _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); + + assocInfo.knownEndpoint = reference; + assocInfo.assocClassName = _ASSOCCLASS; + assocInfo.lhsClassName = _LHSCLASSNAME; + assocInfo.lhsNamespace = _LHSNAMESPACE; + assocInfo.rhsClassName = _RHSCLASSNAME; + assocInfo.rhsNamespace = _RHSNAMESPACE; + assocInfo.properties = properties; + assocInfo.opCode = _CMPI_ASSOC_OP_A; + + assocFilter.assocClass = assocClass; + assocFilter.resultClass = resultClass; + assocFilter.role = role; + assocFilter.resultRole = resultRole; + + if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, assocMatch, results, &status)) { + _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", CMGetCharPtr(status.msg))); + goto exit; } CMReturnDone(results); @@ -299,10 +250,8 @@ static CMPIStatus ReferenceNames( CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target namespace. */ char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ - char *targetclass; /* Class of the target object(s). */ - - char *sourcekeyname; - char *targetkeyname; + _CMPIAssocIdentity assocInfo; + _CMPIAssocFilter assocFilter; _SBLIM_ENTER("ReferenceNames"); _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName)); @@ -310,88 +259,30 @@ static CMPIStatus ReferenceNames( _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, reference, NULL)))); _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass)); _SBLIM_TRACE(2, ("--- role=\"%s\"", role)); - _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace)); - _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); - - /* Check that the requested association class, if any, is supported. */ - if (assocClass != NULL) { - CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, NULL); - if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) { - _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); - goto exit; - } - } - - /* Check that the reference matches the required role, if any. */ - if ((role != NULL) && strcmp(role, sourceclass) != 0) { - _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); - goto exit; - } - - /* Determine the target class from the source class. */ - if (strcmp(sourceclass, _LHSCLASSNAME) == 0) { - sourcekeyname = _LHSKEYNAME; - targetclass = _RHSCLASSNAME; - targetkeyname = _RHSKEYNAME; - } else if (strcmp(sourceclass, _RHSCLASSNAME) == 0) { - sourcekeyname = _RHSKEYNAME; - targetclass = _LHSCLASSNAME; - targetkeyname = _LHSKEYNAME; - } else { - _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); - goto exit; - } - _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); - - CMPIData namedata = CMGetKey(reference, sourcekeyname, NULL); - char * sourcename = CMGetCharPtr(namedata.value.string); - _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourcename)); - - /* Create an object path for the result class. */ - CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, targetclass, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Get the list of all target class object paths from the CIMOM. */ - CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, objectpath, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) { - _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate target class"); - goto exit; - } - - /* Return all object paths that exactly match the target class and resultClass, if specified. */ - while (CMHasNext(objectpaths, NULL)) { - CMPIData data = CMGetNext(objectpaths, NULL); - char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL)); - if (strcmp(class,targetclass) == 0) { - - /* Create an object path for the association. */ - CMPIObjectPath * refobjectpath = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refobjectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Assign the references in the association appropriately. */ - if (strcmp(sourceclass, _RHSCLASSNAME) == 0) { - CMAddKey(refobjectpath, _RHSPROPERTYNAME, &reference, CMPI_ref); - CMAddKey(refobjectpath, _LHSPROPERTYNAME, &data.value.ref, CMPI_ref); - } else { - CMAddKey(refobjectpath, _RHSPROPERTYNAME, &data.value.ref, CMPI_ref); - CMAddKey(refobjectpath, _LHSPROPERTYNAME, &reference, CMPI_ref); - } - - /* Only return entries whose name matches the reference. */ - namedata = CMGetKey(data.value.ref, targetkeyname, &status); - char * resultname = CMGetCharPtr(namedata.value.string); - if (strcmp(sourcename, resultname) == 0) CMReturnObjectPath(results, refobjectpath); - } - } + _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); + + assocInfo.knownEndpoint = reference; + assocInfo.assocClassName = _ASSOCCLASS; + assocInfo.lhsClassName = _LHSCLASSNAME; + assocInfo.lhsNamespace = _LHSNAMESPACE; + assocInfo.lhsPropertyName = _LHSPROPERTYNAME; + assocInfo.rhsClassName = _RHSCLASSNAME; + assocInfo.rhsNamespace = _RHSNAMESPACE; + assocInfo.rhsPropertyName = _RHSPROPERTYNAME; + assocInfo.opCode = _CMPI_ASSOC_OP_RN; + + assocFilter.assocClass = assocClass; + assocFilter.resultClass = NULL; + assocFilter.role = role; + assocFilter.resultRole = NULL; + + if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, assocMatch, results, &status)) { + + _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", CMGetCharPtr(status.msg))); + goto exit; + } + + CMReturnDone(results); exit: _SBLIM_RETURNSTATUS(status); @@ -408,15 +299,13 @@ static CMPIStatus References( CMPIObjectPath * reference, /* [in] Contains the namespace, classname and desired object path. */ const char *assocClass, const char *role, - char **properties) /* [in] List of desired properties (NULL=all). */ + const char **properties) /* [in] List of desired properties (NULL=all). */ { CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target namespace. */ char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ - char *targetclass; /* Class of the target object(s). */ - - char *sourcekeyname; - char *targetkeyname; + _CMPIAssocIdentity assocInfo; + _CMPIAssocFilter assocFilter; _SBLIM_ENTER("References"); _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName)); @@ -424,89 +313,33 @@ static CMPIStatus References( _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, reference, NULL)))); _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass)); _SBLIM_TRACE(2, ("--- role=\"%s\"", role)); - _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace)); - _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); - - /* Check that the requested association class, if any, is supported. */ - if (assocClass != NULL) { - CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, NULL); - if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) { - _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); - goto exit; - } - } - - /* Check that the reference matches the required role, if any. */ - if ((role != NULL) && strcmp(role, sourceclass) != 0) { - _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); - goto exit; - } - - /* Determine the target class from the source class. */ - if (strcmp(sourceclass, _LHSCLASSNAME) == 0) { - sourcekeyname = _LHSKEYNAME; - targetclass = _RHSCLASSNAME; - targetkeyname = _RHSKEYNAME; - } else if (strcmp(sourceclass, _RHSCLASSNAME) == 0) { - sourcekeyname = _RHSKEYNAME; - targetclass = _LHSCLASSNAME; - targetkeyname = _LHSKEYNAME; - } else { - _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); - goto exit; - } - _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); - - CMPIData namedata = CMGetKey(reference, sourcekeyname, NULL); - char * sourcename = CMGetCharPtr(namedata.value.string); - _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourcename)); - - /* Create an object path for the result class. */ - CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, targetclass, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Get the list of all target class object paths from the CIMOM. */ - CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, objectpath, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) { - _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate target class"); - goto exit; - } - - /* Return all object paths that exactly match the target class and resultClass, if specified. */ - while (CMHasNext(objectpaths, NULL)) { - CMPIData data = CMGetNext(objectpaths, NULL); - char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL)); - if (strcmp(class,targetclass) == 0) { - - /* Create an instance for the association. */ - CMPIInstance * refinstance = _CMNewInstance(_BROKER, namespace, _ASSOCCLASS, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refinstance)) { - _SBLIM_TRACE(1,("--- CMNewInstance() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIInstance"); - goto exit; - } - - /* Assign the references in the association appropriately. */ - if (strcmp(sourceclass, _RHSCLASSNAME) == 0) { - CMSetProperty(refinstance, _RHSPROPERTYNAME, &reference, CMPI_ref); - CMSetProperty(refinstance, _LHSPROPERTYNAME, &data.value.ref, CMPI_ref); - } else { - CMSetProperty(refinstance, _RHSPROPERTYNAME, &data.value.ref, CMPI_ref); - CMSetProperty(refinstance, _LHSPROPERTYNAME, &reference, CMPI_ref); - } - - /* Only return entries whose name matches the reference. */ - namedata = CMGetKey(data.value.ref, targetkeyname, &status); - char * resultname = CMGetCharPtr(namedata.value.string); - if (strcmp(sourcename, resultname) == 0) CMReturnInstance(results, refinstance); - } - } -exit: + _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); + + assocInfo.knownEndpoint = reference; + assocInfo.assocClassName = _ASSOCCLASS; + assocInfo.lhsClassName = _LHSCLASSNAME; + assocInfo.lhsNamespace = _LHSNAMESPACE; + assocInfo.lhsPropertyName = _LHSPROPERTYNAME; + assocInfo.rhsClassName = _RHSCLASSNAME; + assocInfo.rhsNamespace = _RHSNAMESPACE; + assocInfo.rhsPropertyName = _RHSPROPERTYNAME; + assocInfo.properties = properties; + assocInfo.opCode = _CMPI_ASSOC_OP_R; + + assocFilter.assocClass = assocClass; + assocFilter.resultClass = NULL; + assocFilter.role = role; + assocFilter.resultRole = NULL; + + if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, assocMatch, results, &status)) { + + _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", CMGetCharPtr(status.msg))); + goto exit; + } + + CMReturnDone(results); + + exit: _SBLIM_RETURNSTATUS(status); } diff -r 7c937c187b5e src/Xen_ProcessorPoolComponent.c --- a/src/Xen_ProcessorPoolComponent.c Fri Oct 20 13:20:15 2006 -0600 +++ b/src/Xen_ProcessorPoolComponent.c Tue Oct 17 14:27:50 2006 -0600 @@ -16,7 +16,7 @@ // ============================================================================ // Authors: Jim Fehlig, <jfehlig@xxxxxxxxxx> // Contributors: -// Description: +// Description: Association provider for Xen_ProcessorPoolComponent. // ============================================================================ #include <string.h> @@ -40,6 +40,8 @@ static CMPIBroker *_BROKER; /* Include _SBLIM_TRACE() logging support */ #include "cmpitrace.h" +/* Include common provider definitions */ +#include "provider_common.h" // ============================================================================ // CMPI ASSOCIATION PROVIDER FUNCTION TABLE @@ -48,18 +50,40 @@ static CMPIBroker *_BROKER; // ---------------------------------------------------------------------------- // Info for the class supported by the association provider // ---------------------------------------------------------------------------- - -/* Name of the left and right hand side classes of this association. */ + +/* Name of the left and right hand side classes, properties, namespaces, and + * key names of this association. */ static char * _ASSOCCLASS = "Xen_ProcessorPoolComponent"; static char * _LHSCLASSNAME = "Xen_ProcessorPool"; -static char * _RHSCLASSNAME = "CIM_Processor"; +static char * _RHSCLASSNAME = HOST_INSTRUMENTATION_PREFIX"Processor"; static char * _LHSPROPERTYNAME = "GroupComponent"; static char * _RHSPROPERTYNAME = "PartComponent"; -static char * _LHSNAMESPACE = "root/cimv2"; -static char * _RHSNAMESPACE = "smash"; +static char * _LHSNAMESPACE = XEN_INSTRUMENTATION_NS; +static char * _RHSNAMESPACE = HOST_INSTRUMENTATION_NS; static char * _XEN_DOMU_PROCESSOR_CLASS = "Xen_Processor"; + +/* + * Determine if object path op is a match as defined by the request + * parameters incapsulated in assocInfo and assocFilter. + */ +static int assocMatch(_CMPIAssocIdentity *assocInfo, + CMPIObjectPath *op, + _CMPIAssocFilter *assocFilter) +{ + char *sourceClass = CMGetCharPtr(CMGetClassName(assocInfo->knownEndpoint, NULL)); + char *targetClass = CMGetCharPtr(CMGetClassName(op, NULL)); + + /* Ignore possible instances of source class. */ + if (strcmp(targetClass, sourceClass) && + (assocFilter->resultClass == NULL || CMClassPathIsA(_BROKER, op, assocFilter->resultClass, NULL))) { + + return 1; + } + + return 0; +} // ---------------------------------------------------------------------------- // AssociationCleanup() @@ -96,10 +120,9 @@ static CMPIStatus AssociatorNames( const char * resultRole) { CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ - char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target namespace. */ - char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ - char *targetclass; /* Class of the target object(s). */ - char *targetnamespace; + char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ + _CMPIAssocIdentity assocInfo; + _CMPIAssocFilter assocFilter; _SBLIM_ENTER("AssociatorNames"); _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName)); @@ -109,73 +132,31 @@ static CMPIStatus AssociatorNames( _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass)); _SBLIM_TRACE(2, ("--- role=\"%s\"", role)); _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole)); - _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace)); - _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); - - /* Ensure the source class is not a virtual processor */ - if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) { - _SBLIM_TRACE(2, ("--- Ignoring source class %s.", _XEN_DOMU_PROCESSOR_CLASS)); - goto exit; - } - - /* Check that the requested association class, if any, is supported. */ - if (assocClass != NULL) { - CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, NULL); - if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) { - _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); - goto exit; - } - } - - /* Check that the reference matches the required role, if any. */ - if ((role != NULL) && strcmp(role, sourceclass) != 0) { - _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); - goto exit; - } - - /* Determine the target class from the source class. */ - if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) { - targetclass = _RHSCLASSNAME; - targetnamespace = _RHSNAMESPACE; - } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) { - targetclass = _LHSCLASSNAME; - targetnamespace = _LHSNAMESPACE; - } else { - _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); - goto exit; - } - _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); - _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace)); - - /* Create an object path for the result class. */ - CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, targetclass, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Get the list of all target class object paths from the CIMOM. */ - CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, objectpath, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) { - _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate target class"); - goto exit; - } - - /* Return all object paths that exactly match the target class and resultClass, if specified. */ - while (CMHasNext(objectpaths, NULL)) { - CMPIData data = CMGetNext(objectpaths, NULL); - char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL)); - - _SBLIM_TRACE(2, ("--- got objectpath=\"%s\"", CMGetCharPtr(CDToString(_BROKER, data.value.ref, NULL)))); - - /* Ignore possible instances of source class. */ - if (strcmp(class,sourceclass) && - (resultClass == NULL || CMClassPathIsA(_BROKER, data.value.ref, resultClass, NULL))) { - - CMReturnObjectPath(results, data.value.ref); - } + _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); + + /* Ensure the source class is not a virtual processor */ + if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) { + _SBLIM_TRACE(2, ("--- Ignoring source class %s.", _XEN_DOMU_PROCESSOR_CLASS)); + goto exit; + } + + assocInfo.knownEndpoint = reference; + assocInfo.assocClassName = _ASSOCCLASS; + assocInfo.lhsClassName = _LHSCLASSNAME; + assocInfo.lhsNamespace = _LHSNAMESPACE; + assocInfo.rhsClassName = _RHSCLASSNAME; + assocInfo.rhsNamespace = _RHSNAMESPACE; + assocInfo.rhsPropertyName = _RHSPROPERTYNAME; + assocInfo.opCode = _CMPI_ASSOC_OP_AN; + + assocFilter.assocClass = assocClass; + assocFilter.resultClass = resultClass; + assocFilter.role = role; + assocFilter.resultRole = resultRole; + + if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, assocMatch, results, &status)) { + _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", CMGetCharPtr(status.msg))); + goto exit; } CMReturnDone(results); @@ -197,13 +178,12 @@ static CMPIStatus Associators( const char *resultClass, const char *role, const char *resultRole, - char ** properties) /* [in] List of desired properties (NULL=all). */ -{ - CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ - char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target namespace. */ - char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ - char *targetclass; /* Class of the target object(s). */ - char *targetnamespace; + const char ** properties) /* [in] List of desired properties (NULL=all). */ +{ + CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ + char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ + _CMPIAssocIdentity assocInfo; + _CMPIAssocFilter assocFilter; _SBLIM_ENTER("Associators"); _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName)); @@ -213,79 +193,33 @@ static CMPIStatus Associators( _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass)); _SBLIM_TRACE(2, ("--- role=\"%s\"", role)); _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole)); - _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace)); - _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); - - /* Ensure the source class is not a virtual processor */ - if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) { - _SBLIM_TRACE(2, ("--- Ignoring source class %s.", _XEN_DOMU_PROCESSOR_CLASS)); - goto exit; - } - - /* Check that the requested association class, if any, is supported. */ - if (assocClass != NULL) { - CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, NULL); - if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) { - _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); - goto exit; - } - } - - /* Check that the reference matches the required role, if any. */ - if ((role != NULL) && strcmp(role, sourceclass) != 0) { - _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); - goto exit; - } - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_SUPPORTED, NULL); - - /* Determine the target class from the source class. */ - if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) { - targetclass = _RHSCLASSNAME; - targetnamespace = _RHSNAMESPACE; - } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) { - targetclass = _LHSCLASSNAME; - targetnamespace = _LHSNAMESPACE; - } else { - _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); - goto exit; - } - _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); - _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace)); - - /* Create an object path for the result class. */ - CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, targetclass, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Get the list of all target class instances from the CIMOM. */ - CMPIEnumeration * instances = CBEnumInstances(_BROKER, context, objectpath, NULL, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(instances)) { - _SBLIM_TRACE(1,("--- CBEnumInstances() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate target class"); - goto exit; - } - - /* Return all instances that exactly match the target class and resultClass, if specified. */ - while (CMHasNext(instances, NULL)) { - CMPIData data = CMGetNext(instances, NULL); - CMPIObjectPath *op = CMGetObjectPath(data.value.inst,NULL); - char *class = CMGetCharPtr(CMGetClassName(op, NULL)); - - CMSetNameSpace(op, targetnamespace); - _SBLIM_TRACE(2, ("--- got objectpath=\"%s\"", CMGetCharPtr(CDToString(_BROKER, op, NULL)))); - _SBLIM_TRACE(2, ("--- got class=\"%s\"", class)); - - /* Ignore possible instances of source class. */ - if (strcmp(class,sourceclass) && - (resultClass == NULL || CMClassPathIsA(_BROKER, op, resultClass, NULL))) { - _SBLIM_TRACE(2, ("--- returning instance")); - CMReturnInstance(results, data.value.inst); - } - } - + _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); + + /* Ensure the source class is not a virtual processor */ + if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) { + _SBLIM_TRACE(2, ("--- Ignoring source class %s.", _XEN_DOMU_PROCESSOR_CLASS)); + goto exit; + } + + assocInfo.knownEndpoint = reference; + assocInfo.assocClassName = _ASSOCCLASS; + assocInfo.lhsClassName = _LHSCLASSNAME; + assocInfo.lhsNamespace = _LHSNAMESPACE; + assocInfo.rhsClassName = _RHSCLASSNAME; + assocInfo.rhsNamespace = _RHSNAMESPACE; + assocInfo.properties = properties; + assocInfo.opCode = _CMPI_ASSOC_OP_A; + + assocFilter.assocClass = assocClass; + assocFilter.resultClass = resultClass; + assocFilter.role = role; + assocFilter.resultRole = resultRole; + + if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, assocMatch, results, &status)) { + _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", CMGetCharPtr(status.msg))); + goto exit; + } + CMReturnDone(results); exit: @@ -305,10 +239,9 @@ static CMPIStatus ReferenceNames( const char *role) { CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ - char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target namespace. */ - char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ - char *targetclass; /* Class of the target object(s). */ - char *targetnamespace; + char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ + _CMPIAssocIdentity assocInfo; + _CMPIAssocFilter assocFilter; _SBLIM_ENTER("ReferenceNames"); _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName)); @@ -316,90 +249,36 @@ static CMPIStatus ReferenceNames( _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, reference, NULL)))); _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass)); _SBLIM_TRACE(2, ("--- role=\"%s\"", role)); - _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace)); - _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); - - /* Ensure the source class is not a virtual processor */ - if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) { - _SBLIM_TRACE(2, ("--- Ignoring source class %s.", _XEN_DOMU_PROCESSOR_CLASS)); - goto exit; - } - - /* Check that the requested association class, if any, is supported. */ - if (assocClass != NULL) { - CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, NULL); - if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) { - _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); - goto exit; - } - } - - /* Check that the reference matches the required role, if any. */ - if ((role != NULL) && strcmp(role, sourceclass) != 0) { - _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); - goto exit; - } - - /* Determine the target class from the source class. */ - if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) { - targetclass = _RHSCLASSNAME; - targetnamespace = _RHSNAMESPACE; - /* Refences of LHS class should always be in LHS namespace. */ - CMSetNameSpace(reference, _LHSNAMESPACE); - } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) { - targetclass = _LHSCLASSNAME; - targetnamespace = _LHSNAMESPACE; - } else { - _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); - goto exit; - } - _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); - _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace)); - - /* Create an object path for the result class. */ - CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, targetclass, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Get the list of all target class object paths from the CIMOM. */ - CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, objectpath, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) { - _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate target class"); - goto exit; - } - - /* Return all object paths that exactly match the target class and resultClass, if specified. */ - while (CMHasNext(objectpaths, NULL)) { - CMPIData data = CMGetNext(objectpaths, NULL); - - if((CMClassPathIsA(_BROKER, data.value.ref, targetclass, NULL)) && - (!CMClassPathIsA(_BROKER, data.value.ref, sourceclass, NULL))) { - /* Create an object path for the association. Note that the association - * objects should exist in 'virt namespace' not the host namespace. - */ - CMPIObjectPath * refobjectpath = CMNewObjectPath(_BROKER, _LHSNAMESPACE, _ASSOCCLASS, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refobjectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Assign the references in the association appropriately. */ - if (strcmp(sourceclass, _RHSCLASSNAME) == 0) { - CMAddKey(refobjectpath, _RHSPROPERTYNAME, &reference, CMPI_ref); - CMAddKey(refobjectpath, _LHSPROPERTYNAME, &data.value.ref, CMPI_ref); - } else { - CMAddKey(refobjectpath, _RHSPROPERTYNAME, &data.value.ref, CMPI_ref); - CMAddKey(refobjectpath, _LHSPROPERTYNAME, &reference, CMPI_ref); - } - - CMReturnObjectPath(results, refobjectpath); - } - } + _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); + + /* Ensure the source class is not a virtual processor */ + if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) { + _SBLIM_TRACE(2, ("--- Ignoring source class %s.", _XEN_DOMU_PROCESSOR_CLASS)); + goto exit; + } + + assocInfo.knownEndpoint = reference; + assocInfo.assocClassName = _ASSOCCLASS; + assocInfo.lhsClassName = _LHSCLASSNAME; + assocInfo.lhsNamespace = _LHSNAMESPACE; + assocInfo.lhsPropertyName = _LHSPROPERTYNAME; + assocInfo.rhsClassName = _RHSCLASSNAME; + assocInfo.rhsNamespace = _RHSNAMESPACE; + assocInfo.rhsPropertyName = _RHSPROPERTYNAME; + assocInfo.opCode = _CMPI_ASSOC_OP_RN; + + assocFilter.assocClass = assocClass; + assocFilter.resultClass = NULL; + assocFilter.role = role; + assocFilter.resultRole = NULL; + + if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, assocMatch, results, &status)) { + + _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", CMGetCharPtr(status.msg))); + goto exit; + } + + CMReturnDone(results); exit: _SBLIM_RETURNSTATUS(status); @@ -416,13 +295,12 @@ static CMPIStatus References( CMPIObjectPath * reference, /* [in] Contains the namespace, classname and desired object path. */ const char *assocClass, const char *role, - char **properties) /* [in] List of desired properties (NULL=all). */ -{ - CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ - char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target namespace. */ - char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ - char *targetclass; /* Class of the target object(s). */ - char *targetnamespace; + const char **properties) /* [in] List of desired properties (NULL=all). */ +{ + CMPIStatus status = { CMPI_RC_OK, NULL }; /* Return status of CIM operations. */ + char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* Class of the source reference object */ + _CMPIAssocIdentity assocInfo; + _CMPIAssocFilter assocFilter; _SBLIM_ENTER("References"); _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName)); @@ -430,90 +308,38 @@ static CMPIStatus References( _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, reference, NULL)))); _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass)); _SBLIM_TRACE(2, ("--- role=\"%s\"", role)); - _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace)); - _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); - - /* Ensure the source class is not a virtual processor */ - if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) { - _SBLIM_TRACE(2, ("--- Ignoring source class %s.", _XEN_DOMU_PROCESSOR_CLASS)); - goto exit; - } - - /* Check that the requested association class, if any, is supported. */ - if (assocClass != NULL) { - CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, _ASSOCCLASS, NULL); - if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) { - _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); - goto exit; - } - } - - /* Check that the reference matches the required role, if any. */ - if ((role != NULL) && strcmp(role, sourceclass) != 0) { - _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); - goto exit; - } - - /* Determine the target class from the source class. */ - if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) { - targetclass = _RHSCLASSNAME; - targetnamespace = _RHSNAMESPACE; - /* Refences of LHS class should always be in LHS namespace. */ - CMSetNameSpace(reference, _LHSNAMESPACE); - } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) { - targetclass = _LHSCLASSNAME; - targetnamespace = _LHSNAMESPACE; - } else { - _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); - goto exit; - } - _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); - _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace)); - - /* Create an object path for the result class. */ - CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, targetclass, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { - _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); - goto exit; - } - - /* Get the list of all target class object paths from the CIMOM. */ - CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, objectpath, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) { - _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate target class"); - goto exit; - } - - /* Return all object paths that exactly match the target class and resultClass, if specified. */ - while (CMHasNext(objectpaths, NULL)) { - CMPIData data = CMGetNext(objectpaths, NULL); - - if((CMClassPathIsA(_BROKER, data.value.ref, targetclass, NULL)) && - (!CMClassPathIsA(_BROKER, data.value.ref, sourceclass, NULL))) { - /* Create an instance for the association. Note that the association - * objects should exist in 'virt namespace' not the host namespace. - */ - CMPIInstance * refinstance = _CMNewInstance(_BROKER, _LHSNAMESPACE, _ASSOCCLASS, &status); - if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refinstance)) { - _SBLIM_TRACE(1,("--- CMNewInstance() failed - %s", CMGetCharPtr(status.msg))); - CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new CMPIInstance"); - goto exit; - } - - /* Assign the references in the association appropriately. */ - if (strcmp(sourceclass, _RHSCLASSNAME) == 0) { - CMSetProperty(refinstance, _RHSPROPERTYNAME, &reference, CMPI_ref); - CMSetProperty(refinstance, _LHSPROPERTYNAME, &data.value.ref, CMPI_ref); - } else { - CMSetProperty(refinstance, _RHSPROPERTYNAME, &data.value.ref, CMPI_ref); - CMSetProperty(refinstance, _LHSPROPERTYNAME, &reference, CMPI_ref); - } - - CMReturnInstance(results, refinstance); - } - } + _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass)); + + /* Ensure the source class is not a virtual processor */ + if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) { + _SBLIM_TRACE(2, ("--- Ignoring source class %s.", _XEN_DOMU_PROCESSOR_CLASS)); + goto exit; + } + + assocInfo.knownEndpoint = reference; + assocInfo.assocClassName = _ASSOCCLASS; + assocInfo.lhsClassName = _LHSCLASSNAME; + assocInfo.lhsNamespace = _LHSNAMESPACE; + assocInfo.lhsPropertyName = _LHSPROPERTYNAME; + assocInfo.rhsClassName = _RHSCLASSNAME; + assocInfo.rhsNamespace = _RHSNAMESPACE; + assocInfo.rhsPropertyName = _RHSPROPERTYNAME; + assocInfo.properties = properties; + assocInfo.opCode = _CMPI_ASSOC_OP_R; + + assocFilter.assocClass = assocClass; + assocFilter.resultClass = NULL; + assocFilter.role = role; + assocFilter.resultRole = NULL; + + if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, assocMatch, results, &status)) { + + _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", CMGetCharPtr(status.msg))); + goto exit; + } + + CMReturnDone(results); + exit: _SBLIM_RETURNSTATUS(status); } diff -r 7c937c187b5e src/cmpiutil.c --- a/src/cmpiutil.c Fri Oct 20 13:20:15 2006 -0600 +++ b/src/cmpiutil.c Mon Oct 23 11:17:36 2006 -0600 @@ -15,7 +15,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // ============================================================================ // Author: Dr. Gareth S. Bestor <bestor@xxxxxxxxxx> -// Contributors: +// Contributors: Jim Fehlig <jfehlig@xxxxxxxxxx> // Summary: Some useful utility functions // Description: // TODO @@ -30,6 +30,13 @@ #include "cmpidt.h" #include "cmpift.h" #include "cmpimacs.h" + +#include "cmpiutil.h" +#include "cmpitrace.h" + +/* Include common provider definitions */ +#include "provider_common.h" + /* ------------------------------------------------------------------------- */ @@ -385,3 +392,150 @@ char * _CMPIValueToString ( CMPIData dat } } + +/* + * Get target endpoints for association defined by assocInfo. + * assocFilter defines any restrictions on the returned enpoints. + * matchFunc must be a non-null function that returns true (1) if + * potential target endpoints meet the requirements of defined in + * assocInfo and assocFilter. Results are collected in the results + * out parameter. + * Returns non-zero on failure with additional error information + * available in out parameter rc. + */ +int _CMPIGetTargetEndpoints(CMPIBroker *mb, + CMPIContext *context, + _CMPIAssocIdentity *assocInfo, + _CMPIAssocFilter *assocFilter, + _CMPIAssocMatchFunc matchFunc, + CMPIResult *results, + CMPIStatus *status) +{ + char *sourceClass = CMGetCharPtr(CMGetClassName(assocInfo->knownEndpoint, NULL)); /* Class of the source reference object */ + char *sourceNamespace = CMGetCharPtr(CMGetNameSpace(assocInfo->knownEndpoint, NULL)); /* Source namespace. */ + char *targetclass; /* Class of the target object. */ + char *targetnamespace; /* Namespace of target object. */ + + if (assocInfo == NULL || assocFilter == NULL || matchFunc == NULL || + results == NULL || status == NULL) { + _SBLIM_TRACE(1, ("--- Invalid parameter.")); + CMSetStatus(status, CMPI_RC_ERR_INVALID_PARAMETER); + return 1; + } + + /* Check that the requested association class, if any, is supported. */ + if (assocFilter->assocClass != NULL) { + CMPIObjectPath *assoc = CMNewObjectPath(mb, sourceNamespace, assocInfo->assocClassName, NULL); + if (!CMClassPathIsA(mb, assoc, assocFilter->assocClass, NULL)) { + _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring request.")); + return 1; + } + } + + /* Check that the reference matches the required role, if any. */ + if ((assocFilter->role != NULL) && strcmp(assocFilter->role, sourceClass) != 0) { + _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring request.")); + return 1; + } + + /* Determine the target class from the source class. */ + if (CMClassPathIsA(mb, assocInfo->knownEndpoint, assocInfo->lhsClassName, NULL)) { + targetclass = assocInfo->rhsClassName; + targetnamespace = assocInfo->rhsNamespace; + } else if (CMClassPathIsA(mb, assocInfo->knownEndpoint, assocInfo->rhsClassName, NULL)) { + targetclass = assocInfo->lhsClassName; + targetnamespace = assocInfo->lhsNamespace; + } else { + _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request.")); + return 1; + } + _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass)); + _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace)); + + /* Create an object path for the result class. */ + CMPIObjectPath *objectpath = CMNewObjectPath(mb, targetnamespace, targetclass, status); + if ((status->rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) { + _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status->msg))); + CMSetStatusWithChars(mb, status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); + return 1; + } + + /* Get the list of all target class object paths from the CIMOM. */ + CMPIEnumeration *objectpaths = CBEnumInstanceNames(mb, context, objectpath, status); + if ((status->rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) { + _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", CMGetCharPtr(status->msg))); + CMSetStatusWithChars(mb, status, CMPI_RC_ERROR, "Cannot enumerate target class"); + return 1; + } + + /* Return all object paths that exactly match the target class and resultClass, if specified. */ + while (CMHasNext(objectpaths, NULL)) { + CMPIData data = CMGetNext(objectpaths, NULL); + if (matchFunc(assocInfo, data.value.ref, assocFilter)) { + switch (assocInfo->opCode) { + case _CMPI_ASSOC_OP_AN: + { + CMReturnObjectPath(results, data.value.ref); + break; + } + + case _CMPI_ASSOC_OP_A: + { + CMPIInstance *inst = CBGetInstance(mb, context, data.value.ref, assocInfo->properties, status); + if ((status->rc == CMPI_RC_OK) && (!CMIsNullObject(inst))) { + //CMSetNameSpace(op, targetnamespace); + CMReturnInstance(results, inst); + } + break; + } + + case _CMPI_ASSOC_OP_RN: + { + CMPIObjectPath *refobjectpath = CMNewObjectPath(mb, XEN_INSTRUMENTATION_NS, assocInfo->assocClassName, status); + if ((status->rc != CMPI_RC_OK) || CMIsNullObject(refobjectpath)) { + _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", CMGetCharPtr(status->msg))); + CMSetStatusWithChars(mb, status, CMPI_RC_ERROR, "Cannot create new CMPIObjectPath"); + return 1; + } + + /* Assign the references in the association appropriately. */ + if (strcmp(sourceClass, assocInfo->rhsClassName) == 0) { + CMAddKey(refobjectpath, assocInfo->rhsPropertyName, &(assocInfo->knownEndpoint), CMPI_ref); + CMAddKey(refobjectpath, assocInfo->lhsPropertyName, &data.value.ref, CMPI_ref); + } else { + CMAddKey(refobjectpath, assocInfo->rhsPropertyName, &data.value.ref, CMPI_ref); + CMAddKey(refobjectpath, assocInfo->lhsPropertyName, &(assocInfo->knownEndpoint), CMPI_ref); + } + + CMReturnObjectPath(results, refobjectpath); + break; + } + + case _CMPI_ASSOC_OP_R: + { + CMPIInstance *refinstance = _CMNewInstance(mb, XEN_INSTRUMENTATION_NS, assocInfo->assocClassName, status); + if ((status->rc != CMPI_RC_OK) || CMIsNullObject(refinstance)) { + _SBLIM_TRACE(1,("--- CMNewInstance() failed - %s", CMGetCharPtr(status->msg))); + CMSetStatusWithChars(mb, status, CMPI_RC_ERROR, "Cannot create new CMPIInstance"); + return 1; + } + + /* Assign the references in the association appropriately. */ + if (strcmp(sourceClass, assocInfo->rhsClassName) == 0) { + CMSetProperty(refinstance, assocInfo->rhsPropertyName, &(assocInfo->knownEndpoint), CMPI_ref); + CMSetProperty(refinstance, assocInfo->lhsPropertyName, &data.value.ref, CMPI_ref); + } else { + CMSetProperty(refinstance, assocInfo->rhsPropertyName, &data.value.ref, CMPI_ref); + CMSetProperty(refinstance, assocInfo->lhsPropertyName, &(assocInfo->knownEndpoint), CMPI_ref); + } + + CMReturnInstance(results, refinstance); + break; + } + } + } + } + + return 0; +} + diff -r 7c937c187b5e src/cmpiutil.h --- a/src/cmpiutil.h Fri Oct 20 13:20:15 2006 -0600 +++ b/src/cmpiutil.h Mon Oct 23 10:58:26 2006 -0600 @@ -15,7 +15,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // ============================================================================ // Author: Dr. Gareth S. Bestor <bestor@xxxxxxxxxx> -// Contributors: +// Contributors: Jim Fehlig <jfehlig@xxxxxxxxxx> // Summary: Some useful utility functions // Description: // TODO @@ -62,4 +62,77 @@ const char * _CMPITypeName ( CMPIType ty /* Return a string representation of a CMPI value. */ char * _CMPIValueToString ( CMPIData data ); + +/* + * An enumeration defining an association operation, e.g. + * AssociatorNames (AN), References (R), etc. + */ +enum _CMPIAssocOperation +{ + _CMPI_ASSOC_OP_AN, + _CMPI_ASSOC_OP_A, + _CMPI_ASSOC_OP_RN, + _CMPI_ASSOC_OP_R +}; + + +/* + * A structure used to specify association meta-data, i.e. its + * identitiy. + */ +typedef struct _CMPIAssocIdentityStruct +{ + CMPIObjectPath *knownEndpoint; + char *assocClassName; + char *lhsClassName; + char *lhsNamespace; + char *lhsPropertyName; + char *rhsClassName; + char *rhsNamespace; + char *rhsPropertyName; + const char **properties; + enum _CMPIAssocOperation opCode; +} _CMPIAssocIdentity; + + +/* + * A structure used to specifiy filters for an association. + */ +typedef struct _CMPIAssocFilterStruct +{ + const char *assocClass; + const char *resultClass; + const char *role; + const char *resultRole; +} _CMPIAssocFilter; + + +/* + * Function prototype for an association match function. Associations + * must implement a match function that returns true (1) if the + * object path op matches the association defined by assocInfo according + * to the restriction in assocFilter. + */ +typedef int (*_CMPIAssocMatchFunc) (_CMPIAssocIdentity *assocInfo, CMPIObjectPath *op, _CMPIAssocFilter *assocFilter); + + +/* + * Get target endpoints for association defined by assocInfo. + * assocFilter defines any restrictions on the returned enpoints. + * matchFunc must be a non-null function that returns true (1) if + * potential target endpoints meet the requirements of defined in + * assocInfo and assocFilter. Results are collected in the results + * out parameter. + * Returns non-zero on failure with additional error information + * available in out parameter rc. + */ +int _CMPIGetTargetEndpoints( CMPIBroker *mb, + CMPIContext *context, + _CMPIAssocIdentity *assocInfo, + _CMPIAssocFilter *assocFilter, + _CMPIAssocMatchFunc matchFunc, + CMPIResult *results, + CMPIStatus *rc ); + + #endif /* _CMPIUTIL_H_ */ diff -r 7c937c187b5e src/provider_common.h.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/provider_common.h.in Tue Oct 17 14:28:42 2006 -0600 @@ -0,0 +1,29 @@ +// Copyright (C) 2006 Novell, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// ============================================================================ +// Authors: Jim Fehlig, <jfehlig@xxxxxxxxxx> +// Contributors: +// Description: Common provider definitions, macros, etc. +// ============================================================================ + +#if !defined(__PROVIDER_COMMON_H__) +#define __PROVIDER_COMMON_H__ + +#define HOST_INSTRUMENTATION_NS "@HOST_INSTRUMENTATION_NS@" +#define HOST_INSTRUMENTATION_PREFIX "@HOST_INSTRUMENTATION_PREFIX@" +#define XEN_INSTRUMENTATION_NS "root/cimv2" + +#endif /* __PROVIDER_COMMON_H__ */ diff -r 7c937c187b5e src/provider_common.h --- a/src/provider_common.h Fri Oct 20 13:20:15 2006 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -// Copyright (C) 2006 Novell, Inc. -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -// ============================================================================ -// Authors: -// Contributors: -// Description: Common provider definitions, macros, etc. -// ============================================================================ - -#if !defined(__PROVIDER_COMMON_H__) -#define __PROVIDER_COMMON_H__ - -#define HOST_INSTRUMENTATION_NS "smash" - - -#endif /* __PROVIDER_COMMON_H__ */ _______________________________________________ Xen-cim mailing list Xen-cim@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-cim
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |