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 2002 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 <errno.h>
30 #include <sys/wait.h>
31 #include "cimKeys.h"
32 #include "util.h"
33 #include "Solaris_DiskPartition.h"
34 #include "partition_descriptors.h"
35 #include "methods.h"
36 #include "providerNames.h"
37 #include "messageStrings.h"
38
39 #define DISK_GETINSTANCE "DISK_PARTITION,GET_INSTANCE"
40 #define DISK_ENUMINSTANCES "DISK_PARTITION,ENUM_INSTANCES"
41 #define DISK_ENUMINSTANCENAMES "DISK_PARTITION,ENUM_INSTANCENAMES"
42 #define DISK_CREATEINSTANCE "DISK_PARTITION,CREATE_INSTANCE"
43 #define DISK_DELETEINSTANCE "DISK_PARTITION,DELETE_INSTANCE"
44 #define DISK_SETINSTANCE "DISK_PARTITION,SET_INSTANCE"
45 #define DISK_GETPROPERTY "DISK_PARTITION,GET_PROPERTY"
46 #define DISK_SETPROPERTY "DISK_PARTITION,SET_PROPERTY"
47 #define DISK_INVOKEMETHOD "DISK_PARTITION,INVOKE_METHOD"
48 #define DISK_EXECQUERY "DISK_PARTITION,EXEC_QUERY"
49
50 /*
51 * Name: cp_getInstance_Solaris_DiskPartition
52 *
53 * Description: Returns an instance which matches the passed in object path
54 * if found.
55 *
56 * Parameters:
57 * pOP - An CCIMObjectPath * which contains the information on
58 * the class for which to find the instance.
59 * Returns:
60 * CCIMInstance * if matched instance is found. Otherwise, NULL.
61 */
62
63 /* ARGSUSED */
64 CCIMInstance *
cp_getInstance_Solaris_DiskPartition(CCIMObjectPath * pOP)65 cp_getInstance_Solaris_DiskPartition(CCIMObjectPath *pOP)
66 {
67
68 CCIMInstance* inst = NULL;
69 CCIMPropertyList* pCurPropList;
70 CCIMException* ex;
71 dm_descriptor_t dp_descriptor;
72 char *name;
73 int error;
74
75 if (pOP == NULL ||
76 pOP->mKeyProperties == NULL) {
77 util_handleError(DISK_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL,
78 NULL, &error);
79 return ((CCIMInstance *)NULL);
80 }
81
82 pCurPropList = pOP->mKeyProperties;
83 name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID,
84 &error);
85
86 if (error != 0 || name == NULL) {
87 util_handleError(DISK_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL,
88 NULL, &error);
89 return ((CCIMInstance*)NULL);
90 }
91
92 dp_descriptor = dm_get_descriptor_by_name(DM_SLICE, name, &error);
93
94 /*
95 * If not found, could be an fdisk partition.
96 */
97
98 if (error == ENODEV) {
99 dp_descriptor = dm_get_descriptor_by_name(DM_PARTITION, name,
100 &error);
101 if (error == ENODEV) {
102 return ((CCIMInstance *)NULL);
103 } else if (error != 0) {
104 util_handleError(DISK_GETINSTANCE, CIM_ERR_FAILED,
105 DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
106 return ((CCIMInstance*)NULL);
107 }
108 } else if (error != 0) {
109 util_handleError(DISK_GETINSTANCE, CIM_ERR_FAILED,
110 DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
111 return ((CCIMInstance*)NULL);
112 }
113
114 /* Turn this descriptor in to a disk partition instance */
115
116 inst = partition_descriptor_toCCIMInstance(
117 hostName, dp_descriptor, DISK_PARTITION, &error);
118 dm_free_descriptor(dp_descriptor);
119
120 if (error != 0) {
121 ex = cim_getLastError();
122 util_handleError(DISK_GETINSTANCE, CIM_ERR_FAILED,
123 PART_DESC_TO_INSTANCE_FAILURE, ex, &error);
124 return ((CCIMInstance*)NULL);
125 }
126
127 return (inst);
128 }
129
130 /*
131 * Name: cp_enumInstances_Solaris_DiskPartition
132 *
133 * Description: Returns a list of instances if found.
134 *
135 * Parameters:
136 * pOP - An CCIMObjectPath * which contains the information on
137 * the class for which to find the instance.
138 * Returns:
139 * CCIMInstance * if matched instance is found. Otherwise, NULL.
140 */
141
142 /* ARGSUSED */
143 CCIMInstanceList*
cp_enumInstances_Solaris_DiskPartition(CCIMObjectPath * pOP)144 cp_enumInstances_Solaris_DiskPartition(CCIMObjectPath* pOP)
145 {
146
147 CCIMInstanceList* instList = NULL;
148 dm_descriptor_t *dsolpart_descriptorp = NULL;
149 dm_descriptor_t *dfdiskpart_descriptorp = NULL;
150 int error;
151 int filter[2];
152
153 filter[0] = DM_MT_FIXED;
154 filter[1] = DM_FILTER_END;
155
156 dsolpart_descriptorp = dm_get_descriptors(DM_SLICE, filter, &error);
157
158 if (error != 0) {
159 util_handleError(DISK_ENUMINSTANCES, CIM_ERR_FAILED,
160 DM_GET_DESCRIPTORS, NULL, &error);
161 return ((CCIMInstanceList *)NULL);
162 }
163
164 dfdiskpart_descriptorp =
165 dm_get_descriptors(DM_PARTITION, filter, &error);
166
167 if (error != 0) {
168 if (dsolpart_descriptorp != NULL) {
169 dm_free_descriptors(dsolpart_descriptorp);
170 }
171 util_handleError(DISK_ENUMINSTANCES, CIM_ERR_FAILED,
172 DM_GET_DESCRIPTORS, NULL, &error);
173 return ((CCIMInstanceList *)NULL);
174 }
175
176
177 /*
178 * If both descriptor lists are null, then there is nothing to return.
179 * otherwise, call the conversion function and return what is found.
180 */
181
182 if (dsolpart_descriptorp == NULL && dfdiskpart_descriptorp == NULL) {
183 return ((CCIMInstanceList *)NULL);
184 }
185
186 /* Convert the slice descriptors to a CCIMInstanceList */
187
188 instList = partition_descriptors_toCCIMInstanceList(DISK_PARTITION,
189 dsolpart_descriptorp, dfdiskpart_descriptorp, &error);
190
191 if (dsolpart_descriptorp != NULL) {
192 dm_free_descriptors(dsolpart_descriptorp);
193 }
194
195 if (dfdiskpart_descriptorp != NULL) {
196 dm_free_descriptors(dfdiskpart_descriptorp);
197 }
198
199 return (instList);
200 }
201
202 /*
203 * Name: cp_enumInstanceNames_Solaris_DiskPartition
204 *
205 * Description: Returns a list of instances if found.
206 *
207 * Parameters:
208 * pOP - An CCIMObjectPath * which contains the information on
209 * the class for which to find the instance.
210 * Returns:
211 * CCIMObjectPathList * if found. Otherwise, NULL.
212 */
213
214 /* ARGSUSED */
215 CCIMObjectPathList *
cp_enumInstanceNames_Solaris_DiskPartition(CCIMObjectPath * pOP)216 cp_enumInstanceNames_Solaris_DiskPartition(CCIMObjectPath *pOP) {
217
218 CCIMInstanceList *instList = NULL;
219 CCIMObjectPathList *objList = NULL;
220 int error = 0;
221
222 if (pOP == NULL) {
223 util_handleError(DISK_ENUMINSTANCENAMES, CIM_ERR_INVALID_PARAMETER,
224 NULL, NULL, &error);
225 return ((CCIMObjectPathList *)NULL);
226 }
227
228 /*
229 * Call to enumInstances and then convert instance list to a list
230 * of object list.
231 */
232
233 instList = cp_enumInstances_Solaris_DiskPartition(pOP);
234 if (instList != NULL) {
235 objList = cim_createObjectPathList(instList);
236 cim_freeInstanceList(instList);
237 }
238
239 return (objList);
240 }
241
242 /*
243 * Creating an instance of a Solaris_DiskPartition is not supported.
244 */
245
246 /* ARGSUSED */
247 CCIMObjectPath*
cp_createInstance_Solaris_DiskPartition(CCIMObjectPath * pOP,CCIMInstance * pInst)248 cp_createInstance_Solaris_DiskPartition(CCIMObjectPath* pOP,
249 CCIMInstance* pInst)
250 {
251 int error;
252
253 util_handleError(DISK_CREATEINSTANCE, CIM_ERR_NOT_SUPPORTED,
254 NULL, NULL, &error);
255 return ((CCIMObjectPath*)NULL);
256 }
257
258 /*
259 * Deleting an instance of a Solaris_DiskPartition is not supported.
260 */
261
262 /* ARGSUSED */
263 CIMBool
cp_deleteInstance_Solaris_DiskPartition(CCIMObjectPath * pInst)264 cp_deleteInstance_Solaris_DiskPartition(CCIMObjectPath* pInst)
265 {
266 int error;
267
268 util_handleError(DISK_DELETEINSTANCE, CIM_ERR_NOT_SUPPORTED,
269 NULL, NULL, &error);
270 return (cim_false);
271 }
272
273 /*
274 * Name: cp_getProperty_Solaris_DiskPartition
275 *
276 * Description: Returns the property requested, if found.
277 *
278 * Parameters:
279 * pOP - An CCIMObjectPath * which contains the information on
280 * the class for which to find the instances.
281 * Returns:
282 * CCIMProperty * if found.
283 */
284
285 /* ARGSUSED */
286 CCIMProperty *
cp_getProperty_Solaris_DiskPartition(CCIMObjectPath * pOP,char * pPropName)287 cp_getProperty_Solaris_DiskPartition(CCIMObjectPath *pOP,
288 char *pPropName)
289 {
290
291 CCIMProperty *prop = NULL;
292 CCIMInstance *inst = NULL;
293 int error = 0;
294
295 if (pOP == NULL) {
296 util_handleError(DISK_GETPROPERTY, CIM_ERR_INVALID_PARAMETER, NULL,
297 NULL, &error);
298 return ((CCIMProperty *)NULL);
299 }
300
301 inst = cp_getInstance_Solaris_DiskPartition(pOP);
302 if (inst == NULL) {
303 return ((CCIMProperty *)NULL);
304 }
305
306 prop = cim_getProperty(inst, pPropName);
307 cim_freeInstance(inst);
308 return (prop);
309 }
310 /*
311 * Deleting an instance of a Solaris_DiskPartition is not supported.
312 */
313
314 /* ARGSUSED */
315 CIMBool
cp_setInstance_Solaris_DiskPartition(CCIMObjectPath * pOP,CCIMInstance * pInst)316 cp_setInstance_Solaris_DiskPartition(CCIMObjectPath* pOP, CCIMInstance* pInst)
317 {
318 int error;
319
320 util_handleError(DISK_DELETEINSTANCE, CIM_ERR_NOT_SUPPORTED,
321 NULL, NULL, &error);
322 return (cim_false);
323 }
324
325 /*
326 * Setting a property on an instance of a Solaris_DiskPartition is not
327 * supported.
328 */
329
330 /* ARGSUSED */
331 CIMBool
cp_setProperty_Solaris_DiskPartition(CCIMObjectPath * pOP,CCIMProperty * pProp)332 cp_setProperty_Solaris_DiskPartition(CCIMObjectPath* pOP, CCIMProperty* pProp)
333 {
334 int error;
335
336 util_handleError(DISK_SETPROPERTY, CIM_ERR_NOT_SUPPORTED,
337 NULL, NULL, &error);
338 return (cim_false);
339 }
340
341 /* invokeMethod function dispatches to the various method implementations */
342
343 /* ARGSUSED */
344 CCIMProperty*
cp_invokeMethod_Solaris_DiskPartition(CCIMObjectPath * op,cimchar * methodName,CCIMPropertyList * inParams,CCIMPropertyList * outParams)345 cp_invokeMethod_Solaris_DiskPartition(CCIMObjectPath* op, cimchar* methodName,
346 CCIMPropertyList* inParams, CCIMPropertyList* outParams)
347 {
348 CCIMProperty *retVal = (CCIMProperty*)NULL;
349 int error = 0;
350
351
352 /* dispatch code for various methods */
353 if (strcasecmp("CreatePartitions", methodName) == 0) {
354 retVal = create_partitions(inParams, op);
355 return (retVal);
356 } else if (strcasecmp("CreateFileSystem", methodName) == 0) {
357 retVal = create_filesystem(op);
358 return (retVal);
359 }
360
361 /*
362 * We fell through the dispatch logic. There is no function
363 * that matches 'methodName'.
364 */
365
366 util_handleError(DISK_INVOKEMETHOD, CIM_ERR_FAILED,
367 NO_SUCH_METHOD, NULL, &error);
368 return ((CCIMProperty*)NULL);
369 }
370
371 /*
372 * Name: cp_execQuery_Solaris_DiskPartition
373 *
374 * Description:
375 * Returns an instance list which matches the query if any are found.
376 *
377 * Parameters:
378 * CCIMObjectPath *op - An CCIMObjectPath * which contains the
379 * information on the class for which to find the instances.
380 *
381 * selectList - Not used
382 * nonJoinExp - Not used
383 *
384 * Returns:
385 * CCIMInstance * if matched instance is found. Otherwise, NULL.
386 */
387
388 /*
389 * Currently, there is no WQL parser for the C providers. As a result,
390 * what is returned to the CIMOM is a list of instances with
391 * a NULL value at the beginning of the list. This NULL value indicates
392 * to the CIMOM that it must do the filtering for the client.
393 */
394
395 /* ARGSUSED */
396 CCIMInstanceList*
cp_execQuery_Solaris_DiskPartition(CCIMObjectPath * op,cimchar * selectList,cimchar * nonJoinExp,cimchar * queryExp,int queryType)397 cp_execQuery_Solaris_DiskPartition(CCIMObjectPath *op, cimchar *selectList,
398 cimchar *nonJoinExp, cimchar *queryExp, int queryType)
399 {
400 CCIMInstanceList *instList = NULL;
401 CCIMInstanceList *result;
402 CCIMInstance *emptyInst;
403 CCIMException *ex;
404 int error;
405
406 if (op == NULL) {
407 util_handleError(DISK_EXECQUERY, CIM_ERR_INVALID_PARAMETER, NULL,
408 NULL, &error);
409 return ((CCIMInstanceList *)NULL);
410 }
411
412 /* Enumerate all instances */
413 instList = cp_enumInstances_Solaris_DiskPartition(op);
414
415 if (instList == NULL) {
416 return ((CCIMInstanceList *)NULL);
417 }
418
419 /*
420 * Create a null instance and add it to the beginning
421 * of the list to indicate to the CIMOM that no filtering
422 * was done.
423 */
424
425 emptyInst = cim_createInstance("");
426 if (emptyInst == NULL) {
427 ex = cim_getLastError();
428 util_handleError(DISK_EXECQUERY, CIM_ERR_FAILED,
429 CREATE_INSTANCE_FAILURE, ex, &error);
430 cim_freeInstanceList(instList);
431 return ((CCIMInstanceList *)NULL);
432 }
433
434 result = cim_createInstanceList();
435 if (result == NULL) {
436 ex = cim_getLastError();
437 util_handleError(DISK_EXECQUERY, CIM_ERR_FAILED,
438 CREATE_INSTANCE_LIST_FAILURE, ex, &error);
439 cim_freeInstance(emptyInst);
440 cim_freeInstanceList(instList);
441 return ((CCIMInstanceList *)NULL);
442 }
443
444 result = cim_addInstance(result, emptyInst);
445 if (result == NULL) {
446 ex = cim_getLastError();
447 util_handleError(DISK_EXECQUERY, CIM_ERR_FAILED,
448 ADD_INSTANCE_FAILURE, ex, &error);
449 cim_freeInstance(emptyInst);
450 cim_freeInstanceList(instList);
451 return ((CCIMInstanceList *)NULL);
452 }
453 /*
454 * Since copying the original list to the new list will
455 * leave no way to free the original list, manually
456 * concatenate the original list to the new one.
457 */
458
459 result->mNext = instList;
460 return (result);
461 }
462