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_NFSShareEntry.h"
30 #include "nfs_keys.h"
31 #include "nfs_providers_msgstrings.h"
32 #include "nfs_provider_names.h"
33 #include "messageStrings.h"
34 #include "util.h"
35 #include "common_functions.h"
36 #include "createprop_methods.h"
37 #include "libfsmgt.h"
38 
39 #define	COMMAND "Command"
40 /*
41  * Private method declarations
42  */
43 static CCIMInstanceList* create_shareEntry_inst_and_update_list(
44 	CCIMObjectPath *nfsShare, CCIMInstanceList *shareEntInstList);
45 static CCIMInstanceList* get_associated_nfsShare_instList(
46 				CCIMObjectPath *sharePersistOP);
47 static CCIMInstanceList* get_associated_sharePersist_instList(
48 				CCIMObjectPath *nfsShareOP);
49 static CCIMObjectPathList* get_associated_sharePersist_OPList(
50 				CCIMObjectPath *nfsShareOP, int *errp);
51 static CCIMObjectPath* get_Solaris_NFSShare_OP(char *nameKey);
52 static CCIMInstance* get_Solaris_PersistentShare_Inst(char *path,
53 				char *command);
54 
55 /*
56  * Public methods
57  */
58 
59 /*
60  * Instance provider methods
61  */
62 
63 /*
64  * Method: cp_createInstance_Solaris_NFSShareEntry
65  *
66  * Description: This method is not supported.  It is not supported because in
67  * order for a Solaris_NFSShareEntry association to exist a corresponding
68  * Solaris_NFSShare and Solaris_PersistentShare must exist.
69  *
70  * Parameters:
71  *	- CCIMObjectPath *hostedShareOP - An object path containing the name of
72  *	the class of which to create an instance of.
73  *      - CCIMInstance *pInst - Not used.
74  *
75  * Return Value:
76  *	- Always returns NULL because the method is not supported.
77  */
78 /* ARGSUSED */
79 CCIMObjectPath *
cp_createInstance_Solaris_NFSShareEntry(CCIMObjectPath * pOP,CCIMInstance * pInst)80 cp_createInstance_Solaris_NFSShareEntry(CCIMObjectPath *pOP,
81 	CCIMInstance *pInst) {
82 
83 	int	err = 0;
84 
85 	util_handleError("SOLARIS_NFSSHAREENT::CREATE_INSTANCE",
86 		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
87 
88 	return ((CCIMObjectPath *)NULL);
89 } /* cp_createInstance_Solaris_NFSShareEntry */
90 
91 /*
92  * Method: cp_deleteInstance_Solaris_NFSShareEntry
93  *
94  * Description: This method is not supported.  It is not supported because in
95  * order for it to be actually deleted the corresponding Solaris_NFSShare or
96  * Solaris_PersistentShare would need to be deleted. That action is not
97  * for this provider.
98  *
99  * Parameters:
100  *      - CCIMObjectPath *pOP - An object path containing the
101  *      information about the class of which to delete the instance of.
102  *
103  * Return Value:
104  *      - Always returns cim_false because the method is not supported.
105  */
106 /* ARGSUSED */
107 CIMBool
cp_deleteInstance_Solaris_NFSShareEntry(CCIMObjectPath * pOP)108 cp_deleteInstance_Solaris_NFSShareEntry(CCIMObjectPath *pOP) {
109 	int	err = 0;
110 
111 	util_handleError("SOLARIS_NFSSHAREENT::DELETE_INSTANCE",
112 		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
113 
114 	return (cim_false);
115 } /* cp_deleteInstance_Solaris_NFSShareEntry */
116 
117 /*
118  * Method: cp_enumInstances_Solaris_NFSShareEntry
119  *
120  * Description: Enumerates the instances of Solaris_NFSShareEntry on a host.
121  * An instance of Solaris_NFSShareEntry is an association that links a share to
122  * it's persistent share entry.
123  *
124  * Parameters:
125  *      - CCIMObjectPath *pOP - An object path containing the name of
126  *      the class of which to enumerate the instances of.
127  *
128  * Return Value:
129  *      - A pointer to a list of Solaris_NFSShareEntry instances.
130  *      - NULL if an error occurred or if there are no instances of
131  *      Solaris_NFSShareEntry on the host.  In the case of an error, the error
132  *      will be logged.
133  */
134 
135 CCIMInstanceList *
cp_enumInstances_Solaris_NFSShareEntry(CCIMObjectPath * pOP)136 cp_enumInstances_Solaris_NFSShareEntry(CCIMObjectPath *pOP) {
137 	CCIMInstanceList	*shareEntryInstList;
138 	CCIMObjectPathList	*nfsShareOPList;
139 	CCIMObjectPathList	*currentShareOP;
140 	CCIMObjectPath		*nfsShareOP;
141 	CCIMException		*ex;
142 	int			err = 0;
143 
144 	if (pOP == NULL) {
145 		util_handleError("SOLARIS_NFSSHAREENT::ENUM_INSTANCES",
146 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
147 		return ((CCIMInstanceList *)NULL);
148 	}
149 
150 	nfsShareOP = cim_createEmptyObjectPath(SOLARIS_NFSSHARE);
151 	if (nfsShareOP == NULL) {
152 		ex = cim_getLastError();
153 		util_handleError("SOLARIS_NFSSHAREENT::ENUM_INSTANCES",
154 			CIM_ERR_FAILED, CREATE_EMPTY_OBJPATH_FAILURE, ex,
155 			&err);
156 		return ((CCIMInstanceList *)NULL);
157 	}
158 
159 	nfsShareOPList = cimom_enumerateInstanceNames(nfsShareOP, cim_false);
160 
161 	/*
162 	 * A NULL return value means error, an empty list does not.
163 	 */
164 	if (nfsShareOPList == NULL) {
165 		ex = cim_getLastError();
166 		util_handleError("SOLARIS_NFSSHAREENT::ENUM_INSTANCES",
167 			CIM_ERR_FAILED, CIMOM_ENUM_INSTNAMES_FAILURE, ex, &err);
168 		cim_freeObjectPath(nfsShareOP);
169 		return ((CCIMInstanceList *)NULL);
170 	}
171 
172 	cim_freeObjectPath(nfsShareOP);
173 
174 	if (nfsShareOPList->mDataObject == NULL) {
175 		cim_freeObjectPathList(nfsShareOPList);
176 		return ((CCIMInstanceList *)NULL);
177 	}
178 
179 	shareEntryInstList = cim_createInstanceList();
180 	if (shareEntryInstList == NULL) {
181 		ex = cim_getLastError();
182 		util_handleError("SOLARIS_NFSSHAREENT::ENUM_INSTANCES",
183 			CIM_ERR_FAILED, CREATE_INSTANCE_LIST_FAILURE, ex, &err);
184 		cim_freeObjectPathList(nfsShareOPList);
185 		return ((CCIMInstanceList *)NULL);
186 	}
187 
188 	for (currentShareOP = nfsShareOPList; currentShareOP != NULL;
189 		currentShareOP = currentShareOP->mNext) {
190 
191 		shareEntryInstList = create_shareEntry_inst_and_update_list(
192 			currentShareOP->mDataObject, shareEntryInstList);
193 		if (shareEntryInstList == NULL) {
194 			cim_freeObjectPathList(nfsShareOPList);
195 			return ((CCIMInstanceList *)NULL);
196 		}
197 	}
198 
199 	cim_freeObjectPathList(nfsShareOPList);
200 	return (shareEntryInstList);
201 } /* cp_enumInstances_Solaris_NFSShareEntry */
202 
203 /*
204  * Method: cp_enumInstanceNames_Solaris_NFSShareEntry
205  *
206  * Description: Enumerates all of the instances of Solaris_NFSShareEntry on the
207  * host.
208  *
209  * Parameters:
210  *	- CCIMObjectPath* pOP - An object path containing the name of the
211  *	class of which to enumerate instances of.
212  *
213  * Returns:
214  *	- A pointer to a list of Solaris_NFSShareEntry object paths.
215  *	- NULL if an error occurred or if there are no NFS mounts on the host.
216  *	In the case of an error, the error will be logged.
217  */
218 CCIMObjectPathList *
cp_enumInstanceNames_Solaris_NFSShareEntry(CCIMObjectPath * pOP)219 cp_enumInstanceNames_Solaris_NFSShareEntry(CCIMObjectPath *pOP) {
220 	CCIMInstanceList	*instList;
221 	CCIMObjectPathList	*OPList;
222 	int			err = 0;
223 
224 	if (pOP == NULL) {
225 		util_handleError("SOLARIS_NFSSHAREENT::ENUM_INSTANCENAMES",
226 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
227 		return ((CCIMObjectPathList *)NULL);
228 	}
229 
230 	instList = cp_enumInstances_Solaris_NFSShareEntry(pOP);
231 	if (instList == NULL) {
232 		/*
233 		 * Either an error occurred or we don't have any
234 		 * Solaris_NFSShareEntry instances on the host.
235 		 */
236 		return ((CCIMObjectPathList *)NULL);
237 	}
238 
239 	OPList = cim_createObjectPathList(instList);
240 
241 	cim_freeInstanceList(instList);
242 	return (OPList);
243 } /* cp_enumInstanceNames_Solaris_NFSShareEntry */
244 
245 /*
246  * Method: cp_execQuery_Solaris_NFSShareEntry
247  *
248  * Description: Queries the Solaris_NFSShareEntry instances on the host to find
249  * those that meet the search criteria.
250  *
251  * Parameters:
252  *	- CCIMObjectPath *pOP - An object path containing the name of
253  *	the class of which to query.
254  *	- char *selectClause - Not used.
255  *	- char *nonJoinExp - Not used.
256  *	- char *queryExp - Not used.
257  *	- char *queryLang - Not used.
258  *
259  * Returns:
260  *	- A pointer to a list of Solaris_NFSShareEntry instances that match the
261  *	criteria.
262  *	- NULL if an error occurred or if there are no Solaris_NFSShareEntry
263  *	instances that match the criteria.  In the case of an error, the error
264  *	will be logged.
265  *
266  * NOTE: Currently, there is no WQL parser for the C providers. As a result,
267  * what is returned to the CIMOM is a list of instances with
268  * a NULL value at the beginning of the list. This NULL value indicates
269  * to the CIMOM that it must do the filtering for the client.
270  */
271 /* ARGSUSED */
272 CCIMInstanceList *
cp_execQuery_Solaris_NFSShareEntry(CCIMObjectPath * pOP,char * selectClause,char * nonJoinExp,char * queryExp,char * queryLang)273 cp_execQuery_Solaris_NFSShareEntry(CCIMObjectPath *pOP, char *selectClause,
274 	char *nonJoinExp, char *queryExp, char *queryLang) {
275 
276 	CCIMInstance		*emptyInst;
277 	CCIMInstanceList	*shareEntryInstList;
278 	CCIMException		*ex;
279 	int			err = 0;
280 
281 	if (pOP == NULL) {
282 		util_handleError("SOLARIS_NFSSHAREENT::EXEC_QUERY",
283 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
284 		return ((CCIMInstanceList *)NULL);
285 	}
286 
287 	shareEntryInstList = cp_enumInstances_Solaris_NFSShareEntry(pOP);
288 	if (shareEntryInstList == NULL) {
289 		return ((CCIMInstanceList *)NULL);
290 	}
291 
292 	emptyInst = cim_createInstance("");
293 	if (emptyInst == NULL) {
294 		ex = cim_getLastError();
295 		util_handleError("SOLARIS_NFSSHAREENT::EXEC_QUERY",
296 			CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err);
297 		cim_freeInstanceList(shareEntryInstList);
298 		return ((CCIMInstanceList *)NULL);
299 	}
300 
301 	shareEntryInstList = cim_prependInstance(shareEntryInstList,
302 		emptyInst);
303 	if (shareEntryInstList == NULL) {
304 		ex = cim_getLastError();
305 		util_handleError("SOLARIS_NFSSHAREENT::EXEC_QUERY",
306 			CIM_ERR_FAILED, PREPEND_INSTANCE_FAILURE, ex, &err);
307 		cim_freeInstance(emptyInst);
308 		return ((CCIMInstanceList *)NULL);
309 	}
310 
311 	return (shareEntryInstList);
312 } /* cp_execQuery_Solaris_NFSShareEntry */
313 
314 /*
315  * Method: cp_getInstance_Solaris_NFSShareEntry
316  *
317  * Description: Gets the instance corresponding to the Solaris_NFSShareEntry
318  * object path passed in.
319  *
320  * Parameters:
321  *      - CCIMObjectPath* pOP - An object path containing all the keys of
322  *      the instance that is supposed to be returned.
323  *
324  * Returns:
325  *	- A pointer to the Solaris_NFSShareEntry instance corresponding to the
326  *	object path parameter.
327  *	- NULL if an error occurred or if the instance doesn't exist.  In the
328  *	case of an error, the error will be logged.
329  */
330 CCIMInstance *
cp_getInstance_Solaris_NFSShareEntry(CCIMObjectPath * pOP)331 cp_getInstance_Solaris_NFSShareEntry(CCIMObjectPath *pOP) {
332 	CCIMInstanceList	*instList;
333 	CCIMInstance		*inst;
334 	CCIMObjectPath		*setOP;
335 	CCIMObjectPath		*elemOP;
336 	CCIMPropertyList	*shareEntPropList;
337 	int			err = 0;
338 
339 	if (pOP == NULL || pOP->mKeyProperties == NULL) {
340 		util_handleError("SOLARIS_NFSSHAREENT::GET_INSTANCE",
341 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
342 		return ((CCIMInstance *)NULL);
343 	}
344 
345 	/*
346 	 * Determine if the key values are populated.
347 	 */
348 	shareEntPropList = pOP->mKeyProperties;
349 	setOP = util_getKeyValue(shareEntPropList, shareEntProps[SETTING].type,
350 		shareEntProps[SETTING].name, &err);
351 	elemOP = util_getKeyValue(shareEntPropList, shareEntProps[ELEMENT].type,
352 		shareEntProps[ELEMENT].name, &err);
353 
354 	if (setOP == NULL || elemOP == NULL ||
355 		setOP->mKeyProperties == NULL ||
356 		elemOP->mKeyProperties == NULL) {
357 
358 		util_handleError("SOLARIS_NFSSHAREENT::GET_INSTANCE",
359 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
360 		return ((CCIMInstance *)NULL);
361 	}
362 
363 	instList = cp_enumInstances_Solaris_NFSShareEntry(pOP);
364 	if (instList == NULL) {
365 		/*
366 		 * Either an error occurred or we simply don't have any
367 		 * instances of Solaris_NFSShareEntry on the system.  In the
368 		 * case that an error occurred, it will be handled in
369 		 * cp_enumInstances_Solaris_NFSShareEntry.
370 		 */
371 		return ((CCIMInstance *)NULL);
372 	}
373 
374 	inst = cim_getInstance(instList, pOP);
375 
376 	cim_freeInstanceList(instList);
377 	return (inst);
378 } /* cp_getInstance_Solaris_NFSShareEntry */
379 
380 /*
381  * Method: cp_setInstance_Solaris_NFSShareEntry
382  *
383  * Description: This method is not supported.  This is not allowed because in
384  * order to change the properties a Solaris_NFSShareEntry on the host, the
385  * Solaris_NFSShare and Solaris_PersistentShare must most likely be changed.
386  * In order to change the associated objects, they need to be changed in those
387  * providers and not this one.
388  *
389  * Parameters:
390  *	- CCIMObjectPath *pOP - An object path containing the name of the class
391  *	of which to set the instance.
392  *	- CCIMInstance *pInst - Not used.
393  *
394  * Returns:
395  *	- cim_false is returned every time since the method is not supported.
396  */
397 /* ARGSUSED */
398 CIMBool
cp_setInstance_Solaris_NFSShareEntry(CCIMObjectPath * pOP,CCIMInstance * pInst)399 cp_setInstance_Solaris_NFSShareEntry(CCIMObjectPath *pOP, CCIMInstance *pInst) {
400 	int	err = 0;
401 
402 	util_handleError("SOLARIS_NFSSHAREENT::SET_INSTANCE",
403 		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
404 
405 	return (cim_false);
406 } /* cp_setInstance_Solaris_NFSShareEntry */
407 
408 /*
409  * Method: cp_setInstanceWithList_Solaris_NFSShareEntry
410  *
411  * Description: This method is not supported.  This is not allowed because in
412  * order to change the properties a Solaris_NFSShareEntry on the host, the
413  * Solaris_NFSShare and Solaris_PersistentShare must most likely be changed.
414  * In order to change the associated objects, they need to be changed in those
415  * providers and not this one.
416  *
417  * Parameters:
418  *	- CCIMObjectPath *pOP - An object path containing the name of the class
419  *	of which to set the instance.
420  *	- CCIMInstance *pInst - Not used.
421  *
422  * Returns:
423  *	- cim_false is returned every time since the method is not supported.
424  */
425 /* ARGSUSED */
426 CIMBool
cp_setInstanceWithList_Solaris_NFSShareEntry(CCIMObjectPath * pOP,CCIMInstance * pInst,char ** props,int num_props)427 cp_setInstanceWithList_Solaris_NFSShareEntry(CCIMObjectPath *pOP,
428 	CCIMInstance *pInst, char **props, int num_props) {
429 
430 	int	err = 0;
431 
432 	util_handleError("SOLARIS_NFSSHAREENT::SET_INSTANCE",
433 		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
434 
435 	return (cim_false);
436 } /* cp_setInstanceWithList_Solaris_NFSShareEntry */
437 
438 /*
439  * Association provider methods
440  */
441 
442 /*
443  * Method: cp_associators_Solaris_NFSShareEntry
444  *
445  * Description: Returns the instances associated, via the Solaris_NFSShareEntry
446  * association, to the pObjectName parameter.
447  *
448  * Parameters:
449  *	- CCIMObjectPath *pAssocName - An object path containing the name of
450  *	the association that the caller is trying to reach.
451  *	- CCIMObjectPath *pObjectName - The object path containing information
452  *	(Class Name, Key Properties) about the object whose associated objects
453  *	are to be returned.
454  *	- char *pResultClass - If specified, only return instances that are of
455  *	this class type.
456  *	- char *pRole - If specified, this is the role of the pObjectName
457  *	object path passed in.  If this is not valid, NULL is returned.
458  *	- char *pResultRole - If specified, only return instances that are
459  *	playing this role in the association.
460  *
461  * Returns:
462  *	- A pointer to a list of Solaris_PersistentShare (if pRole ==
463  *	Element && pObjectName is a Solaris_NFSShare object path) or
464  *	Solaris_NFSShare (if pRole == Setting && pObjectName is a
465  *	Solaris_PersistentShare object path) instances which are associated to
466  *	the pObjectName parameter.
467  *	- NULL if an error occurred or if there are no instances associated to
468  *	the pObjectName passed in.  In the case of an error, the error will be
469  *	logged.
470  */
471 /* ARGSUSED */
472 CCIMInstanceList *
cp_associators_Solaris_NFSShareEntry(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pResultClass,char * pRole,char * pResultRole)473 cp_associators_Solaris_NFSShareEntry(CCIMObjectPath *pAssocName,
474 	CCIMObjectPath *pObjectName, char *pResultClass, char *pRole,
475 	char *pResultRole) {
476 
477 	CCIMInstanceList	*returnInstList;
478 	int			err = 0;
479 
480 	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
481 		util_handleError("SOLARIS_NFSSHAREENT::ASSOCIATORS",
482 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
483 		return ((CCIMInstanceList *)NULL);
484 	}
485 
486 	/*
487 	 * Determine whether pObjectname is the Element or the Setting of the
488 	 * association.  Element = Solaris_NFSShare,
489 	 * Setting = Solaris_PersistentShare.
490 	 */
491 	if (strcasecmp(pObjectName->mName, SOLARIS_NFSSHARE) == 0) {
492 		if (pRole != NULL && (strcasecmp(pRole,
493 			shareEntProps[ELEMENT].name) != 0)) {
494 
495 			util_handleError("SOLARIS_NFSSHAREENT::ASSOCIATORS",
496 				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
497 			return ((CCIMInstanceList *)NULL);
498 		}
499 
500 		returnInstList = get_associated_sharePersist_instList(
501 			pObjectName);
502 	} else if (strcasecmp(pObjectName->mName, SOLARIS_PERSISTSHARE) == 0) {
503 		if (pRole != NULL && (strcasecmp(pRole,
504 			shareEntProps[SETTING].name) != 0)) {
505 
506 			util_handleError("SOLARIS_NFSSHAREENT::ASSOCIATORS",
507 				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
508 			return ((CCIMInstanceList *)NULL);
509 		}
510 
511 		returnInstList = get_associated_nfsShare_instList(pObjectName);
512 	} else {
513 		util_handleError("SOLARIS_NFSSHAREENT::ASSOCIATORS",
514 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
515 		return ((CCIMInstanceList *)NULL);
516 	}
517 
518 	return (returnInstList);
519 } /* cp_associators_Solaris_NFSShareEntry */
520 
521 /*
522  * Method: cp_associatorNames_Solaris_NFSShareEntry
523  *
524  * Description: Returns the object paths of the instances on the other side of
525  * the association which are associated via the Solaris_NFSShareEntry
526  * association and having the passed in parameter, pObjectName, as the
527  * opposite key.
528  *
529  * Parameters:
530  *	- CCIMObjectPath *pAssocName - An object path containing information
531  *	about the association that the caller is trying to reach.
532  *	- CCIMObjectPath *pObjectName - The object path which contains the
533  *	information on whose associated objects are to be returned.
534  *	- char *pResultClass - If specified, only return instances that are of
535  *	this class type.
536  *	- char *pRole - If specified, this is the role of the pObjectName
537  *	object path passed in.  If this is not valid, NULL is returned.
538  *	- char *pResultRole - If specified, only return instances that are
539  *	playing this role in the association.
540  *
541  * Returns:
542  *	- A pointer to a list of Solaris_PersistentShare (if pRole ==
543  *	Element && pObjectName is a Solaris_NFSShare object path) or
544  *	Solaris_NFSShare (if pRole == Setting && pObjectName is a
545  *	Solaris_PersistentShare object path) object paths which are associated
546  *	to the pObjectName parameter.
547  *	- NULL if an error occurred or if there are no instances associated to
548  *	the pObjectName passed in.  In the case of an error, the error will be
549  *	logged.
550  */
551 CCIMObjectPathList *
cp_associatorNames_Solaris_NFSShareEntry(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pResultClass,char * pRole,char * pResultRole)552 cp_associatorNames_Solaris_NFSShareEntry(CCIMObjectPath *pAssocName,
553 	CCIMObjectPath *pObjectName, char *pResultClass, char *pRole,
554 	char *pResultRole) {
555 
556 	CCIMInstanceList	*instList;
557 	CCIMObjectPathList	*objPathList;
558 	int			err = 0;
559 
560 	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
561 		util_handleError("SOLARIS_NFSSHAREENT::ASSOCIATOR_NAMES",
562 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
563 		return ((CCIMObjectPathList *)NULL);
564 	}
565 
566 	instList = cp_associators_Solaris_NFSShareEntry(pAssocName, pObjectName,
567 		pResultClass, pRole, pResultRole);
568 	if (instList == NULL) {
569 		return ((CCIMObjectPathList *)NULL);
570 	}
571 
572 	objPathList = cim_createObjectPathList(instList);
573 
574 	cim_freeInstanceList(instList);
575 
576 	return (objPathList);
577 } /* cp_associatorNames_Solaris_NFSShareEntry */
578 
579 /*
580  * Method: cp_references_Solaris_NFSShareEntry
581  *
582  * Description: Returns the Solaris_NFSShareEntry instances that have the
583  * passed in parameter, pObjectName, as one of it's keys.
584  *
585  * Parameters:
586  *      - CCIMObjectPath *pAssocName - An object path containing information
587  *      about the association that the caller is trying to reach.
588  *      - CCIMObjectPath *pObjectName - The object path which contains the
589  *      information on whose associated objects are to be returned.
590  *      - char *pRole - If specified, this is the role of the pObjectName
591  *      object path passed in.  If this is not valid, NULL is returned.
592  *
593  * Returns:
594  *      - A pointer to a list of Solaris_NFSShareEntry instances.
595  *      - NULL if an error occurred or if there are no Solaris_NFSShareEntry
596  *      instances having pObjectName as one of it's keys.
597  */
598 CCIMInstanceList *
cp_references_Solaris_NFSShareEntry(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pRole)599 cp_references_Solaris_NFSShareEntry(CCIMObjectPath *pAssocName,
600 	CCIMObjectPath *pObjectName, char *pRole) {
601 
602 	CCIMInstanceList	*instList;
603 	CCIMObjectPathList	*objPathList;
604 	int			err = 0;
605 
606 	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
607 		util_handleError("SOLARIS_NFSSHAREENT::REFERENCES",
608 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
609 		return ((CCIMInstanceList *)NULL);
610 	}
611 
612 	/*
613 	 * Get everything that is related to the pObjectName passed in.
614 	 */
615 	objPathList = cp_associatorNames_Solaris_NFSShareEntry(
616 		pAssocName, pObjectName, NULL, pRole, NULL);
617 	if (objPathList == NULL) {
618 		return ((CCIMInstanceList *)NULL);
619 	}
620 
621 	/*
622 	 * Determine whether pObjectname is the Element or the Setting of the
623 	 * association.  Element = Solaris_NFSShare,
624 	 * Setting = Solaris_PersistentShare.
625 	 */
626 
627 	if (strcasecmp(pObjectName->mName, SOLARIS_NFSSHARE) == 0) {
628 		instList = create_association_instList(SOLARIS_NFSSHAREENT,
629 			pObjectName, shareEntProps[ELEMENT].name, objPathList,
630 			shareEntProps[SETTING].name, &err);
631 	} else {
632 		instList = create_association_instList(SOLARIS_NFSSHAREENT,
633 			pObjectName, shareEntProps[SETTING].name, objPathList,
634 			shareEntProps[ELEMENT].name, &err);
635 	}
636 	cim_freeObjectPathList(objPathList);
637 
638 	return (instList);
639 } /* cp_references_Solaris_NFSShareEntry */
640 
641 /*
642  * Method: cp_referenceNames_Solaris_NFSShareEntry
643  *
644  * Description: Returns the Solaris_NFSShareEntry object paths of the instances
645  * that have the passed in parameter, pObjectName, as one of it's keys.
646  *
647  * Parameters:
648  *	- CCIMObjectPath *pAssocName - An object path containing information
649  *	about the association that the caller is trying to reach.
650  *	- CCIMObjectPath *pObjectName - The object path which contains the
651  *	information on whose associated objects are to be returned.
652  *	- char *pRole - If specified, this is the role of the pObjectName
653  *	object path passed in.  If this is not valid, NULL is returned.
654  *
655  * Returns:
656  *	- A pointer to a list of Solaris_NFSShareEntry object paths.
657  *	- NULL if an error occurred or if there are no Solaris_NFSShareEntry
658  *	instances having pObjectName as one of it's keys.
659  */
660 CCIMObjectPathList *
cp_referenceNames_Solaris_NFSShareEntry(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pRole)661 cp_referenceNames_Solaris_NFSShareEntry(CCIMObjectPath *pAssocName,
662 	CCIMObjectPath *pObjectName, char *pRole) {
663 
664 	CCIMInstanceList	*shareEntryInstList;
665 	CCIMObjectPathList	*shareEntryOPList;
666 	int			err = 0;
667 
668 	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
669 		util_handleError("SOLARIS_NFSSHAREENT::REFERENCE_NAMES",
670 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
671 		return ((CCIMInstanceList *)NULL);
672 	}
673 
674 	shareEntryInstList = cp_references_Solaris_NFSShareEntry(pAssocName,
675 		pObjectName, pRole);
676 
677 	if (shareEntryInstList == NULL) {
678 		return ((CCIMObjectPathList *)NULL);
679 	}
680 
681 	shareEntryOPList = cim_createObjectPathList(shareEntryInstList);
682 
683 	cim_freeInstanceList(shareEntryInstList);
684 
685 	return (shareEntryOPList);
686 } /* cp_referenceNames_Solaris_NFSShareEntry */
687 
688 /*
689  * Property provider methods
690  */
691 
692 /*
693  * Method: cp_getProperty_Solaris_NFSShareEntry
694  *
695  * Description: Retrieves a certain property from the instance of
696  * Solaris_NFSShareEntry on the host that is described by the parameter pOP.
697  *
698  * Parameters:
699  *	- CCIMObjectPath *pOP - The object path containing all the
700  *	information needed to find the instance in which the property is to
701  *	be returned.
702  *	- cimchar *pPropName - The name of the property to be found.
703  *
704  * Returns:
705  *	- A pointer to the property corresponding to the name passed in with
706  *	pPropName.
707  *	- NULL if an error occurred or if the property doesn't exist.  In the
708  *	case of an error, the error will be logged.
709  */
710 CCIMProperty *
cp_getProperty_Solaris_NFSShareEntry(CCIMObjectPath * pOP,cimchar * pPropName)711 cp_getProperty_Solaris_NFSShareEntry(CCIMObjectPath *pOP, cimchar *pPropName) {
712 	CCIMInstance	*shareEntryInst;
713 	CCIMProperty	*shareEntryProp;
714 	int		err = 0;
715 
716 	if (pOP == NULL) {
717 		util_handleError("SOLARIS_NFSSHAREENT::GET_PROPERTY",
718 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
719 		return ((CCIMProperty *)NULL);
720 	}
721 
722 	shareEntryInst = cp_getInstance_Solaris_NFSShareEntry(pOP);
723 	if (shareEntryInst == NULL) {
724 		return ((CCIMProperty *)NULL);
725 	}
726 
727 	shareEntryProp = cim_getProperty(shareEntryInst, pPropName);
728 	cim_freeInstance(shareEntryInst);
729 
730 	return (shareEntryProp);
731 } /* cp_getProperty_Solaris_NFSShareEntry */
732 
733 /*
734  * Method: cp_setProperty_Solaris_NFSShareEntry
735  *
736  * Description: This method is not supported.  This is not allowed because in
737  * order to change the properties a Solaris_NFSShareEntry on the host, the
738  * Solaris_NFSShare and Solaris_PersistentShare must most likely be changed.
739  * In order to change the associated objects, they need to be changed in those
740  * providers and not this one.
741  *
742  * Parameters:
743  *	- CCIMObjectPath *pOP - Not used.
744  *	- CCIMProperty *pProp - Not used.
745  *
746  * Returns:
747  *	- cim_false is returned every time since the method is not supported.
748  */
749 /* ARGSUSED */
750 CIMBool
cp_setProperty_Solaris_NFSShareEntry(CCIMObjectPath * pOP,CCIMProperty * pProp)751 cp_setProperty_Solaris_NFSShareEntry(CCIMObjectPath *pOP, CCIMProperty *pProp) {
752 	int	err = 0;
753 
754 	util_handleError("SOLARIS_NFSSHAREENT::SET_PROPERTY",
755 		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
756 
757 	return (cim_false);
758 } /* cp_setProperty_Solaris_NFSShareEntry */
759 
760 /*
761  * Method provider methods
762  */
763 
764 /*
765  * Method: cp_invokeMethod_Solaris_NFSShareEntry
766  *
767  * Description: This method is not supported because the provider doesn't have
768  * any methods.
769  *
770  * Parameters:
771  *	- CCIMObjectPath* op - Not used.
772  *	- cimchar* methodName - Not used.
773  *	- CCIMPropertyList* inParams - Not used.
774  *	- CCIMPropertyList* outParams - Not used.
775  *
776  * Return Value:
777  *	- Always returns null because the method is not supported.
778  */
779 /* ARGSUSED */
780 CCIMProperty *
cp_invokeMethod_Solaris_NFSShareEntry(CCIMObjectPath * op,cimchar * methodName,CCIMPropertyList * inParams,CCIMPropertyList * outParams)781 cp_invokeMethod_Solaris_NFSShareEntry(CCIMObjectPath* op, cimchar* methodName,
782 	CCIMPropertyList* inParams, CCIMPropertyList* outParams) {
783 
784 	return ((CCIMProperty *)NULL);
785 } /* cp_invokeMethod_Solaris_NFSShareEntry */
786 
787 /*
788  * Private methods
789  */
790 
791 /*
792  * Method: create_shareEntry_inst_and_update_list
793  *
794  */
795 static CCIMInstanceList *
create_shareEntry_inst_and_update_list(CCIMObjectPath * nfsShareOP,CCIMInstanceList * shareEntInstList)796 create_shareEntry_inst_and_update_list(CCIMObjectPath *nfsShareOP,
797 	CCIMInstanceList *shareEntInstList) {
798 
799 	CCIMObjectPathList	*sharePersistOPList;
800 	CCIMObjectPathList	*currentPersistShareOP;
801 	CCIMInstance		*shareEntryInst;
802 	CCIMException		*ex;
803 	int			err = 0;
804 
805 	shareEntryInst = cim_createInstance(SOLARIS_NFSSHAREENT);
806 	if (shareEntryInst == NULL) {
807 		ex = cim_getLastError();
808 		util_handleError("SOLARIS_NFSSHAREENT::ENUM_INSTANCES",
809 			CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex,
810 			&err);
811 		return ((CCIMInstanceList *)NULL);
812 	}
813 
814 	/*
815 	 * Retrieve all of the Solaris_PersistentShare object paths
816 	 * associated with the current Solaris_NFSShare object path.
817 	 *
818 	 * NOTE: Although it is wrong, and we can't control it since
819 	 * /etc/dfs/dfstab is a editable file, there may be multiple
820 	 * dfstab entries for one nfs share.
821 	 */
822 	sharePersistOPList = get_associated_sharePersist_OPList(nfsShareOP,
823 		&err);
824 	if (sharePersistOPList == NULL) {
825 		if (err != 0) {
826 			cim_freeInstance(shareEntryInst);
827 			return ((CCIMInstanceList *)NULL);
828 		}
829 		cim_freeInstance(shareEntryInst);
830 		return (shareEntInstList);
831 	}
832 
833 	for (currentPersistShareOP = sharePersistOPList;
834 		currentPersistShareOP != NULL;
835 		currentPersistShareOP = currentPersistShareOP->mNext) {
836 		/*
837 		 * Add the properties to the Solaris_NFSShareEntry
838 		 * instance.
839 		 */
840 		if (add_property_to_instance(shareEntProps[SETTING].name,
841 			shareEntProps[SETTING].type, NULL,
842 			currentPersistShareOP->mDataObject,
843 			shareEntProps[SETTING].isKey, shareEntryInst)
844 			== cim_false) {
845 
846 			cim_freeObjectPathList(sharePersistOPList);
847 			return ((CCIMInstanceList *)NULL);
848 		}
849 
850 		if (add_property_to_instance(shareEntProps[ELEMENT].name,
851 			shareEntProps[ELEMENT].type, NULL, nfsShareOP,
852 			shareEntProps[ELEMENT].isKey, shareEntryInst)
853 			== cim_false) {
854 
855 			cim_freeObjectPathList(sharePersistOPList);
856 			return ((CCIMInstanceList *)NULL);
857 		}
858 
859 		shareEntInstList = cim_addInstance(shareEntInstList,
860 			shareEntryInst);
861 		if (shareEntInstList == NULL) {
862 			ex = cim_getLastError();
863 			util_handleError("SOLARIS_NFSSHAREENT::ENUM_INSTANCES",
864 				CIM_ERR_FAILED, ADD_INSTANCE_FAILURE,
865 				ex, &err);
866 			cim_freeInstance(shareEntryInst);
867 			return ((CCIMInstanceList *)NULL);
868 		}
869 	}
870 
871 	return (shareEntInstList);
872 } /* create_shareEntry_inst_and_update_list */
873 
874 /*
875  * Method: get_associated_nfsShare_instList
876  *
877  * Description: Finds the Solaris_NFSShare instances that are associated to
878  * the passed in Solaris_PersistentShare object path.
879  *
880  * Parameters:
881  *	- CCIMObjectPath *sharePersistOP - The Solaris_PersistentShare object
882  *	path that is to be used to find the associated Solaris_NFSShare
883  *	instances.
884  *
885  * Returns:
886  *	- A pointer to a list of Solaris_NFSShare instances that are associated
887  *	to the Solaris_PersistentShare object path, sharePersistOP, passed in.
888  *	- NULL if an error occurred or if there are no Solaris_NFSShare
889  *	instances associated to the Solaris_PersistentShare object path.  In
890  *	the case of an error, the error will be logged.
891  */
892 static CCIMInstanceList *
get_associated_nfsShare_instList(CCIMObjectPath * sharePersistOP)893 get_associated_nfsShare_instList(CCIMObjectPath *sharePersistOP) {
894 	CCIMInstanceList	*nfsShareInstList;
895 	CCIMInstance		*nfsShareInst;
896 	CCIMObjectPath		*nfsShareOP;
897 	CCIMException		*ex;
898 	char			*settingId;
899 	int			err = 0;
900 
901 	settingId = util_getKeyValue(sharePersistOP->mKeyProperties, string,
902 		SETTING_ID, &err);
903 	if (settingId == NULL || err != 0) {
904 		util_handleError(
905 			"SOLARIS_NFSSHAREENT::GET_ASSOC_SHARE_INSTLIST",
906 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
907 		return ((CCIMInstanceList *)NULL);
908 	}
909 
910 	nfsShareInstList = cim_createInstanceList();
911 	if (nfsShareInstList == NULL) {
912 		ex = cim_getLastError();
913 		util_handleError(
914 			"SOLARIS_NFSSHAREENT::GET_ASSOC_SHARE_INSTLIST",
915 			CIM_ERR_FAILED, CREATE_INSTANCE_LIST_FAILURE, ex, &err);
916 		return ((CCIMInstanceList *)NULL);
917 	}
918 
919 	nfsShareOP = get_Solaris_NFSShare_OP(settingId);
920 	if (nfsShareOP == NULL) {
921 		/*
922 		 * An error occurred in get_Solaris_NFSShare_OP and was
923 		 * handled there.
924 		 */
925 		cim_freeInstanceList(nfsShareInstList);
926 		return ((CCIMInstanceList *)NULL);
927 	}
928 
929 	nfsShareInst = cimom_getInstance(nfsShareOP, cim_false, cim_false,
930 		cim_false, cim_false, NULL, 0);
931 
932 	cim_freeObjectPath(nfsShareOP);
933 	/*
934 	 * A NULL return value indicates an error, an empty instance does not.
935 	 */
936 	if (nfsShareInst == NULL) {
937 		ex = cim_getLastError();
938 		util_handleError(
939 			"SOLARIS_NFSSHAREENT::GET_ASSOC_SHARE_INSTLIST",
940 			CIM_ERR_FAILED, CIMOM_GET_INST_FAILURE, ex, &err);
941 		cim_freeInstanceList(nfsShareInstList);
942 		return ((CCIMInstanceList *)NULL);
943 	}
944 
945 	if (nfsShareInst->mProperties == NULL) {
946 		cim_freeInstanceList(nfsShareInstList);
947 		cim_freeInstance(nfsShareInst);
948 		return ((CCIMInstanceList *)NULL);
949 	}
950 
951 	/*
952 	 * Work around for cimom bug 4649100.
953 	 */
954 	if (!set_share_keyProperties_to_true(nfsShareInst)) {
955 		/*
956 		 * Key values not found
957 		 */
958 		cim_logDebug(
959 			"get_associated_nfsShareSec_instList",
960 			"No keyProprties found, should return error here");
961 		cim_freeInstance(nfsShareInst);
962 		cim_freeInstanceList(nfsShareInstList);
963 		return ((CCIMInstanceList *)NULL);
964 	}
965 
966 	nfsShareInstList = cim_addInstance(nfsShareInstList, nfsShareInst);
967 	if (nfsShareInstList == NULL) {
968 		ex = cim_getLastError();
969 		util_handleError(
970 			"SOLARIS_NFSSHAREENT::GET_ASSOC_SHARE_INSTLIST",
971 			CIM_ERR_FAILED, ADD_INSTANCE_FAILURE, ex, &err);
972 		cim_freeInstance(nfsShareInst);
973 		return ((CCIMInstanceList *)NULL);
974 	}
975 
976 	return (nfsShareInstList);
977 } /* get_associated_nfsShare_instList */
978 
979 /*
980  * Method: get_associated_sharePersist_instList
981  *
982  * Description:  Finds the Solaris_PersistentShare instances that are
983  * associated to the passed in Solaris_NFSShare object path.
984  *
985  * Parameters:
986  *	- CCIMObjectPath *nfsShareOP - The Solaris_NFSShare object path that is
987  *	to be used to find the associated Solaris_PersistentShare instances.
988  *
989  * Returns:
990  *	- A pointer to a list of Solaris_PersistentShare instances that are
991  *	associated to the Solaris_NFSShare object path, nfsShareOP, passed in.
992  *	NOTE: An instance list is returned rather than a single instance
993  *	because it is possible (although unlikely) to have multiple
994  *	/etc/dfs/dfstab entries per share.
995  *	- NULL if an error occurred or if there are no Solaris_PersistentShare
996  *	instances associated to the Solaris_NFSShare object path.
997  */
998 static CCIMInstanceList *
get_associated_sharePersist_instList(CCIMObjectPath * nfsShareOP)999 get_associated_sharePersist_instList(CCIMObjectPath *nfsShareOP) {
1000 	CCIMInstanceList	*sharePersistInstList = NULL;
1001 	CCIMException		*ex;
1002 	fs_dfstab_entry_t	dfstabEnt;
1003 	fs_dfstab_entry_t	tmpDfstabEnt;
1004 	char			*name;
1005 	int			err = 0;
1006 
1007 	name = util_getKeyValue(nfsShareOP->mKeyProperties, string, NAME, &err);
1008 	if (name == NULL || err != 0) {
1009 		util_handleError("SOLARIS_NFSSHAREENT::GET_ASSOC_SP_INSTLIST",
1010 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
1011 		return ((CCIMInstanceList *)NULL);
1012 	}
1013 
1014 	sharePersistInstList = cim_createInstanceList();
1015 	if (sharePersistInstList == NULL) {
1016 		ex = cim_getLastError();
1017 		util_handleError("SOLARIS_NFSSHAREENT::GET_ASSOC_SP_INSTLIST",
1018 			CIM_ERR_FAILED, CREATE_INSTANCE_LIST_FAILURE, ex, &err);
1019 		return ((CCIMInstanceList *)NULL);
1020 	}
1021 
1022 	dfstabEnt = fs_get_DFStab_ents(&err);
1023 	if (dfstabEnt == NULL) {
1024 		/*
1025 		 * Check if an error occurred or if there just weren't any
1026 		 * /etc/dfs/dfstab entries.
1027 		 */
1028 		if (err != 0) {
1029 			util_handleError(
1030 				"SOLARIS_NFSSHAREENT::GET_ASSOC_SP_INSTLIST",
1031 				CIM_ERR_FAILED, FS_GET_DFSTAB_ENT_FAILURE,
1032 				NULL, &err);
1033 			cim_freeInstanceList(sharePersistInstList);
1034 			return ((CCIMInstanceList *)NULL);
1035 		}
1036 
1037 		return ((CCIMInstanceList *)NULL);
1038 	}
1039 
1040 	for (tmpDfstabEnt = dfstabEnt; tmpDfstabEnt != NULL;
1041 		tmpDfstabEnt = fs_get_DFStab_ent_Next(tmpDfstabEnt)) {
1042 		char    *path;
1043 		char	*fstype;
1044 		char	*command;
1045 
1046 		err = 0;
1047 		path = fs_get_DFStab_ent_Path(tmpDfstabEnt);
1048 		fstype = fs_get_DFStab_ent_Fstype(tmpDfstabEnt);
1049 		command = fs_get_Dfstab_share_cmd(tmpDfstabEnt, &err);
1050 
1051 		/*
1052 		 * Compare the dfstab entry to the nfs share.  Do this by first
1053 		 * checking if the fstype is "nfs" and second by checking
1054 		 * if the path is the same.
1055 		 */
1056 		if ((strcasecmp(fstype, NFS) == 0) &&
1057 			(strcmp(path, name) == 0)) {
1058 
1059 			CCIMInstance	*sharePersistInst;
1060 
1061 			/*
1062 			 * We can't just call Solaris_PersistentShare's
1063 			 * cp_getInstance method because there is a chance that
1064 			 * multiple dfstab entries having the same path.  If
1065 			 * this is the case, that method will return null and
1066 			 * some sort of "key not unique" error.
1067 			 */
1068 			sharePersistInst = get_Solaris_PersistentShare_Inst(
1069 				path, command);
1070 			if (sharePersistInst == NULL) {
1071 				/*
1072 				 * An error occurred and it was handled in
1073 				 * get_sharePersist_Inst.
1074 				 */
1075 				fs_free_DFStab_ents(dfstabEnt);
1076 				return ((CCIMInstanceList *)NULL);
1077 			}
1078 
1079 			sharePersistInstList = cim_addInstance(
1080 				sharePersistInstList, sharePersistInst);
1081 			if (sharePersistInstList == NULL) {
1082 			    ex = cim_getLastError();
1083 			    util_handleError(
1084 				"SOLARIS_NFSSHAREENT::GET_ASSOC_SP_INSTLIST",
1085 				CIM_ERR_FAILED, ADD_INSTANCE_FAILURE, ex, &err);
1086 			    cim_freeInstance(sharePersistInst);
1087 			    fs_free_DFStab_ents(dfstabEnt);
1088 			    return ((CCIMInstanceList *)NULL);
1089 			}
1090 		}
1091 	}
1092 
1093 	fs_free_DFStab_ents(dfstabEnt);
1094 	return (sharePersistInstList);
1095 } /* get_associated_sharePersist_instList */
1096 
1097 /*
1098  * Method: get_associated_sharePersist_OPList
1099  *
1100  * Description:  Finds the Solaris_PersistentShare object paths that are
1101  * associated to the passed in Solaris_NFSShare object path.
1102  *
1103  * Parameters:
1104  *	- CCIMObjectPath *nfsShareOP - The Solaris_NFSShare object path of
1105  *	of which to retrieve the associated Solaris_PersistentShare object
1106  *	paths.
1107  *
1108  * Returns:
1109  *	- A pointer to a list of Solaris_PersistentShare object paths that are
1110  *	associated to the passed in Solaris_NFSShare object path.
1111  *      - Upon error, NULL is returned and the error is logged.
1112  *
1113  * Returns:
1114  */
1115 static CCIMObjectPathList *
get_associated_sharePersist_OPList(CCIMObjectPath * nfsShareOP,int * errp)1116 get_associated_sharePersist_OPList(CCIMObjectPath *nfsShareOP, int *errp) {
1117 	CCIMInstanceList	*sharePersistInstList;
1118 	CCIMObjectPathList	*sharePersistOPList;
1119 	CCIMException		*ex;
1120 	int			err = 0;
1121 
1122 	sharePersistInstList = get_associated_sharePersist_instList(nfsShareOP);
1123 	if (sharePersistInstList == NULL) {
1124 		/*
1125 		 * An error occurred in get_associated_sharePersist_InstList
1126 		 * and was handled in that function.
1127 		 */
1128 		*errp = -1;
1129 		return ((CCIMObjectPathList *)NULL);
1130 	}
1131 
1132 	sharePersistOPList = cim_createObjectPathList(sharePersistInstList);
1133 	if (sharePersistOPList == NULL) {
1134 		ex = cim_getLastError();
1135 		util_handleError("SOLARIS_NFSSHAREENT::GET_ASSOC_SP_OPLIST",
1136 			CIM_ERR_FAILED, CREATE_OBJECT_LIST_FAILURE, ex, &err);
1137 		cim_freeInstanceList(sharePersistInstList);
1138 		*errp = -1;
1139 		return ((CCIMObjectPathList *)NULL);
1140 	}
1141 
1142 	cim_freeInstanceList(sharePersistInstList);
1143 	return (sharePersistOPList);
1144 } /* get_associated_sharePersist_OPList */
1145 
1146 /*
1147  * Method: get_Solaris_NFSShare_OP
1148  *
1149  * Description:
1150  *
1151  * Parameters:
1152  *
1153  * Returns:
1154  */
1155 static CCIMObjectPath *
get_Solaris_NFSShare_OP(char * nameKey)1156 get_Solaris_NFSShare_OP(char *nameKey) {
1157 	CCIMObjectPath		*nfsShareOP;
1158 	CCIMPropertyList	*nfsShareKeyPropList;
1159 	CCIMException		*ex;
1160 	char			*sysName;
1161 	int			err = 0;
1162 
1163 	nfsShareOP = cim_createEmptyObjectPath(SOLARIS_NFSSHARE);
1164 	if (nfsShareOP == NULL) {
1165 		ex = cim_getLastError();
1166 		util_handleError("SOLARIS_NFSSHAREENT::GET_NFSSHARE_OP",
1167 			CIM_ERR_FAILED, CREATE_EMPTY_OBJPATH_FAILURE, ex,
1168 			&err);
1169 		return ((CCIMObjectPath *)NULL);
1170 	}
1171 
1172 	sysName = (cimchar *)sys_get_hostname(&err);
1173 	if (sysName == NULL) {
1174 		util_handleError("SOLARIS_NFSSHAREENT::GET_NFSSHARE_OP",
1175 			CIM_ERR_FAILED, GET_HOSTNAME_FAILURE, NULL, &err);
1176 		cim_freeObjectPath(nfsShareOP);
1177 		return ((CCIMObjectPath *)NULL);
1178 	}
1179 
1180 	/*
1181 	 * Create the property list which to add all the key properties to and
1182 	 * which will be added to the object path.
1183 	 */
1184 	nfsShareKeyPropList = cim_createPropertyList();
1185 	if (nfsShareKeyPropList == NULL) {
1186 		ex = cim_getLastError();
1187 		util_handleError("SOLARIS_NFSSHAREENT::GET_NFSSHARE_OP",
1188 			CIM_ERR_FAILED, CREATE_PROPLIST_FAILURE, ex, &err);
1189 		cim_freeObjectPath(nfsShareOP);
1190 		return ((CCIMObjectPath *)NULL);
1191 	}
1192 
1193 	/*
1194 	 * add_property_to_list parameters are as follows:
1195 	 * 1.) property name (cimchar *),
1196 	 * 2.) property type (CIMType),
1197 	 * 3.) property value (cimchar *),
1198 	 * 4.) property object path for reference properties (CCIMObjectPath *),
1199 	 * 5.) is property a key? (CIMBool),
1200 	 * 6.) property list to add the property to (CCIMPropertyList *).
1201 	 */
1202 	nfsShareKeyPropList = add_property_to_list(NAME, string, nameKey,
1203 		NULL, cim_true, nfsShareKeyPropList);
1204 	if (nfsShareKeyPropList == NULL) {
1205 		cim_freeObjectPath(nfsShareOP);
1206 		return ((CCIMObjectPath *)NULL);
1207 	}
1208 
1209 	nfsShareKeyPropList = add_property_to_list(CREATION_CLASS, string,
1210 		SOLARIS_NFSSHARE, NULL, cim_true, nfsShareKeyPropList);
1211 	if (nfsShareKeyPropList == NULL) {
1212 		cim_freeObjectPath(nfsShareOP);
1213 		return ((CCIMObjectPath *)NULL);
1214 	}
1215 
1216 	nfsShareKeyPropList = add_property_to_list(SYS_CREATION_CLASS, string,
1217 		COMPUTER_SYSTEM, NULL, cim_true, nfsShareKeyPropList);
1218 	if (nfsShareKeyPropList == NULL) {
1219 		cim_freeObjectPath(nfsShareOP);
1220 		return ((CCIMObjectPath *)NULL);
1221 	}
1222 
1223 	nfsShareKeyPropList = add_property_to_list(SYSTEM, string, sysName,
1224 		NULL, cim_true, nfsShareKeyPropList);
1225 	if (nfsShareKeyPropList == NULL) {
1226 		free(sysName);
1227 		cim_freeObjectPath(nfsShareOP);
1228 		return ((CCIMObjectPath *)NULL);
1229 	}
1230 	free(sysName);
1231 
1232 	nfsShareOP = cim_addPropertyListToObjectPath(nfsShareOP,
1233 		nfsShareKeyPropList);
1234 	if (nfsShareOP == NULL) {
1235 		ex = cim_getLastError();
1236 		util_handleError("SOLARIS_NFSSHAREENT::GET_NFSSHARE_OP",
1237 			CIM_ERR_FAILED, ADD_PROP_TO_OBJPATH_FAILURE, ex, &err);
1238 		cim_freePropertyList(nfsShareKeyPropList);
1239 		return ((CCIMObjectPath *)NULL);
1240 	}
1241 
1242 	return (nfsShareOP);
1243 } /* get_Solaris_NFSShare_OP */
1244 
1245 /*
1246  * Method: get_Solaris_PersistentShare_Inst
1247  *
1248  * Description: Creates an instance of the Solaris_PersistentShare class.
1249  *
1250  * Parameters:
1251  *	- char *path - The value to be used for the SettingID property.
1252  *	- char *command - The value to be used for the Command property.
1253  *
1254  * Returns:
1255  *	- A pointer to a Solaris_PersistentShare instance.
1256  *	- Upon error, NULL is returned and the error is logged.
1257  */
1258 static CCIMInstance *
get_Solaris_PersistentShare_Inst(char * path,char * command)1259 get_Solaris_PersistentShare_Inst(char *path, char *command) {
1260 	CCIMInstance	*sharePersistInst;
1261 	CCIMException	*ex;
1262 	cimchar		*sysName;
1263 	int		err = 0;
1264 
1265 	sysName = (cimchar *)sys_get_hostname(&err);
1266 	if (sysName == NULL) {
1267 		util_handleError("SOLARIS_NFSSHAREENT::GET_SHAREPERSIST_INST",
1268 			CIM_ERR_FAILED, GET_HOSTNAME_FAILURE, NULL, &err);
1269 		return ((CCIMInstance *)NULL);
1270 	}
1271 
1272 	sharePersistInst = cim_createInstance(SOLARIS_PERSISTSHARE);
1273 	if (sharePersistInst == NULL) {
1274 		ex = cim_getLastError();
1275 		util_handleError("SOLARIS_NFSSHAREENT::GET_SHAREPERSIST_INST",
1276 			CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err);
1277 		return ((CCIMInstance *)NULL);
1278 	}
1279 
1280 	/*
1281 	 * add_property_to_instance parameters are as follows:
1282 	 * 1.) property name (cimchar *),
1283 	 * 2.) property type (CIMType),
1284 	 * 3.) property value (cimchar *),
1285 	 * 4.) property object path for reference properties (CCIMObjectPath *),
1286 	 * 5.) is property a key? (CIMBool),
1287 	 * 6.) instance to add the property to (CCIMInstance *).
1288 	 */
1289 	if (add_property_to_instance(CREATION_CLASS, string,
1290 		SOLARIS_PERSISTSHARE, NULL, cim_true, sharePersistInst)
1291 		== cim_false) {
1292 
1293 		cim_freeInstance(sharePersistInst);
1294 		return ((CCIMInstance *)NULL);
1295 	}
1296 
1297 	if (add_property_to_instance(SYS_CREATION_CLASS, string,
1298 		COMPUTER_SYSTEM, NULL, cim_true, sharePersistInst)
1299 		== cim_false) {
1300 
1301 		cim_freeInstance(sharePersistInst);
1302 		return ((CCIMInstance *)NULL);
1303 	}
1304 
1305 	if (add_property_to_instance(SETTING_ID, string, path,
1306 		NULL, cim_true, sharePersistInst) == cim_false) {
1307 
1308 		cim_freeInstance(sharePersistInst);
1309 		return ((CCIMInstance *)NULL);
1310 	}
1311 
1312 	if (add_property_to_instance(SYSTEM, string, sysName,
1313 		NULL, cim_true, sharePersistInst) == cim_false) {
1314 
1315 		free(sysName);
1316 		cim_freeInstance(sharePersistInst);
1317 		return ((CCIMInstance *)NULL);
1318 	}
1319 	free(sysName);
1320 
1321 	if (add_property_to_instance(COMMAND, string, command,
1322 		NULL, cim_false, sharePersistInst) == cim_false) {
1323 
1324 		cim_freeInstance(sharePersistInst);
1325 		return ((CCIMInstance *)NULL);
1326 	}
1327 
1328 	return (sharePersistInst);
1329 } /* get_Solaris_PersistentShare_Inst */
1330