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 "mountprov_methods.h"
30#include "nfsprov_methods.h"
31#include "util.h"
32#include "libfsmgt.h"
33#include "nfs_providers_msgstrings.h"
34#include "nfs_provider_names.h"
35#include <errno.h>
36
37#define	SHOWEXPORTS "/usr/sbin/showmount -e "
38
39/*
40 * Private methods
41 */
42static char **create_export_array(char *exportList_in_string_form,
43	int *num_elements, int *errp);
44
45/*
46 * Public methods
47 */
48/*
49 * Method: delete_vfstab_entry
50 *
51 * Description: Deletes the /etc/vfstab entry with the corresponding resource
52 * and mount point as passed in with inParams.
53 *
54 * Parameters:
55 *	- CCIMPropertyList *inParams - The input parameters to the method.
56 *	The property list is expected to contain two elements in the following
57 *	order:
58 *	1.) string resource - the resource that is listed in the device to
59 *	mount column of /etc/vfstab.  Example: /dev/dsk/c0t0d0s5
60 *	2.) string mount point
61 *
62 * Returns:
63 *	- CCIMProperty * - A value telling the success or failure of the method.
64 */
65CCIMProperty *
66delete_vfstab_entry(CCIMPropertyList *inParams) {
67	fs_mntdefaults_t	*vfstabEnts, *vfstabEntToDelete;
68	CCIMPropertyList	*currentParam;
69	CCIMProperty		*resourceProp;
70	CCIMProperty		*mountPointProp;
71	char			*resource;
72	char			*mountPoint;
73	int			err = 0;
74
75	if (inParams == NULL) {
76		util_handleError(DELETE_VFSTAB_ENT, CIM_ERR_INVALID_PARAMETER,
77			NULL, NULL, &err);
78		return ((CCIMProperty *)NULL);
79	}
80
81	/*
82	 * The inParams are expected to contain two elements in this order:
83	 * 1.) string resource
84	 * 2.) string mountPoint
85	 */
86	currentParam = inParams;
87
88	resourceProp = currentParam->mDataObject;
89	if (resourceProp == NULL || resourceProp->mValue == NULL) {
90		util_handleError(DELETE_VFSTAB_ENT, CIM_ERR_INVALID_PARAMETER,
91			NULL, NULL, &err);
92		return ((CCIMProperty *)NULL);
93	}
94
95	resource = resourceProp->mValue;
96
97	currentParam = currentParam->mNext;
98
99	mountPointProp = currentParam->mDataObject;
100	if (mountPointProp == NULL || mountPointProp->mValue == NULL) {
101		util_handleError(DELETE_VFSTAB_ENT, CIM_ERR_INVALID_PARAMETER,
102			NULL, NULL, &err);
103		return ((CCIMProperty *)NULL);
104	}
105
106	mountPoint = mountPointProp->mValue;
107
108	vfstabEntToDelete = calloc(1, sizeof (fs_mntdefaults_t));
109
110	vfstabEntToDelete->resource = strdup(resource);
111	vfstabEntToDelete->mountp = strdup(mountPoint);
112
113	vfstabEnts = fs_del_mount_default_ent(vfstabEntToDelete, &err);
114	if (vfstabEnts == NULL) {
115		util_handleError(DELETE_VFSTAB_ENT, CIM_ERR_FAILED,
116			FS_DEL_MNT_DEFAULT_FAILURE, NULL, &err);
117		return ((CCIMProperty *)NULL);
118	}
119
120	cim_logDebug("delete_vfstab_entry", "After fs_del_mount_default_ent");
121	fs_free_mntdefaults_list(vfstabEnts);
122	fs_free_mntdefaults_list(vfstabEntToDelete);
123	return (cim_createProperty("Status", sint32, "0", NULL, cim_false));
124} /* delete_vfstab_entry */
125
126/*
127 * Method: show_exports
128 *
129 * Description: Shows the list of shared file systems on a certain host by
130 * executing the showmount command.
131 *
132 * Parameters:
133 *	- CCIMPropertyList *inParams - The input parameters to the method.
134 *	The property list is expected to contain one element, a string value
135 *	representing the host to show exports on.
136 *	- CCIMPropertyList *outParams - The output of the showmount command.
137 *
138 * Returns:
139 *	- CCIMProperty * - A value telling the success or failure of the method.
140 *
141 * NOTE: This is a deprecated method, but is supported until the EOL process
142 * is done.  That date is TBD.
143 */
144CCIMProperty *
145show_exports(CCIMPropertyList *inParams, CCIMPropertyList *outParams) {
146	CCIMProperty	*hostProp;
147	char		*showExportsCommand;
148	char		*cmd_return;
149	char		*host;
150	int		commandLen;
151	int		err = 0;
152
153	if (inParams == NULL) {
154		util_handleError(SHOW_EXPORTS, CIM_ERR_INVALID_PARAMETER,
155			NULL, NULL, &err);
156		return ((CCIMProperty *)NULL);
157	}
158
159	/*
160	 * The inParams are expected to contain one element being:
161	 * 1.) string host
162	 */
163	hostProp = inParams->mDataObject;
164	if (hostProp == NULL || hostProp->mValue == NULL) {
165		util_handleError(SHOW_EXPORTS, CIM_ERR_INVALID_PARAMETER,
166			NULL, NULL, &err);
167		return ((CCIMProperty *)NULL);
168	}
169
170	host = hostProp->mValue;
171
172	commandLen = strlen(SHOWEXPORTS) + strlen(host) + 1;
173
174	showExportsCommand = calloc(commandLen, sizeof (char));
175	if (showExportsCommand == NULL) {
176		util_handleError(SHOW_EXPORTS, CIM_ERR_LOW_ON_MEMORY,
177			NULL, NULL, &err);
178		return ((CCIMProperty *)NULL);
179	}
180
181	(void) snprintf(showExportsCommand, commandLen, "%s%s", SHOWEXPORTS,
182	    host);
183	cmd_return = cmd_execute_command_and_retrieve_string(showExportsCommand,
184		&err);
185	if (err != 0) {
186		cim_logDebug(SHOW_EXPORTS, "err =%d", err);
187		outParams = NULL;
188		if (cmd_return != NULL) {
189			cim_logDebug(SHOW_EXPORTS, "Command return =%s",
190				cmd_return);
191			util_handleError(SHOW_EXPORTS, CIM_ERR_FAILED,
192				cmd_return, NULL, &err);
193			free(cmd_return);
194		} else {
195			util_handleError(SHOW_EXPORTS, CIM_ERR_FAILED,
196				CMD_EXEC_RETR_STR_FAILURE, NULL, &err);
197		}
198
199		free(showExportsCommand);
200		return ((CCIMProperty *)NULL);
201	}
202
203	if (cmd_return != NULL) {
204		char	**export_array;
205		int	num_elements = 0;
206
207		cim_logDebug("show_exports", "Output =%s", cmd_return);
208
209		export_array = create_export_array(cmd_return, &num_elements,
210			&err);
211		if (export_array == NULL) {
212			cim_logDebug("show_exports", "export_array == NULL");
213			if (err != 0) {
214				util_handleError(SHOW_EXPORTS,
215					CIM_ERR_LOW_ON_MEMORY, NULL, NULL,
216					&err);
217			}
218			return ((CCIMProperty *)NULL);
219		}
220
221		create_outParams_list(outParams, export_array, num_elements,
222			NULL);
223		fileutil_free_string_array(export_array, num_elements);
224	}
225
226	free(showExportsCommand);
227	return (cim_createProperty("Status", sint32, "0", NULL, cim_false));
228} /* show_exports */
229
230
231/*
232 * Private methods
233 */
234
235/*
236 * Method: create_export_array
237 *
238 * Description: Creates an array from the export list given in string form.
239 *
240 * Parameters:
241 *	- char *exportList_in_string_form - The export list from the showmount
242 *	command.
243 *	- int *num_elements - The element counter which keeps track of the
244 *	number of elements returned in the string array.
245 *	- int *errp - The error pointer which gets set upon error.
246 *
247 * Returns:
248 *	- char ** - The string array containing the individual elements from
249 *	the showmount export list.
250 *	- NULL if an error occurred.
251 */
252static char **
253create_export_array(char *exportList_in_string_form, int *num_elements,
254	int *errp) {
255
256	char	*endOfLine = "\n";
257	char	*export;
258	char	*listCopy;
259	char	**export_array = NULL;
260	int	i = 0;
261
262
263	listCopy = strdup(exportList_in_string_form);
264	if (listCopy == NULL) {
265		*errp = errno;
266		*num_elements = 0;
267		return (NULL);
268	}
269
270	/*
271	 * Ignore the first line.  It is a header that is always printed out
272	 * when using showmounts -e.
273	 */
274	export = strtok(listCopy, endOfLine);
275
276	/*
277	 * Count the number of elements to be in the array.
278	 */
279	*num_elements = 0;
280	for (export = strtok(NULL, endOfLine); export != NULL;
281		export = strtok(NULL, endOfLine)) {
282		*num_elements = *num_elements + 1;
283	}
284
285	export_array = calloc((size_t)*num_elements, (size_t)sizeof (char *));
286	if (export_array == NULL) {
287		*errp = errno;
288		*num_elements = 0;
289		free(listCopy);
290		return (NULL);
291	}
292
293	free(listCopy);
294	listCopy = strdup(exportList_in_string_form);
295	if (listCopy == NULL) {
296		*errp = errno;
297		*num_elements = 0;
298		fileutil_free_string_array(export_array, *num_elements);
299		return (NULL);
300	}
301
302	export = strtok(listCopy, endOfLine);
303
304	for (i = 0; i < *num_elements; i++) {
305
306		export = strtok(NULL, endOfLine);
307
308		if (export != NULL) {
309			export_array[i] = strdup(export);
310			if (export_array[i] == NULL) {
311				*errp = errno;
312				free(listCopy);
313				fileutil_free_string_array(export_array,
314					*num_elements);
315				*num_elements = 0;
316				return (NULL);
317			}
318		}
319	}
320
321	free(listCopy);
322	return (export_array);
323} /* create_export_array */
324