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 <unistd.h>
30 #include <netdb.h>
31 #include <errno.h>
32
33 #include "util.h"
34 #include "cimKeys.h"
35 #include "ctrl_descriptors.h"
36 #include "providerNames.h"
37 #include "messageStrings.h"
38 #include "Solaris_SCSIController.h"
39
40 #define SCSI_GETINSTANCE "SCSI_CONTROLLER,GET_INSTANCE"
41 #define SCSI_ENUMINSTANCES "SCSI_CONTROLLER,ENUM_INSTANCES"
42 #define SCSI_ENUMINSTANCENAMES "SCSI_CONTROLLER,ENUM_INSTANCENAMES"
43 #define SCSI_CREATEINSTANCE "SCSI_CONTROLLER,CREATE_INSTANCE"
44 #define SCSI_DELETEINSTANCE "SCSI_CONTROLLER,DELETE_INSTANCE"
45 #define SCSI_SETINSTANCE "SCSI_CONTROLLER,SET_INSTANCE"
46 #define SCSI_GETPROPERTY "SCSI_CONTROLLER,GET_PROPERTY"
47 #define SCSI_SETPROPERTY "SCSI_CONTROLLER,SET_PROPERTY"
48 #define SCSI_INVOKEMETHOD "SCSI_CONTROLLER,INVOKE_METHOD"
49 #define SCSI_EXECQUERY "SCSI_CONTROLLER,EXEC_QUERY"
50
51 /*
52 * Solaris_SCSIController provider
53 *
54 * It is important to note that all memory allocated by these functions
55 * and passed to the CIMOM, is freed by the CIMOM as the caller.
56 */
57
58 /*
59 * Name: cp_getInstance_Solaris_SCSIController
60 *
61 * Description: Returns an instance which matches the passed in object path
62 * if found.
63 *
64 * Parameters:
65 * pOP - An CCIMObjectPath * which contains the information on
66 * the class for which to find the instance.
67 * Returns:
68 * CCIMInstance * if matched instance is found. Otherwise, NULL.
69 */
70
71 /* ARGSUSED */
72 CCIMInstance*
cp_getInstance_Solaris_SCSIController(CCIMObjectPath * pOP)73 cp_getInstance_Solaris_SCSIController(CCIMObjectPath* pOP)
74 {
75 CCIMInstance *inst = NULL;
76 CCIMPropertyList *pCurPropList;
77 dm_descriptor_t scsictrl_descriptor;
78 char *name;
79 int error;
80
81 if (pOP == NULL ||
82 pOP->mKeyProperties == NULL) {
83 util_handleError(SCSI_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL,
84 NULL, &error);
85 return ((CCIMInstance *)NULL);
86 }
87
88 pCurPropList = pOP->mKeyProperties;
89 name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID,
90 &error);
91 if (error != 0 || name == NULL) {
92 util_handleError(SCSI_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL,
93 NULL, &error);
94 return ((CCIMInstance*)NULL);
95 }
96
97 scsictrl_descriptor =
98 dm_get_descriptor_by_name(DM_CONTROLLER, name, &error);
99 /*
100 * Not found. Return a null instance.
101 */
102
103 if (error == ENODEV) {
104 return ((CCIMInstance *)NULL);
105 }
106
107 if (error != 0) {
108 util_handleError(SCSI_GETINSTANCE, CIM_ERR_FAILED,
109 DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
110 return ((CCIMInstance*)NULL);
111 }
112 /* Turn this descriptor in to a scsi controller instance */
113
114 inst = ctrl_descriptor_toCCIMInstance(
115 hostName, scsictrl_descriptor, SCSI_CONTROLLER, &error);
116 dm_free_descriptor(scsictrl_descriptor);
117
118 if (error != 0) {
119 util_handleError(SCSI_GETINSTANCE, CIM_ERR_FAILED,
120 SCSICTRL_DESC_TO_INSTANCE_FAILURE, NULL, &error);
121 return ((CCIMInstance*)NULL);
122 }
123
124 return (inst);
125 }
126
127 /*
128 * Name: cp_enumInstances_Solaris_SCSIController
129 *
130 * Description: Returns an instancelist of SCSI controllers, if found.
131 *
132 * Parameters:
133 * pOP - An CCIMObjectPath * which contains the information on
134 * the class for which to find the instance.
135 * Returns:
136 * CCIMInstanceList * if matched instances are found. Otherwise, NULL.
137 */
138
139 /* ARGSUSED */
140 CCIMInstanceList*
cp_enumInstances_Solaris_SCSIController(CCIMObjectPath * pOP)141 cp_enumInstances_Solaris_SCSIController(CCIMObjectPath* pOP)
142 {
143 CCIMInstanceList *instList = NULL;
144 dm_descriptor_t *scsictrl_descriptorp;
145 int error;
146 int filter[1];
147
148 filter[0] = DM_FILTER_END;
149
150 scsictrl_descriptorp = dm_get_descriptors(DM_CONTROLLER, filter,
151 &error);
152
153 if (scsictrl_descriptorp == NULL ||
154 scsictrl_descriptorp[0] == NULL) {
155 return ((CCIMInstanceList *)NULL);
156 }
157
158 if (error != 0) {
159 util_handleError(SCSI_ENUMINSTANCES, CIM_ERR_FAILED,
160 DM_GET_DESCRIPTORS, NULL, &error);
161 return ((CCIMInstanceList *)NULL);
162 }
163
164 /* convert controller to CCIMInstanceList */
165 instList = ctrl_descriptors_toCCIMInstanceList(SCSI_CONTROLLER,
166 scsictrl_descriptorp, &error, 2, "scsi", "fibre channel");
167 dm_free_descriptors(scsictrl_descriptorp);
168
169 if (error != 0) {
170 util_handleError(SCSI_ENUMINSTANCES, CIM_ERR_FAILED,
171 SCSICTRL_DESC_TO_INSTANCE_FAILURE, NULL, &error);
172 return ((CCIMInstanceList *)NULL);
173 }
174
175 return (instList);
176 }
177
178 /*
179 * Name: cp_enumInstanceNames_Solaris_SCSIController
180 *
181 * Description: Returns an object path list of SCSI controllers, if found.
182 *
183 * Parameters:
184 * pOP - An CCIMObjectPath * which contains the information on
185 * the class for which to find the instance.
186 * Returns:
187 * CCIMObjectPathList * if matched instances are found. Otherwise, NULL.
188 */
189
190 /* ARGSUSED */
191 CCIMObjectPathList*
cp_enumInstanceNames_Solaris_SCSIController(CCIMObjectPath * pOP)192 cp_enumInstanceNames_Solaris_SCSIController(CCIMObjectPath * pOP) {
193
194 CCIMInstanceList *instList;
195 CCIMObjectPathList *objList = NULL;
196 int error;
197
198 if (pOP == NULL) {
199 util_handleError(SCSI_ENUMINSTANCENAMES, CIM_ERR_INVALID_PARAMETER,
200 NULL, NULL, &error);
201 return ((CCIMObjectPathList *)NULL);
202 }
203
204 /*
205 * Call in to enumInstances and then convert the instance list in
206 * to an object list.
207 */
208
209 instList = cp_enumInstances_Solaris_SCSIController(pOP);
210
211 if (instList != NULL) {
212 objList = cim_createObjectPathList(instList);
213 cim_freeInstanceList(instList);
214 }
215
216 return (objList);
217 }
218
219 /*
220 * Creating an instance of a Solaris_SCSIController is not supported.
221 */
222
223 /* ARGSUSED */
224 CCIMObjectPath*
cp_createInstance_Solaris_SCSIController(CCIMObjectPath * pOP,CCIMInstance * pInst)225 cp_createInstance_Solaris_SCSIController(
226 CCIMObjectPath* pOP, CCIMInstance* pInst)
227 {
228 int error;
229
230 util_handleError(SCSI_CREATEINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL,
231 NULL, &error);
232 return ((CCIMObjectPath*)NULL);
233 }
234
235 /*
236 * Deleting an instance of a Solaris_SCSIController is not supported.
237 */
238
239 /* ARGSUSED */
240 CIMBool
cp_deleteInstance_Solaris_SCSIController(CCIMObjectPath * pInst)241 cp_deleteInstance_Solaris_SCSIController(CCIMObjectPath* pInst)
242 {
243
244 int error;
245
246 util_handleError(SCSI_DELETEINSTANCE, CIM_ERR_NOT_SUPPORTED,
247 NULL, NULL, &error);
248 return (cim_false);
249 }
250
251 /*
252 * Name: cp_getProperty_Solaris_SCSIController
253 *
254 * Description: Returns the property requested, if found.
255 *
256 * Parameters:
257 * pOP - An CCIMObjectPath * which contains the information on
258 * the class for which to find the instances.
259 * Returns:
260 * CCIMProperty * if found.
261 */
262
263 /* ARGSUSED */
264 CCIMProperty *
cp_getProperty_Solaris_SCSIController(CCIMObjectPath * pOP,char * pPropName)265 cp_getProperty_Solaris_SCSIController(CCIMObjectPath *pOP,
266 char *pPropName)
267 {
268
269 CCIMProperty *prop = NULL;
270 CCIMInstance *inst = NULL;
271 int error = 0;
272
273 if (pOP == NULL) {
274 util_handleError(SCSI_GETPROPERTY, CIM_ERR_INVALID_PARAMETER, NULL,
275 NULL, &error);
276 return ((CCIMProperty *)NULL);
277 }
278
279 inst = cp_getInstance_Solaris_SCSIController(pOP);
280 if (inst == NULL) {
281 return ((CCIMProperty *)NULL);
282 }
283
284 prop = cim_getProperty(inst, pPropName);
285 cim_freeInstance(inst);
286 return (prop);
287 }
288
289 /*
290 * Setting an instance of a Solaris_SCSIController is not supported.
291 */
292
293 /* ARGSUSED */
294 CIMBool
cp_setInstance_Solaris_SCSIController(CCIMObjectPath * pOP,CCIMInstance * pInst)295 cp_setInstance_Solaris_SCSIController(CCIMObjectPath* pOP, CCIMInstance* pInst)
296 {
297
298 int error;
299
300 util_handleError(SCSI_SETINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL,
301 NULL, &error);
302 return (cim_false);
303 }
304
305 /*
306 * Setting a property of a Solaris_SCSIController is not supported.
307 */
308
309 /* ARGSUSED */
310 CIMBool
cp_setProperty_Solaris_SCSIController(CCIMObjectPath * pOP,CCIMProperty * pProp)311 cp_setProperty_Solaris_SCSIController(CCIMObjectPath* pOP, CCIMProperty* pProp)
312 {
313
314 int error;
315
316 util_handleError(SCSI_SETPROPERTY, CIM_ERR_NOT_SUPPORTED,
317 NULL, NULL, &error);
318 return (cim_false);
319 }
320
321 /*
322 * No methods available for Solaris_SCSIController.
323 */
324
325 /* ARGSUSED */
326 CCIMProperty*
cp_invokeMethod_Solaris_SCSIController(CCIMObjectPath * op,cimchar * methodName,CCIMPropertyList * inParams,CCIMPropertyList * outParams)327 cp_invokeMethod_Solaris_SCSIController(CCIMObjectPath* op, cimchar* methodName,
328 CCIMPropertyList* inParams, CCIMPropertyList* outParams)
329 {
330 CCIMProperty *retVal = (CCIMProperty*)NULL;
331 return (retVal);
332 }
333
334 /*
335 * Name: cp_execQuery_Solaris_SCSIController
336 *
337 * Description:
338 * Returns an instance list which matches the query if any are found.
339 *
340 * Parameters:
341 * CCIMObjectPath *op - An CCIMObjectPath * which contains the
342 * information on the class for which to find the instances.
343 *
344 * selectList - Not used
345 * nonJoinExp - Not used
346 *
347 * Returns:
348 * CCIMInstanceList * if matched instances are found. Otherwise, NULL.
349 */
350
351 /*
352 * Currently, there is no WQL parser for the C providers. As a result,
353 * what is returned to the CIMOM is a list of instances with
354 * a NULL value at the beginning of the list. This NULL value indicates
355 * to the CIMOM that it must do the filtering for the client.
356 */
357
358 /* ARGSUSED */
359 CCIMInstanceList*
cp_execQuery_Solaris_SCSIController(CCIMObjectPath * op,cimchar * selectList,cimchar * nonJoinExp,cimchar * queryExp,int queryType)360 cp_execQuery_Solaris_SCSIController(CCIMObjectPath *op, cimchar *selectList,
361 cimchar *nonJoinExp, cimchar *queryExp, int queryType)
362 {
363 CCIMInstanceList *instList = NULL;
364 CCIMInstanceList *result;
365 CCIMInstance *emptyInst;
366 CCIMException *ex;
367 int error;
368
369 if (op == NULL) {
370 util_handleError(SCSI_EXECQUERY, CIM_ERR_INVALID_PARAMETER, NULL,
371 NULL, &error);
372 return ((CCIMInstanceList *)NULL);
373 }
374
375 instList = cp_enumInstances_Solaris_SCSIController(op);
376
377 if (instList == NULL) {
378 return ((CCIMInstanceList *)NULL);
379 }
380 /*
381 * Create a null instance and add it to the beginning
382 * of the list to indicate to the CIMOM that no filtering
383 * was done.
384 */
385
386 emptyInst = cim_createInstance("");
387 if (emptyInst == NULL) {
388 ex = cim_getLastError();
389 util_handleError(SCSI_EXECQUERY, CIM_ERR_FAILED,
390 CREATE_INSTANCE_FAILURE, ex, &error);
391 cim_freeInstanceList(instList);
392 return ((CCIMInstanceList *)NULL);
393 }
394
395 result = cim_createInstanceList();
396 if (result == NULL) {
397 ex = cim_getLastError();
398 util_handleError(SCSI_EXECQUERY, CIM_ERR_FAILED,
399 CREATE_INSTANCE_LIST_FAILURE, ex, &error);
400 cim_freeInstance(emptyInst);
401 cim_freeInstanceList(instList);
402 return ((CCIMInstanceList *)NULL);
403 }
404
405 result = cim_addInstance(result, emptyInst);
406 if (result == NULL) {
407 ex = cim_getLastError();
408 util_handleError(SCSI_EXECQUERY, CIM_ERR_FAILED,
409 ADD_INSTANCE_FAILURE, ex, &error);
410 cim_freeInstanceList(instList);
411 cim_freeInstance(emptyInst);
412 return ((CCIMInstanceList *)NULL);
413 }
414
415 /*
416 * Since copying the original list to the new list will
417 * leave no way to free the original list, manually
418 * concatenate the original list to the new one.
419 */
420
421 result->mNext = instList;
422 return (result);
423 }
424