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