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_NFSMount.h"
30 #include "nfs_keys.h"
31 #include "nfs_providers_msgstrings.h"
32 #include "messageStrings.h"
33 #include "nfs_provider_names.h"
34 #include "libfsmgt.h"
35 #include "cmdgen.h"
36 #include "util.h"
37 #include "nfsprov_methods.h"
38 #include "mountprov_methods.h"
39 #include "createprop_methods.h"
40 #include <sys/types.h>
41 #include <string.h>
42 #include <errno.h>
43 
44 /*
45  * Constants
46  */
47 #define	DELETE_VFSTAB_ENT_METHOD "deleteVfstabEntry"
48 #define	GET_DEF_SECMODE_METHOD "getDefaultNfsSecMode"
49 #define	GET_NET_CFG_LIST_METHOD "getNetCfgList"
50 #define	GET_NFS_SEC_LIST_METHOD "getNfsSecList"
51 #define	SHOW_EXPORTS_METHOD "showExports"
52 /*
53  * Private method declarations
54  */
55 
56 static CCIMInstanceList * create_nfsMount_associations(nfs_mntlist_t *mountList,
57 				int *errp);
58 static CCIMInstanceList * enumerate_mounts();
59 static CCIMObjectPath * get_Antecedent(cimchar *mount_point);
60 static CCIMInstanceList * get_associated_instances(nfs_mntlist_t *mountList,
61 				boolean_t resultIsAnt);
62 static nfs_mntlist_t *get_associated_nfs_mntlist(boolean_t isAntecedent,
63 			char *nameKeyValue);
64 static CCIMObjectPath * get_Dependent(nfs_mntlist_t *nfs_mount);
65 static char *get_devid(char *keyValue, int *errp);
66 static char *get_resource(char *keyValue, int *errp);
67 static CCIMPropertyList * populate_property_list(nfs_mntlist_t *nfs_mount);
68 static CIMBool populate_property_values(nfs_mntlist_t *nfs_mount,
69 		cimchar **propValues);
70 
71 /*
72  * Public methods
73  */
74 
75 /*
76  * Instance provider methods
77  */
78 
79 /*
80  * Method: cp_enumInstances_Solaris_NFSMount
81  *
82  * Description: Enumerates all of the nfs mounts on the host.  NFS mounts with
83  * "ignore" in the option string are ignored.
84  *
85  * Parameters:
86  *	- CCIMObjectPath* mountOP - The object path containing the name of the
87  *	class to which the instance to be enumerated belongs.
88  *
89  * Returns:
90  *	- A pointer to a list of Solaris_NFSMount instances.
91  *	- NULL if an error occurred or if there are no NFS mounts on the host.
92  *	In the case of an error, the error will be logged.
93  */
94 CCIMInstanceList *
cp_enumInstances_Solaris_NFSMount(CCIMObjectPath * mountOP)95 cp_enumInstances_Solaris_NFSMount(CCIMObjectPath* mountOP) {
96 	CCIMInstanceList *instList;
97 	int	err = 0;
98 
99 	/*
100 	 * First check if the CCIMObjectPath passed in is null.
101 	 */
102 	if (mountOP == NULL) {
103 		util_handleError(
104 			"SOLARIS_NFSMOUNT::ENUM_INSTANCES",
105 			CIM_ERR_INVALID_PARAMETER, NULL,
106 			NULL, &err);
107 		return ((CCIMInstanceList *)NULL);
108 	}
109 
110 	instList = enumerate_mounts();
111 	if (instList == NULL) {
112 		return ((CCIMInstanceList *)NULL);
113 	}
114 
115 	return (instList);
116 } /* cp_enumInstances_Solaris_NFSMount */
117 
118 /*
119  * Method: cp_getInstance_Solaris_NFSMount
120  *
121  * Description: Gets the instance corresponding to the Solaris_NFSMount
122  * object path passed in.
123  *
124  * Parameters:
125  *	- CCIMObjectPath* mountOP - An object path containing all the keys of
126  *	the instance that is supposed to be returned.
127  *
128  * Returns:
129  *	- A pointer to the Solaris_NFSMount instance corresponding to the object
130  *	path parameter.
131  *	- NULL if an error occurred or if the instance doesn't exist.  In the
132  *	case of an error, the error will be logged.
133  */
134 CCIMInstance *
cp_getInstance_Solaris_NFSMount(CCIMObjectPath * mountOP)135 cp_getInstance_Solaris_NFSMount(CCIMObjectPath* mountOP) {
136 	CCIMInstanceList	*instList;
137 	CCIMInstance		*inst;
138 	CCIMPropertyList	*mountPropList;
139 	CCIMObjectPath		*antOP, *depOP;
140 	int			err;
141 
142 	if (mountOP == NULL || mountOP->mKeyProperties == NULL) {
143 		util_handleError("SOLARIS_NFSMOUNT::GET_INSTANCE",
144 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
145 		return ((CCIMInstance *)NULL);
146 	}
147 
148 	mountPropList = mountOP->mKeyProperties;
149 	depOP = util_getKeyValue(mountPropList, nfsMountProps[DEP].type,
150 		nfsMountProps[DEP].name, &err);
151 	antOP = util_getKeyValue(mountPropList, nfsMountProps[ANT].type,
152 		nfsMountProps[ANT].name, &err);
153 
154 	if (depOP == NULL || antOP == NULL ||
155 		depOP->mKeyProperties == NULL ||
156 		antOP->mKeyProperties == NULL) {
157 
158 		util_handleError("SOLARIS_NFSMOUNT::GET_INSTANCE",
159 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
160 		return ((CCIMInstance *)NULL);
161 	}
162 
163 	instList = cp_enumInstances_Solaris_NFSMount(mountOP);
164 	if (instList == NULL) {
165 		/*
166 		 * Either an error occurred or we simply don't have any
167 		 * instances of Solaris_NFSMount on the system.  In the case,
168 		 * that an error occurred, it will be handled in
169 		 * cp_enumInstances_Solaris_NFSMount.
170 		 */
171 		return ((CCIMInstance *)NULL);
172 	}
173 
174 	inst = cim_getInstance(instList, mountOP);
175 
176 	cim_freeInstanceList(instList);
177 	return (inst);
178 } /* cp_getInstance_Solaris_NFSMount */
179 
180 /*
181  * Method: cp_createInstance_Solaris_NFSMount
182  *
183  * Description:
184  * Creates an instance of the Solaris_NFSMount class.
185  * A create instance will actually mount a file system on the current host by
186  * calling the cmd interface's cmd_execute_command_and_retrieve_string function.
187  *
188  * Parameters:
189  *	- CCIMObjectPath* nfsOP - An object path containing the information
190  *	needed about the class of which to have an instance created.
191  *	- CCIMInstance* nfsInst - The instance to be created.
192  *
193  * Returns:
194  *	- A pointer to a Solaris_NFSMount CCIMObjectPath which corresponds to
195  *	the mount that was created.
196  *	- Upon error, NULL is returned and the error will be logged.
197  */
198 CCIMObjectPath *
cp_createInstance_Solaris_NFSMount(CCIMObjectPath * nfsOP,CCIMInstance * nfsInst)199 cp_createInstance_Solaris_NFSMount(CCIMObjectPath* nfsOP,
200 	CCIMInstance* nfsInst) {
201 
202 	char			*cmd_return = NULL;
203 	char			*cmd;
204 	char			*resource;
205 	char			*mountp;
206 	char			*mntoptsParam, *timeParam;
207 	boolean_t		findOverlayParam;
208 	int			err = 0;
209 	nfs_mntlist_t		*mount;
210 	CCIMObjectPath		*nfsMountOP = NULL;
211 	CCIMObjectPath		*opParam;
212 	CCIMPropertyList	*propListParam;
213 	CCIMInstanceList	*nfsMountInstList;
214 	CCIMInstanceList	*currentInst;
215 	CCIMProperty		*mnt_prop;
216 	CCIMException		*ex;
217 
218 	/*
219 	 * First check if the CCIMInstance or CCIMObjectPath is null.
220 	 */
221 	if (nfsOP == NULL || nfsInst == NULL) {
222 		util_handleError(
223 			"SOLARIS_NFSMOUNT::CREATE_INSTANCE",
224 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
225 		return ((CCIMObjectPath *)NULL);
226 	}
227 
228 	/*
229 	 * Get the properties from the instance parameter in order to create
230 	 * an instance as defined. The properties will be used to create a
231 	 * mount command to execute.
232 	 */
233 
234 	/*
235 	 * The only properties required are resource and mount point.
236 	 * All other properties are not needed.  The defaults will be used.
237 	 */
238 	err = 0;
239 	opParam = NULL;
240 	propListParam = NULL;
241 	cmd = cmdgen_generate_command(CMDGEN_NFS_MOUNT, nfsInst, opParam,
242 		propListParam, &err);
243 	if (cmd == NULL || err != 0) {
244 		util_handleError("SOLARIS_NFSMOUNT::CREATE_INSTANCE",
245 			CIM_ERR_FAILED, CMDGEN_GEN_CMD_FAILURE, NULL, &err);
246 		return ((CCIMObjectPath *)NULL);
247 	}
248 
249 	cim_logDebug("cp_createInstance_Solaris_NFSMount",
250 		"cmd =%s", cmd);
251 	err = 0;
252 	cmd_return = cmd_execute_command_and_retrieve_string(cmd, &err);
253 	if (err != 0) {
254 		cim_logDebug("cp_createInstance_Solaris_NFSMount",
255 			"cmd_return =%s", cmd_return);
256 		/*
257 		 * An error occurred in executing the command.
258 		 */
259 		if (cmd_return != NULL) {
260 			util_handleError("SOLARIS_NFSMOUNT::CREATE_INSTANCE",
261 				CIM_ERR_FAILED, CMD_EXEC_RETR_STR_FAILURE,
262 				NULL, &err);
263 			free(cmd);
264 			free(cmd_return);
265 			return ((CCIMObjectPath *)NULL);
266 		} else {
267 			util_handleError("SOLARIS_NFSMOUNT::CREATE_INSTANCE",
268 				CIM_ERR_FAILED, CMD_EXEC_RETR_STR_FAILURE,
269 				NULL, &err);
270 			free(cmd);
271 			return ((CCIMObjectPath *)NULL);
272 		}
273 	}
274 
275 	free(cmd);
276 	if (cmd_return != NULL) {
277 		free(cmd_return);
278 	}
279 
280 	/*
281 	 * It should be certain that the mount got created if the
282 	 * cmd_execute_command_and_retrieve_string function succeded, but we
283 	 * will do a second check to make sure it did and to get the devid.
284 	 * We can determine if the mount exists by checking for a mount having
285 	 * the same resource/mount point as the instance passed in.
286 	 */
287 	mnt_prop = cim_getProperty(nfsInst, nfsMountProps[ANT].name);
288 	if (mnt_prop != NULL) {
289 		CCIMPropertyList	*antPropList;
290 
291 		antPropList = mnt_prop->mObjPathValue->mKeyProperties;
292 
293 		mountp = util_getKeyValue(antPropList, string, NAME, &err);
294 		if (mountp == NULL || err != 0) {
295 			util_handleError("SOLARIS_NFSMOUNT::CREATE_INSTANCE",
296 				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
297 			return ((CCIMObjectPath *)NULL);
298 		}
299 
300 		cim_freeProperty(mnt_prop);
301 
302 	}
303 
304 	mnt_prop = cim_getProperty(nfsInst, nfsMountProps[DEP].name);
305 	if (mnt_prop != NULL) {
306 		CCIMPropertyList	*depPropList;
307 
308 		depPropList = mnt_prop->mObjPathValue->mKeyProperties;
309 
310 		resource = util_getKeyValue(depPropList, string, NAME, &err);
311 		if (resource == NULL || err != 0) {
312 			util_handleError("SOLARIS_NFSMOUNT::CREATE_INSTANCE",
313 				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
314 			return ((CCIMObjectPath *)NULL);
315 		}
316 
317 		cim_freeProperty(mnt_prop);
318 	}
319 
320 	err = 0;
321 	mntoptsParam = NULL;
322 	timeParam = NULL;
323 	findOverlayParam = B_TRUE;
324 	mount = nfs_get_filtered_mount_list(resource, mountp, mntoptsParam,
325 		timeParam, findOverlayParam, &err);
326 	if (mount == NULL) {
327 		if (err != 0) {
328 			util_handleError("SOLARIS_NFSMOUNT::CREATE_INSTANCE",
329 				CIM_ERR_FAILED, NFS_GET_FILTERED_MOUNTS_FAILURE,
330 				NULL, &err);
331 		}
332 		cim_logDebug("cp_createInstance_Solaris_NFSMount",
333 			"Mount was not found w/ resource/mount point combo");
334 		/*
335 		 * There were no mounts found with the resource and mount point.
336 		 * We can assume that the mount wasn't created so return NULL.
337 		 */
338 		return ((CCIMObjectPath *)NULL);
339 	}
340 
341 	nfsMountInstList = create_nfsMount_associations(mount, &err);
342 	if (nfsMountInstList == NULL) {
343 		if (err != 0) {
344 			nfs_free_mntinfo_list(mount);
345 			util_handleError("SOLARIS_NFSMOUNT::CREATE_INSTANCE",
346 				CIM_ERR_FAILED, CREATE_NFSMOUNT_ASSOC_FAILURE,
347 				NULL, &err);
348 		}
349 		return ((CCIMObjectPath *)NULL);
350 	}
351 
352 	nfs_free_mntinfo_list(mount);
353 
354 	for (currentInst = nfsMountInstList; currentInst != NULL;
355 		currentInst = currentInst->mNext) {
356 
357 		/*
358 		 * Ideally there is only one instance, but with being able to
359 		 * overlay file systems there is a possibility that there may
360 		 * be multiple file systems with the same resource/mount point.
361 		 * If there are multiple instances in this list the last one
362 		 * returned will be used to create the return object path.
363 		 * That should be the most recently created mount.
364 		 */
365 		if (nfsMountOP != NULL) {
366 			cim_logDebug("cp_createInstance_Solaris_NFSMount",
367 				"More than one mount found.");
368 			cim_freeObjectPath(nfsMountOP);
369 		}
370 		nfsMountOP = cim_createObjectPath(currentInst->mDataObject);
371 		if (nfsMountOP == NULL) {
372 			ex = cim_getLastError();
373 			util_handleError("SOLARIS_NFSMOUNT::CREATE_INSTANCE",
374 				CIM_ERR_FAILED, CREATE_OBJECT_PATH_FAILURE,
375 				ex, &err);
376 			cim_freeInstanceList(nfsMountInstList);
377 			return ((CCIMObjectPath *)NULL);
378 		}
379 	}
380 
381 	cim_freeInstanceList(nfsMountInstList);
382 	return (nfsMountOP);
383 } /* cp_createInstance_Solaris_NFSMount */
384 
385 /*
386  * Method: cp_deleteInstance_Solaris_NFSMount
387  *
388  * Description: Deletes a Solaris_NFSMount instance.
389  * A delete instance will actually unmount a file system on the current host by
390  * calling the cmd interface's cmd_execute_command_and_retrieve_string function.
391  *
392  * Parameters:
393  *	- CCIMObjectPath* nfsOP - The object path containing all information
394  *	needed to delete the appropriate instance.
395  *
396  * Returns:
397  *	- A CIMBool value corresponding to whether or not the instance was
398  *	deleted.  cim_true will be returned if the delete was successful,
399  *	cim_false will be returned if the delete failed.
400  */
401 CIMBool
cp_deleteInstance_Solaris_NFSMount(CCIMObjectPath * nfsOP)402 cp_deleteInstance_Solaris_NFSMount(CCIMObjectPath* nfsOP) {
403 
404 	CCIMInstance		*instParam;
405 	CCIMPropertyList	*propListParam;
406 	char			*cmd;
407 	char			*cmd_return = NULL;
408 	int			err = 0;
409 
410 	if (nfsOP == NULL) {
411 		util_handleError("SOLARIS_NFSMOUNT::DELETE_INSTANCE",
412 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
413 		return (cim_false);
414 	}
415 
416 	/*
417 	 * Get the mount that is to be deleted and generate the command.
418 	 */
419 	instParam = NULL;
420 	propListParam = NULL;
421 	cmd = cmdgen_generate_command(CMDGEN_NFS_UMOUNT, instParam, nfsOP,
422 		propListParam, &err);
423 	if (cmd == NULL || err != 0) {
424 		util_handleError("SOLARIS_NFSMOUNT::DELETE_INSTANCE",
425 			CIM_ERR_FAILED, CMDGEN_GEN_CMD_FAILURE, NULL, &err);
426 		return (cim_false);
427 	}
428 
429 	/*
430 	 * Execute the umount command
431 	 */
432 	err = 0;
433 	cmd_return = cmd_execute_command_and_retrieve_string(cmd, &err);
434 	if (err != 0) {
435 		/*
436 		 * The command execution failed.
437 		 */
438 		if (cmd_return != NULL) {
439 			util_handleError("SOLARIS_NFSMOUNT::DELETE_INSTANCE",
440 				CIM_ERR_FAILED, CMD_EXEC_RETR_STR_FAILURE,
441 				NULL, &err);
442 			free(cmd);
443 			free(cmd_return);
444 			return (cim_false);
445 		} else {
446 			util_handleError("SOLARIS_NFSMOUNT::DELETE_INSTANCE",
447 				CIM_ERR_FAILED, CMD_EXEC_RETR_STR_FAILURE,
448 				NULL, &err);
449 			free(cmd);
450 			return (cim_false);
451 		}
452 	}
453 
454 	free(cmd);
455 	if (cmd_return != NULL)
456 		free(cmd_return);
457 
458 	return (cim_true);
459 } /* cp_deleteInstance_Solaris_NFSMount */
460 
461 /*
462  * Method: cp_enumInstanceNames_Solaris_NFSMount
463  *
464  * Description: Enumerates all of the nfs mounts on the host.  NFS mounts with
465  * "ignore" in the option string are ignored.
466  *
467  * Parameters:
468  *	- CCIMObjectPath* mountOP - An object path containing the name of the
469  *	class of which to enumerate instances of.
470  *
471  * Returns:
472  *	- A pointer to a list of Solaris_NFSMount object paths.
473  *	- NULL if an error occurred or if there are no NFS mounts on the host.
474  *	In the case of an error, the error will be logged.
475  */
476 CCIMObjectPathList *
cp_enumInstanceNames_Solaris_NFSMount(CCIMObjectPath * mountOP)477 cp_enumInstanceNames_Solaris_NFSMount(CCIMObjectPath* mountOP) {
478 	CCIMInstanceList	*instList;
479 	CCIMObjectPathList	*OPList;
480 	int			err = 0;
481 	/*
482 	 * First check if the CCIMObjectPath parameter is null.
483 	 */
484 	if (mountOP == NULL) {
485 		util_handleError("SOLARIS_NFSMOUNT::ENUM_INSTANCENAMES",
486 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
487 		return ((CCIMObjectPathList *)NULL);
488 	}
489 
490 	instList = cp_enumInstances_Solaris_NFSMount(mountOP);
491 	if (instList == NULL)
492 	{
493 		/*
494 		 * Failure...or there are no NFS mount instances.
495 		 */
496 		return ((CCIMObjectPathList *)NULL);
497 	}
498 
499 	OPList = cim_createObjectPathList(instList);
500 
501 	cim_freeInstanceList(instList);
502 	/*
503 	 * If an error occurred in cim_createObjectPathList it will be handled
504 	 * there.
505 	 */
506 	return (OPList);
507 } /* cp_enumInstanceNames_Solaris_NFSMount */
508 
509 /*
510  * Method: cp_execQuery_Solaris_NFSMount
511  *
512  * Description: Queries the nfs mounts on the host to find those that meet the
513  * search criteria.
514  *
515  * Parameters:
516  *	- CCIMObjectPath *hostedShareOP - An object path containing the name of
517  *	the class to query.
518  *	- char *selectClause - Not used.
519  *	- char *nonJoinExp - Not used.
520  *	- char *queryExp - Not used.
521  *	- char *queryLang - Not used.
522  *
523  * Returns:
524  *	- A pointer to a list of Solaris_NFSMount instances that match the
525  *	criteria.
526  *	- NULL if an error occurred or if there are no Solaris_NFSMount
527  *	instances that match the criteria.  In the case of an error, the error
528  *	will be logged.
529  *
530  * NOTE: Currently, there is no WQL parser for the C providers. As a result,
531  * what is returned to the CIMOM is a list of instances with
532  * a NULL value at the beginning of the list. This NULL value indicates
533  * to the CIMOM that it must do the filtering for the client.
534  */
535 /* ARGSUSED */
536 CCIMInstanceList *
cp_execQuery_Solaris_NFSMount(CCIMObjectPath * mountOP,char * selectClause,char * nonJoinExp,char * queryExp,char * queryLang)537 cp_execQuery_Solaris_NFSMount(CCIMObjectPath *mountOP, char *selectClause,
538 	char *nonJoinExp, char *queryExp, char *queryLang) {
539 
540 	CCIMInstance		*emptyInst;
541 	CCIMInstanceList	*nfsMountInstList;
542 	CCIMException		*ex;
543 	int			err = 0;
544 
545 	if (mountOP == NULL) {
546 		util_handleError("SOLARIS_NFSMOUNT::EXEC_QUERY",
547 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
548 		return ((CCIMInstanceList *)NULL);
549 	}
550 
551 	nfsMountInstList = cp_enumInstances_Solaris_NFSMount(mountOP);
552 
553 	if (nfsMountInstList == NULL) {
554 		return ((CCIMInstanceList *)NULL);
555 	}
556 
557 	emptyInst = cim_createInstance("");
558 	if (emptyInst == NULL) {
559 		ex = cim_getLastError();
560 		util_handleError("SOLARIS_NFSMOUNT::EXEC_QUERY",
561 			CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err);
562 		return ((CCIMInstanceList *)NULL);
563 	}
564 
565 	nfsMountInstList = cim_prependInstance(nfsMountInstList, emptyInst);
566 	if (nfsMountInstList == NULL) {
567 		ex = cim_getLastError();
568 		util_handleError("SOLARIS_NFSMOUNT::EXEC_QUERY",
569 			CIM_ERR_FAILED, PREPEND_INSTANCE_FAILURE, ex, &err);
570 		cim_freeInstance(emptyInst);
571 		return ((CCIMInstanceList *)NULL);
572 	}
573 
574 	return (nfsMountInstList);
575 } /* cp_execQuery_Solaris_NFSMount */
576 
577 /*
578  * Method: cp_setInstance_Solaris_NFSMount
579  *
580  * Description: This method is not supported.  This is not allowed because in
581  * order to change the properties of a mount on the host, the mount must be
582  * unmounted and mounted with the new properties.  This behavior is not
583  * appropriate for the set instance.  If the client wants to change the
584  * properties of a mount they must delete the old instance and create a
585  * new one with the desired properties.
586  *
587  * Parameters:
588  *	- CCIMObjectPath *pOP - An object path containing the name of the class
589  *	of which to set the instance.
590  *	- CCIMInstance *pInst - Not used.
591  *
592  * Returns:
593  *	- cim_false is returned every time since the method is not supported.
594  */
595 /* ARGSUSED */
596 CIMBool
cp_setInstance_Solaris_NFSMount(CCIMObjectPath * pOP,CCIMInstance * pInst)597 cp_setInstance_Solaris_NFSMount(CCIMObjectPath* pOP, CCIMInstance* pInst) {
598 	int	err = 0;
599 
600 	util_handleError("SOLARIS_NFSMOUNT::SET_INSTANCE",
601 		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
602 
603 	return (cim_false);
604 } /* cp_setInstance_Solaris_NFSMount */
605 
606 /*
607  * Method: cp_setInstanceWithList_Solaris_NFSMount
608  *
609  * Description: This method is not supported.  This is not allowed because in
610  * order to change the properties of a mount on the host, the mount must be
611  * unmounted and mounted with the new properties.  This behavior is not
612  * appropriate for the set instance.  If the client wants to change the
613  * properties of a mount they must delete the old instance and create a
614  * new one with the desired properties.
615  *
616  * Parameters:
617  *	- CCIMObjectPath *hostedShareOP - The object path containing the name
618  *	of the class of which to set the instance.
619  *	- CCIMInstance *hostedShareInst - Not used.
620  *	- char **props - Not used.
621  *	- int num_props - Not used.
622  *
623  * Returns:
624  *	- cim_false is returned every time since the method is not supported.
625  */
626 /* ARGSUSED */
627 CIMBool
cp_setInstanceWithList_Solaris_NFSMount(CCIMObjectPath * mountOP,CCIMInstance * mountInst,char ** props,int num_props)628 cp_setInstanceWithList_Solaris_NFSMount(CCIMObjectPath* mountOP,
629 					CCIMInstance* mountInst,
630 					char **props, int num_props) {
631 	int	err = 0;
632 
633 	util_handleError("SOLARIS_NFSMOUNT::SET_INSTANCE",
634 		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
635 
636 	return (cim_false);
637 
638 } /* cp_setInstanceWithList_Solaris_NFSMount */
639 
640 /*
641  * Associator provider methods
642  */
643 
644 /*
645  * Method: cp_associators_Solaris_NFSMount
646  *
647  * Description: Returns the instances associated, via the Solaris_NFSMount
648  * association, to the pObjectName parameter.
649  *
650  * Parameters:
651  *	- CCIMObjectPath *pAssocName - An object path containing the name of
652  *	the association that the caller is trying to reach.
653  *	- CCIMObjectPath *pObjectName - The object path containing information
654  *	(Class Name, Key Properties) about the object whose associated objects
655  *	are to be returned.
656  *	- char *pResultClass - If specified, only return instances that are of
657  *	this class type.
658  *	- char *pRole - If specified, this is the role of the pObjectName
659  *	object path passed in.  If this is not valid, NULL is returned.
660  *	- char *pResultRole - If specified, only return instances that are
661  *	playing this role in the association.
662  *
663  * Returns:
664  *	- A pointer to a list of Solaris_NFS (if pRole == Antecedent &&
665  *	pObjectName is a Solaris_Directory object path) or Solaris_Directory
666  *	(if pRole == DEPENDENT && pObjectName is a Solaris_NFS object path)
667  *	instances which are associated to the pObjectName parameter.
668  *	- NULL if an error occurred or if there are no instances associated to
669  *	the pObjectName passed in.  In the case of an error, the error will be
670  *	logged.
671  */
672 /* ARGSUSED */
673 CCIMInstanceList *
cp_associators_Solaris_NFSMount(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pResultClass,char * pRole,char * pResultRole)674 cp_associators_Solaris_NFSMount(CCIMObjectPath *pAssocName,
675 	CCIMObjectPath *pObjectName, char *pResultClass, char *pRole,
676 	char *pResultRole) {
677 
678 	CCIMInstanceList	*returnInstList;
679 	CCIMPropertyList	*propList;
680 	nfs_mntlist_t		*mountList;
681 	cimchar			*name;
682 	boolean_t		isAntecedent = B_FALSE;
683 	int			err = 0;
684 
685 	/*
686 	 * Check if the needed parameters are null.
687 	 */
688 	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
689 		util_handleError("SOLARIS_NFSMOUNT::ASSOCIATORS",
690 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
691 		return ((CCIMInstanceList *)NULL);
692 	}
693 
694 	/*
695 	 * The Name key property is the defining property for each the
696 	 * Antecedent (Solaris_Directory) and the Dependent (Solaris_NFS)
697 	 * so retrieve that property.
698 	 */
699 	propList = pObjectName->mKeyProperties;
700 	name = (cimchar *)util_getKeyValue(propList, string, NAME, &err);
701 
702 	if (name == NULL || err != 0) {
703 		util_handleError("SOLARIS_NFSMOUNT::ASSOCIATORS",
704 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
705 		return ((CCIMInstanceList *)NULL);
706 	}
707 
708 	/*
709 	 * Determine whether pObjectName is the Antecedent or the Dependent
710 	 * of the association.  Antecedent = Solaris_Directory,
711 	 * Dependent = Solaris_NFS
712 	 */
713 	if ((strcasecmp(pObjectName->mName, SOLARIS_DIR) == 0)) {
714 		isAntecedent = B_TRUE;
715 		/*
716 		 * If a value was passed in with pRole and it does not match
717 		 * the role that pObjectName actually is then log an invalid
718 		 * param error.
719 		 */
720 		if (pRole != NULL && (strcasecmp(pRole, ANTECEDENT) != 0)) {
721 			util_handleError("SOLARIS_NFSMOUNT::ASSOCIATORS",
722 				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
723 			return ((CCIMInstanceList *)NULL);
724 		}
725 	} else {
726 		isAntecedent = B_FALSE;
727 		if (pRole != NULL && (strcasecmp(pRole, DEPENDENT) != 0)) {
728 			util_handleError("SOLARIS_NFSMOUNT::ASSOCIATORS",
729 				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
730 			return ((CCIMInstanceList *)NULL);
731 		}
732 	}
733 
734 	mountList = get_associated_nfs_mntlist(isAntecedent, name);
735 	if (mountList == NULL)
736 		return ((CCIMInstanceList *)NULL);
737 	returnInstList = get_associated_instances(mountList, (!isAntecedent));
738 	nfs_free_mntinfo_list(mountList);
739 
740 	return (returnInstList);
741 } /* cp_associators_Solaris_NFSMount */
742 
743 /*
744  * Method: cp_associatorNames_Solaris_NFSMount
745  *
746  * Description: Returns the object paths of the instances on the other side of
747  * the association which are associated via the Solaris_NFSMount association
748  * and having the passed in parameter, pObjectName, as the opposite key.
749  *
750  * Parameters:
751  *	- CCIMObjectPath *pAssocName - An object path containing information
752  *	about the association that the caller is trying to reach.
753  *	- CCIMObjectPath *pObjectName - The object path which contains the
754  *	information on whose associated objects are to be returned.
755  *	- char *pResultClass - If specified, only return instances that are of
756  *	this class type.
757  *	- char *pRole - If specified, this is the role of the pObjectName
758  *	object path passed in.  If this is not valid, NULL is returned.
759  *	- char *pResultRole - If specified, only return instances that are
760  *	playing this role in the association.
761  *
762  * Returns:
763  *	- A pointer to a list of Solaris_NFS (if pRole == Antecedent &&
764  *	pObjectName is a Solaris_Directory object path) or Solaris_Directory
765  *	(if pRole == DEPENDENT && pObjectName is a Solaris_NFS object path)
766  *	object paths which are associated to the pObjectName parameter.
767  *	- NULL if an error occurred or if there are no instances associated to
768  *	the pObjectName passed in.  In the case of an error, the error will be
769  *	logged.
770  */
771 CCIMObjectPathList *
cp_associatorNames_Solaris_NFSMount(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pResultClass,char * pRole,char * pResultRole)772 cp_associatorNames_Solaris_NFSMount(CCIMObjectPath *pAssocName,
773 	CCIMObjectPath *pObjectName, char *pResultClass, char *pRole,
774 	char *pResultRole) {
775 
776 	CCIMInstanceList	*instList;
777 	CCIMObjectPathList	*objPathList;
778 	int			err = 0;
779 
780 	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
781 		util_handleError("SOLARIS_NFSMOUNT::ASSOCIATOR_NAMES",
782 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
783 		return ((CCIMObjectPathList *)NULL);
784 	}
785 
786 	instList = cp_associators_Solaris_NFSMount(pAssocName, pObjectName,
787 		pResultClass, pRole, pResultRole);
788 
789 	if (instList != NULL) {
790 		objPathList = cim_createObjectPathList(instList);
791 		cim_freeInstanceList(instList);
792 	}
793 
794 	return (objPathList);
795 } /* cp_associatorNames_Solaris_NFSMount */
796 
797 /*
798  * Method: cp_references_Solaris_NFSMount
799  *
800  * Description: Returns the Solaris_NFSMount instances that have the passed in
801  * parameter, pObjectName, as one of it's keys.
802  *
803  * Parameters:
804  *	- CCIMObjectPath *pAssocName - An object path containing information
805  *	about the association that the caller is trying to reach.
806  *	- CCIMObjectPath *pObjectName - The object path which contains the
807  *	information on whose associated objects are to be returned.
808  *	- char *pRole - If specified, this is the role of the pObjectName
809  *	object path passed in.  If this is not valid, NULL is returned.
810  *
811  * Returns:
812  *	- A pointer to a list of Solaris_NFSMount instances.
813  *	- NULL if an error occurred or if there are no Solaris_NFSMount
814  *	instances having pObjectName as one of it's keys.
815  */
816 /* ARGSUSED */
817 CCIMInstanceList *
cp_references_Solaris_NFSMount(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pRole)818 cp_references_Solaris_NFSMount(CCIMObjectPath *pAssocName,
819 	CCIMObjectPath *pObjectName, char *pRole) {
820 
821 	CCIMInstanceList	*instList;
822 	CCIMPropertyList	*propList;
823 	nfs_mntlist_t		*mountList;
824 	char			*name;
825 	boolean_t		isAntecedent = B_FALSE;
826 	int			err = 0;
827 
828 	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
829 		util_handleError("SOLARIS_NFSMOUNT::REFERENCES",
830 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
831 		return ((CCIMInstanceList *)NULL);
832 	}
833 
834 	/*
835 	 * The Name key property is the defining property for each the
836 	 * Antecedent (Solaris_Directory) and the Dependent (Solaris_NFS)
837 	 * so retrieve that property.
838 	 */
839 	propList = pObjectName->mKeyProperties;
840 	name = (cimchar *)util_getKeyValue(propList, string, NAME, &err);
841 
842 	if (name == NULL || err != 0) {
843 		/*
844 		 * The object path passed in does not have the appropriate
845 		 * information.
846 		 */
847 		util_handleError("SOLARIS_NFSMOUNT::ASSOCIATORS",
848 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
849 		return ((CCIMInstanceList *)NULL);
850 	}
851 
852 	if ((strcasecmp(pObjectName->mName, SOLARIS_DIR) == 0)) {
853 		isAntecedent = B_TRUE;
854 		/*
855 		 * If a value was passed in with pRole and it does not match
856 		 * the role that pObjectName actually is then log an invalid
857 		 * param error.
858 		 */
859 		if (pRole != NULL && (strcasecmp(pRole, ANTECEDENT) != 0)) {
860 			util_handleError("SOLARIS_NFSMOUNT::REFERENCES",
861 				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
862 			return ((CCIMInstanceList *)NULL);
863 		}
864 	} else {
865 		isAntecedent = B_FALSE;
866 		if (pRole != NULL && (strcasecmp(pRole, DEPENDENT) != 0)) {
867 			util_handleError("SOLARIS_NFSMOUNT::REFERENCES",
868 				CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
869 			return ((CCIMInstanceList *)NULL);
870 		}
871 	}
872 
873 	mountList = get_associated_nfs_mntlist(isAntecedent, name);
874 	if (mountList == NULL)
875 		return ((CCIMInstanceList *)NULL);
876 	instList = create_nfsMount_associations(mountList, &err);
877 
878 	nfs_free_mntinfo_list(mountList);
879 
880 	return (instList);
881 } /* cp_references_Solaris_NFSMount */
882 
883 /*
884  * Method: cp_referenceNames_Solaris_NFSMount
885  *
886  * Description: Returns the Solaris_NFSMount object paths of the instances
887  * that have the passed in parameter, pObjectName, as one of it's keys.
888  *
889  * Parameters:
890  *	- CCIMObjectPath *pAssocName - An object path containing information
891  *	about the association that the caller is trying to reach.
892  *	- CCIMObjectPath *pObjectName - The object path which contains the
893  *	information on whose associated objects are to be returned.
894  *	- char *pRole - If specified, this is the role of the pObjectName
895  *	object path passed in.  If this is not valid, NULL is returned.
896  *
897  * Returns:
898  *	- A pointer to a list of Solaris_NFSMount object paths.
899  *	- NULL if an error occurred or if there are no Solaris_NFSMount
900  *	instances having pObjectName as one of it's keys.
901  */
902 CCIMObjectPathList *
cp_referenceNames_Solaris_NFSMount(CCIMObjectPath * pAssocName,CCIMObjectPath * pObjectName,char * pRole)903 cp_referenceNames_Solaris_NFSMount(CCIMObjectPath *pAssocName,
904 	CCIMObjectPath *pObjectName, char *pRole) {
905 
906 	CCIMInstanceList	*nfsMountInstList;
907 	CCIMObjectPathList	*nfsMountOPList;
908 	CCIMException		*ex;
909 	int			err = 0;
910 
911 	if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) {
912 		util_handleError("SOLARIS_NFSMOUNT::REFERENCES_NAMES",
913 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
914 		return ((CCIMObjectPathList *)NULL);
915 	}
916 
917 	nfsMountInstList = cp_references_Solaris_NFSMount(pAssocName,
918 		pObjectName, pRole);
919 
920 	if (nfsMountInstList == NULL) {
921 		return ((CCIMObjectPathList *)NULL);
922 	}
923 
924 	nfsMountOPList = cim_createObjectPathList(nfsMountInstList);
925 	if (nfsMountOPList == NULL) {
926 		ex = cim_getLastError();
927 		util_handleError("SOLARIS_NFSMOUNT::REFERENCE_NAMES",
928 			CIM_ERR_FAILED, CREATE_OBJECT_LIST_FAILURE, ex, &err);
929 		cim_freeInstanceList(nfsMountInstList);
930 		return ((CCIMObjectPathList *)NULL);
931 	}
932 
933 	cim_freeInstanceList(nfsMountInstList);
934 
935 	return (nfsMountOPList);
936 } /* cp_referenceNames_Solaris_NFSMount */
937 
938 /*
939  * Property provider methods
940  */
941 
942 /*
943  * Method: cp_getProperty_Solaris_NFSMount
944  *
945  * Description: Retrieves a certain property from the instance of
946  * Solaris_NFSMount on the host that is described by the parameter pOP.
947  *
948  * Parameters:
949  *	- CCIMObjectPath *pOP - The object path containing all the
950  *	information needed to find the instance in which the property is to
951  *	be returned.
952  *	- cimchar *pPropName - The name of the property to be found.
953  *
954  * Returns:
955  *	- A pointer to the property corresponding to the name passed in with
956  *	pPropName.
957  *	- NULL if an error occurred or if the property doesn't exist.  In the
958  *	case of an error, the error will be logged.
959  */
960 CCIMProperty *
cp_getProperty_Solaris_NFSMount(CCIMObjectPath * pOP,cimchar * pPropName)961 cp_getProperty_Solaris_NFSMount(CCIMObjectPath *pOP, cimchar *pPropName) {
962 	CCIMInstance	*nfsMountInst;
963 	CCIMProperty	*nfsMountProp;
964 	int		err = 0;
965 
966 	if (pOP == NULL || pPropName == NULL) {
967 		util_handleError("SOLARIS_NFSMOUNT::GET_PROPERTY",
968 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
969 		return ((CCIMProperty *)NULL);
970 	}
971 
972 	nfsMountInst = cp_getInstance_Solaris_NFSMount(pOP);
973 	if (nfsMountInst == NULL) {
974 		return ((CCIMProperty *)NULL);
975 	}
976 
977 	nfsMountProp = cim_getProperty(nfsMountInst, pPropName);
978 
979 	cim_freeInstance(nfsMountInst);
980 	/*
981 	 * If an error occurred in cim_getProperty it will be handled there.
982 	 */
983 	return (nfsMountProp);
984 } /* cp_getProperty_Solaris_NFSMount */
985 
986 /*
987  * Method: cp_setProperty_Solaris_NFSMount
988  *
989  * Description: This method is not supported.  This is not allowed because in
990  * order to change the properties of a mount on the host, the mount must be
991  * unmounted and mounted with the new properties.  This behavior is not
992  * appropriate for the set property.  If the client wants to change the
993  * properties of a mount they must delete the old instance and create a
994  * new one with the desired properties.
995  *
996  * Parameters:
997  *	- CCIMObjectPath *pOP - Not used.
998  *	- CCIMProperty *pProp - Not used.
999  *
1000  * Returns:
1001  *	- cim_false is returned every time since the method is not supported.
1002  */
1003 /* ARGSUSED */
1004 CIMBool
cp_setProperty_Solaris_NFSMount(CCIMObjectPath * pOP,CCIMProperty * pProp)1005 cp_setProperty_Solaris_NFSMount(CCIMObjectPath *pOP, CCIMProperty *pProp) {
1006 	int	err = 0;
1007 
1008 	util_handleError("SOLARIS_NFSMOUNT::SET_PROPERTY",
1009 		CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err);
1010 
1011 	return (cim_false);
1012 } /* cp_setProperty_Solaris_NFSMount */
1013 
1014 /*
1015  * Method provider methods
1016  */
1017 
1018 /*
1019  * Method: cp_invokeMethod_Solaris_NFSMount
1020  *
1021  * Description: Routes the cp_invokeMethod_Solaris_NFSMount calls to the
1022  * correct Solaris_NFSMount methods.
1023  *
1024  * Parameters:
1025  *	- CCIMObjectPath *pOP - The object path containing needed information
1026  *	about the class that is to getting methods invoked.
1027  *	- cimchar *functionName - The name of the function to be invoked.
1028  *	- CCIMPropertyList *inParams - The input parameters to the function.
1029  *	- CCIMPropertyList *outParams - The output parameters from the function.
1030  *
1031  * Returns:
1032  *	- A pointer to a property which indicates success or failure of the
1033  *	function.  1 for success, 0 for failure.
1034  *	- Upon error, NULL is returned and the error is logged.
1035  */
1036 /* ARGSUSED */
1037 CCIMProperty *
cp_invokeMethod_Solaris_NFSMount(CCIMObjectPath * pOP,cimchar * functionName,CCIMPropertyList * inParams,CCIMPropertyList * outParams)1038 cp_invokeMethod_Solaris_NFSMount(CCIMObjectPath *pOP, cimchar *functionName,
1039 	CCIMPropertyList *inParams, CCIMPropertyList *outParams) {
1040 
1041 	int		err = 0;
1042 	CCIMProperty	*retVal;
1043 
1044 	if (pOP == NULL || functionName == NULL) {
1045 		util_handleError("SOLARIS_NFSMOUNT::INVOKE_METHOD",
1046 			CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err);
1047 		return ((CCIMProperty *)NULL);
1048 	}
1049 	cim_logDebug("cp_invokeMethod_Solaris_NFSMount",
1050 		"Invoking %s", functionName);
1051 	/*
1052 	 * Determine what method is being called.
1053 	 */
1054 	if (strcasecmp(functionName, GET_NET_CFG_LIST_METHOD) == 0) {
1055 		retVal = get_netconfig_list(outParams);
1056 	} else if (strcasecmp(functionName, GET_NFS_SEC_LIST_METHOD) == 0) {
1057 		retVal = get_nfssec_list(outParams);
1058 	} else if (strcasecmp(functionName, GET_DEF_SECMODE_METHOD) == 0) {
1059 		retVal = get_default_secmode(outParams);
1060 	} else if (strcasecmp(functionName, SHOW_EXPORTS_METHOD) == 0) {
1061 		retVal = show_exports(inParams, outParams);
1062 	} else if (strcasecmp(functionName, DELETE_VFSTAB_ENT_METHOD) == 0) {
1063 		retVal = delete_vfstab_entry(inParams);
1064 	} else {
1065 		/*
1066 		 * No such method name.
1067 		 */
1068 		util_handleError("SOLARIS_NFSMOUNT::INVOKE_METHOD",
1069 			CIM_ERR_FAILED, NO_SUCH_METHOD, NULL, &err);
1070 		return ((CCIMProperty *)NULL);
1071 	}
1072 
1073 	return (retVal);
1074 } /* cp_invokeMethod_Solaris_NFSMount */
1075 
1076 /*
1077  * Private Methods
1078  */
1079 
1080 /*
1081  * Method: create_nfsMount_associations
1082  *
1083  * Description: Creates Solaris_NFSMount associations out of the information
1084  * gathered from all the NFS mounts on the host.
1085  *
1086  * Parameters:
1087  *	- nfs_mntlist_t *mountList - The list of nfs mounts on the host.
1088  *	- int *errp - The error pointer.  If an error occurs, this will be a
1089  * 	non-zero number.
1090  *
1091  * Returns:
1092  *	- A pointer to a list of all the Solaris_NFSMount instances on the host.
1093  *	- NULL if an error occurred or if there aren't any NFS mounts on the
1094  *	host.  In the case of an error, the error will be logged.
1095  */
1096 static CCIMInstanceList *
create_nfsMount_associations(nfs_mntlist_t * mountList,int * errp)1097 create_nfsMount_associations(nfs_mntlist_t *mountList, int *errp) {
1098 	nfs_mntlist_t		*currentMnt;
1099 	CCIMInstanceList	*nfsMountInstList;
1100 	CCIMException		*ex;
1101 
1102 	nfsMountInstList = cim_createInstanceList();
1103 	if (nfsMountInstList == NULL) {
1104 		ex = cim_getLastError();
1105 		util_handleError("SOLARIS_NFSMOUNT::CREATE_NFSMOUNT_ASSOC",
1106 			CIM_ERR_FAILED, CREATE_INSTANCE_LIST_FAILURE, ex,
1107 			errp);
1108 		return ((CCIMInstanceList *)NULL);
1109 	}
1110 
1111 	for (currentMnt = mountList; currentMnt != NULL;
1112 		currentMnt = currentMnt->next) {
1113 
1114 		CCIMInstance		*nfsMountInst;
1115 		CCIMPropertyList	*nfsMountPropList;
1116 
1117 		/*
1118 		 * Create the Solaris_NFSMount instance and add the properties
1119 		 * to the instance.
1120 		 */
1121 		nfsMountInst = cim_createInstance(SOLARIS_NFSMOUNT);
1122 		if (nfsMountInst == NULL) {
1123 			ex = cim_getLastError();
1124 			util_handleError(
1125 				"SOLARIS_NFSMOUNT::CREATE_NFSMOUNT_ASSOC",
1126 				CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE,
1127 				ex, errp);
1128 			cim_freeInstanceList(nfsMountInstList);
1129 			return ((CCIMInstanceList *)NULL);
1130 		}
1131 
1132 		nfsMountPropList = populate_property_list(currentMnt);
1133 		if (nfsMountPropList == NULL) {
1134 			/*
1135 			 * An error was encountered, but it was logged in
1136 			 * populate_property_list so just return null.
1137 			 */
1138 			cim_freeInstanceList(nfsMountInstList);
1139 			cim_freeInstance(nfsMountInst);
1140 			return ((CCIMInstanceList *)NULL);
1141 		}
1142 
1143 		/*
1144 		 * Add the returned property list to the instance.
1145 		 */
1146 		nfsMountInst = cim_addPropertyListToInstance(nfsMountInst,
1147 			nfsMountPropList);
1148 		if (nfsMountInst == NULL) {
1149 			ex = cim_getLastError();
1150 			util_handleError(
1151 				"SOLARIS_NFSMOUNT::CREATE_NFSMOUNT_ASSOC",
1152 				CIM_ERR_FAILED, PROPLIST_TO_INSTANCE_FAILURE,
1153 				ex, errp);
1154 			cim_freeInstanceList(nfsMountInstList);
1155 			cim_freePropertyList(nfsMountPropList);
1156 			return ((CCIMInstanceList *)NULL);
1157 		}
1158 
1159 		/*
1160 		 * Add the instance to the instance list.
1161 		 */
1162 		nfsMountInstList = cim_addInstance(nfsMountInstList,
1163 			nfsMountInst);
1164 		if (nfsMountInstList == NULL) {
1165 			ex = cim_getLastError();
1166 			util_handleError(
1167 				"SOLARIS_NFSMOUNT::CREATE_NFSMOUNT_ASSOC",
1168 				CIM_ERR_FAILED, ADD_INSTANCE_FAILURE,
1169 				ex, errp);
1170 			/*
1171 			 * Freeing the instance will free the property list
1172 			 * that was added to it.  There is no need to free
1173 			 * the property list separately.
1174 			 */
1175 			cim_freeInstance(nfsMountInst);
1176 			return ((CCIMInstanceList *)NULL);
1177 		}
1178 	}
1179 
1180 	return (nfsMountInstList);
1181 } /* create_nfsMount_associations */
1182 
1183 /*
1184  * Method: enumerate_mounts
1185  *
1186  * Description: Enumerates the NFS mounts on the host by using the
1187  * nfs_mntinfo nfs_get_mount_list method.
1188  *
1189  * Parameters:
1190  *	- NONE
1191  *
1192  * Returns:
1193  *	- A pointer to a list of all the Solaris_NFSMount instances on the host.
1194  *	- NULL if an error occurred or if there are no NFS mounts on the system.
1195  *	In the case of an error, the error will be logged.
1196  */
1197 static CCIMInstanceList *
enumerate_mounts()1198 enumerate_mounts() {
1199 	int get_mntlist_err = 0;
1200 	int err = 0;
1201 	nfs_mntlist_t 	*nfs_mount_list;
1202 
1203 	nfs_mount_list = nfs_get_mount_list(&get_mntlist_err);
1204 	if (nfs_mount_list == NULL) {
1205 		/*
1206 		 * Check whether an error was returned or if we simply don't
1207 		 * have any nfs file systems on the system. If
1208 		 * get_mntlist_err is not equal to 0, an error was encountered.
1209 		 */
1210 		if (get_mntlist_err != 0) {
1211 			/*
1212 			 * Determine the error and log it.
1213 			 */
1214 			if (get_mntlist_err == ENOMEM ||
1215 				get_mntlist_err == EAGAIN) {
1216 				util_handleError(
1217 					"SOLARIS_NFSMOUNT::ENUM_MOUNTS",
1218 					CIM_ERR_LOW_ON_MEMORY,
1219 					NFS_GET_MNTLIST_FAILURE,
1220 					NULL, &err);
1221 
1222 				return ((CCIMInstanceList *)NULL);
1223 			} else {
1224 				/*
1225 				 * If any other errors were encountered it
1226 				 * can be handled as a general error.  We may
1227 				 * not know exactly what the error is.
1228 				 */
1229 				util_handleError(
1230 					"SOLARIS_NFSMOUNT::ENUM_MOUNTS",
1231 					CIM_ERR_FAILED,
1232 					NFS_GET_MNTLIST_FAILURE,
1233 					NULL, &err);
1234 
1235 				return ((CCIMInstanceList *)NULL);
1236 			}
1237 		}
1238 		/*
1239 		 * We simply don't have any nfs mounts on the host.
1240 		 */
1241 		return ((CCIMInstanceList *)NULL);
1242 
1243 	} else {
1244 		/*
1245 		 * At this point, one or more nfs mounts were found on the
1246 		 * system, create the instance list from the nfs_mount_list.
1247 		 */
1248 		CCIMInstanceList	*nfsMountInstList;
1249 
1250 		nfsMountInstList = create_nfsMount_associations(nfs_mount_list,
1251 			&err);
1252 
1253 		nfs_free_mntinfo_list(nfs_mount_list);
1254 		return (nfsMountInstList);
1255 	} /* if (nfs_mount_list == NULL) */
1256 
1257 } /* enumerate_mounts */
1258 
1259 /*
1260  * Method: get_Antecedent
1261  *
1262  * Description: Creates the Antecedent object path of the Solaris_NFSMount
1263  * class.
1264  *
1265  * Parameters:
1266  *	- cimchar *mount_point - the mount point of the nfs mount which is
1267  *	used as the Name Key property of the Antecedent, Solaris_Directory.
1268  *
1269  * Returns:
1270  *	- The corresponding Solaris_Directory CCIMObjectPath* is returned.
1271  *	- Upon error NULL is returned.
1272  *	The returned CCIMObjectPath* must be freed by the calling function.
1273  */
1274 static CCIMObjectPath *
get_Antecedent(cimchar * mount_point)1275 get_Antecedent(cimchar *mount_point) {
1276 	CCIMInstance	*solarisDirInst;
1277 	CCIMObjectPath	*solarisDirOP;
1278 	CCIMException	*ex;
1279 	int		err;
1280 	char		*hostname;
1281 
1282 	solarisDirInst = cim_createInstance(SOLARIS_DIR);
1283 	if (solarisDirInst == NULL) {
1284 		ex = cim_getLastError();
1285 		util_handleError("SOLARIS_NFSMOUNT::GET_ANT",
1286 			CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err);
1287 		return ((CCIMObjectPath *)NULL);
1288 	}
1289 
1290 	/*
1291 	 * Create the key properties on the Solaris_Directory instance.
1292 	 *
1293 	 * The Solaris_Directory keys are as follows:
1294 	 * CSCreationClassName = "Solaris_ComputerSystem"
1295 	 * CSName = < hostname >
1296 	 * FSCreationClassName = "Solaris_NFS"
1297 	 * FSName = "NFS"
1298 	 * CreationClassName = "Solaris_Directory"
1299 	 * Name = < full pathname of mount point >
1300 	 */
1301 	if (add_property_to_instance(CS_CREATION_CLASS, string,
1302 		SOLARIS_CS, NULL, cim_true, solarisDirInst) == cim_false) {
1303 
1304 		cim_freeInstance(solarisDirInst);
1305 		return ((CCIMObjectPath *)NULL);
1306 	}
1307 
1308 	hostname = sys_get_hostname(&err);
1309 	if (hostname == NULL) {
1310 		util_handleError("SOLARIS_NFSMOUNT::GET_ANT)", CIM_ERR_FAILED,
1311 			GET_HOSTNAME_FAILURE, NULL, &err);
1312 		return ((CCIMObjectPath *)NULL);
1313 	}
1314 
1315 	if (add_property_to_instance(CSNAME, string, hostname,
1316 		NULL, cim_true, solarisDirInst) == cim_false) {
1317 
1318 		free(hostname);
1319 		cim_freeInstance(solarisDirInst);
1320 		return ((CCIMObjectPath *)NULL);
1321 	}
1322 	free(hostname);
1323 
1324 	if (add_property_to_instance(FS_CREATION_CLASS, string,
1325 		SOLARIS_NFS, NULL, cim_true, solarisDirInst) == cim_false) {
1326 
1327 		cim_freeInstance(solarisDirInst);
1328 		return ((CCIMObjectPath *)NULL);
1329 	}
1330 
1331 	if (add_property_to_instance(FSNAME, string,
1332 		NFS, NULL, cim_true, solarisDirInst) == cim_false) {
1333 
1334 		cim_freeInstance(solarisDirInst);
1335 		return ((CCIMObjectPath *)NULL);
1336 	}
1337 
1338 	if (add_property_to_instance(CREATION_CLASS, string,
1339 		SOLARIS_DIR, NULL, cim_true, solarisDirInst) == cim_false) {
1340 
1341 		cim_freeInstance(solarisDirInst);
1342 		return ((CCIMObjectPath *)NULL);
1343 	}
1344 
1345 	if (add_property_to_instance(NAME, string, mount_point,
1346 		NULL, cim_true, solarisDirInst) == cim_false) {
1347 
1348 		cim_freeInstance(solarisDirInst);
1349 		return ((CCIMObjectPath *)NULL);
1350 	}
1351 
1352 	solarisDirOP = cim_createObjectPath(solarisDirInst);
1353 	if (solarisDirOP == NULL) {
1354 		ex = cim_getLastError();
1355 		util_handleError("SOLARIS_NFSMOUNT::GET_ANT",
1356 			CIM_ERR_FAILED, CREATE_OBJECT_PATH_FAILURE,
1357 			ex, &err);
1358 		cim_freeInstance(solarisDirInst);
1359 		return ((CCIMObjectPath *)NULL);
1360 	}
1361 
1362 	cim_freeInstance(solarisDirInst);
1363 	return (solarisDirOP);
1364 } /* get_Antecedent */
1365 
1366 /*
1367  * Method: get_associated_instances
1368  *
1369  * Description: Gets instances associated to the mounts passed in with
1370  * mountList.
1371  *
1372  * Parameters:
1373  *	- nfs_mntlist_t *mountList - The nfs mount list from which to get the
1374  *	associated instances.
1375  *	- boolean_t resultIsAnt - Whether or not the role that the instance
1376  *	returned plays in the association is the Antecedent.
1377  *
1378  * Returns:
1379  *	- A pointer to a list of Solaris_NFS or Solaris_Directory instances that
1380  *	are associated to the mount passed in with mountList.
1381  *	- NULL if an error occurred or if there are no instances that are
1382  *	associated to mountList.
1383  */
1384 static CCIMInstanceList *
get_associated_instances(nfs_mntlist_t * mountList,boolean_t resultIsAnt)1385 get_associated_instances(nfs_mntlist_t *mountList, boolean_t resultIsAnt) {
1386 	CCIMInstanceList	*returnInstList;
1387 	CCIMException		*ex;
1388 	nfs_mntlist_t		*currentMnt;
1389 	int			err = 0;
1390 
1391 	returnInstList = cim_createInstanceList();
1392 	if (returnInstList == NULL) {
1393 		ex = cim_getLastError();
1394 		util_handleError("SOLARIS_NFSMOUNT::GET_ASSOC_INST",
1395 			CIM_ERR_FAILED, CREATE_INSTANCE_LIST_FAILURE, ex, &err);
1396 		return ((CCIMInstanceList *)NULL);
1397 	}
1398 
1399 	for (currentMnt = mountList; currentMnt != NULL;
1400 		currentMnt = currentMnt->next) {
1401 		/*
1402 		 * Determine if we are supposed to form the Antecedent or
1403 		 * Dependent instances by checking the value of resultIsAnt.
1404 		 */
1405 		if (resultIsAnt == B_FALSE) {
1406 			CCIMObjectPath	*nfsOP;
1407 			CCIMInstance	*nfsInst;
1408 
1409 			nfsOP = get_Dependent(currentMnt);
1410 			if (nfsOP == NULL) {
1411 				/*
1412 				 * An error occurred in get_Dependent and was
1413 				 * handled there so just return NULL.
1414 				 */
1415 				cim_freeInstanceList(returnInstList);
1416 				return ((CCIMInstanceList *)NULL);
1417 			}
1418 
1419 			nfsInst = cimom_getInstance(nfsOP, cim_false,
1420 				cim_false, cim_false, cim_false, NULL, 0);
1421 
1422 			/*
1423 			 * A NULL return value indicates an error, an empty
1424 			 * list does not.
1425 			 */
1426 			if (nfsInst == NULL) {
1427 				ex = cim_getLastError();
1428 				util_handleError(
1429 					"SOLARIS_NFSMOUNT::GET_ASSOC_INST",
1430 					CIM_ERR_FAILED, CIMOM_GET_INST_FAILURE,
1431 					ex, &err);
1432 				cim_freeObjectPath(nfsOP);
1433 				cim_freeInstanceList(returnInstList);
1434 				return ((CCIMInstanceList *)NULL);
1435 			}
1436 
1437 			cim_freeObjectPath(nfsOP);
1438 
1439 			if (nfsInst->mProperties == NULL) {
1440 				cim_freeInstanceList(returnInstList);
1441 				return ((CCIMInstanceList *)NULL);
1442 			}
1443 
1444 			/*
1445 			 * Add the Solaris_NFS instance to the instance
1446 			 * list to be returned.
1447 			 */
1448 			returnInstList = cim_addInstance(returnInstList,
1449 				nfsInst);
1450 			if (returnInstList == NULL) {
1451 				ex = cim_getLastError();
1452 				util_handleError(
1453 					"SOLARIS_NFSMOUNT::GET_ASSOC_INST",
1454 					CIM_ERR_FAILED, ADD_INSTANCE_FAILURE,
1455 					ex, &err);
1456 				cim_freeInstance(nfsInst);
1457 				return ((CCIMInstanceList *)NULL);
1458 			}
1459 		} else {
1460 			CCIMObjectPath	*dirOP;
1461 			CCIMInstance	*dirInst;
1462 
1463 			dirOP = (CCIMObjectPath *)get_Antecedent(
1464 				currentMnt->nml_mountp);
1465 
1466 			if (dirOP == NULL) {
1467 				/*
1468 				 * An error occurred in get_Antecedent and was
1469 				 * handled there so just return NULL.
1470 				 */
1471 				cim_freeInstanceList(returnInstList);
1472 				return ((CCIMInstanceList *)NULL);
1473 			}
1474 			cim_logDebug("get_associated_instances",
1475 				"dirOP =%s", dirOP->mName);
1476 
1477 			dirInst = cimom_getInstance(dirOP, cim_false,
1478 				cim_false, cim_false, cim_false, NULL, 0);
1479 
1480 			/*
1481 			 * A NULL return value means error, an empty list
1482 			 * does not.
1483 			 */
1484 			if (dirInst == NULL) {
1485 				ex = cim_getLastError();
1486 				util_handleError(
1487 					"SOLARIS_NFSMOUNT::GET_ASSOC_INST",
1488 					CIM_ERR_FAILED, CIMOM_GET_INST_FAILURE,
1489 					ex, &err);
1490 				cim_freeObjectPath(dirOP);
1491 				cim_freeInstanceList(returnInstList);
1492 				return ((CCIMInstanceList *)NULL);
1493 			}
1494 
1495 			cim_freeObjectPath(dirOP);
1496 
1497 			if (dirInst->mProperties == NULL) {
1498 				cim_freeInstance(dirInst);
1499 				cim_freeInstanceList(returnInstList);
1500 				return ((CCIMInstanceList *)NULL);
1501 			}
1502 
1503 			/*
1504 			 * Work around for cimom bug 4649100.
1505 			 */
1506 			if (!set_dir_keyProperties_to_true(dirInst)) {
1507 				cim_freeInstance(dirInst);
1508 				cim_freeInstanceList(returnInstList);
1509 				return ((CCIMInstanceList *)NULL);
1510 			}
1511 
1512 			/*
1513 			 * Add the Solaris_Directory instance to the
1514 			 * instance list to be returned.
1515 			 */
1516 			returnInstList = cim_addInstance(returnInstList,
1517 				dirInst);
1518 			if (returnInstList == NULL) {
1519 				ex = cim_getLastError();
1520 				util_handleError(
1521 					"SOLARIS_NFSMOUNT::GET_ASSOC_INST",
1522 					CIM_ERR_FAILED, ADD_INSTANCE_FAILURE,
1523 					ex, &err);
1524 				cim_freeInstance(dirInst);
1525 				return ((CCIMInstanceList *)NULL);
1526 			}
1527 		}
1528 	}
1529 
1530 	return (returnInstList);
1531 } /* get_associated_instances */
1532 
1533 /*
1534  * Method: get_associated_nfs_mntlist
1535  *
1536  * Description: Gets a list of mounts, including their information, that have
1537  * the same value as nameKeyValue for the Name property.
1538  *
1539  * Parameters:
1540  *	- boolean_t isAntecedent - A boolean value representing whether the
1541  *	key value passed in with nameKeyVal is the Antecedent or not.
1542  *	- char *nameKeyVal - The value of the Name key.
1543  *
1544  * Returns:
1545  *	- A pointer to a list of nfs mounts.
1546  *	- NULL if an error occurred or if there are no mounts having the same
1547  *	information as passed in with nameKeyVal.
1548  */
1549 static nfs_mntlist_t *
get_associated_nfs_mntlist(boolean_t isAntecedent,char * nameKeyVal)1550 get_associated_nfs_mntlist(boolean_t isAntecedent, char *nameKeyVal) {
1551 	nfs_mntlist_t	*mountList;
1552 	int		err = 0;
1553 
1554 	if (isAntecedent) {
1555 		/*
1556 		 * The nameKeyValue is that of the Antecedent,
1557 		 * Solaris_Directory.
1558 		 */
1559 		/*
1560 		 * The Name property is populated with the mount point of the
1561 		 * nfs file system so we need to determine if the mount point
1562 		 * exists.
1563 		 */
1564 		mountList = nfs_get_filtered_mount_list(NULL, nameKeyVal, NULL,
1565 			NULL, B_TRUE, &err);
1566 		if (mountList == NULL) {
1567 			/*
1568 			 * Check if an error occurred and if it did handle it.
1569 			 */
1570 			if (err != 0) {
1571 				util_handleError(
1572 					"SOLARIS_NFSMOUNT::GET_ASSOC_NFSMNTS",
1573 					CIM_ERR_FAILED,
1574 					NFS_GET_FILTERED_MOUNTS_FAILURE,
1575 					NULL, &err);
1576 				return (NULL);
1577 			}
1578 			/*
1579 			 * If no error occurred then we know that the mount
1580 			 * point doesn't exist so return NULL.
1581 			 */
1582 			return (NULL);
1583 		}
1584 	} else {
1585 		char	*resource;
1586 		char	*devid;
1587 		char	*devMntOpt = "dev=";
1588 		char	*searchOpt;
1589 		int	searchOptLen;
1590 
1591 		/*
1592 		 * The nameKeyValue is that of the Dependent, Solaris_NFS.
1593 		 */
1594 		/*
1595 		 * Get the resource and devid from the Name key property
1596 		 * which should be in the form:
1597 		 * "resource:=< resource > devid:=< devid >"
1598 		 */
1599 		err = 0;
1600 		devid = get_devid(nameKeyVal, &err);
1601 		if (devid == NULL) {
1602 			util_handleError(
1603 				"SOLARIS_NFSMOUNT::GET_ASSOC_NFSMNTS",
1604 				CIM_ERR_FAILED, GET_DEVID_FAILURE, NULL, &err);
1605 			return (NULL);
1606 		}
1607 
1608 		cim_logDebug("get_associated_nfs_mntlist",
1609 			"isDependent: devid =%s", devid);
1610 		err = 0;
1611 		resource = get_resource(nameKeyVal, &err);
1612 		if (resource == NULL) {
1613 			util_handleError(
1614 				"SOLARIS_NFSMOUNT::GET_ASSOC_NFSMNTS",
1615 				CIM_ERR_FAILED, GET_RESOURCE_FAILURE, NULL,
1616 				&err);
1617 			free(devid);
1618 			return (NULL);
1619 		}
1620 
1621 		cim_logDebug("get_associated_nfs_mntlist",
1622 			"isDependent: resource =%s", resource);
1623 		/*
1624 		 * The devid is unique per file system so we will search for
1625 		 * the mount that has the corresponding devid.  Obviously,
1626 		 * we only expect to get one file system.
1627 		 */
1628 		searchOptLen = (strlen(devMntOpt) + strlen(devid) + 1);
1629 
1630 		searchOpt = (char *)calloc((size_t)searchOptLen,
1631 			(size_t)sizeof (char));
1632 
1633 		if (searchOpt == NULL) {
1634 			/*
1635 			 * Out of memory
1636 			 */
1637 			free(devid);
1638 			free(resource);
1639 			return (NULL);
1640 		}
1641 
1642 		(void) snprintf(searchOpt, (size_t)searchOptLen, "%s%s",
1643 			devMntOpt, devid);
1644 		cim_logDebug("get_associated_nfs_mntlist",
1645 			"isDependent: searchOpt =%s", searchOpt);
1646 
1647 		free(devid);
1648 
1649 		mountList = nfs_get_mounts_by_mntopt(searchOpt, B_FALSE, &err);
1650 		if (mountList == NULL) {
1651 			free(resource);
1652 			free(searchOpt);
1653 			if (err != 0) {
1654 				util_handleError(
1655 					"SOLARIS_NFSMOUNT::GET_ASSOC_NFSMNTS",
1656 					CIM_ERR_FAILED,
1657 					NFS_GET_MNTS_BY_MNTOPT_FAILURE,
1658 					NULL, &err);
1659 				return (NULL);
1660 			}
1661 			return (NULL);
1662 		}
1663 
1664 		free(searchOpt);
1665 
1666 		/*
1667 		 * Check that the resource from the pObjectName is the same as
1668 		 * the one in the mountList.  If it is not, return null.
1669 		 */
1670 		if ((strcmp(resource, mountList->nml_resource) != 0)) {
1671 			free(resource);
1672 			return (NULL);
1673 		}
1674 		free(resource);
1675 	}
1676 
1677 	return (mountList);
1678 } /* get_associated_nfs_mntlist */
1679 
1680 /*
1681  * Method: get_Dependent
1682  *
1683  * Description: Creates the Dependent object path of the Solaris_NFSMount class
1684  *
1685  * Parameters:
1686  *	- nfs_mntlist_t *nfs_mount - The nfs mount to be used for filling in
1687  *	the properties of the Dependent, Solaris_NFS.
1688  *
1689  * Returns:
1690  *	- A Solaris_NFS CCIMObjectPath* is returned.
1691  *	- Upon error, NULL is returned.
1692  */
1693 static CCIMObjectPath *
get_Dependent(nfs_mntlist_t * nfs_mount)1694 get_Dependent(nfs_mntlist_t *nfs_mount) {
1695 	CCIMInstance	*solarisNFSInst;
1696 	CCIMObjectPath	*solarisNFSOp;
1697 	CCIMException	*ex;
1698 	char		*name_val;
1699 	char		*devid;
1700 	char		*resourceStr = "resource:=";
1701 	char		*devidStr = "devid:=";
1702 	char		*hostname;
1703 	int		err = 0;
1704 	int		name_val_len;
1705 
1706 	solarisNFSInst = cim_createInstance(SOLARIS_NFS);
1707 	if (solarisNFSInst == NULL) {
1708 		ex = cim_getLastError();
1709 		util_handleError("SOLARIS_NFSMOUNT::GET_DEP",
1710 			CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err);
1711 		return (NULL);
1712 	}
1713 
1714 	/*
1715 	 * Create the key properties on the Solaris_NFS instance.
1716 	 *
1717 	 * The Solaris_Directory keys are as follows:
1718 	 * CSCreationClassName = "Solaris_ComputerSystem"
1719 	 * CSName = < hostname >
1720 	 * CreationClassName = "Solaris_NFS"
1721 	 * Name = resource:=< resource > devid:= < devid >
1722 	 */
1723 	if (add_property_to_instance(CS_CREATION_CLASS, string,
1724 		SOLARIS_CS, NULL, cim_true, solarisNFSInst) == cim_false) {
1725 
1726 		cim_freeInstance(solarisNFSInst);
1727 		return ((CCIMObjectPath *)NULL);
1728 	}
1729 
1730 	hostname = sys_get_hostname(&err);
1731 	if (hostname == NULL) {
1732 		util_handleError("SOLARIS_NFSMOUNT::GET_DEP", CIM_ERR_FAILED,
1733 			GET_HOSTNAME_FAILURE, NULL, &err);
1734 		cim_freeInstance(solarisNFSInst);
1735 		return ((CCIMObjectPath *)NULL);
1736 	}
1737 
1738 	if (add_property_to_instance(CSNAME, string, hostname, NULL, cim_true,
1739 		solarisNFSInst) == cim_false) {
1740 
1741 		free(hostname);
1742 		cim_freeInstance(solarisNFSInst);
1743 		return ((CCIMObjectPath *)NULL);
1744 	}
1745 	free(hostname);
1746 
1747 	if (add_property_to_instance(CREATION_CLASS, string,
1748 		SOLARIS_NFS, NULL, cim_true, solarisNFSInst) == cim_false) {
1749 
1750 		cim_freeInstance(solarisNFSInst);
1751 		return ((CCIMObjectPath *)NULL);
1752 	}
1753 
1754 	if (nfs_mount != NULL) {
1755 		err = 0;
1756 		devid = fs_parse_optlist_for_option(
1757 			nfs_mount->nml_mntopts, "dev=", &err);
1758 		if (devid == NULL) {
1759 			util_handleError("SOLARIS_NFSMOUNT::GET_DEP",
1760 				CIM_ERR_FAILED, FS_PARSE_OPTLIST_FAILURE,
1761 				NULL, &err);
1762 			cim_freeInstance(solarisNFSInst);
1763 			return ((CCIMObjectPath *)NULL);
1764 		}
1765 
1766 		name_val_len = strlen(resourceStr) +
1767 			strlen(nfs_mount->nml_resource) + strlen(devidStr) +
1768 			strlen(devid) + 2;
1769 
1770 		name_val = (char *)calloc((size_t)name_val_len,
1771 			(size_t)(sizeof (char)));
1772 		if (name_val == NULL) {
1773 			util_handleError("SOLARIS_NFSMOUNT::GET_DEP",
1774 				CIM_ERR_LOW_ON_MEMORY, LOW_MEMORY, NULL, NULL);
1775 			cim_freeInstance(solarisNFSInst);
1776 			return ((CCIMObjectPath *)NULL);
1777 		}
1778 
1779 		(void) snprintf(name_val, (size_t)name_val_len,
1780 			"%s%s%s%s%s", resourceStr, nfs_mount->nml_resource, " ",
1781 			devidStr, devid);
1782 	}
1783 
1784 	free(devid);
1785 
1786 	if (add_property_to_instance(NAME, string, name_val, NULL,
1787 		cim_true, solarisNFSInst) == cim_false) {
1788 
1789 		cim_freeInstance(solarisNFSInst);
1790 		return ((CCIMObjectPath *)NULL);
1791 	}
1792 
1793 	free(name_val);
1794 
1795 	solarisNFSOp = cim_createObjectPath(solarisNFSInst);
1796 
1797 	if (solarisNFSOp == NULL) {
1798 		ex = cim_getLastError();
1799 		util_handleError("SOLARIS_NFSMOUNT::GET_DEP",
1800 			CIM_ERR_FAILED, CREATE_OBJECT_PATH_FAILURE,
1801 			ex, &err);
1802 		cim_freeInstance(solarisNFSInst);
1803 		return (NULL);
1804 	}
1805 
1806 	cim_freeInstance(solarisNFSInst);
1807 
1808 	return (solarisNFSOp);
1809 } /* get_Dependent */
1810 
1811 /*
1812  * Method: get_devid
1813  *
1814  * Description:
1815  * Parses the Solaris_NFS.Name key property, which is in the
1816  * "resource:=<resource> devid:=<devid>" format, for the devid.
1817  *
1818  * Parameters:
1819  *	- char *keyValue - The string which is in the
1820  *	"resource:=<resource> devid:=<devid>" format to parse the devid from.
1821  *	- int *errp - The error pointer.  This will be set to a non-zero number
1822  *	if an error is encountered.
1823  *
1824  * Returns:
1825  *	- A pointer to a string which is the value of the devid.
1826  *	- NULL if the devid is not found or if an error occurred.  In the case
1827  *	of an error, errp will be set to a non-zero number.
1828  *
1829  * NOTE:
1830  * The caller must free the memory allocated for the return string.
1831  */
1832 char *
get_devid(char * keyValue,int * errp)1833 get_devid(char *keyValue, int *errp) {
1834 	char	*devidMarker = "devid:=";
1835 	char	*devidMarkerStart;
1836 	char	*devidStart;
1837 	char	*devid;
1838 
1839 	devidMarkerStart = strstr(keyValue, devidMarker);
1840 	if (devidMarkerStart == NULL) {
1841 		return (NULL);
1842 	}
1843 
1844 	devidStart = devidMarkerStart + strlen(devidMarker);
1845 	devid = strdup(devidStart);
1846 	if (devid == NULL) {
1847 		*errp = errno;
1848 		return (NULL);
1849 	}
1850 
1851 	return (devid);
1852 } /* get_devid */
1853 
1854 /*
1855  * Method: get_resource
1856  *
1857  * Description:
1858  * Parses the Solaris_NFS.Name key property, which is in the
1859  * "resource:=<resource> devid:=<devid>" format, for the resource.
1860  *
1861  * Parameters:
1862  *	- char *keyValue - The string which is in the
1863  *      "resource:=<resource> devid:=<devid>" format to parse the resource from.
1864  *	- int *errp - The error pointer.  This will be set to a non-zero number
1865  *	if an error is encountered.
1866  *
1867  * Returns:
1868  *	- A pointer to a string which is the value of the resource.
1869  *	- NULL if the resource is not for or if an error occurred.  In the case
1870  *	of an error, errp will be set to a non-zero number.
1871  * NOTE:
1872  * The caller must free the memory allocated for the return string.
1873  */
1874 static char *
get_resource(char * keyValue,int * errp)1875 get_resource(char *keyValue, int *errp) {
1876 	char	*devid;
1877 	char	*devidStr = "devid:=";
1878 	char	*resource;
1879 	char	*resourceStr = "resource:=";
1880 	int	totalDevidLen = 0, keyValueLen = 0, resourceLen = 0,
1881 		resourceStrLen = 0, i = 0;
1882 	int	err = 0;
1883 
1884 	/*
1885 	 * First we need to get the devid string portion of the Solaris_NFS.Name
1886 	 * key value in order to figure out how long that portion is.
1887 	 */
1888 	devid = get_devid(keyValue, &err);
1889 	if (devid == NULL) {
1890 		*errp = err;
1891 		return (NULL);
1892 	}
1893 
1894 	totalDevidLen = strlen(devidStr) + strlen(devid);
1895 
1896 	keyValueLen = strlen(keyValue);
1897 	resourceStrLen = strlen(resourceStr);
1898 
1899 	/*
1900 	 * The length of the space character between the resource and devid
1901 	 * is not taken out here for the fact that we will use that space in
1902 	 * order to allocate enough space for the null terminating character.
1903 	 */
1904 	resourceLen = keyValueLen - totalDevidLen - resourceStrLen;
1905 	resourceLen = strlen(keyValue) - (strlen(devidStr) + strlen(devid)) -
1906 		strlen(resourceStr);
1907 
1908 	resource = (char *)calloc((size_t)resourceLen, (size_t)sizeof (char));
1909 	if (resource == NULL) {
1910 		*errp = errno;
1911 		return (NULL);
1912 	}
1913 
1914 	for (i = 0; i < (resourceLen - 1); i++) {
1915 		resource[i] = keyValue[resourceStrLen+i];
1916 	}
1917 
1918 	/*
1919 	 * Make sure to put the null terminating character at the end.
1920 	 */
1921 	resource[resourceLen-1] = '\0';
1922 
1923 	free(devid);
1924 	return (resource);
1925 } /* get_resource */
1926 
1927 /*
1928  * Method: populate_property_list
1929  *
1930  * Description: Populates all the properties of the passed in mount into a
1931  * property list.
1932  *
1933  * Parameters:
1934  *	- nfs_mntlist_t *nfs_mount - The nfs mount to retrieve the properties
1935  *	from.
1936  *
1937  * Returns:
1938  *	- A pointer to a list of properties that correspond to the properties of
1939  *	nfs_mount.
1940  *	- Upon error, NULL is returned and the error is logged.
1941  */
1942 static CCIMPropertyList *
populate_property_list(nfs_mntlist_t * nfs_mount)1943 populate_property_list(nfs_mntlist_t *nfs_mount) {
1944 	CCIMException		*ex;
1945 	CCIMPropertyList	*nfsMountPropList;
1946 	CCIMObjectPath		*antOP;
1947 	CCIMObjectPath		*depOP;
1948 	cimchar			**propValues;
1949 	int			i = 0;
1950 	int			err = 0;
1951 
1952 	nfsMountPropList = cim_createPropertyList();
1953 	if (nfsMountPropList == NULL) {
1954 		ex = cim_getLastError();
1955 		util_handleError("SOLARIS_NFSMOUNT::POPULATE_PROPLIST",
1956 			CIM_ERR_FAILED, CREATE_PROPLIST_FAILURE, ex, &err);
1957 		return ((CCIMPropertyList *)NULL);
1958 	}
1959 
1960 	/*
1961 	 * Create the CCIMProperties for this instance
1962 	 */
1963 
1964 	/*
1965 	 * Antecedent
1966 	 */
1967 	antOP = get_Antecedent(nfs_mount->nml_mountp);
1968 	if (antOP == NULL) {
1969 		cim_freePropertyList(nfsMountPropList);
1970 		return ((CCIMPropertyList *)NULL);
1971 	}
1972 	nfsMountPropList = add_property_to_list(nfsMountProps[ANT].name,
1973 		nfsMountProps[ANT].type, NULL, antOP, nfsMountProps[ANT].isKey,
1974 		nfsMountPropList);
1975 
1976 	/*
1977 	 * Dependent
1978 	 */
1979 	depOP = get_Dependent(nfs_mount);
1980 	if (depOP == NULL) {
1981 		cim_freePropertyList(nfsMountPropList);
1982 		return ((CCIMPropertyList *)NULL);
1983 	}
1984 	nfsMountPropList = add_property_to_list(nfsMountProps[DEP].name,
1985 		nfsMountProps[DEP].type, NULL, depOP, nfsMountProps[DEP].isKey,
1986 		nfsMountPropList);
1987 
1988 	propValues = calloc((size_t)PROPCOUNT, (size_t)sizeof (cimchar *));
1989 	if (propValues == NULL) {
1990 		util_handleError("SOLARIS_NFSMOUNT::POPULATE_PROPLIST",
1991 			CIM_ERR_LOW_ON_MEMORY, LOW_MEMORY, NULL, &err);
1992 		return ((CCIMPropertyList *)NULL);
1993 	}
1994 
1995 	if (populate_property_values(nfs_mount, propValues) == cim_false) {
1996 		fileutil_free_string_array(propValues, PROPCOUNT);
1997 		cim_freePropertyList(nfsMountPropList);
1998 		return ((CCIMPropertyList *)NULL);
1999 	}
2000 
2001 	for (i = 0; i < PROPCOUNT; i++) {
2002 		if (i == ANT || i == DEP) {
2003 			continue;
2004 		}
2005 		nfsMountPropList = add_property_to_list(nfsMountProps[i].name,
2006 			nfsMountProps[i].type, propValues[i], NULL,
2007 			nfsMountProps[i].isKey, nfsMountPropList);
2008 		if (nfsMountPropList == NULL) {
2009 			fileutil_free_string_array(propValues, PROPCOUNT);
2010 			return ((CCIMPropertyList *)NULL);
2011 		}
2012 	}
2013 
2014 	fileutil_free_string_array(propValues, PROPCOUNT);
2015 	return (nfsMountPropList);
2016 } /* populate_property_list */
2017 
2018 static CIMBool
populate_property_values(nfs_mntlist_t * nfs_mount,cimchar ** propValues)2019 populate_property_values(nfs_mntlist_t *nfs_mount,
2020 	cimchar **propValues) {
2021 
2022 	fs_mntdefaults_t	vfstab_filter;
2023 	fs_mntdefaults_t	*vfstab_entry;
2024 	boolean_t		readonly;
2025 	boolean_t		optHasEquals;
2026 	char			*enableQuota, *failoverList, *noSuid,
2027 				*posix, *public, *port;
2028 	cimchar			propValue[MAXSIZE];
2029 	int			defaultValue = 0;
2030 	int			err = 0;
2031 
2032 	/*
2033 	 * AttributeCaching
2034 	 */
2035 	(void) snprintf(propValue, MAXSIZE, "%d", !(nfs_mount->nml_noac));
2036 	propValues[ATTRCACHE] = strdup(propValue);
2037 	if (propValues[ATTRCACHE] == NULL) {
2038 		return (cim_false);
2039 	}
2040 
2041 	/*
2042 	 * AttributeCachingForDirectoriesMax
2043 	 */
2044 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_acdirmax);
2045 	propValues[ATTRCACHEDIRMAX] = strdup(propValue);
2046 	if (propValues[ATTRCACHEDIRMAX] == NULL) {
2047 		return (cim_false);
2048 	}
2049 
2050 	/*
2051 	 * AttributeCachingForDirectoriesMin
2052 	 */
2053 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_acdirmin);
2054 	propValues[ATTRCACHEDIRMIN] = strdup(propValue);
2055 	if (propValues[ATTRCACHEDIRMIN] == NULL) {
2056 		return (cim_false);
2057 	}
2058 
2059 	/*
2060 	 * AttributeCachingForRegularFilesMax
2061 	 */
2062 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_acregmax);
2063 	propValues[ATTRCACHEFILESMAX] = strdup(propValue);
2064 	if (propValues[ATTRCACHEFILESMAX] == NULL) {
2065 		return (cim_false);
2066 	}
2067 
2068 	/*
2069 	 * AttributeCachingForRegularFilesMin
2070 	 */
2071 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_acregmin);
2072 	propValues[ATTRCACHEFILESMIN] = strdup(propValue);
2073 	if (propValues[ATTRCACHEFILESMIN] == NULL) {
2074 		return (cim_false);
2075 	}
2076 
2077 	/*
2078 	 * EnableQuotaChecking
2079 	 */
2080 	optHasEquals = B_FALSE;
2081 	enableQuota = get_property_from_opt_string(nfs_mount->nml_mntopts,
2082 		"quota", optHasEquals, defaultValue);
2083 	if (enableQuota == NULL) {
2084 		return (cim_false);
2085 	}
2086 	propValues[ENABLEQUOTA] = strdup(enableQuota);
2087 	if (propValues[ENABLEQUOTA] == NULL) {
2088 		return (cim_false);
2089 	}
2090 	free(enableQuota);
2091 
2092 	/*
2093 	 * FailoverList
2094 	 */
2095 	failoverList = cim_encodeStringArray(nfs_mount->nml_failoverlist,
2096 		nfs_mount->nml_failovercount);
2097 	if (failoverList == NULL) {
2098 		cim_logDebug("populate_property_values", "encoding FAILED");
2099 		return (cim_false);
2100 	}
2101 	propValues[FAILOVER] = strdup(failoverList);
2102 	if (propValues[FAILOVER] == NULL) {
2103 		return (cim_false);
2104 	}
2105 
2106 	/*
2107 	 * ForceDirectIO
2108 	 */
2109 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_directio);
2110 	propValues[FORCEDIRECTIO] = strdup(propValue);
2111 	if (propValues[FORCEDIRECTIO] == NULL) {
2112 		return (cim_false);
2113 	}
2114 
2115 	/*
2116 	 * FsType
2117 	 */
2118 	propValues[FSTYPE] = strdup(nfs_mount->nml_fstype);
2119 	if (propValues[FSTYPE] == NULL) {
2120 		return (cim_false);
2121 	}
2122 
2123 	/*
2124 	 * GroupId
2125 	 */
2126 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_grpid);
2127 	propValues[GRPID] = strdup(propValue);
2128 	if (propValues[GRPID] == NULL) {
2129 		return (cim_false);
2130 	}
2131 
2132 	/*
2133 	 * HardMount
2134 	 */
2135 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_hard);
2136 	propValues[HARDMNT] = strdup(propValue);
2137 	if (propValues[HARDMNT] == NULL) {
2138 		return (cim_false);
2139 	}
2140 
2141 	/*
2142 	 * Interrupt
2143 	 */
2144 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_intr);
2145 	propValues[INTR] = strdup(propValue);
2146 	if (propValues[INTR] == NULL) {
2147 		return (cim_false);
2148 	}
2149 
2150 	/*
2151 	 * MaxRetransmissionAttempts
2152 	 */
2153 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_retrans);
2154 	propValues[MAXRETRANSATTEMPTS] = strdup(propValue);
2155 	if (propValues[MAXRETRANSATTEMPTS] == NULL) {
2156 		return (cim_false);
2157 	}
2158 
2159 	/*
2160 	 * MountAtBootEntry - Deprecated
2161 	 */
2162 	vfstab_filter.resource = nfs_mount->nml_resource;
2163 	vfstab_filter.fsckdevice = NULL;
2164 	vfstab_filter.mountp = nfs_mount->nml_mountp;
2165 	vfstab_filter.fstype = nfs_mount->nml_fstype;
2166 	vfstab_filter.fsckpass = NULL;
2167 	vfstab_filter.mountatboot = NULL;
2168 	vfstab_filter.mntopts = NULL;
2169 
2170 	err = 0;
2171 	/*
2172 	 * The space allocated for the value returned by
2173 	 * fs_get_filtered_mount_defaults is freed later in this function
2174 	 * because it is needed to set the value of the VfstabEntry property.
2175 	 */
2176 	vfstab_entry = fs_get_filtered_mount_defaults(&vfstab_filter, &err);
2177 	if (vfstab_entry == NULL) {
2178 		if (err != 0) {
2179 			util_handleError("SOLARIS_NFSMOUNT::POPULATE_PROPLIST",
2180 				CIM_ERR_FAILED,
2181 				FS_GET_FILTERED_MNTDEFAULTS_FAILURE, NULL,
2182 				&err);
2183 			return (cim_false);
2184 		}
2185 		(void) snprintf(propValue, (size_t)MAXSIZE, "%d", B_FALSE);
2186 	} else {
2187 		/*
2188 		 * The possible values in the mount at boot field are "yes",
2189 		 * "no" and "-".  The "-" character, although it is not likely
2190 		 * to be used, will be interpretted as the mount is to not be
2191 		 * mounted at boot.  "-" is used when a field does not apply to
2192 		 * the resource being mounted.
2193 		 */
2194 		if (strcasecmp(vfstab_entry->mountatboot, "yes") == 0) {
2195 			(void) snprintf(propValue, (size_t)MAXSIZE, "%d",
2196 			    B_TRUE);
2197 		} else {
2198 			(void) snprintf(propValue, (size_t)MAXSIZE, "%d",
2199 			    B_FALSE);
2200 		}
2201 	}
2202 	propValues[MNTATBOOTENTRY] = strdup(propValue);
2203 	if (propValues[MNTATBOOTENTRY] == NULL) {
2204 		return (cim_false);
2205 	}
2206 
2207 	/*
2208 	 * MountOptions
2209 	 */
2210 	propValues[MNTOPTS] = strdup(nfs_mount->nml_mntopts);
2211 	if (propValues[MNTOPTS] == NULL) {
2212 		return (cim_false);
2213 	}
2214 
2215 	/*
2216 	 * MountFailureRetries - This value is only valid upon creation of an
2217 	 * instance of Solaris_NFSMount.  This is actually a mount _process_
2218 	 * option and not a mount option.
2219 	 */
2220 
2221 	/*
2222 	 * NoCloseToOpenConsistency
2223 	 */
2224 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_nocto);
2225 	propValues[NOCTO] = strdup(propValue);
2226 	if (propValues[NOCTO] == NULL) {
2227 		return (cim_false);
2228 	}
2229 
2230 	/*
2231 	 * NoMnttabEntry - This will always be false for every nfs mount that
2232 	 * is shown in the CIM/WBEM interface because there is no way to
2233 	 * programatically determine a file system that is mounted if it is not
2234 	 * in /etc/mnttab.  If it is not in /etc/mnttab, it is like that for a
2235 	 * reason and is also an argument for not showing the existense of
2236 	 * those file systems.
2237 	 */
2238 	(void) snprintf(propValue, (size_t)MAXSIZE, "%d", B_FALSE);
2239 	propValues[NOMNTTABENT] = strdup(propValue);
2240 	if (propValues[NOMNTTABENT] == NULL) {
2241 		return (cim_false);
2242 	}
2243 
2244 	/*
2245 	 * NoSuid
2246 	 */
2247 	optHasEquals = B_FALSE;
2248 	noSuid = get_property_from_opt_string(nfs_mount->nml_mntopts,
2249 		"nosuid", optHasEquals, defaultValue);
2250 	if (noSuid == NULL) {
2251 		return (cim_false);
2252 	}
2253 	propValues[NOSUID] = strdup(noSuid);
2254 	if (propValues[NOSUID] == NULL) {
2255 		return (cim_false);
2256 	}
2257 	free(noSuid);
2258 
2259 	/*
2260 	 * Overlay - This is a property which is only valid upon creation of a
2261 	 * Solaris_NFSMount instance.  It specifies that the file system to be
2262 	 * mounted should be mounted on top of another existing mounted file
2263 	 * system.
2264 	 */
2265 
2266 	/*
2267 	 * Overlayed
2268 	 */
2269 	/*
2270 	 * We must do some magic here with determining an overlayed file system.
2271 	 * We must check for mounts with the same mount point and determine
2272 	 * which is further down in the mnttab list to determine the top most
2273 	 * file system.  This is all done in the fs_mounts interface.
2274 	 */
2275 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_overlayed);
2276 	propValues[OVERLAYED] = strdup(propValue);
2277 	if (propValues[OVERLAYED] == NULL) {
2278 		return (cim_false);
2279 	}
2280 
2281 	/*
2282 	 * Posix
2283 	 */
2284 	optHasEquals = B_FALSE;
2285 	posix = get_property_from_opt_string(nfs_mount->nml_mntopts, "posix",
2286 		optHasEquals, defaultValue);
2287 	if (posix == NULL) {
2288 		return (cim_false);
2289 	}
2290 	propValues[POSIX] = strdup(posix);
2291 	if (propValues[POSIX] == NULL) {
2292 		return (cim_false);
2293 	}
2294 	free(posix);
2295 
2296 	/*
2297 	 * Protocol
2298 	 */
2299 	propValues[PROTO] = strdup(nfs_mount->nml_proto);
2300 	if (propValues[PROTO] == NULL) {
2301 		return (cim_false);
2302 	}
2303 
2304 	/*
2305 	 * Public
2306 	 */
2307 	optHasEquals = B_FALSE;
2308 	public = get_property_from_opt_string(nfs_mount->nml_mntopts,
2309 		"public", optHasEquals, defaultValue);
2310 	if (public == NULL) {
2311 		return (cim_false);
2312 	}
2313 	propValues[PUBLIC] = strdup(public);
2314 	if (propValues[PUBLIC] == NULL) {
2315 		return (cim_false);
2316 	}
2317 	free(public);
2318 
2319 	/*
2320 	 * ReadBufferSize
2321 	 */
2322 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_curread);
2323 	propValues[READBUFFSIZE] = strdup(propValue);
2324 	if (propValues[READBUFFSIZE] == NULL) {
2325 		return (cim_false);
2326 	}
2327 
2328 	/*
2329 	 * ReadOnly
2330 	 */
2331 	readonly = fs_is_readonly(nfs_mount->nml_mountp, &err);
2332 	if (err != 0) {
2333 		return (cim_false);
2334 	}
2335 	(void) snprintf(propValue, (size_t)MAXSIZE, "%d", readonly);
2336 	propValues[READONLY] = strdup(propValue);
2337 	if (propValues[READONLY] == NULL) {
2338 		return (cim_false);
2339 	}
2340 
2341 	/*
2342 	 * ReplicatedResources - Deprecated.
2343 	 */
2344 	/*
2345 	 * This is the same as the FailoverList so we can use the value used
2346 	 * to create that property (failoverList).
2347 	 */
2348 	propValues[REPLRESOURCES] = strdup(failoverList);
2349 	if (propValues[REPLRESOURCES] == NULL) {
2350 		free(failoverList);
2351 		return (cim_false);
2352 	}
2353 	free(failoverList);
2354 
2355 	/*
2356 	 * RetransmissionTimeout
2357 	 */
2358 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_timeo);
2359 	propValues[RETRANSTIMEO] = strdup(propValue);
2360 	if (propValues[RETRANSTIMEO] == NULL) {
2361 		return (cim_false);
2362 	}
2363 
2364 	/*
2365 	 * RetryInForeground - This value is only valid upon creation of an
2366 	 * instance of Solaris_NFSMount.  This is actually a mount _process_
2367 	 * option and not a mount option.
2368 	 */
2369 
2370 	/*
2371 	 * SecurityMode
2372 	 */
2373 	if (nfs_mount->nml_securitymode == NULL) {
2374 		cim_logDebug("populate_property_value", "secmode == NULL");
2375 	} else {
2376 		cim_logDebug("populate_property_value", "secmode =%s",
2377 			nfs_mount->nml_securitymode);
2378 	}
2379 
2380 	if (nfs_mount->nml_securitymode != NULL) {
2381 		propValues[SECMODE] = strdup(nfs_mount->nml_securitymode);
2382 		if (propValues[SECMODE] == NULL) {
2383 			return (cim_false);
2384 		}
2385 	}
2386 
2387 	/*
2388 	 * ServerCommunicationPort
2389 	 */
2390 	optHasEquals = B_TRUE;
2391 	defaultValue = NFS_PORT;
2392 	port = get_property_from_opt_string(nfs_mount->nml_mntopts, "port=",
2393 		optHasEquals, defaultValue);
2394 	if (port == NULL) {
2395 		return (cim_false);
2396 	}
2397 	propValues[SERVERCOMMPORT] = strdup(port);
2398 	if (propValues[SERVERCOMMPORT] == NULL) {
2399 		return (cim_false);
2400 	}
2401 	free(port);
2402 
2403 	/*
2404 	 * ServerName
2405 	 */
2406 	propValues[SERVERNAME] = strdup(nfs_mount->nml_curserver);
2407 	if (propValues[SERVERNAME] == NULL) {
2408 		return (cim_false);
2409 	}
2410 
2411 	/*
2412 	 * ServerPath
2413 	 */
2414 	propValues[SERVERPATH] = strdup(nfs_mount->nml_curpath);
2415 	if (propValues[SERVERPATH] == NULL) {
2416 		return (cim_false);
2417 	}
2418 
2419 	/*
2420 	 * Version
2421 	 */
2422 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_vers);
2423 	propValues[VERS] = strdup(propValue);
2424 	if (propValues[VERS] == NULL) {
2425 		return (cim_false);
2426 	}
2427 
2428 	/*
2429 	 * VfstabEntry
2430 	 */
2431 	/*
2432 	 * The vfstab_entry variable is retrieved from the
2433 	 * fs_get_filtered_mount_defaults call when populating the
2434 	 * MountAtBootEntry property.
2435 	 */
2436 	if (vfstab_entry == NULL) {
2437 		(void) snprintf(propValue, MAXSIZE, "%d", B_FALSE);
2438 	} else {
2439 		(void) snprintf(propValue, MAXSIZE, "%d", B_TRUE);
2440 		fs_free_mntdefaults_list(vfstab_entry);
2441 	}
2442 	propValues[VFSTABENTRY] = strdup(propValue);
2443 	if (propValues[VFSTABENTRY] == NULL) {
2444 		return (cim_false);
2445 	}
2446 
2447 	/*
2448 	 * WriteBufferSize
2449 	 */
2450 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_curwrite);
2451 	propValues[WRITEBUFFSIZE] = strdup(propValue);
2452 	if (propValues[WRITEBUFFSIZE] == NULL) {
2453 		return (cim_false);
2454 	}
2455 
2456 	/*
2457 	 * Xattr
2458 	 */
2459 	(void) snprintf(propValue, MAXSIZE, "%d", nfs_mount->nml_xattr);
2460 	propValues[XATTR] = strdup(propValue);
2461 	if (propValues[XATTR] == NULL) {
2462 		return (cim_false);
2463 	}
2464 
2465 	cim_logDebug("populate_property_values", "returning cim_true");
2466 	return (cim_true);
2467 } /* populate_property_values */
2468