1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#pragma ident	"%Z%%M%	%I%	%E% SMI"
28
29#include <unistd.h>
30#include <netdb.h>
31#include <errno.h>
32
33#include "util.h"
34#include "cimKeys.h"
35#include "providerNames.h"
36#include "messageStrings.h"
37#include "disk_descriptors.h"
38#include "logicaldisk_descriptors.h"
39#include "realizesextent_descriptors.h"
40#include "Solaris_RealizesExtent.h"
41
42#define	REALIZES_GETINSTANCE		"REALIZES_EXTENT,GET_INSTANCE"
43#define	REALIZES_ENUMINSTANCES		"REALIZES_EXTENT,ENUM_INSTANCES"
44#define	REALIZES_ENUMINSTANCENAMES \
45	"REALIZES_EXTENT,ENUM_INSTANCENAMES"
46#define	REALIZES_CREATEINSTANCE		"REALIZES_EXTENT,CREATE_INSTANCE"
47#define	REALIZES_DELETEINSTANCE		"REALIZES_EXTENT,DELETE_INSTANCE"
48#define	REALIZES_SETINSTANCE		"REALIZES_EXTENT,SET_INSTANCE"
49#define	REALIZES_SETPROPERTY		"REALIZES_EXTENT,SET_PROPERTY"
50#define	REALIZES_GETPROPERTY		"REALIZES_EXTENT,GET_PROPERTY"
51#define	REALIZES_INVOKEMETHOD		"REALIZES_EXTENT,INVOKE_METHOD"
52#define	REALIZES_EXECQUERY		"REALIZES_EXTENT,EXEC_QUERY"
53#define	REALIZES_ASSOCIATORS		"REALIZES_EXTENT,ASSOCIATORS"
54#define	REALIZES_ASSOCIATORNAMES	"REALIZES_EXTENT,ASSOCIATOR_NAMES"
55#define	REALIZES_REFERENCES		"REALIZES_EXTENT,REFERENCES"
56#define	REALIZES_REFERENCENAMES		"REALIZES_EXTENT,REFERENCE_NAMES"
57
58static
59CCIMInstanceList  *
60createRealizesExtentList(CCIMObjectPath *pObjectName,
61    cimchar *pObjectNameRole,
62	CCIMObjectPathList *objList, cimchar *objRole, int *error);
63/*
64 * Solaris_RealizesExtent provider
65 *
66 * It is important to note that all memory allocated by these functions
67 * and passed to the CIMOM, is freed by the door process prior to
68 * sending a copy of the data to the CIMOM.
69 */
70
71/*
72 * Name: cp_getInstance_Solaris_RealizesExtent
73 *
74 * Description: Returns an instance of Solaris_RealizesExtent if one
75 *  is found that matches the object path passed in .
76 *
77 * Parameters:
78 *	pOP - An CCIMObjectPath * which contains the information on
79 *	the class for which to find the instance.
80 * Returns: CCIMInstance * if match is found, or NULL if not.
81 *
82 */
83
84CCIMInstance*
85cp_getInstance_Solaris_RealizesExtent(CCIMObjectPath* pOP)
86{
87
88	CCIMInstance 		*inst = NULL;
89	CCIMPropertyList	*pCurPropList;
90	CCIMObjectPath		*antOp = NULL;
91	CCIMObjectPath		*depOp = NULL;
92	dm_descriptor_t		d_descriptor;
93	char			*name;
94	int			error;
95
96
97	if (pOP == NULL || pOP->mKeyProperties == NULL) {
98	    util_handleError(REALIZES_GETINSTANCE,
99		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
100	}
101
102	pCurPropList = pOP->mKeyProperties;
103	antOp = (CCIMObjectPath *)util_getKeyValue(pCurPropList, reference,
104	    ANTECEDENT, &error);
105
106	if (error == 0) {
107	    depOp = (CCIMObjectPath *)util_getKeyValue(pCurPropList, reference,
108		DEPENDENT, &error);
109	}
110
111	/*
112	 * Make sure we have both keys. If not, this is an error.
113	 */
114
115	if (error != 0) {
116	    util_handleError(REALIZES_GETINSTANCE,
117		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
118	    return ((CCIMInstance *)NULL);
119	}
120
121	/*
122	 * Now get the name of the antecedent from the object path.
123	 */
124
125	if (antOp->mKeyProperties == NULL ||
126	    depOp->mKeyProperties == NULL) {
127	    util_handleError(REALIZES_GETINSTANCE,
128		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
129	    return ((CCIMInstance *)NULL);
130	}
131
132	pCurPropList = antOp->mKeyProperties;
133	name = (cimchar *)util_getKeyValue(pCurPropList, string, TAG, &error);
134
135	if (error != 0 || name == NULL) {
136	    util_handleError(REALIZES_GETINSTANCE,
137		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
138	    return ((CCIMInstance *)NULL);
139	}
140
141	d_descriptor = dm_get_descriptor_by_name(DM_MEDIA, name, &error);
142
143	/*
144	 * Not found. Return a null instance.
145	 */
146
147	if (error == ENODEV || d_descriptor == NULL) {
148	    return ((CCIMInstance *)NULL);
149	}
150
151	if (error != 0) {
152	    util_handleError(REALIZES_GETINSTANCE, CIM_ERR_FAILED,
153		DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
154	    return ((CCIMInstance *)NULL);
155	}
156
157	/*
158	 * Turn this in to a realizes extent instance.
159	 */
160
161	inst = realizesextent_descriptor_toCCIMInstance(hostName, d_descriptor,
162	    REALIZES_EXTENT, &error);
163	dm_free_descriptor(d_descriptor);
164
165	if (error != 0) {
166	    util_handleError(REALIZES_GETINSTANCE, CIM_ERR_FAILED,
167		REALIZESEXT_DESC_TO_INSTANCE_FAILURE, NULL, &error);
168	    return ((CCIMInstance *)NULL);
169	}
170
171	return (inst);
172}
173
174/*
175 * Name: cp_enumInstances_Solaris_RealizesExtent
176 *
177 * Description: Returns a linked list of instances of this association.
178 *
179 * Parameters:
180 *	pOP - An CCIMObjectPath * which contains the information on
181 *	the class for which to find the instances.
182 * Returns:
183 *	CCIMInstanceList * if istances are found. NULL otherwise.
184 */
185
186/* ARGSUSED */
187CCIMInstanceList*
188cp_enumInstances_Solaris_RealizesExtent(CCIMObjectPath* pOP)
189{
190	CCIMInstanceList* 	instList = NULL;
191	CCIMInstance*		inst;
192	CCIMException*		ex;
193	dm_descriptor_t		*disk_descriptorp = NULL;
194	int			error = 0;
195	int			filter[2];
196	int			i = 0;
197
198	filter[0] = DM_MT_FIXED;
199	filter[1] = DM_FILTER_END;
200
201
202	disk_descriptorp = dm_get_descriptors(DM_MEDIA, filter, &error);
203	if (disk_descriptorp == NULL ||
204	    disk_descriptorp[0] == NULL) {
205	    return ((CCIMInstanceList *)NULL);
206	}
207	if (error != 0) {
208	    util_handleError(REALIZES_ENUMINSTANCES, CIM_ERR_FAILED,
209		DM_GET_DESCRIPTORS, NULL, &error);
210	    return ((CCIMInstanceList *)NULL);
211	}
212
213	/*
214	 * For each one of the disks found, generate the physical and
215	 * logical views and create an association instance.
216	 */
217
218	instList = cim_createInstanceList();
219	if (instList == NULL) {
220	    ex = cim_getLastError();
221	    util_handleError(REALIZES_ENUMINSTANCES, CIM_ERR_FAILED,
222		CREATE_INSTANCE_LIST_FAILURE, ex, &error);
223	    dm_free_descriptors(disk_descriptorp);
224	    return ((CCIMInstanceList *)NULL);
225	}
226
227	for (i = 0; disk_descriptorp[i] != NULL; i ++) {
228	    inst = realizesextent_descriptor_toCCIMInstance(hostName,
229		disk_descriptorp[i], REALIZES_EXTENT, &error);
230	    if (error != 0) {
231		util_handleError(REALIZES_ENUMINSTANCES, CIM_ERR_FAILED,
232		    REALIZESEXT_DESC_TO_INSTANCE_FAILURE, NULL, &error);
233		cim_freeInstanceList(instList);
234		dm_free_descriptors(disk_descriptorp);
235		return ((CCIMInstanceList *)NULL);
236	    }
237	    instList = cim_addInstance(instList, inst);
238	    if (instList == NULL) {
239		util_handleError(REALIZES_ENUMINSTANCES, CIM_ERR_FAILED,
240		    ADD_INSTANCE_FAILURE, NULL, &error);
241		dm_free_descriptors(disk_descriptorp);
242		cim_freeInstance(inst);
243		return ((CCIMInstanceList *)NULL);
244	    }
245	}
246
247	dm_free_descriptors(disk_descriptorp);
248	if (instList->mDataObject == NULL) {
249	    cim_freeInstanceList(instList);
250	    instList = NULL;
251	}
252	return (instList);
253}
254
255/*
256 * Name: cp_enumInstanceNames_Solaris_RealizesExtent
257 *
258 * Description: Returns a linked list of CCIMObjectPath *
259 *      of Solaris_RealizesExtent objects if found.
260 *
261 * Parameters:
262 *	pOP - An CCIMObjectPath * which contains the information on
263 *	the class for which to find the instances.
264 * Returns:
265 *	CCIMObjectPathList * if objects are found. NULL otherwise.
266 */
267
268/* ARGSUSED */
269CCIMObjectPathList*
270cp_enumInstanceNames_Solaris_RealizesExtent(CCIMObjectPath * pOP) {
271
272	CCIMInstanceList	*instList;
273	CCIMObjectPathList	*objList = NULL;
274	int			error;
275
276	if (pOP == NULL) {
277	    util_handleError(REALIZES_ENUMINSTANCENAMES,
278		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
279	    return ((CCIMObjectPathList *)NULL);
280	}
281
282	/*
283	 * Call in to enumInstances and then convert the instance list in
284	 * to an object list.
285	 */
286
287	instList = cp_enumInstances_Solaris_RealizesExtent(pOP);
288
289	if (instList != NULL) {
290	    objList = cim_createObjectPathList(instList);
291	    cim_freeInstanceList(instList);
292	}
293
294	return (objList);
295}
296
297/*
298 * Creating an instance of a Solaris_RealizesExtent is not supported.
299 */
300
301/* ARGSUSED */
302CCIMObjectPath*
303cp_createInstance_Solaris_RealizesExtent(
304    CCIMObjectPath* pOP, CCIMInstance* pInst)
305{
306	int	error;
307
308	util_handleError(REALIZES_CREATEINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL,
309	    NULL, &error);
310	return ((CCIMObjectPath *)NULL);
311}
312
313
314/*
315 * Deleting an instance of a Solaris_RealizesExtent is not supported.
316 */
317
318/* ARGSUSED */
319CIMBool
320cp_deleteInstance_Solaris_RealizesExtent(CCIMObjectPath* pInst)
321{
322	int	error;
323
324	util_handleError(REALIZES_DELETEINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL,
325	    NULL, &error);
326	return (cim_false);
327}
328
329/*
330 * Name: cp_getProperty_Solaris_RealizesExtent
331 *
332 * Description: Returns the property requested, if found.
333 *
334 * Parameters:
335 *	pOP - An CCIMObjectPath * which contains the information on
336 *	the class for which to find the instances.
337 * Returns:
338 *	CCIMProperty * if found.
339 */
340
341/* ARGSUSED */
342CCIMProperty	*
343cp_getProperty_Solaris_RealizesExtent(CCIMObjectPath *pOP,
344    char *pPropName)
345{
346
347	CCIMProperty	*prop = NULL;
348	CCIMInstance	*inst = NULL;
349	int		error = 0;
350
351	if (pOP == NULL) {
352	    util_handleError(REALIZES_GETPROPERTY,
353		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
354	    return ((CCIMProperty *)NULL);
355	}
356
357	inst = cp_getInstance_Solaris_RealizesExtent(pOP);
358	if (inst == NULL) {
359	    return ((CCIMProperty *)NULL);
360	}
361
362	prop = cim_getProperty(inst, pPropName);
363	cim_freeInstance(inst);
364	return (prop);
365}
366
367/*
368 * Setting an instance of a Solaris_RealizesExtent is not supported.
369 */
370
371/* ARGSUSED */
372CIMBool
373cp_setInstance_Solaris_RealizesExtent(
374    CCIMObjectPath* pOP, CCIMInstance* pInst)
375{
376	int	error;
377
378	util_handleError(REALIZES_SETINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL,
379	    NULL, &error);
380	return (cim_false);
381}
382
383
384/*
385 * Setting a property on a Solaris_RealizesExtent is not supported.
386 */
387
388/* ARGSUSED */
389CIMBool
390cp_setProperty_Solaris_RealizesExtent(
391    CCIMObjectPath* pOP, CCIMProperty* pProp)
392{
393	int	error;
394
395	util_handleError(REALIZES_SETPROPERTY, CIM_ERR_NOT_SUPPORTED, NULL,
396	    NULL, &error);
397	return (cim_false);
398}
399
400/*
401 * No Methods for Solaris_RealizesExtent.
402 */
403
404/* ARGSUSED */
405CCIMProperty*
406cp_invokeMethod_Solaris_RealizesExtent(
407    CCIMObjectPath* op, cimchar* methodName,
408	CCIMPropertyList* inParams, CCIMPropertyList* outParams)
409{
410	CCIMProperty	*retVal = (CCIMProperty *)NULL;
411	return (retVal);
412}
413
414/*
415 * Name: cp_execQuery_Solaris_RealizesExtent
416 *
417 * Description:
418 * Returns an instance list which matches the query if any are found.
419 *
420 * Parameters:
421 *	CCIMObjectPath *op - An CCIMObjectPath * which contains the
422 *	information on the class for which to find the instances.
423 *
424 * 	selectList - Not used
425 *	nonJoinExp - Not used
426 *
427 * Returns:
428 *	CCIMInstance * if matched instance is found. Otherwise, NULL.
429 */
430/*
431 * Currently, there is no WQL parser for the C providers. As a result,
432 * what is returned to the CIMOM is a list of instances with
433 * a NULL value at the beginning of the list. This NULL value indicates
434 * to the CIMOM that it must do the filtering for the client.
435 */
436
437/* ARGSUSED */
438CCIMInstanceList*
439cp_execQuery_Solaris_RealizesExtent(
440    CCIMObjectPath *op, cimchar *selectList, cimchar *nonJoinExp,
441	cimchar *queryExp, int queryType)
442{
443	CCIMInstanceList	*instList = NULL;
444	CCIMInstanceList	*result;
445	CCIMInstance		*emptyInst;
446	CCIMException		*ex;
447	int			error;
448
449	if (op == NULL) {
450	    util_handleError(REALIZES_EXECQUERY,
451		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
452	    return ((CCIMInstanceList *)NULL);
453	}
454
455	instList = cp_enumInstances_Solaris_RealizesExtent(op);
456
457	if (instList == NULL) {
458	    return ((CCIMInstanceList *)NULL);
459	}
460	/*
461	 * Create a null instance and add it to the beginning
462	 * of the list to indicate to the CIMOM that no filtering
463	 * was done.
464	 */
465
466	emptyInst = cim_createInstance("");
467	if (emptyInst == NULL) {
468	    ex = cim_getLastError();
469	    util_handleError(REALIZES_EXECQUERY, CIM_ERR_FAILED,
470		CREATE_INSTANCE_FAILURE, ex, &error);
471	    return ((CCIMInstanceList *)NULL);
472	}
473
474	result = cim_createInstanceList();
475	if (result == NULL) {
476	    ex = cim_getLastError();
477	    util_handleError(REALIZES_EXECQUERY, CIM_ERR_FAILED,
478		CREATE_INSTANCE_LIST_FAILURE, ex, &error);
479	    cim_freeInstance(emptyInst);
480	    cim_freeInstanceList(instList);
481	    return ((CCIMInstanceList *)NULL);
482	}
483
484	result = cim_addInstance(result, emptyInst);
485	if (result == NULL) {
486	    ex = cim_getLastError();
487	    util_handleError(REALIZES_EXECQUERY, CIM_ERR_FAILED,
488		ADD_INSTANCE_FAILURE, ex, &error);
489	    cim_freeInstance(emptyInst);
490	    cim_freeInstanceList(instList);
491	    return ((CCIMInstanceList *)NULL);
492	}
493
494	/*
495	 * Since copying the original list to the new list will
496	 * leave no way to free the original list, manually
497	 * concatenate the original list to the new one.
498	 */
499
500	result->mNext = instList;
501	return (result);
502}
503
504/*
505 * Name: cp_associators_Solaris_RealizesExtent
506 *
507 * Description:
508 * Returns a instances of objects associated with the passed in
509 * object if there are any.
510 *
511 * Parameters:
512 *
513 *	CCIMObjectPath *pAssocName - The name of the association that
514 *	the client wants information about.
515 *
516 *	CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the
517 *	information on the class for which to find the associated instances.
518 *
519 *	cimchar *pResultClass - If specified, only return instances that
520 *	are of this class type.
521 *
522 *      cimchar *pRole - If specified, must be valid for the object path
523 *	passed in requesting the associated instances.
524 *
525 *	cimchar *pResultRole - If specified, only return instances that
526 *	are playing this role in the association.
527 *
528 *
529 * Returns:
530 *	CCIMInstanceList * if associated objects are found. NULL otherwise.
531 */
532
533/* ARGSUSED */
534CCIMInstanceList *
535cp_associators_Solaris_RealizesExtent(CCIMObjectPath *pAssocName,
536    CCIMObjectPath *pObjectName, cimchar *pResultClass, cimchar *pRole,
537	cimchar *pResultRole)
538{
539	CCIMPropertyList	*pCurPropList;
540	CCIMInstanceList	*instList = NULL;
541	CCIMInstance		*inst;
542	CCIMException		*ex;
543	dm_descriptor_t		obj_desc;
544	char			*name;
545	int			error = 0;
546	int			isAntecedent = 0;
547
548
549	if (pObjectName == NULL ||
550	    pObjectName->mName == NULL ||
551		pObjectName->mKeyProperties == NULL) {
552	    util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_INVALID_PARAMETER,
553		NULL, NULL, &error);
554	}
555
556	if (strcasecmp(pObjectName->mName, DISK) == 0) {
557	    isAntecedent = 1;
558	}
559
560	if (pRole != NULL) {
561	    if (strcasecmp(pRole, ANTECEDENT) == 0) {
562		if (isAntecedent != 1) {
563		    util_handleError(REALIZES_ASSOCIATORS,
564			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
565		    return ((CCIMInstanceList *)NULL);
566		}
567	    }
568	}
569
570	pCurPropList = pObjectName->mKeyProperties;
571
572	/*
573	 * Get the key. It will either be deviceid or tag. These are
574	 * mutually exclusive.
575	 */
576
577	if (isAntecedent) {
578	    name = (cimchar *)util_getKeyValue(pCurPropList, string, TAG,
579		&error);
580	} else {
581	    name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID,
582		&error);
583	}
584
585	/*
586	 * We went through the whole list and didn't find the necessary
587	 * key value.
588	 */
589
590	if (error != 0 || name == NULL) {
591	    util_handleError(REALIZES_ASSOCIATORS,
592		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
593	    return ((CCIMInstanceList *)NULL);
594	}
595
596	obj_desc = dm_get_descriptor_by_name(DM_MEDIA, name, &error);
597	/*
598	 * No device found.
599	 */
600	if (error == ENODEV || obj_desc == NULL) {
601	    return (instList);
602	}
603
604	if (error != 0) {
605	    util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED,
606		DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
607	    return ((CCIMInstanceList *)NULL);
608	}
609
610	if (isAntecedent == 1) {
611		/*
612		 * Physical disk calling this method, return instances of the
613		 * logical disk associated with this disk.
614		 */
615
616	    inst = logicaldisk_descriptor_toCCIMInstance(hostName,
617		    obj_desc, LOGICAL_DISK, &error);
618	    dm_free_descriptor(obj_desc);
619
620	    if (error != 0) {
621		util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED,
622		    LOGICALDISK_DESC_TO_INSTANCE_FAILURE, NULL, &error);
623		return ((CCIMInstanceList *)NULL);
624	    }
625
626	    instList = cim_createInstanceList();
627	    if (instList == NULL) {
628		ex = cim_getLastError();
629		util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED,
630		    CREATE_INSTANCE_FAILURE, ex, &error);
631		return ((CCIMInstanceList *)NULL);
632	    }
633	    instList = cim_addInstance(instList, inst);
634	    if (instList == NULL) {
635		ex = cim_getLastError();
636		util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED,
637		    ADD_INSTANCE_FAILURE, ex, &error);
638		cim_freeInstance(inst);
639		return ((CCIMInstanceList *)NULL);
640	    }
641	} else {
642		/*
643		 * This is the logical disk calling this function. Return the
644		 * disk that this belongs to.
645		 */
646
647	    inst = disk_descriptor_toCCIMInstance(hostName, obj_desc,
648		DISK, &error);
649	    dm_free_descriptor(obj_desc);
650
651	    if (error != 0) {
652		util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED,
653		    DISK_DESC_TO_INSTANCE_FAILURE, NULL, &error);
654		return ((CCIMInstanceList *)NULL);
655	    }
656
657	    instList = cim_createInstanceList();
658	    if (instList == NULL) {
659		ex = cim_getLastError();
660		util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED,
661		    CREATE_INSTANCE_FAILURE, ex, &error);
662		cim_freeInstance(inst);
663		return ((CCIMInstanceList *)NULL);
664	    }
665	    instList = cim_addInstance(instList, inst);
666	    if (instList == NULL) {
667		ex = cim_getLastError();
668		util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED,
669		    ADD_INSTANCE_FAILURE, ex, &error);
670		return ((CCIMInstanceList *)NULL);
671	    }
672	}
673
674	return (instList);
675}
676
677/*
678 * Name: cp_associatorNames_Solaris_RealizesExtent
679 *
680 * Description:
681 * Returns a list of objects associated with the passed in
682 * object if there are any via the object CCIMObjectPath.
683 *
684 * Parameters:
685 *
686 *	CCIMObjectPath *pAssocName - The name of the association that
687 *	the client wants information about.
688 *
689 *	CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the
690 *	information on the class for which to find the associated instances.
691 *
692 *	cimchar *pResultClass - If specified, only return instances that
693 *	are of this class type.
694 *
695 *      cimchar *pRole - If specified, must be valid for the object path
696 *	passed in requesting the associated instances.
697 *
698 *	cimchar *pResultRole - If specified, only return instances that
699 *	are playing this role in the association.
700 *
701 *
702 * Returns:
703 *	CCIMObjectPathList * if associated objects are found. NULL otherwise.
704 */
705
706/* ARGSUSED */
707CCIMObjectPathList *
708cp_associatorNames_Solaris_RealizesExtent(CCIMObjectPath *pAssocName,
709    CCIMObjectPath *pObjectName, cimchar *pResultClass, cimchar *pRole,
710	cimchar *pResultRole)
711{
712
713	CCIMInstanceList	*instList;
714	CCIMObjectPathList	*objList = NULL;
715	int			error;
716
717
718	if (pObjectName == NULL) {
719	    util_handleError(REALIZES_ASSOCIATORNAMES,
720		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
721	    return ((CCIMObjectPathList *)NULL);
722	}
723
724	instList =
725	    cp_associators_Solaris_RealizesExtent(
726		pAssocName, pObjectName, pResultClass, pRole, pResultRole);
727
728	if (instList != NULL) {
729	    objList = cim_createObjectPathList(instList);
730	    cim_freeInstanceList(instList);
731	}
732
733	return (objList);
734}
735
736/*
737 * Name: cp_references_Solaris_RealizesExtent
738 *
739 * Description:
740 * Returns a instances of objects that have references to the passed in
741 * object if there are any.
742 *
743 * Parameters:
744 *
745 *	CCIMObjectPath *pAssocName - The name of the association that
746 *	the client wants information about.
747 *
748 *	CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the
749 *	information on the class for which to find the associated instances.
750 *
751 *      cimchar *pRole - If specified, must be valid for the object path
752 *	passed in requesting the associated instances.
753 *
754 * Returns:
755 *	CCIMObjectPathList * if associated objects are found. NULL otherwise.
756 */
757
758/* ARGSUSED */
759CCIMInstanceList *
760cp_references_Solaris_RealizesExtent(CCIMObjectPath *pAssocName,
761CCIMObjectPath *pObjectName, char *pRole)
762{
763
764	CCIMInstanceList	*instList;
765	CCIMObjectPathList	*objList = NULL;
766	int			error;
767
768
769	if (pObjectName == NULL) {
770	    util_handleError(REALIZES_REFERENCES,
771		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
772	    return ((CCIMInstanceList *)NULL);
773	}
774	/*
775	 * Get the list of those objects that are referred to by
776	 * the calling object.
777	 */
778
779	objList =
780	    cp_associatorNames_Solaris_RealizesExtent(
781		pAssocName, pObjectName, NULL, NULL, NULL);
782
783	if (objList == NULL) {
784	    return ((CCIMInstanceList *)NULL);
785	}
786
787	/*
788	 * Now generate the list of instances to return.
789	 */
790
791	if (strcasecmp(pObjectName->mName, DISK) == 0) {
792	    instList = createRealizesExtentList(pObjectName,
793		ANTECEDENT, objList, DEPENDENT, &error);
794	} else {
795	    instList = createRealizesExtentList(pObjectName,
796		DEPENDENT, objList, ANTECEDENT, &error);
797	}
798
799	cim_freeObjectPathList(objList);
800	return (instList);
801}
802
803/*
804 * Name: cp_referenceNames_Solaris_RealizesExtent
805 *
806 * Description:
807 * Returns a instances of objects that have references to the passed in
808 * object if there are any.
809 *
810 * Parameters:
811 *
812 *	CCIMObjectPath *pAssocName - The name of the association that
813 *	the client wants information about.
814 *
815 *	CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the
816 *	information on the class for which to find the associated instances.
817 *
818 *      cimchar *pRole - If specified, must be valid for the object path
819 *	passed in requesting the associated instances.
820 *
821 *
822 * Returns:
823 *	CCIMObjectPathList * if associated objects are found. NULL otherwise.
824 *
825 */
826
827/* ARGSUSED */
828CCIMObjectPathList *
829cp_referenceNames_Solaris_RealizesExtent(CCIMObjectPath *pAssocName,
830    CCIMObjectPath *pObjectName, cimchar *pRole)
831{
832
833	CCIMInstanceList	*instList = NULL;
834	CCIMObjectPathList	*objList = NULL;
835	int			error;
836
837	if (pObjectName == NULL) {
838	    util_handleError(REALIZES_REFERENCENAMES,
839		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
840	    return ((CCIMObjectPathList *)NULL);
841	}
842
843	instList =
844	    cp_references_Solaris_RealizesExtent(pAssocName,
845		pObjectName, pRole);
846
847	if (instList != NULL) {
848	    objList = cim_createObjectPathList(instList);
849	    cim_freeInstanceList(instList);
850	}
851
852	return (objList);
853}
854
855/*
856 * Create the association class with the passed in attributes.
857 */
858static
859CCIMInstanceList  *
860createRealizesExtentList(CCIMObjectPath *pObjectName,
861    cimchar *pObjectNameRole,
862	CCIMObjectPathList *objList, cimchar *objRole, int *error)
863{
864
865	CCIMObjectPathList	*tmpList;
866	CCIMInstanceList	*instList = NULL;
867	CCIMInstance		*inst;
868	CCIMObjectPath		*obj1;
869	CCIMObjectPath		*obj2;
870	CCIMException		*ex;
871
872	*error = 0;
873
874	/*
875	 * If no objects associated with this one, return NULL.
876	 */
877	if (objList == NULL) {
878	    return ((CCIMInstanceList *)NULL);
879	}
880
881	instList = cim_createInstanceList();
882	if (instList == NULL) {
883	    ex = cim_getLastError();
884	    util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED,
885		CREATE_INSTANCE_FAILURE, ex, error);
886	    return ((CCIMInstanceList *)NULL);
887	}
888
889	tmpList = objList;
890	while (tmpList != NULL) {
891	    obj1 = tmpList->mDataObject;
892	    obj2 = cim_copyObjectPath(pObjectName);
893	    if (obj2 == NULL) {
894		ex = cim_getLastError();
895		util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED,
896		    COPY_OBJPATH_FAILURE, ex, error);
897		return ((CCIMInstanceList *)NULL);
898	    }
899
900	    inst = cim_createInstance(REALIZES_EXTENT);
901	    if (inst == NULL) {
902		ex = cim_getLastError();
903		util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED,
904		    CREATE_INSTANCE_FAILURE, ex, error);
905		return ((CCIMInstanceList *)NULL);
906	    }
907
908	    util_doReferenceProperty(pObjectNameRole, obj2, cim_true, inst,
909		error);
910	    cim_freeObjectPath(obj2);
911
912	    if (*error != 0) {
913		ex = cim_getLastError();
914		util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED,
915		    ADD_PROPERTY_FAILURE, ex, error);
916		cim_freeInstance(inst);
917		return ((CCIMInstanceList *)NULL);
918	    }
919
920	    util_doReferenceProperty(objRole, obj1, cim_true, inst, error);
921
922	    if (*error != 0) {
923		ex = cim_getLastError();
924		util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED,
925		    ADD_PROPERTY_FAILURE, ex, error);
926		cim_freeInstance(inst);
927		return ((CCIMInstanceList *)NULL);
928	    }
929
930	    instList = cim_addInstance(instList, inst);
931	    if (instList == NULL) {
932		ex = cim_getLastError();
933		util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED,
934		    ADD_INSTANCE_FAILURE, ex, error);
935		cim_freeInstance(inst);
936		return ((CCIMInstanceList *)NULL);
937	    }
938
939	    tmpList = tmpList->mNext;
940	}
941	return (instList);
942}
943