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 "partbasedon_descriptors.h"
38 #include "partition_descriptors.h"
39 #include "logicaldisk_descriptors.h"
40 #include "Solaris_DiskPartitionBasedOnDisk.h"
41 
42 #define	DISKPART_GETINSTANCE		"DISKPART_BASEDONDISK,GET_INSTANCE"
43 #define	DISKPART_ENUMINSTANCES		"DISKPART_BASEDONDISK,ENUM_INSTANCES"
44 #define	DISKPART_ENUMINSTANCENAMES \
45 	"DISKPART_BASEDONDISK,ENUM_INSTANCENAMES"
46 #define	DISKPART_CREATEINSTANCE		"DISKPART_BASEDONDISK,CREATE_INSTANCE"
47 #define	DISKPART_DELETEINSTANCE		"DISKPART_BASEDONDISK,DELETE_INSTANCE"
48 #define	DISKPART_SETINSTANCE		"DISKPART_BASEDONDISK,SET_INSTANCE"
49 #define	DISKPART_SETPROPERTY		"DISKPART_BASEDONDISK,SET_PROPERTY"
50 #define	DISKPART_GETPROPERTY		"DISKPART_BASEDONDISK,GET_PROPERTY"
51 #define	DISKPART_INVOKEMETHOD		"DISKPART_BASEDONDISK,INVOKE_METHOD"
52 #define	DISKPART_EXECQUERY		"DISKPART_BASEDONDISK,EXEC_QUERY"
53 #define	DISKPART_ASSOCIATORS		"DISKPART_BASEDONDISK,ASSOCIATORS"
54 #define	DISKPART_ASSOCIATORNAMES	"DISKPART_BASEDONDISK,ASSOCIATOR_NAMES"
55 #define	DISKPART_REFERENCES		"DISKPART_BASEDONDISK,REFERENCES"
56 #define	DISKPART_REFERENCENAMES		"DISKPART_BASEDONDISK,REFERENCE_NAMES"
57 
58 static CCIMInstanceList  *createDiskPartBasedOnRefList(
59     CCIMObjectPath *pObjectName, cimchar *pObjectNameRole,
60 	CCIMObjectPathList *objList, cimchar *objRole, int *error);
61 
62 /*
63  * Solaris_DiskPartitionBasedOnDisk provider
64  *
65  * It is important to note that all memory allocated by these functions
66  * and passed to the CIMOM, is freed by the door process prior to
67  * sending a copy of the data to the CIMOM.
68  */
69 
70 /*
71  * Name: cp_getInstance_Solaris_DiskPartitionBasedOnDisk
72  *
73  * Description: Returns an instance which matches the passed in object path
74  * if found.
75  *
76  * Parameters:
77  *	pOP - An CCIMObjectPath * which contains the information on
78  *	the class for which to find the instance.
79  * Returns:
80  *	CCIMInstance * if matched instance is found. Otherwise, NULL.
81  */
82 
83 CCIMInstance*
cp_getInstance_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pOP)84 cp_getInstance_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath* pOP)
85 {
86 	CCIMInstance		*inst = NULL;
87 	CCIMPropertyList	*pCurPropList;
88 	dm_descriptor_t		d_descriptor;
89 	dm_descriptor_t		p_descriptor;
90 	CCIMObjectPath		*antOp = NULL;
91 	CCIMObjectPath		*depOp = NULL;
92 	char			*name;
93 	int			error;
94 
95 
96 	if (pOP == NULL) {
97 	    util_handleError(DISKPART_GETINSTANCE,
98 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
99 	    return ((CCIMInstance *)NULL);
100 	}
101 
102 	if ((pCurPropList = pOP->mKeyProperties) == NULL) {
103 	    util_handleError(DISKPART_GETINSTANCE,
104 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
105 	    return ((CCIMInstance*)NULL);
106 	}
107 
108 	antOp = (CCIMObjectPath *)util_getKeyValue(
109 	    pCurPropList, reference, ANTECEDENT, &error);
110 
111 	if (error == 0) {
112 	    depOp = (CCIMObjectPath *)util_getKeyValue(
113 		pCurPropList, reference, DEPENDENT, &error);
114 	}
115 
116 	if (error != 0) {
117 	    util_handleError(DISKPART_GETINSTANCE, CIM_ERR_INVALID_PARAMETER,
118 		NULL, NULL, &error);
119 	    return ((CCIMInstance *)NULL);
120 	}
121 
122 	/*
123 	 * Now, get the name of the antecedent from the object path.
124 	 */
125 
126 	if ((pCurPropList = antOp->mKeyProperties) == NULL ||
127 		((pCurPropList = depOp->mKeyProperties) == NULL)) {
128 	    util_handleError(DISKPART_GETINSTANCE, CIM_ERR_INVALID_PARAMETER,
129 		NULL, NULL, &error);
130 	    return ((CCIMInstance *)NULL);
131 	}
132 
133 	pCurPropList = antOp->mKeyProperties;
134 	name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID,
135 	    &error);
136 
137 	if (error != 0) {
138 	    util_handleError(DISKPART_GETINSTANCE, CIM_ERR_INVALID_PARAMETER,
139 		NULL, NULL, &error);
140 	    return ((CCIMInstance *)NULL);
141 	}
142 	d_descriptor = dm_get_descriptor_by_name(DM_MEDIA, name, &error);
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(DISKPART_GETINSTANCE, CIM_ERR_FAILED,
153 		DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
154 	    return ((CCIMInstance*)NULL);
155 	}
156 
157 	/*
158 	 * Now, get the name of the dependent from the object path.
159 	 */
160 
161 	pCurPropList = depOp->mKeyProperties;
162 	name = (cimchar *)util_getKeyValue(pCurPropList, string,
163 	    DEVICEID, & error);
164 
165 	if (error != 0) {
166 	    util_handleError(DISKPART_GETINSTANCE, CIM_ERR_INVALID_PARAMETER,
167 		NULL, NULL, &error);
168 	    return ((CCIMInstance *)NULL);
169 	}
170 	p_descriptor = dm_get_descriptor_by_name(DM_SLICE, name,
171 	    &error);
172 
173 	/*
174 	 * Not found. Return a null instance.
175 	 */
176 
177 	if (error == ENODEV || p_descriptor == NULL) {
178 	    return ((CCIMInstance *)NULL);
179 	}
180 
181 	if (error != 0) {
182 	    util_handleError(DISKPART_GETINSTANCE, CIM_ERR_FAILED,
183 		DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
184 	    return ((CCIMInstance*)NULL);
185 	}
186 
187 	/* Turn these descriptors in to a disk part based on instance */
188 
189 	inst = partbasedon_descriptor_toCCIMInstance(
190 	    hostName, d_descriptor, p_descriptor, DISKPART_BASEDONDISK, &error);
191 	dm_free_descriptor(d_descriptor);
192 	dm_free_descriptor(p_descriptor);
193 
194 	if (error != 0) {
195 	    util_handleError(DISKPART_GETINSTANCE, CIM_ERR_FAILED,
196 		PARTBASEDON_DESC_TO_INSTANCE_FAILURE, NULL, &error);
197 	    return ((CCIMInstance*)NULL);
198 	}
199 
200 	return (inst);
201 }
202 
203 /*
204  * Name: cp_enumInstances_Solaris_DiskPartitionBasedOnDisk
205  *
206  * Description: Returns a linked list of instances of
207  *      Solaris_DiskPartitionBasedOnDisk if found.
208  *
209  * Parameters:
210  *	pOP - An CCIMObjectPath * which contains the information on
211  *	the class for which to find the instances.
212  * Returns:
213  *	CCIMInstanceList * if instances are found. Otherwise,
214  *	NULL is returned.
215  */
216 
217 /* ARGSUSED */
218 CCIMInstanceList*
cp_enumInstances_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pOP)219 cp_enumInstances_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath* pOP)
220 {
221 	CCIMInstanceList* 	instList = NULL;
222 	CCIMInstance*		inst;
223 	CCIMException*		ex;
224 	dm_descriptor_t		*disk_descriptorp = NULL;
225 	dm_descriptor_t		*part_descriptorp = NULL;
226 	int			error = 0;
227 	int			filter[2];
228 	int			i = 0;
229 	int			j = 0;
230 
231 	filter[0] = DM_MT_FIXED;
232 	filter[1] = DM_FILTER_END;
233 
234 	disk_descriptorp = dm_get_descriptors(DM_MEDIA, filter, &error);
235 
236 	if (disk_descriptorp == NULL ||
237 		disk_descriptorp[0] == NULL) {
238 	    return ((CCIMInstanceList *)NULL);
239 	}
240 	if (error != 0) {
241 	    util_handleError(DISKPART_ENUMINSTANCES, CIM_ERR_FAILED,
242 		DM_GET_DESCRIPTORS, NULL, &error);
243 	    return ((CCIMInstanceList *)NULL);
244 	}
245 
246 	/*
247 	 * For each one of the disks found, get the associated partitions.
248 	 */
249 
250 	instList = cim_createInstanceList();
251 	if (instList == NULL) {
252 	    ex = cim_getLastError();
253 	    util_handleError(DISKPART_ENUMINSTANCES, CIM_ERR_FAILED,
254 		CREATE_INSTANCE_LIST_FAILURE, ex,
255 		&error);
256 	    dm_free_descriptors(disk_descriptorp);
257 	    return ((CCIMInstanceList *)NULL);
258 	}
259 
260 	for (i = 0; disk_descriptorp[i] != NULL; i ++) {
261 	    part_descriptorp = dm_get_associated_descriptors(
262 		disk_descriptorp[i], DM_SLICE, &error);
263 
264 	    /* If no partitions associated with this disk, continue */
265 
266 	    if (part_descriptorp == NULL) {
267 		continue;
268 	    }
269 
270 	    if (error != 0) {
271 		util_handleError(DISKPART_ENUMINSTANCES, CIM_ERR_FAILED,
272 		    DM_GET_ASSOC_FAILURE, NULL, &error);
273 		dm_free_descriptors(disk_descriptorp);
274 		cim_freeInstanceList(instList);
275 		return ((CCIMInstanceList *)NULL);
276 	    }
277 
278 
279 	    for (j = 0; part_descriptorp[j] != NULL; j ++) {
280 		inst = partbasedon_descriptor_toCCIMInstance(hostName,
281 		    disk_descriptorp[i], part_descriptorp[j],
282 			DISKPART_BASEDONDISK, &error);
283 		if (error != 0) {
284 		    util_handleError(DISKPART_ENUMINSTANCES, CIM_ERR_FAILED,
285 			PARTBASEDON_DESC_TO_INSTANCE_FAILURE, NULL, &error);
286 		    dm_free_descriptors(disk_descriptorp);
287 		    dm_free_descriptors(part_descriptorp);
288 		    cim_freeInstanceList(instList);
289 		    return ((CCIMInstanceList *)NULL);
290 		}
291 
292 		instList = cim_addInstance(instList, inst);
293 		if (instList == NULL) {
294 		    ex = cim_getLastError();
295 		    util_handleError(DISKPART_ENUMINSTANCES, CIM_ERR_FAILED,
296 			ADD_INSTANCE_FAILURE, ex, &error);
297 		    dm_free_descriptors(disk_descriptorp);
298 		    dm_free_descriptors(part_descriptorp);
299 		    cim_freeInstance(inst);
300 		    return ((CCIMInstanceList *)NULL);
301 		}
302 	    }
303 
304 	    dm_free_descriptors(part_descriptorp);
305 	}
306 
307 	dm_free_descriptors(disk_descriptorp);
308 	return (instList);
309 }
310 
311 /*
312  * Name: cp_enumInstanceNames_Solaris_DiskPartitionBasedOnDisk
313  *
314  * Description: Returns a linked list of CCIMObjectPath *
315  *      of Solaris_DiskPartitionBasedOnDisk if found.
316  *
317  * Parameters:
318  *	pOP - An CCIMObjectPath * which contains the information on
319  *	the class for which to find the instances.
320  * Returns:
321  *	CCIMObjectPathList * if objects are found.
322  *	Otherwise NULL is returned.
323  */
324 
325 CCIMObjectPathList*
cp_enumInstanceNames_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pOP)326 cp_enumInstanceNames_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pOP) {
327 
328 	CCIMInstanceList	*instList;
329 	CCIMObjectPathList	*objList = NULL;
330 	int			error;
331 
332 	if (pOP == NULL) {
333 	    util_handleError(DISKPART_ENUMINSTANCENAMES,
334 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
335 	}
336 	/*
337 	 * Call in to enumInstances and then convert the instance list in
338 	 * to an object list.
339 	 */
340 
341 	instList = cp_enumInstances_Solaris_DiskPartitionBasedOnDisk(pOP);
342 
343 	if (instList != NULL) {
344 	    objList = cim_createObjectPathList(instList);
345 	    cim_freeInstanceList(instList);
346 	}
347 
348 	return (objList);
349 }
350 
351 /*
352  * Creating an instance of a Solaris_DiskPartitionBasedOnDisk is not supported.
353  */
354 
355 /* ARGSUSED */
356 CCIMObjectPath*
cp_createInstance_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pOP,CCIMInstance * pInst)357 cp_createInstance_Solaris_DiskPartitionBasedOnDisk(
358     CCIMObjectPath* pOP, CCIMInstance* pInst)
359 {
360 	int	error;
361 
362 	util_handleError(DISKPART_CREATEINSTANCE,
363 	    CIM_ERR_NOT_SUPPORTED, NULL, NULL, &error);
364 	return ((CCIMObjectPath *)NULL);
365 }
366 
367 /*
368  * Deleting an instance of a Solaris_DiskPartitionBasedOnDisk is not supported.
369  */
370 
371 /* ARGSUSED */
372 CIMBool
cp_deleteInstance_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pInst)373 cp_deleteInstance_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath* pInst)
374 {
375 	int	error;
376 
377 	util_handleError(DISKPART_DELETEINSTANCE,
378 	    CIM_ERR_NOT_SUPPORTED, NULL, NULL, &error);
379 	return (cim_false);
380 }
381 
382 /*
383  * Name: cp_getProperty_Solaris_DiskPartitionBasedOnDisk
384  *
385  * Description: Returns the property requested, if found.
386  *
387  * Parameters:
388  *	pOP - An CCIMObjectPath * which contains the information on
389  *	the class for which to find the instances.
390  * Returns:
391  *	CCIMProperty * if found.
392  */
393 
394 /* ARGSUSED */
395 CCIMProperty	*
cp_getProperty_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pOP,char * pPropName)396 cp_getProperty_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath *pOP,
397     char *pPropName)
398 {
399 
400 	CCIMProperty	*prop = NULL;
401 	CCIMInstance	*inst = NULL;
402 	int		error = 0;
403 
404 	if (pOP == NULL) {
405 	    util_handleError(DISKPART_GETPROPERTY,
406 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
407 	    return ((CCIMProperty *)NULL);
408 	}
409 
410 	inst = cp_getInstance_Solaris_DiskPartitionBasedOnDisk(pOP);
411 	if (inst == NULL) {
412 	    return ((CCIMProperty *)NULL);
413 	}
414 
415 	prop = cim_getProperty(inst, pPropName);
416 	cim_freeInstance(inst);
417 	return (prop);
418 }
419 
420 /*
421  * Setting an instance of a Solaris_DiskPartitionBasedOnDisk is not supported.
422  */
423 
424 /* ARGSUSED */
425 CIMBool
cp_setInstance_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pOP,CCIMInstance * pInst)426 cp_setInstance_Solaris_DiskPartitionBasedOnDisk(
427     CCIMObjectPath* pOP, CCIMInstance* pInst)
428 {
429 	int	error;
430 
431 	util_handleError(DISKPART_SETINSTANCE,
432 	    CIM_ERR_NOT_SUPPORTED, NULL, NULL, &error);
433 	return (cim_false);
434 }
435 
436 
437 
438 /*
439  * Setting a property on a Solaris_DiskPartitionBasedOnDisk is not supported.
440  */
441 
442 /* ARGSUSED */
443 CIMBool
cp_setProperty_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pOP,CCIMProperty * pProp)444 cp_setProperty_Solaris_DiskPartitionBasedOnDisk(
445     CCIMObjectPath* pOP, CCIMProperty* pProp)
446 {
447 	int	error;
448 
449 	util_handleError(DISKPART_SETPROPERTY,
450 	    CIM_ERR_NOT_SUPPORTED, NULL, NULL, &error);
451 	return (cim_false);
452 }
453 
454 /*
455  * No Methods for Solaris_DiskPartitionBasedOnDisk.
456  */
457 
458 /* ARGSUSED */
459 CCIMProperty*
cp_invokeMethod_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * op,cimchar * methodName,CCIMPropertyList * inParams,CCIMPropertyList * outParams)460 cp_invokeMethod_Solaris_DiskPartitionBasedOnDisk(
461     CCIMObjectPath* op, cimchar* methodName,
462 	CCIMPropertyList* inParams, CCIMPropertyList* outParams)
463 {
464 	CCIMProperty	*retVal = (CCIMProperty	*)NULL;
465 	return (retVal);
466 }
467 
468 /*
469  * Name: cp_execQuery_Solaris_DiskPartitionBasedOnDisk
470  *
471  * Description:
472  * Returns an instance list which matches the query if any are found.
473  *
474  * Parameters:
475  *	CCIMObjectPath *op - An CCIMObjectPath * which contains the
476  *	information on the class for which to find the instances.
477  *
478  * 	selectList - Not used
479  *	nonJoinExp - Not used
480  *
481  * Returns:
482  *	CCIMInstance * if matched instance is found. Otherwise, NULL.
483  */
484 /*
485  * Currently, there is no WQL parser for the C providers. As a result,
486  * what is returned to the CIMOM is a list of instances with
487  * a NULL value at the beginning of the list. This NULL value indicates
488  * to the CIMOM that it must do the filtering for the client.
489  */
490 
491 /* ARGSUSED */
492 CCIMInstanceList*
cp_execQuery_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * op,cimchar * selectList,cimchar * nonJoinExp,cimchar * queryExp,int queryType)493 cp_execQuery_Solaris_DiskPartitionBasedOnDisk(
494     CCIMObjectPath *op, cimchar *selectList, cimchar *nonJoinExp,
495 	cimchar *queryExp, int queryType)
496 {
497 	CCIMInstanceList	*instList = NULL;
498 	CCIMInstanceList	*result;
499 	CCIMInstance		*emptyInst;
500 	CCIMException		*ex;
501 	int			error;
502 
503 	if (op == NULL) {
504 	    util_handleError(DISKPART_EXECQUERY,
505 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
506 	    return ((CCIMInstanceList *)NULL);
507 	}
508 
509 	instList = cp_enumInstances_Solaris_DiskPartitionBasedOnDisk(op);
510 
511 	if (instList == NULL) {
512 	    return ((CCIMInstanceList *)NULL);
513 	}
514 
515 	/*
516 	 * Create a null instance and add it to the beginning
517 	 * of the list to indicate to the CIMOM that no filtering
518 	 * was done.
519 	 */
520 
521 	emptyInst = cim_createInstance("");
522 	if (emptyInst == NULL) {
523 	    ex = cim_getLastError();
524 	    util_handleError(DISKPART_EXECQUERY, CIM_ERR_FAILED,
525 		CREATE_INSTANCE_FAILURE, ex, &error);
526 	    cim_freeInstanceList(instList);
527 	    return ((CCIMInstanceList *)NULL);
528 	}
529 
530 	result = cim_createInstanceList();
531 	if (result == NULL) {
532 	    ex = cim_getLastError();
533 	    util_handleError(DISKPART_EXECQUERY, CIM_ERR_FAILED,
534 		CREATE_INSTANCE_LIST_FAILURE, ex, &error);
535 	    cim_freeInstance(emptyInst);
536 	    cim_freeInstanceList(instList);
537 	    return ((CCIMInstanceList *)NULL);
538 	}
539 
540 	result = cim_addInstance(result, emptyInst);
541 	if (result == NULL) {
542 	    ex = cim_getLastError();
543 	    util_handleError(DISKPART_EXECQUERY, CIM_ERR_FAILED,
544 		ADD_INSTANCE_FAILURE, ex, &error);
545 	    cim_freeInstance(emptyInst);
546 	    cim_freeInstanceList(instList);
547 	    return ((CCIMInstanceList *)NULL);
548 	}
549 
550 	/*
551 	 * Since copying the original list to the new list will
552 	 * leave no way to free the original list, manually
553 	 * concatenate the original list to the new one.
554 	 */
555 
556 	result->mNext = instList;
557 	return (result);
558 }
559 
560 /*
561  * Name: cp_associators_Solaris_DiskPartitionBasedOnDisk
562  *
563  * Description:
564  * Returns instances of objects associated with the passed in
565  * object if there are any.
566  *
567  * Parameters:
568  *
569  *	CCIMObjectPath *pAssocName - The name of the association that
570  *	the client wants information about.
571  *
572  *	CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the
573  *	information on the class for which to find the associated instances.
574  *
575  *	cimchar *pResultClass - If specified, only return instances that
576  *	are of this class type.
577  *
578  *      cimchar *pRole - If specified, must be valid for the object path
579  *	passed in requesting the associated instances.
580  *
581  *	cimchar *pResultRole - If specified, only return instances that
582  *	are playing this role in the association.
583  *
584  *
585  * Returns:
586  *	CCIMInstanceList * if associated objects are found.
587  *	Otherwise NULL is returned.
588  */
589 
590 /* ARGSUSED */
591 CCIMInstanceList *
cp_associators_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,cimchar * pResultClass,cimchar * pRole,cimchar * pResultRole)592 cp_associators_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath *pAssocName,
593     CCIMObjectPath *pObjectName, cimchar *pResultClass, cimchar *pRole,
594 	cimchar *pResultRole)
595 {
596 	CCIMPropertyList	*pCurPropList;
597 	CCIMInstanceList	*instList = NULL;
598 	CCIMInstance		*inst;
599 	CCIMException		*ex;
600 	dm_descriptor_t		*assoc_descriptors;
601 	dm_descriptor_t		obj_desc;
602 	char			*name;
603 	int			error = 0;
604 	int			isAntecedent = 0;
605 	int			i;
606 
607 
608 	if (pObjectName == NULL || pObjectName->mName == NULL) {
609 	    util_handleError(DISKPART_ASSOCIATORS,
610 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
611 	    return ((CCIMInstanceList *)NULL);
612 	}
613 
614 	if (strcasecmp(pObjectName->mName, LOGICAL_DISK) == 0) {
615 	    isAntecedent = 1;
616 	}
617 
618 	if (pRole != NULL) {
619 	    if (strcasecmp(pRole, ANTECEDENT) == 0) {
620 		if (isAntecedent != 1) {
621 		    util_handleError(DISKPART_ASSOCIATORS,
622 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
623 		    return ((CCIMInstanceList *)NULL);
624 		}
625 	    }
626 	}
627 
628 	if ((pCurPropList = pObjectName->mKeyProperties) == NULL) {
629 	    util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_INVALID_PARAMETER,
630 		NULL, NULL, &error);
631 	    return ((CCIMInstanceList *)NULL);
632 	}
633 
634 	/*
635 	 * Both logical disk and disk partition have deviceid as the
636 	 * key.
637 	 */
638 
639 	name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID,
640 	    &error);
641 
642 	if (error != 0) {
643 	    util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_INVALID_PARAMETER,
644 		NULL, NULL, &error);
645 	    return ((CCIMInstanceList *)NULL);
646 	}
647 
648 	if (isAntecedent) {
649 	    obj_desc = dm_get_descriptor_by_name(DM_MEDIA, name, &error);
650 	} else {
651 	    obj_desc = dm_get_descriptor_by_name(DM_SLICE, name, &error);
652 	}
653 
654 	/* No device found. */
655 
656 	if (error == ENODEV || obj_desc == NULL) {
657 	    return ((CCIMInstanceList *)NULL);
658 	}
659 
660 	if (error != 0) {
661 	    util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_FAILED,
662 		DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
663 	    return ((CCIMInstanceList *)NULL);
664 	}
665 
666 	if (isAntecedent == 1) {
667 		/*
668 		 * Logical disk calling this method, return instances of the
669 		 * partitions associated with this disk.
670 		 */
671 
672 	    /* Get associated descriptors. */
673 
674 	    assoc_descriptors = dm_get_associated_descriptors(obj_desc,
675 		DM_SLICE, &error);
676 	    dm_free_descriptor(obj_desc);
677 
678 	    if (assoc_descriptors == NULL) {
679 		return ((CCIMInstanceList *)NULL);
680 	    }
681 
682 	    if (assoc_descriptors[0] == NULL) {
683 		dm_free_descriptors(assoc_descriptors);
684 		return ((CCIMInstanceList *)NULL);
685 	    }
686 
687 	    if (error != 0) {
688 		util_handleError(DISKPART_ASSOCIATORS,  CIM_ERR_FAILED,
689 		    DM_GET_ASSOC_FAILURE, NULL, &error);
690 		return ((CCIMInstanceList *)NULL);
691 	    }
692 
693 	    instList = cim_createInstanceList();
694 	    if (instList == NULL) {
695 		ex = cim_getLastError();
696 		util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_FAILED,
697 		    CREATE_INSTANCE_FAILURE, ex, &error);
698 		dm_free_descriptors(assoc_descriptors);
699 		return ((CCIMInstanceList *)NULL);
700 	    }
701 
702 	    /* Traverse the list and create instances of associated objects. */
703 
704 	    for (i = 0; assoc_descriptors[i] != NULL; i ++) {
705 		inst = partition_descriptor_toCCIMInstance(hostName,
706 		    assoc_descriptors[i], DISK_PARTITION, &error);
707 
708 		if (error != 0) {
709 		    util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_FAILED,
710 			PART_DESC_TO_INSTANCE_FAILURE, NULL, &error);
711 		    dm_free_descriptors(assoc_descriptors);
712 		    cim_freeInstanceList(instList);
713 		    return ((CCIMInstanceList *)NULL);
714 		}
715 		instList = cim_addInstance(instList, inst);
716 		if (instList == NULL) {
717 		    ex = cim_getLastError();
718 		    util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_FAILED,
719 			ADD_INSTANCE_FAILURE, ex, &error);
720 		    cim_freeInstance(inst);
721 		    dm_free_descriptors(assoc_descriptors);
722 		    return ((CCIMInstanceList *)NULL);
723 		}
724 	    } /* End for */
725 	} else {
726 		/*
727 		 * This is the partition calling this function. Return the
728 		 * logical disk that this belongs to.
729 		 */
730 	    assoc_descriptors = dm_get_associated_descriptors(obj_desc,
731 		DM_MEDIA, &error);
732 	    dm_free_descriptor(obj_desc);
733 
734 	    if (assoc_descriptors == NULL) {
735 		return ((CCIMInstanceList *)NULL);
736 	    }
737 
738 	    if (assoc_descriptors[0] == NULL) {
739 		dm_free_descriptors(assoc_descriptors);
740 		return ((CCIMInstanceList *)NULL);
741 	    }
742 
743 	    if (error != 0) {
744 		util_handleError(DISKPART_ASSOCIATORS,  CIM_ERR_FAILED,
745 		    DM_GET_ASSOC_FAILURE, NULL, &error);
746 		return ((CCIMInstanceList *)NULL);
747 	    }
748 
749 	    instList = cim_createInstanceList();
750 	    if (instList == NULL) {
751 		ex = cim_getLastError();
752 		util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_FAILED,
753 		    CREATE_INSTANCE_FAILURE, ex, &error);
754 		return ((CCIMInstanceList *)NULL);
755 	    }
756 	    for (i = 0; assoc_descriptors[i] != NULL; i ++) {
757 		inst = logicaldisk_descriptor_toCCIMInstance(hostName,
758 		    assoc_descriptors[i], LOGICAL_DISK, &error);
759 
760 		if (error != 0) {
761 		    util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_FAILED,
762 			LOGICALDISK_DESC_TO_INSTANCE_FAILURE,
763 			    NULL, &error);
764 		    dm_free_descriptors(assoc_descriptors);
765 		    cim_freeInstanceList(instList);
766 		    return ((CCIMInstanceList *)NULL);
767 		}
768 
769 		instList = cim_addInstance(instList, inst);
770 		if (instList == NULL) {
771 		    ex = cim_getLastError();
772 		    util_handleError(DISKPART_ASSOCIATORS, CIM_ERR_FAILED,
773 			ADD_INSTANCE_FAILURE, ex, &error);
774 		    dm_free_descriptors(assoc_descriptors);
775 		    return ((CCIMInstanceList *)NULL);
776 		}
777 	    } /* End for */
778 	}
779 	dm_free_descriptors(assoc_descriptors);
780 	return (instList);
781 }
782 
783 /*
784  * Name: cp_associatorNames_Solaris_DiskPartitionBasedOnDisk
785  *
786  * Description:
787  * Returns a list of objects associated with the passed in
788  * object if there are any via the object CCIMObjectPath.
789  *
790  * Parameters:
791  *
792  *	CCIMObjectPath *pAssocName - The name of the association that
793  *	the client wants information about.
794  *
795  *	CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the
796  *	information on the class for which to find the associated instances.
797  *
798  *	cimchar *pResultClass - If specified, only return instances that
799  *	are of this class type.
800  *
801  *      cimchar *pRole - If specified, must be valid for the object path
802  *	passed in requesting the associated instances.
803  *
804  *	cimchar *pResultRole - If specified, only return instances that
805  *	are playing this role in the association.
806  *
807  *
808  * Returns:
809  *	CCIMObjectPathList * if associated objects are found.
810  *	Otherwise, NULL is returned.
811  */
812 
813 /* ARGSUSED */
814 CCIMObjectPathList *
cp_associatorNames_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,cimchar * pResultClass,cimchar * pRole,cimchar * pResultRole)815 cp_associatorNames_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath *pAssocName,
816     CCIMObjectPath *pObjectName, cimchar *pResultClass, cimchar *pRole,
817 	cimchar *pResultRole)
818 {
819 
820 	CCIMInstanceList	*instList;
821 	CCIMObjectPathList	*objList = NULL;
822 	int			error;
823 
824 	if (pObjectName == NULL) {
825 	    util_handleError(DISKPART_ASSOCIATORNAMES,
826 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
827 	    return ((CCIMObjectPathList *)NULL);
828 	}
829 
830 	instList =
831 	    cp_associators_Solaris_DiskPartitionBasedOnDisk(
832 		pAssocName, pObjectName, pResultClass, pRole, pResultRole);
833 
834 	if (instList != NULL) {
835 	    objList = cim_createObjectPathList(instList);
836 	    cim_freeInstanceList(instList);
837 	}
838 
839 	return (objList);
840 }
841 
842 /*
843  * Name: cp_references_Solaris_DiskPartitionBasedOnDisk
844  *
845  * Description:
846  * Returns instances of objects that have references to the passed in
847  * object if there are any.
848  *
849  * Parameters:
850  *
851  *	CCIMObjectPath *pAssocName - The name of the association that
852  *	the client wants information about.
853  *
854  *	CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the
855  *	information on the class for which to find the associated instances.
856  *
857  *      cimchar *pRole - If specified, must be valid for the object path
858  *	passed in requesting the associated instances.
859  *
860  * Returns:
861  *	CCIMInstanceList * if associated objects are found.
862  *	Otherwise, NULL is returned.
863  */
864 
865 /* ARGSUSED */
866 CCIMInstanceList *
cp_references_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pRole)867 cp_references_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath *pAssocName,
868 CCIMObjectPath *pObjectName, char *pRole)
869 {
870 
871 	CCIMInstanceList	*instList = NULL;
872 	CCIMObjectPathList	*objList;
873 	int			error;
874 
875 
876 	if (pObjectName == NULL) {
877 	    util_handleError(DISKPART_REFERENCES,
878 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
879 	    return ((CCIMInstanceList *)NULL);
880 	}
881 	/*
882 	 * Get the list of those objects that are referred to by
883 	 * the calling object.
884 	 */
885 
886 	objList =
887 	    cp_associatorNames_Solaris_DiskPartitionBasedOnDisk(
888 		pAssocName, pObjectName, NULL, NULL, NULL);
889 
890 	if (objList == NULL) {
891 	    return ((CCIMInstanceList *)NULL);
892 	}
893 
894 	/*
895 	 * Now generate the list of instances to return.
896 	 */
897 
898 	if (strcasecmp(pObjectName->mName, LOGICAL_DISK) == 0) {
899 	    instList = createDiskPartBasedOnRefList(pObjectName,
900 		ANTECEDENT, objList, DEPENDENT, &error);
901 	} else {
902 	    instList = createDiskPartBasedOnRefList(pObjectName,
903 		DEPENDENT, objList, ANTECEDENT, &error);
904 	}
905 
906 	cim_freeObjectPathList(objList);
907 	return (instList);
908 }
909 
910 /*
911  * Name: cp_referenceNames_Solaris_DiskPartitionBasedOnDisk
912  *
913  * Description:
914  * Returns a instances of objects that have references to the passed in
915  * object if there are any.
916  *
917  * Parameters:
918  *
919  *	CCIMObjectPath *pAssocName - The name of the association that
920  *	the client wants information about.
921  *
922  *	CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the
923  *	information on the class for which to find the associated instances.
924  *
925  *      cimchar *pRole - If specified, must be valid for the object path
926  *	passed in requesting the associated instances.
927  *
928  *
929  * Returns:
930  *	CCIMInstanceList * if associated objects are found.
931  *	Otherwise, NULL is returned.
932  *
933  */
934 
935 /* ARGSUSED */
936 CCIMObjectPathList *
cp_referenceNames_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,cimchar * pRole)937 cp_referenceNames_Solaris_DiskPartitionBasedOnDisk(CCIMObjectPath *pAssocName,
938     CCIMObjectPath *pObjectName, cimchar *pRole)
939 {
940 
941 	CCIMInstanceList	*instList;
942 	CCIMObjectPathList	*objList = NULL;
943 	int			error;
944 
945 	if (pObjectName == NULL) {
946 	    util_handleError(DISKPART_REFERENCENAMES,
947 		CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error);
948 	    return ((CCIMObjectPathList *)NULL);
949 	}
950 
951 	instList =
952 	    cp_references_Solaris_DiskPartitionBasedOnDisk(
953 		pAssocName, pObjectName, pRole);
954 
955 	if (instList != NULL) {
956 	    objList = cim_createObjectPathList(instList);
957 	    cim_freeInstanceList(instList);
958 	}
959 
960 	return (objList);
961 }
962 
963 /*
964  * Create the association class with the passed in attributes.
965  */
966 static
967 CCIMInstanceList  *
createDiskPartBasedOnRefList(CCIMObjectPath * pObjectName,cimchar * pObjectNameRole,CCIMObjectPathList * objList,cimchar * objRole,int * error)968 createDiskPartBasedOnRefList(CCIMObjectPath *pObjectName,
969     cimchar *pObjectNameRole,
970 	CCIMObjectPathList *objList, cimchar *objRole, int *error)
971 {
972 
973 	CCIMObjectPathList	*tmpList;
974 	CCIMInstanceList	*instList = NULL;
975 	CCIMInstance		*inst;
976 	CCIMObjectPath		*obj1;
977 	CCIMObjectPath		*obj2;
978 	CCIMException		*ex;
979 
980 	*error	= 0;
981 	instList = cim_createInstanceList();
982 	if (instList == NULL) {
983 	    ex = cim_getLastError();
984 	    util_handleError(DISKPART_BASEDONDISK, CIM_ERR_FAILED,
985 		CREATE_INSTANCE_FAILURE, ex, error);
986 	    return ((CCIMInstanceList *)NULL);
987 	}
988 
989 	/*
990 	 * If no objects associated with this one, return an empty list.
991 	 */
992 	if (objList == NULL) {
993 	    cim_freeInstanceList(instList);
994 	    return ((CCIMInstanceList *)instList);
995 	}
996 
997 	tmpList = objList;
998 	while (tmpList != NULL) {
999 	    obj1 = tmpList->mDataObject;
1000 	    obj2 = cim_copyObjectPath(pObjectName);
1001 	    if (obj2 == NULL) {
1002 		ex = cim_getLastError();
1003 		util_handleError(DISKPART_BASEDONDISK, CIM_ERR_FAILED,
1004 		    COPY_OBJPATH_FAILURE, ex, error);
1005 		cim_freeInstanceList(instList);
1006 		return ((CCIMInstanceList *)NULL);
1007 	    }
1008 
1009 	    inst = cim_createInstance(DISKPART_BASEDONDISK);
1010 	    if (inst == NULL) {
1011 		ex = cim_getLastError();
1012 		util_handleError(DISKPART_BASEDONDISK, CIM_ERR_FAILED,
1013 		    CREATE_INSTANCE_FAILURE, ex, error);
1014 		cim_freeObjectPath(obj2);
1015 		cim_freeInstanceList(instList);
1016 		return ((CCIMInstanceList *)NULL);
1017 	    }
1018 	    util_doReferenceProperty(pObjectNameRole, obj2, cim_true, inst,
1019 		error);
1020 	    util_doReferenceProperty(objRole, obj1, cim_true, inst, error);
1021 	    cim_freeObjectPath(obj2);
1022 
1023 	    if (*error != 0) {
1024 		ex = cim_getLastError();
1025 		util_handleError(DISKPART_BASEDONDISK, CIM_ERR_FAILED,
1026 		    CREATE_REFPROP_FAILURE, ex, error);
1027 		cim_freeInstance(inst);
1028 		cim_freeInstanceList(instList);
1029 		return ((CCIMInstanceList *)NULL);
1030 	    }
1031 
1032 	    instList = cim_addInstance(instList, inst);
1033 	    if (instList == NULL) {
1034 		ex = cim_getLastError();
1035 		util_handleError(DISKPART_BASEDONDISK, CIM_ERR_FAILED,
1036 		    ADD_INSTANCE_FAILURE, ex, error);
1037 		cim_freeInstance(inst);
1038 		return ((CCIMInstanceList *)NULL);
1039 	    }
1040 
1041 	    tmpList = tmpList->mNext;
1042 	}
1043 	return (instList);
1044 }
1045