⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 instance.c

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 C
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================//// Author: Frank Scheffler//// Modified By:  Adrian Schuur (schuur@de.ibm.com)//               Marek Szermutzky, IBM (mszermutzky@de.ibm.com)////%//////////////////////////////////////////////////////////////////////////////*!  \file instance.c  \brief Native CMPIInstance implementation.  This is the native CMPIInstance implementation as used for remote  providers. It reflects the well-defined interface of a regular  CMPIInstance, however, it works independently from the management broker.  It is part of a native broker implementation that simulates CMPI data  types rather than interacting with the entities in a full-grown CIMOM.  \author Frank Scheffler*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "mm.h"#include "native.h"struct native_instance {	CMPIInstance instance;	int mem_state;	char * classname;	char * namespace;	int filtered;	char ** property_list;	char ** key_list;	struct native_property * props;};/****************************************************************************/static void __release_list ( char ** list ){	if ( list ) {		char ** tmp = list;		while ( *tmp ) tool_mm_add ( *tmp++ );		tool_mm_add ( list );	}}static  char ** __duplicate_list (  char ** list, int mem_state ){	char ** result = NULL;	if ( list ) {		size_t size = 1;		char ** tmp = (char **)list;		while ( *tmp++ ) ++size;		result = (char**) tool_mm_alloc ( mem_state, size * sizeof ( char * ) );		for ( tmp = result; *list; tmp++ ) {			*tmp = strdup ( *list++ );			if ( mem_state == TOOL_MM_ADD ) tool_mm_add ( *tmp );		}	}	return result;}static int __contained_list ( char ** list, const char * name ){	if ( list ) {		while ( *list )			if ( strcmp ( *list++, name ) == 0 ) return 1;	}	return 0;}/****************************************************************************/static CMPIStatus __ift_release ( CMPIInstance * instance ){	struct native_instance * i = (struct native_instance *) instance;	if ( i->mem_state == TOOL_MM_NO_ADD ) {		i->mem_state = TOOL_MM_ADD;		tool_mm_add ( i );		tool_mm_add ( i->classname );		tool_mm_add ( i->namespace );		__release_list ( i->property_list );		__release_list ( i->key_list );		propertyFT.release ( i->props );		CMReturn ( CMPI_RC_OK );	}	CMReturn ( CMPI_RC_ERR_FAILED );}static CMPIInstance * __ift_clone ( CONST CMPIInstance * instance, CMPIStatus * rc ){	struct native_instance * i   = (struct native_instance *) instance;	struct native_instance * new =		(struct native_instance *)		tool_mm_alloc ( TOOL_MM_NO_ADD,				sizeof ( struct native_instance ) );	new->classname     = strdup ( i->classname );	new->namespace     = strdup ( i->namespace );	new->property_list = __duplicate_list ( i->property_list,						TOOL_MM_NO_ADD );	new->key_list      = __duplicate_list ( i->key_list, TOOL_MM_NO_ADD );	new->props     = propertyFT.clone ( i->props, rc );	return (CMPIInstance *) new;}static CMPIData __ift_getProperty ( CONST CMPIInstance * instance,				    const char * name,				    CMPIStatus * rc ){	struct native_instance * i = (struct native_instance *) instance;	return propertyFT.getDataProperty ( i->props, name, rc );}static CMPIData __ift_getPropertyAt ( CONST CMPIInstance * instance,				      unsigned int index,				      CMPIString ** name,				      CMPIStatus * rc ){	struct native_instance * i = (struct native_instance *) instance;	return propertyFT.getDataPropertyAt ( i->props, index, name, rc );}static unsigned int __ift_getPropertyCount ( CONST CMPIInstance * instance,					     CMPIStatus * rc ){	struct native_instance * i = (struct native_instance *) instance;	return propertyFT.getPropertyCount ( i->props, rc );}static CMPIStatus __ift_setProperty ( CONST CMPIInstance * instance,				      const char * name,				      CONST CMPIValue * value,				      CMPIType type ){	struct native_instance * i = (struct native_instance *) instance;	if ( i->filtered == 0 ||	     i->property_list == NULL ||	     __contained_list ( i->property_list, name ) ||	     __contained_list ( i->key_list, name ) ) {		if ( propertyFT.setProperty ( i->props,					      i->mem_state,					      name,					      type,					      value ) ) {			propertyFT.addProperty ( &i->props,						 i->mem_state,						 name,						 type,						 0,						 value );		}	}	CMReturn ( CMPI_RC_OK );}static CMPIObjectPath * __ift_getObjectPath ( CONST CMPIInstance * instance,					      CMPIStatus * rc ){	int j,f=0;	CMPIStatus tmp;	struct native_instance * i = (struct native_instance *) instance;	CMPIObjectPath * cop   = native_new_CMPIObjectPath ( i->namespace,							     i->classname,							     rc );	if ( rc && rc->rc != CMPI_RC_OK )		return NULL;	j = propertyFT.getPropertyCount ( i->props, NULL );	while ( j-- ) {		CMPIString * keyName;		CMPIData d = propertyFT.getDataPropertyAt ( i->props,							    j,							    &keyName,							    &tmp );		if ( d.state & CMPI_keyValue ) {			CMAddKey ( cop,				   CMGetCharsPtr ( keyName, NULL ),				   &d.value,				   d.type );		        f++;		}	}#ifndef CMPI_VER_100	if (f==0) {	   CMPIData d;	   CMPIContext *ctx;	   CMPIBroker *broker;	   CMPIArray *kl;	   unsigned int e,m;	   broker=(CMPIBroker*) tool_mm_get_broker((void**)&ctx);	   kl=broker->eft->getKeyList(broker,ctx,cop,NULL);           m=kl->ft->getSize(kl,NULL);	   for (e=0; e<m; e++) {	      CMPIString *n=kl->ft->getElementAt(kl,e,NULL).value.string;	      d=propertyFT.getDataProperty(i->props,CMGetCharPtr(n),&tmp);	      if (tmp.rc==CMPI_RC_OK)		  CMAddKey (cop,CMGetCharPtr(n),&d.value,d.type);           }	}#endif	return cop;}static CMPIStatus __ift_setPropertyFilter ( CMPIInstance * instance,					    CONST char ** propertyList,					    CONST char ** keys ){	struct native_instance * i = (struct native_instance *) instance;	if ( i->filtered && i->mem_state == TOOL_MM_NO_ADD ) {		__release_list ( i->property_list );		__release_list ( i->key_list );	}	i->filtered = 1;	i->property_list = __duplicate_list ( (char **)propertyList, i->mem_state );	i->key_list      = __duplicate_list ( (char **)keys, i->mem_state );	CMReturn ( CMPI_RC_OK );}#ifdef CMPI_VER_100static CMPIStatus __ift_setObjectPath ( CMPIInstance * instance,					const CMPIObjectPath *op){	CMReturn ( CMPI_RC_ERR_NOT_SUPPORTED );}#endifvoid add(char **buf, unsigned int *p, unsigned int *m, char *data){   unsigned int ds=strlen(data)+1;   if (*buf==NULL) {      *buf=(char*)malloc(1024);      *p=0;      *m=1024;   }   if ((ds+(*p))>=*m) {      unsigned nm=*m;      char *nb;      while ((ds+(*p))>=nm) nm*=2;      nb=(char*)malloc(nm);      memcpy(nb,*buf,*p);      free(*buf);      *buf=nb;      *m=nm;   }   memcpy(*buf+(*p),data,ds);   *p+=ds-1;}extern char * value2Chars ( CMPIType type, CMPIValue * value );extern CMPIString *__oft_toString( CONST CMPIObjectPath * cop, CMPIStatus *rc);extern CMPIString * __oft_getClassName ( CONST CMPIObjectPath * cop, CMPIStatus * rc );CMPIString *instance2String(CONST CMPIInstance *inst, CMPIStatus *rc){   CMPIObjectPath *path;   CMPIData data;   CMPIString *name,*ps,*rv;   unsigned int i,m;   char *buf=NULL,*v;   unsigned int bp,bm;       add(&buf,&bp,&bm,"Instance of ");       path=__ift_getObjectPath(inst,NULL);       name=__oft_getClassName(path,rc);       add(&buf,&bp,&bm,(char*)name->hdl);       add(&buf,&bp,&bm," {\n");       ps=__oft_toString(path,rc);       add(&buf,&bp,&bm," PATH: ");       add(&buf,&bp,&bm,(char*)ps->hdl);       add(&buf,&bp,&bm,"\n");       for (i=0,m=__ift_getPropertyCount(inst,rc); i<m; i++) {          data=__ift_getPropertyAt(inst,i,&name,rc);          add(&buf,&bp,&bm," ");	  add(&buf,&bp,&bm,(char*)name->hdl);          add(&buf,&bp,&bm," = ");	  v=value2Chars(data.type,&data.value);	  add(&buf,&bp,&bm,v);	  free(v);          add(&buf,&bp,&bm," ;\n");       }       add(&buf,&bp,&bm,"}\n");       rv=native_new_CMPIString(buf,rc);       free(buf);       return rv;}static CMPIInstanceFT ift = {	NATIVE_FT_VERSION,	__ift_release,	__ift_clone,	__ift_getProperty,	__ift_getPropertyAt,	__ift_getPropertyCount,	__ift_setProperty,	__ift_getObjectPath,	__ift_setPropertyFilter#ifdef CMPI_VER_100	,__ift_setObjectPath#endif};CMPIInstanceFT *CMPI_Instance_FT=&ift;CMPIInstance * native_new_CMPIInstance ( CONST CMPIObjectPath * cop,					 CMPIStatus * rc ){	static CMPIInstance i = {		"CMPIInstance",		&ift	};	struct native_instance * instance =		(struct native_instance *)		tool_mm_alloc ( TOOL_MM_ADD, sizeof ( struct native_instance ) );	CMPIStatus tmp1, tmp2, tmp3;	CMPIString * str;	int j = CMGetKeyCount ( cop, &tmp1 );	instance->instance     = i;	instance->mem_state    = TOOL_MM_ADD;	str = CMGetClassName ( cop, &tmp2 );	instance->classname = CMGetCharsPtr ( str, NULL );	str = CMGetNameSpace ( cop, &tmp3 );	instance->namespace = CMGetCharsPtr ( str, NULL );	if ( tmp1.rc != CMPI_RC_OK ||	     tmp2.rc != CMPI_RC_OK ||	     tmp3.rc != CMPI_RC_OK ) {		if ( rc ) CMSetStatus ( rc, CMPI_RC_ERR_FAILED );	} else {		while ( j-- && ( tmp1.rc == CMPI_RC_OK ) ) {			CMPIString * keyName;			CMPIData tmp = CMGetKeyAt ( cop, j, &keyName, &tmp1 );			propertyFT.addProperty ( &instance->props,						 TOOL_MM_ADD,						 CMGetCharsPtr ( keyName, NULL ),						 tmp.type,						 tmp.state,						 &tmp.value );		}		if ( rc ) CMSetStatus ( rc, tmp1.rc );	}	return (CMPIInstance *) instance;}/****************************************************************************//*** Local Variables:  ***//*** mode: C           ***//*** c-basic-offset: 8 ***//*** End:              ***/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -