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 2003 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 "Solaris_HostedShare.h"
30#include "nfs_keys.h"
31#include "nfs_providers_msgstrings.h"
32#include "messageStrings.h"
33#include "nfs_provider_names.h"
34#include "util.h"
35#include "libfsmgt.h"
36#include "common_functions.h"
37#include "createprop_methods.h"
38
39/*
40 * Private method declarations
41 */
42static CIMBool		does_share_exist(char *dir);
43static CCIMObjectPath*	get_Antecedent();
44
45/*
46 * Public methods
47 */
48
49/*
50 * Instance provider methods
51 */
52
53/*
54 * Method: cp_createInstance_Solaris_HostedShare
55 *
56 * Description: This method is not supported.  It is not supported because in
57 * order for a Solaris_HostedShare association to exist a corresponding
58 * Solaris_NFSShare and Solaris_ComputerSystem must exist.
59 *
60 * Parameters:
61 *	- CCIMObjectPath *hostedShareOP - An object path containing the name of
62 *	the class of which to create an instance of.
63 *	- CCIMInstance *hostedShareInst - Not used.
64 *
65 * Returns:
66 *	- Always returns NULL because the method is not supported.
67 */
68/* ARGSUSED */
69CCIMObjectPath *
70cp_createInstance_Solaris_HostedShare(CCIMObjectPath *hostedShareOP,
71	CCIMInstance *hostedShareInst) {
72
73	int	err = 0;
74
75	util_handleError("SOLARIS_HOSTEDSHARE::CREATE_INSTANCE",
76		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
77
78	return ((CCIMObjectPath *)NULL);
79} /* cp_createInstance_Solaris_HostedShare */
80
81/*
82 * Method: cp_deleteInstance_Solaris_HostedShare
83 *
84 * Description: This method is not supported.  It is not supported because in
85 * order for it to be actually deleted the corresponding Solaris_NFSShare would
86 * need to be deleted.  That action is not appropriate for this provider.
87 *
88 * Parameters:
89 *	- CCIMObjectPath *hostedShareOP - An object path containing the
90 *	information about the class of which to delete the instance of.
91 *
92 * Returns:
93 *	- Always returns cim_false because the method is not supported.
94 */
95/* ARGSUSED */
96CIMBool
97cp_deleteInstance_Solaris_HostedShare(CCIMObjectPath *hostedShareOP) {
98	int	err = 0;
99
100	util_handleError("SOLARIS_HOSTEDSHARE::DELETE_INSTANCE",
101		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
102
103	return (cim_false);
104} /* cp_deleteInstance_Solaris_HostedShare */
105
106/*
107 * Method: cp_enumInstances_Solaris_HostedShare
108 *
109 * Description: Enumerates the instances of Solaris_HostedShare on a host.
110 * An instance of Solaris_HostedShare is an association that links a share to
111 * the hosting machine.
112 *
113 * Parameters:
114 *	- CCIMObjectPath *hostedShareOP - An object path containing the name of
115 *	the class of which to enumerate the instances of.
116 *
117 * Returns:
118 *	- A pointer to a list of Solaris_HostedShare instances.
119 *	- NULL if an error occurred or if there are no instances of
120 *	Solaris_HostedShare on the host.  In the case of an error, the error
121 *	will be logged.
122 */
123CCIMInstanceList *
124cp_enumInstances_Solaris_HostedShare(CCIMObjectPath* hostedShareOP) {
125	CCIMInstanceList	*hostedShareInstList;
126	CCIMObjectPath		*nfsShareOP;
127	CCIMObjectPathList	*nfsShareOPList, *currentShareOP;
128	CCIMObjectPath		*antOP;
129	CCIMException		*ex;
130	int			err = 0;
131
132	/*
133	 * The Antecedent property is a Solaris_ComputerSystem reference.
134	 * The Dependent property is a Solaris_NFSShare reference.
135	 */
136	if (hostedShareOP == NULL) {
137		util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES",
138			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
139		return ((CCIMInstanceList *)NULL);
140	}
141
142	nfsShareOP = cim_createEmptyObjectPath(SOLARIS_NFSSHARE);
143	if (nfsShareOP == NULL) {
144		ex = cim_getLastError();
145		util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES",
146			CIM_ERR_FAILED, CREATE_EMPTY_OBJPATH_FAILURE, ex, &err);
147		return ((CCIMInstanceList *)NULL);
148	}
149
150	/*
151	 * Enumerate all of the Solaris_NFSShare object paths on the system.
152	 */
153	nfsShareOPList = cimom_enumerateInstanceNames(nfsShareOP, cim_false);
154
155	/*
156	 * A NULL return value indicates an error, an empty list does not.
157	 */
158	if (nfsShareOPList == NULL) {
159		cim_logDebug("cp_enumInstances_Solaris_HostedShare",
160			"nfsShareOPList = NULL");
161		ex = cim_getLastError();
162		util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES",
163			CIM_ERR_FAILED, CIMOM_ENUM_INSTNAMES_FAILURE, ex, &err);
164		cim_freeObjectPath(nfsShareOP);
165		return ((CCIMInstanceList *)NULL);
166
167	}
168
169	cim_freeObjectPath(nfsShareOP);
170
171	if (nfsShareOPList->mDataObject == NULL) {
172		return ((CCIMInstanceList *)NULL);
173	}
174
175	antOP = get_Antecedent();
176	if (antOP == NULL) {
177		/*
178		 * The error was logged in get_Antecedent.
179		 */
180		cim_freeObjectPathList(nfsShareOPList);
181		return ((CCIMInstanceList *)NULL);
182	}
183
184	hostedShareInstList = cim_createInstanceList();
185	if (hostedShareInstList == NULL) {
186		ex = cim_getLastError();
187		util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES",
188			CIM_ERR_FAILED, CREATE_INSTANCE_LIST_FAILURE, ex, &err);
189		cim_freeObjectPathList(nfsShareOPList);
190		cim_freeObjectPath(antOP);
191		return ((CCIMInstanceList *)NULL);
192	}
193
194	/*
195	 * Each share on the system will be associated with the same
196	 * Solaris_ComputerSystem object path.
197	 */
198	for (currentShareOP = nfsShareOPList; currentShareOP != NULL;
199		currentShareOP = currentShareOP->mNext) {
200
201		CCIMInstance	*hostedShareInst;
202		cimchar		*propValue;
203
204		hostedShareInst = cim_createInstance(SOLARIS_HOSTEDSHARE);
205		if (hostedShareInst == NULL) {
206			ex = cim_getLastError();
207			util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES",
208				CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex,
209				&err);
210			cim_freeInstanceList(hostedShareInstList);
211			cim_freeObjectPath(antOP);
212			cim_freeObjectPathList(nfsShareOPList);
213			return ((CCIMInstanceList *)NULL);
214		}
215
216		propValue = NULL;
217		if (add_property_to_instance(
218			hostedShareProps[ANT].name, hostedShareProps[ANT].type,
219			propValue, antOP, hostedShareProps[ANT].isKey,
220			hostedShareInst) == cim_false) {
221
222			cim_freeInstance(hostedShareInst);
223			cim_freeInstanceList(hostedShareInstList);
224			cim_freeObjectPathList(nfsShareOPList);
225			cim_freeObjectPath(antOP);
226			return ((CCIMInstanceList *)NULL);
227		}
228
229		if (add_property_to_instance(hostedShareProps[DEP].name,
230			hostedShareProps[DEP].type, propValue,
231			currentShareOP->mDataObject,
232			hostedShareProps[DEP].isKey, hostedShareInst)
233			== cim_false) {
234
235			cim_freeInstance(hostedShareInst);
236			cim_freeInstanceList(hostedShareInstList);
237			cim_freeObjectPathList(nfsShareOPList);
238			cim_freeObjectPath(antOP);
239			return ((CCIMInstanceList *)NULL);
240		}
241
242		hostedShareInstList = cim_addInstance(hostedShareInstList,
243			hostedShareInst);
244		if (hostedShareInstList == NULL) {
245			ex = cim_getLastError();
246			util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES",
247				CIM_ERR_FAILED, ADD_INSTANCE_FAILURE, ex, &err);
248			cim_freeInstance(hostedShareInst);
249			cim_freeObjectPathList(nfsShareOPList);
250			cim_freeObjectPath(antOP);
251			return ((CCIMInstanceList *)NULL);
252		}
253	}
254
255	cim_freeObjectPath(antOP);
256	cim_freeObjectPathList(nfsShareOPList);
257
258	return (hostedShareInstList);
259} /* cp_enumInstances_Solaris_HostedShare */
260
261/*
262 * Method: cp_enumInstanceNames_Solaris_HostedShare
263 *
264 * Description: Enumerates the instances of Solaris_HostedShare on the host.
265 *
266 * Parameters:
267 *	- CCIMObjectPath *hostedShareOP - An object path containing the name of
268 *	the class of which to enumerate the instance names of.
269 *
270 * Returns:
271 *	- A list of object paths corresponding to the instances of
272 *	Solaris_HostedShare on the host.
273 *	- NULL if an error occurred or if there are no instances of
274 *	Solaris_HostedShare on the host.  In the case of an error, the error
275 *	will be logged.
276 */
277CCIMObjectPathList *
278cp_enumInstanceNames_Solaris_HostedShare(CCIMObjectPath *hostedShareOP) {
279	CCIMInstanceList	*hostedShareInstList;
280	CCIMObjectPathList	*hostedShareOPList;
281	int			err = 0;
282
283	if (hostedShareOP == NULL) {
284		util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCENAMES",
285			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
286		return ((CCIMObjectPathList *)NULL);
287	}
288
289	hostedShareInstList =
290		cp_enumInstances_Solaris_HostedShare(hostedShareOP);
291	if (hostedShareInstList == NULL) {
292		/*
293		 * An error occurred in enumInstances or there are simply
294		 * no Solaris_HostedShare instances to enumerate.  In the case,
295		 * of an error, the error would have been handled in the
296		 * cp_enumInstances_Solaris_HostedShare function.
297		 */
298		return ((CCIMObjectPathList *)NULL);
299	}
300
301	hostedShareOPList = cim_createObjectPathList(hostedShareInstList);
302
303	cim_freeInstanceList(hostedShareInstList);
304	/*
305	 * If an error occurred it will be handled in cim_createObjectPathList.
306	 */
307	return (hostedShareOPList);
308} /* cp_enumInstanceNames_Solaris_HostedShare */
309
310/*
311 * Method: cp_execQuery_Solaris_HostedShare
312 *
313 * Description: Queries the host to find those Solaris_HostedShare instances
314 * that meet the search criteria.
315 *
316 * Parameters:
317 *	- CCIMObjectPath *hostedShareOP - An object path containing the name of
318 *	the class of which to query.
319 *	- char *selectClause - Not used.
320 *	- char *nonJoinExp - Not used.
321 *	- char *queryExp - Not used.
322 *	- char *queryLang - Not used.
323 *
324 * Returns:
325 *      - A pointer to a list of Solaris_HostedShare instances that match the
326 *      criteria.
327 *      - NULL if an error occurred or if there are no Solaris_HostedShare
328 *      instances that match the criteria.  In the case of an error, the error
329 *      will be logged.
330 *
331 * NOTE: Currently, there is no WQL parser for the C providers. As a result,
332 * what is returned to the CIMOM is a list of instances with
333 * a NULL value at the beginning of the list. This NULL value indicates
334 * to the CIMOM that it must do the filtering for the client.
335 */
336/* ARGSUSED */
337CCIMInstanceList *
338cp_execQuery_Solaris_HostedShare(CCIMObjectPath *hostedShareOP,
339	char *selectClause, char *nonJoinExp, char *queryExp, char *queryLang) {
340
341	CCIMInstance		*emptyInst;
342	CCIMInstanceList	*hostedShareInstList;
343	CCIMException		*ex;
344	int			err = 0;
345
346	if (hostedShareOP == NULL) {
347		util_handleError("SOLARIS_HOSTEDSHARE::EXEC_QUERY",
348			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
349		return ((CCIMInstanceList *)NULL);
350	}
351
352	hostedShareInstList = cp_enumInstances_Solaris_HostedShare(
353		hostedShareOP);
354	if (hostedShareInstList == NULL) {
355		return ((CCIMInstanceList *)NULL);
356	}
357
358	emptyInst = cim_createInstance("");
359	if (emptyInst == NULL) {
360		ex = cim_getLastError();
361		util_handleError("SOLARIS_HOSTEDSHARE::EXEC_QUERY",
362			CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err);
363		cim_freeInstanceList(hostedShareInstList);
364		return ((CCIMInstanceList *)NULL);
365	}
366
367	hostedShareInstList = cim_prependInstance(hostedShareInstList,
368		emptyInst);
369
370	if (hostedShareInstList == NULL) {
371		ex = cim_getLastError();
372		util_handleError("SOLARIS_HOSTEDSHARE::EXEC_QUERY",
373			CIM_ERR_FAILED, PREPEND_INSTANCE_FAILURE, ex, &err);
374		cim_freeInstance(emptyInst);
375		return ((CCIMInstanceList *)NULL);
376	}
377
378	return (hostedShareInstList);
379} /* cp_execQuery_Solaris_HostedShare */
380
381/*
382 * Method: cp_getInstance_Solaris_HostedShare
383 *
384 * Description: Gets the instance corresponding to the passed in object path.
385 *
386 * Parameters:
387 *	- CCIMObjectPath *hostedShareOP - The object path containing all the
388 *	keys of the instance that is supposed to be returned.
389 *
390 * Returns:
391 *	- A pointer to the instance of Solaris_HostedShare corresponding to
392 *	hostedShareOP.
393 *	- NULL if an error occurred or if the instance doesn't exist on the
394 *	host.  In the case of an error, the error will be logged.
395 */
396CCIMInstance *
397cp_getInstance_Solaris_HostedShare(CCIMObjectPath *hostedShareOP) {
398	CCIMInstance		*inst;
399	CCIMInstanceList	*instList;
400	CCIMPropertyList	*hsPropList;
401	CCIMObjectPath		*depOP;
402	CCIMObjectPath		*antOP;
403	int			err = 0;
404
405	if (hostedShareOP == NULL || hostedShareOP->mKeyProperties == NULL) {
406		util_handleError("SOLARIS_HOSTEDSHARE::GET_INSTANCE",
407			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
408		return ((CCIMInstance *)NULL);
409	}
410
411	/*
412	 * Get the Dependent and Antecedent properties.
413	 */
414	hsPropList = hostedShareOP->mKeyProperties;
415	depOP = util_getKeyValue(hsPropList, hostedShareProps[DEP].type,
416		hostedShareProps[DEP].name, &err);
417	antOP = util_getKeyValue(hsPropList, hostedShareProps[ANT].type,
418		hostedShareProps[ANT].name, &err);
419
420	/*
421	 * Check if we have the Antecedent and Dependent properties.
422	 */
423	if (depOP == NULL || antOP == NULL ||
424		depOP->mKeyProperties == NULL ||
425		antOP->mKeyProperties == NULL) {
426		util_handleError("SOLARIS_HOSTEDSHARE::GET_INSTANCE",
427			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
428		return ((CCIMInstance *)NULL);
429	}
430
431	instList = cp_enumInstances_Solaris_HostedShare(hostedShareOP);
432	if (instList == NULL) {
433		return ((CCIMInstance *)NULL);
434	}
435
436	inst = cim_getInstance(instList, hostedShareOP);
437
438	cim_freeInstanceList(instList);
439	return (inst);
440} /* cp_getInstance_Solaris_HostedShare */
441
442/*
443 * Method: cp_setInstance_Solaris_HostedShare
444 *
445 * Description: This method is not supported.  It is not supported because in
446 * order to change a Solaris_HostedShare instance the underlying share and
447 * computer system must be modified.  Those actions must be done on the
448 * appropriate share and computer system objects, not here.
449 *
450 * Parameters:
451 *	- CCIMObjectPath *pOP - An object path containing the name of the class
452 *	of which to set the instance.
453 *	- CCIMInstance *pInst - Not used.
454 *
455 * Returns:
456 *	- Always returns cim_false, because the method is not supported.
457 */
458/* ARGSUSED */
459CIMBool
460cp_setInstance_Solaris_HostedShare(CCIMObjectPath *pOP, CCIMInstance *pInst) {
461
462	int	err = 0;
463
464	util_handleError("SOLARIS_HOSTEDSHARE::SET_INSTANCE",
465		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
466
467	return (cim_false);
468} /* cp_setInstance_Solaris_HostedShare */
469
470/*
471 * Method: cp_setInstanceWithList_Solaris_HostedShare
472 *
473 * Description: This method is not supported.  It is not supported because in
474 * order to change a Solaris_HostedShare instance the underlying share and
475 * computer system must be modified.  Those actions must be done on the
476 * appropriate share and computer system objects, not here.
477 *
478 * Parameters:
479 *	- CCIMObjectPath *hostedShareOP - The object path containing the name
480 *	of the class of which to set the instance.
481 *	- CCIMInstance *hostedShareInst - Not used.
482 *	- char **props - Not used.
483 *	- int num_props - Not used.
484 *
485 * Returns:
486 *      - Always returns cim_false, because the method is not supported.
487 */
488/* ARGSUSED */
489CIMBool
490cp_setInstanceWithList_Solaris_HostedShare(CCIMObjectPath *hostedShareOP,
491	CCIMInstance *hostedShareInst, char **props, int num_props) {
492
493	int	err = 0;
494
495	util_handleError("SOLARIS_HOSTEDSHARE::SET_INSTANCE",
496		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
497
498	return (cim_false);
499} /* cp_setInstanceWithList_Solaris_HostedShare */
500
501/*
502 * Association provider methods
503 */
504
505/*
506 * Method: cp_associators_Solaris_HostedShare
507 *
508 * Description: Returns the instances associated, via the Solaris_HostedShare
509 * association, to the pObjectName parameter.
510 *
511 * Parameters:
512 *	- CCIMObjectPath *pAssocName - An object path containing the name of
513 *	the association that the caller is trying to reach.
514 *	- CCIMObjectPath *pObjectName - The object path containing information
515 *	(Class Name, Key Properties) about the object whose associated objects
516 *	are to be returned.
517 *	- char *pResultClass - If specified, only return instances that are of
518 *	this class type.
519 *	- char *pRole - If specified, this is the role of the pObjectName
520 *	object path passed in.  If this is not valid, NULL is returned.
521 *	- char *pResultRole - If specified, only return instances that are
522 *	playing this role in the association.
523 *
524 * Returns:
525 *	- A list of Solaris_NFSShare (if pRole == Antecedent && pObjectName is
526 *	a Solaris_ComputerSystem object path) or Solaris_ComputerSystem (if
527 *	pRole == Dependent && pObjectName is a Solaris_NFSShare object path)
528 *	instances which are associated to the pObjectName parameter.
529 *	- NULL if an error occurred or if there are no instances associated to
530 *	the pObjectName passed in.  In the case of an error, the error will be
531 *	logged.
532 */
533/* ARGSUSED */
534CCIMInstanceList *
535cp_associators_Solaris_HostedShare(CCIMObjectPath *pAssocName,
536	CCIMObjectPath *pObjectName, char *pResultClass, char *pRole,
537	char *pResultRole) {
538
539	CCIMInstanceList	*returnInstList = NULL;
540	CCIMPropertyList	*propList;
541	CCIMObjectPath		*resultOP;
542	CCIMException		*ex;
543	CIMBool			pDeep, pLocalOnly, pIncludeQualifiers,
544				pIncludeClassOrigin, pUseInternal;
545	cimchar			*resultClassName;
546	char			*name;
547	char			**pPropertyList;
548	unsigned int		pNumProps;
549	int			err = 0;
550	/*
551	 * Check if the needed parameters are NULL.
552	 */
553	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
554		util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS",
555			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
556		return ((CCIMInstanceList *)NULL);
557	}
558
559	/*
560	 * The Name key property is the defining property for each the
561	 * Antecedent (Solaris_ComputerSystem) and the Dependent
562	 * (Solaris_NFSShare) so retrieve that property.
563	 */
564	propList = pObjectName->mKeyProperties;
565	name = (cimchar *)util_getKeyValue(propList, string, NAME, &err);
566
567	if (name == NULL || err != 0) {
568		/*
569		 * We don't have the appropriate information.
570		 */
571		util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS",
572			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
573		return ((CCIMInstanceList *)NULL);
574	}
575
576	/*
577	 * Determine whether the pObjectName is the Antecedent or the Dependent
578	 * of the association.  Antecedent == Solaris_ComputerSystem,
579	 * Dependent == Solaris_NFSShare
580	 */
581	if ((strcasecmp(pObjectName->mName, COMPUTER_SYSTEM) == 0)) {
582		char	*hostname;
583
584		resultClassName = SOLARIS_NFSSHARE;
585
586		/*
587		 * If a value was passed in with pRole and it does not match
588		 * the role that pObjectName actually is then log an invalid
589		 * param error.
590		 */
591		if (pRole != NULL && (strcasecmp(pRole, ANTECEDENT) != 0)) {
592			util_handleError("SOLARIS_NFSMOUNT::ASSOCIATORS",
593				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
594			return ((CCIMInstanceList *)NULL);
595		}
596
597		/*
598		 * Get the current host name and compare it to the name
599		 * property of the passed in pObjectName.
600		 */
601		hostname = sys_get_hostname(&err);
602		if (hostname == NULL) {
603			util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS",
604				CIM_ERR_FAILED, GET_HOSTNAME_FAILURE, NULL,
605				&err);
606			return ((CCIMInstanceList *)NULL);
607		}
608
609		if ((strcmp(name, hostname) != 0)) {
610			/*
611			 * We can only determine shares on the current host.
612			 * The providers are not distributed.
613			 */
614			util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS",
615				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
616			free(hostname);
617			return ((CCIMInstanceList *)NULL);
618		}
619		free(hostname);
620	} else if ((strcasecmp(pObjectName->mName, SOLARIS_NFSSHARE) == 0)) {
621		CIMBool	shareExists;
622
623		resultClassName = COMPUTER_SYSTEM;
624
625		/*
626		 * pObjectName is the Dependent (Solaris_NFSShare) so determine
627		 * if the share actually exists by comparing the Name property
628		 * of pObjectName, which is populated with the shared directory,
629		 * to existing nfs shares on the system.
630		 */
631		shareExists = does_share_exist(name);
632		if (shareExists == cim_false) {
633			return ((CCIMInstanceList *)NULL);
634		}
635	} else {
636		util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS",
637			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
638		return ((CCIMInstanceList *)NULL);
639	}
640
641	resultOP = cim_createEmptyObjectPath(resultClassName);
642	if (resultOP == NULL) {
643		ex = cim_getLastError();
644		util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS",
645			CIM_ERR_FAILED, CREATE_EMPTY_OBJPATH_FAILURE,
646			ex, &err);
647		return ((CCIMInstanceList *)NULL);
648	}
649
650	pDeep = cim_false;
651	pLocalOnly = cim_false;
652	pIncludeQualifiers = cim_false;
653	pIncludeClassOrigin = cim_false;
654	pUseInternal = cim_false;
655	pPropertyList = NULL;
656	pNumProps = 0;
657	returnInstList = cimom_enumerateInstances(resultOP, pDeep,
658		pLocalOnly, pIncludeQualifiers, pIncludeClassOrigin,
659		pUseInternal, pPropertyList, pNumProps);
660	/*
661	 * A NULL return value indicates an error, an empty list
662	 * doesn't.
663	 */
664	if (returnInstList == NULL) {
665		ex = cim_getLastError();
666		util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS",
667			CIM_ERR_FAILED, CIMOM_ENUM_INST_FAILURE, ex,
668			&err);
669		cim_freeObjectPath(resultOP);
670		return ((CCIMInstanceList *)NULL);
671	}
672
673	cim_freeObjectPath(resultOP);
674
675	if (returnInstList->mDataObject == NULL) {
676		return ((CCIMInstanceList *)NULL);
677	}
678
679	return (returnInstList);
680} /* cp_associators_Solaris_HostedShare */
681
682/*
683 * Method: cp_associatorNames_Solaris_HostedShare
684 *
685 * Description: Returns the object paths of the instances on the other side of
686 * the association which are associated via the Solaris_HostedShare association
687 * and having the passed in parameter, pObjectName, as the opposite key.
688 *
689 * Parameters:
690 *	- CCIMObjectPath *pAssocName - An object path containing information
691 *	about the association that the caller is trying to reach.
692 *	- CCIMObjectPath *pObjectName - The object path which contains the
693 *	information on whose associated objects are to be returned.
694 *	- char *pResultClass - If specified, only return instances that are of
695 *	this class type.
696 *	- char *pRole - If specified, this is the role of the pObjectName
697 *	object path passed in.  If this is not valid, NULL is returned.
698 *	- char *pResultRole - If specified, only return instances that are
699 *	playing this role in the association.
700 *
701 * Returns:
702 *	- A list of Solaris_NFSShare (if pRole == Antecedent && pObjectName is
703 *      a Solaris_ComputerSystem object path) or Solaris_ComputerSystem (if
704 *      pRole == Dependent && pObjectName is a Solaris_NFSShare object path)
705 *      object paths which are associated to the pObjectName parameter.
706 *      - NULL if an error occurred or if there are no instances associated to
707 *      the pObjectName passed in.  In the case of an error, the error will be
708 *      logged.
709 */
710CCIMObjectPathList *
711cp_associatorNames_Solaris_HostedShare(CCIMObjectPath *pAssocName,
712	CCIMObjectPath *pObjectName, char *pResultClass, char *pRole,
713	char *pResultRole) {
714
715	CCIMInstanceList	*instList;
716	CCIMObjectPathList	*objPathList = NULL;
717	int			err = 0;
718
719	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
720		util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATOR_NAMES",
721			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
722		return ((CCIMObjectPathList *)NULL);
723	}
724
725	instList = cp_associators_Solaris_HostedShare(pAssocName, pObjectName,
726		pResultClass, pRole, pResultRole);
727	if (instList == NULL) {
728		return ((CCIMObjectPathList *)NULL);
729	}
730
731	objPathList = cim_createObjectPathList(instList);
732	cim_freeInstanceList(instList);
733
734	return (objPathList);
735} /* cp_associatorNames_Solaris_HostedShare */
736
737/*
738 * Method: cp_references_Solaris_HostedShare
739 *
740 * Description: Returns the Solaris_HostedShare instances that have the passed
741 * in parameter, pObjectName, as one of it's keys.
742 *
743 * Parameters:
744 *	- CCIMObjectPath *pAssocName - An object path containing information
745 *      about the association that the caller is trying to reach.
746 *	- CCIMObjectPath *pObjectName - The object path which contains the
747 *	information on whose associated objects are to be returned.
748 *	- char *pRole - If specified, this is the role of the pObjectName
749 *	object path passed in.  If this is not valid, NULL is returned.
750 *
751 * Returns:
752 *	- A pointer to a list of Solaris_HostedShare instances.
753 *	- NULL if an error occurred or if there are no Solaris_HostedShare
754 *	instances having pObjectName as one of it's keys.
755 */
756CCIMInstanceList *
757cp_references_Solaris_HostedShare(CCIMObjectPath *pAssocName,
758	CCIMObjectPath *pObjectName, char *pRole) {
759
760	CCIMInstanceList	*instList;
761	CCIMObjectPathList	*objPathList;
762	char			*pObjectNameRole;
763	char			*objPathListRole;
764	int			err = 0;
765
766	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
767		util_handleError("SOLARIS_HOSTEDSHARE::REFERENCES",
768			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
769		return ((CCIMInstanceList *)NULL);
770	}
771
772	/*
773	 * Get everything that is related to the pObjectName passed in.
774	 */
775	objPathList = cp_associatorNames_Solaris_HostedShare(pAssocName,
776		pObjectName, NULL, pRole, NULL);
777	if (objPathList == NULL) {
778		return ((CCIMInstanceList *)NULL);
779	}
780
781	/*
782	 * Now use the object paths in the object path list and the pObjectName
783	 * variable to create the association instances.
784	 */
785	if ((strcasecmp(pObjectName->mName, SOLARIS_NFSSHARE) == 0)) {
786		/*
787		 * pObjectName is the Dependent.
788		 */
789		pObjectNameRole = DEPENDENT;
790		objPathListRole = ANTECEDENT;
791		instList = create_association_instList(SOLARIS_HOSTEDSHARE,
792			pObjectName, pObjectNameRole, objPathList,
793			objPathListRole, &err);
794	} else {
795		/*
796		 * pObjectName is the Antecedent.
797		 */
798		pObjectNameRole = ANTECEDENT;
799		objPathListRole = DEPENDENT;
800		instList = create_association_instList(SOLARIS_HOSTEDSHARE,
801			pObjectName, pObjectNameRole, objPathList,
802			objPathListRole, &err);
803	}
804	cim_freeObjectPathList(objPathList);
805
806	return (instList);
807} /* cp_references_Solaris_HostedShare */
808
809/*
810 * Method: cp_referenceNames_Solaris_HostedShare
811 *
812 * Description: Returns the Solaris_HostedShare object paths of the instances
813 * that have the passed in parameter, pObjectName, as one of it's keys.
814 *
815 * Parameters:
816 *	- CCIMObjectPath *pAssocName - An object path containing information
817 *	about the association that the caller is trying to reach.
818 *	- CCIMObjectPath *pObjectName - The object path which contains the
819 *	information on whose associated objects are to be returned.
820 *	- char *pRole - If specified, this is the role of the pObjectName
821 *	object path passed in.  If this is not valid, NULL is returned.
822 *
823 * Returns:
824 *	- A pointer to a list of Solaris_HostedShare object paths.
825 *	- NULL if an error occurred or if there are no Solaris_HostedShare
826 *	instances having pObjectName as one of it's keys.
827 */
828CCIMObjectPathList *
829cp_referenceNames_Solaris_HostedShare(CCIMObjectPath *pAssocName,
830	CCIMObjectPath *pObjectName, char *pRole) {
831
832	CCIMInstanceList	*hostedShareInstList;
833	CCIMObjectPathList	*hostedShareOPList;
834	int			err = 0;
835
836	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
837		util_handleError("SOLARIS_HOSTEDSHARE::REFERENCE_NAMES",
838			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
839		return ((CCIMObjectPathList *)NULL);
840	}
841
842	hostedShareInstList = cp_references_Solaris_HostedShare(pAssocName,
843		pObjectName, pRole);
844
845	if (hostedShareInstList == NULL) {
846		return ((CCIMObjectPathList *)NULL);
847	}
848
849	hostedShareOPList = cim_createObjectPathList(hostedShareInstList);
850
851	cim_freeInstanceList(hostedShareInstList);
852	/*
853	 * If an error occurred it will be handled in cim_createObjectPathList.
854	 */
855	return (hostedShareOPList);
856} /* cp_referenceNames_Solaris_HostedShare */
857
858/*
859 * Property provider methods
860 */
861
862/*
863 * Method: cp_getProperty_Solaris_HostedShare
864 *
865 * Description: Retrieves a certain property from the instance of
866 * Solaris_HostedShare on the host that is described by the parameter
867 * hostedShareOP.
868 *
869 * Parameters:
870 *	- CCIMObjectPath *hostedShareOP - The object path containing all the
871 *	information needed to find the instance in which the property is to
872 *	be returned.
873 *	- cimchar *pPropName - The name of the property to be found.
874 *
875 * Returns:
876 *	- A pointer to the property corresponding to the name passed in with
877 *	pPropName.
878 *	- NULL if an error occurred or if the property doesn't exist.  In the
879 *	case of an error, the error will be logged.
880 */
881CCIMProperty *
882cp_getProperty_Solaris_HostedShare(CCIMObjectPath *hostedShareOP,
883	cimchar *pPropName) {
884
885	CCIMInstance	*hostedShareInst;
886	CCIMProperty	*hostedShareProp;
887	int		err = 0;
888
889	if (hostedShareOP == NULL) {
890		util_handleError("SOLARIS_HOSTEDSHARE::GET_PROPERTY",
891			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
892		return ((CCIMProperty *)NULL);
893	}
894
895	hostedShareInst = cp_getInstance_Solaris_HostedShare(hostedShareOP);
896	if (hostedShareInst == NULL) {
897		return ((CCIMProperty *)NULL);
898	}
899
900	hostedShareProp = cim_getProperty(hostedShareInst, pPropName);
901	cim_freeInstance(hostedShareInst);
902
903	return (hostedShareProp);
904
905} /* cp_getProperty_Solaris_HostedShare */
906
907/*
908 * Method: cp_setProperty_Solaris_HostedShare
909 *
910 * Description: This method is not supported.  It is not supported because in
911 * order to change the properties of a Solaris_HostedShare instance, the
912 * underlying classes being associated must be changed.  This provider isn't
913 * the appropriate place to be changing other things on the host.
914 *
915 * Parameters:
916 *      - CCIMObjectPath *hostedShareOP - Not used.
917 *      - CCIMProperty *pProp - Not used.
918 *
919 * Returns:
920 *	- Always returns cim_false because the method is not supported.
921 */
922/* ARGSUSED */
923CIMBool
924cp_setProperty_Solaris_HostedShare(CCIMObjectPath *hostedShareOP,
925	CCIMProperty *pProp) {
926
927	int	err = 0;
928
929	util_handleError("SOLARIS_HOSTEDSHARE::SET_PROPERTY",
930		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
931
932	return (cim_false);
933} /* cp_setProperty_Solaris_HostedShare */
934
935/*
936 * Method provider methods
937 */
938
939/*
940 * Method: cp_invokeMethod_Solaris_HostedShare
941 *
942 * Description: This method is not supported because the provider doesn't have
943 * any methods.
944 *
945 * Parameters:
946 *	- CCIMObjectPath* op - Not used.
947 *	- cimchar* methodName - Not used.
948 *	- CCIMPropertyList* inParams - Not used.
949 *	- CCIMPropertyList* outParams - Not used.
950 *
951 * Returns:
952 *	- Always returns null because the method is not supported.
953 */
954/* ARGSUSED */
955CCIMProperty *
956cp_invokeMethod_Solaris_HostedShare(CCIMObjectPath* op, cimchar* methodName,
957	CCIMPropertyList* inParams, CCIMPropertyList* outParams) {
958
959	return ((CCIMProperty *)NULL);
960} /* cp_invokeMethod_Solaris_HostedShare */
961
962/*
963 * Private methods
964 */
965
966/*
967 * Method: does_share_exist
968 *
969 * Description: Determines if a given share exists on the host.
970 *
971 * Parameters:
972 *	- char *dir - The name of the directory to see if it is shared.
973 *
974 * Returns:
975 *	- An integer corresponding to the existence of the share on the system.
976 *	1 is returned if the share exists, 0 is returned if the share does not
977 *	exist.
978 */
979static CIMBool
980does_share_exist(char *dir) {
981	fs_sharelist_t	*share_list;
982	fs_sharelist_t	*currentShare;
983	CIMBool		return_val = cim_false;
984	int		err = 0;
985
986	share_list = fs_get_share_list(&err);
987	if (share_list == NULL) {
988		/*
989		 * Either there was an error or there are no shares on the
990		 * system.  If there was an error err should be a non-zero
991		 * value.
992		 */
993		if (err != 0) {
994			util_handleError("SOLARIS_HOSTEDSHARE::SHARE_EXISTS",
995				CIM_ERR_FAILED, FS_GET_SHARE_FAILURE, NULL,
996				&err);
997		}
998
999		return (return_val);
1000	}
1001
1002	currentShare = share_list;
1003	while (currentShare != NULL && return_val == cim_false) {
1004		if ((strcmp(currentShare->path, dir) == 0)) {
1005			return_val = cim_true;
1006		}
1007
1008		currentShare = currentShare->next;
1009	}
1010
1011	fs_free_share_list(share_list);
1012	return (return_val);
1013
1014} /* does_share_exist */
1015
1016/*
1017 * Method: get_Antecedent
1018 *
1019 * Description: Retrieves a reference property of the host's
1020 * Solaris_ComputerSystem class.
1021 *
1022 * Parameters:
1023 *	- NONE
1024 * Returns:
1025 *	- A pointer to a property which is a reference property of the host's
1026 *	Solaris_ComputerSystem instance.
1027 *	- Upon error, NULL is returned and the error is logged.
1028 */
1029static CCIMObjectPath *
1030get_Antecedent() {
1031	CCIMInstance	*compSysInst;
1032	CCIMObjectPath	*compSysOP;
1033	CCIMException	*ex;
1034	char		*hostname;
1035	int		err = 0;
1036
1037	compSysInst = cim_createInstance(COMPUTER_SYSTEM);
1038	if (compSysInst == NULL) {
1039		ex = cim_getLastError();
1040		util_handleError("SOLARIS_HOSTEDSHARE::GET_ANT",
1041			CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err);
1042		return ((CCIMObjectPath *)NULL);
1043	}
1044
1045	/*
1046	 * Create the key properties on the Solaris_ComputerSystem instance.
1047	 *
1048	 * The Solaris_ComputerSystem keys are as follows:
1049	 * CreationClassName = "Solaris_ComputerSystem"
1050	 * Name = < host name >
1051	 */
1052	if (add_property_to_instance(CREATION_CLASS, string, COMPUTER_SYSTEM,
1053		NULL, cim_true, compSysInst) == cim_false) {
1054
1055		cim_freeInstance(compSysInst);
1056		return ((CCIMObjectPath *)NULL);
1057	}
1058
1059	hostname = sys_get_hostname(&err);
1060	if (hostname == NULL) {
1061		util_handleError("SOLARIS_HOSTEDSHARE::GET_ANT",
1062			CIM_ERR_FAILED, GET_HOSTNAME_FAILURE, NULL, &err);
1063		return ((CCIMObjectPath *)NULL);
1064	}
1065
1066	if (add_property_to_instance(NAME, string, hostname, NULL,
1067		cim_true, compSysInst) == cim_false) {
1068
1069		free(hostname);
1070		cim_freeInstance(compSysInst);
1071		return ((CCIMObjectPath *)NULL);
1072	}
1073	free(hostname);
1074
1075	compSysOP = cim_createObjectPath(compSysInst);
1076	if (compSysOP == NULL) {
1077		ex = cim_getLastError();
1078		util_handleError("SOLARIS_HOSTEDSHARE::GET_ANT",
1079			CIM_ERR_FAILED, CREATE_OBJECT_PATH_FAILURE,
1080			ex, &err);
1081		cim_freeInstance(compSysInst);
1082		return ((CCIMObjectPath *)NULL);
1083	}
1084
1085	return (compSysOP);
1086} /* get_Antecedent */
1087