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