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