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_IDEController.h"
39
40#define	IDE_GETINSTANCE		"IDE_CONTROLLER,GET_INSTANCE"
41#define	IDE_ENUMINSTANCES	"IDE_CONTROLLER,ENUM_INSTANCES"
42#define	IDE_ENUMINSTANCENAMES	"IDE_CONTROLLER,ENUM_INSTANCENAMES"
43#define	IDE_CREATEINSTANCE	"IDE_CONTROLLER,CREATE_INSTANCE"
44#define	IDE_DELETEINSTANCE	"IDE_CONTROLLER,DELETE_INSTANCE"
45#define	IDE_SETINSTANCE		"IDE_CONTROLLER,SET_INSTANCE"
46#define	IDE_GETPROPERTY		"IDE_CONTROLLER,GET_PROPERTY"
47#define	IDE_SETPROPERTY		"IDE_CONTROLLER,SET_PROPERTY"
48#define	IDE_INVOKEMETHOD	"IDE_CONTROLLER,INVOKE_METHOD"
49#define	IDE_EXECQUERY		"IDE_CONTROLLER,EXEC_QUERY"
50
51/*
52 * Solaris_IDEController 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/*
60 * Name: cp_getInstance_Solaris_IDEController
61 *
62 * Description: Returns an instance which matches the passed in object path
63 * if found.
64 *
65 * Parameters:
66 *      pOP - An CCIMObjectPath * which contains the information on
67 *      the class for which to find the instance.
68 * Returns:
69 *      CCIMInstance * if matched instance is found. Otherwise, NULL.
70 */
71/* ARGSUSED */
72CCIMInstance*
73cp_getInstance_Solaris_IDEController(CCIMObjectPath* pOP)
74{
75	CCIMInstance		*inst = NULL;
76	CCIMPropertyList	*pCurPropList;
77	dm_descriptor_t		idectrl_descriptor;
78	char			*name;
79	int			error;
80
81	if (pOP == NULL ||
82	    pOP->mKeyProperties == NULL) {
83	    util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER,
84		NULL, NULL, &error);
85	    return ((CCIMInstance *)NULL);
86	}
87
88	pCurPropList = pOP->mKeyProperties;
89	name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID,
90	    &error);
91
92	if (error != 0 || name == NULL) {
93	    util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL,
94		NULL, &error);
95	    return ((CCIMInstance*)NULL);
96	}
97
98	idectrl_descriptor =
99	    dm_get_descriptor_by_name(DM_CONTROLLER, name, &error);
100
101	/*
102	 * Not found. Return a null instance.
103	 */
104
105	if (error == ENODEV) {
106	    return ((CCIMInstance *)NULL);
107	}
108
109	if (error != 0) {
110	    util_handleError(IDE_GETINSTANCE, CIM_ERR_FAILED,
111		DM_GET_DESC_BYNAME_FAILURE, NULL, &error);
112	    return ((CCIMInstance*)NULL);
113	}
114
115	/* Turn this descriptor in to a ide controller instance */
116
117	inst = ctrl_descriptor_toCCIMInstance(
118	    hostName, idectrl_descriptor, IDE_CONTROLLER, &error);
119	dm_free_descriptor(idectrl_descriptor);
120
121	if (error != 0) {
122	    util_handleError(IDE_GETINSTANCE, CIM_ERR_FAILED,
123		IDECTRL_DESC_TO_INSTANCE_FAILURE, NULL,
124		&error);
125	    return ((CCIMInstance*)NULL);
126	}
127
128	return (inst);
129}
130
131/*
132 * Name: cp_enumInstances_Solaris_IDEController
133 *
134 * Description: Returns an instance list of IDE controllers, if any found.
135 *
136 * Parameters:
137 *      pOP - An CCIMObjectPath * which contains the information on
138 *      the class for which to find the instances.
139 * Returns:
140 *      CCIMInstanceList * if matches are found. Otherwise, NULL.
141 */
142
143/* ARGSUSED */
144CCIMInstanceList*
145cp_enumInstances_Solaris_IDEController(CCIMObjectPath* pOP)
146{
147	CCIMInstanceList	*instList = NULL;
148	dm_descriptor_t		*idectrl_descriptorp;
149	int			error;
150	int			filter[1];
151
152	filter[0] = DM_FILTER_END;
153
154	idectrl_descriptorp = dm_get_descriptors(DM_CONTROLLER, filter,
155	    &error);
156
157	if (idectrl_descriptorp == NULL ||
158	    idectrl_descriptorp[0] == NULL) {
159	    return ((CCIMInstanceList *)NULL);
160	}
161	if (error != 0) {
162	    util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED,
163		DM_GET_DESCRIPTORS, NULL, &error);
164	    return ((CCIMInstanceList *)NULL);
165	}
166
167	/* convert controller to CCIMInstanceList */
168	instList = ctrl_descriptors_toCCIMInstanceList(IDE_CONTROLLER,
169	    idectrl_descriptorp, &error, 2, "ata", "pcata");
170	dm_free_descriptors(idectrl_descriptorp);
171
172	if (error != 0) {
173	    util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED,
174		IDECTRL_DESC_TO_INSTANCE_FAILURE, NULL, &error);
175	    return ((CCIMInstanceList *)NULL);
176	}
177
178	return (instList);
179}
180
181/*
182 * Name: cp_enumInstanceNames_Solaris_IDEController
183 *
184 * Description: Returns an objectPath list of IDE controllers, if any found.
185 *
186 * Parameters:
187 *      pOP - An CCIMObjectPath * which contains the information on
188 *      the class for which to find the instances.
189 * Returns:
190 *      CCIMObjectPathList * if matched instances are found. Otherwise, NULL.
191 */
192
193/* ARGSUSED */
194CCIMObjectPathList*
195cp_enumInstanceNames_Solaris_IDEController(CCIMObjectPath * pOP) {
196
197	CCIMInstanceList	*instList;
198	CCIMObjectPathList	*objList = NULL;
199	int			error;
200
201	if (pOP == NULL) {
202	    util_handleError(IDE_ENUMINSTANCENAMES, CIM_ERR_INVALID_PARAMETER,
203		NULL, NULL, &error);
204	    return ((CCIMObjectPathList *)NULL);
205	}
206
207	/*
208	 * Call in to enumInstances and then convert the instance list in
209	 * to an object list.
210	 */
211
212	instList = cp_enumInstances_Solaris_IDEController(pOP);
213
214	if (instList != NULL) {
215	    objList = cim_createObjectPathList(instList);
216	    cim_freeInstanceList(instList);
217	}
218
219	return (objList);
220}
221
222/*
223 * Creating an instance of a Solaris_IDEController is not supported.
224 */
225
226/* ARGSUSED */
227CCIMObjectPath*
228cp_createInstance_Solaris_IDEController(
229    CCIMObjectPath* pOP, CCIMInstance* pInst)
230{
231	int	error;
232
233	util_handleError(IDE_CREATEINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL,
234	    NULL, &error);
235	return ((CCIMObjectPath*)NULL);
236}
237
238/*
239 * Deleting an instance of a Solaris_IDEController is not supported.
240 */
241
242/* ARGSUSED */
243CIMBool
244cp_deleteInstance_Solaris_IDEController(CCIMObjectPath* pInst)
245{
246	int	error;
247
248	util_handleError(IDE_DELETEINSTANCE,
249	    CIM_ERR_NOT_SUPPORTED, NULL, NULL, &error);
250	return (cim_false);
251}
252
253/*
254 * Name: cp_getProperty_Solaris_IDEController
255 *
256 * Description: Returns the property requested, if found.
257 *
258 * Parameters:
259 *	pOP - An CCIMObjectPath * which contains the information on
260 *	the class for which to find the instances.
261 * Returns:
262 *	CCIMProperty * if found.
263 */
264
265/* ARGSUSED */
266CCIMProperty	*
267cp_getProperty_Solaris_IDEController(CCIMObjectPath *pOP,
268    char *pPropName)
269{
270
271	CCIMProperty	*prop = NULL;
272	CCIMInstance	*inst = NULL;
273	int		error = 0;
274
275	if (pOP == NULL) {
276	    util_handleError(IDE_GETPROPERTY, CIM_ERR_INVALID_PARAMETER, NULL,
277		NULL, &error);
278	    return ((CCIMProperty *)NULL);
279	}
280
281	inst = cp_getInstance_Solaris_IDEController(pOP);
282	if (inst == NULL) {
283	    return ((CCIMProperty *)NULL);
284	}
285
286	prop = cim_getProperty(inst, pPropName);
287	cim_freeInstance(inst);
288	return (prop);
289}
290/*
291 * Setting an instance of a Solaris_IDEController is not supported.
292 */
293
294/* ARGSUSED */
295CIMBool
296cp_setInstance_Solaris_IDEController(CCIMObjectPath* pOP, CCIMInstance* pInst)
297{
298
299	int	error;
300
301	util_handleError(IDE_SETINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL,
302	    NULL, &error);
303	return (cim_false);
304}
305
306/*
307 * Setting a property on an instance of a Solaris_IDEController is not
308 * supported.
309 */
310/* ARGSUSED */
311CIMBool
312cp_setProperty_Solaris_IDEController(CCIMObjectPath* pOP, CCIMProperty* pProp)
313{
314
315	int	error;
316
317	util_handleError(IDE_SETPROPERTY, CIM_ERR_NOT_SUPPORTED, NULL,
318	    NULL, &error);
319	return (cim_false);
320}
321
322/*
323 * No methods available on an instance of a Solaris_IDEController
324 */
325
326/* ARGSUSED */
327CCIMProperty*
328cp_invokeMethod_Solaris_IDEController(CCIMObjectPath* op, cimchar* methodName,
329    CCIMPropertyList* inParams, CCIMPropertyList* outParams)
330{
331	CCIMProperty	*retVal = (CCIMProperty*)NULL;
332	return (retVal);
333}
334
335/*
336 * Name: cp_execQuery_Solaris_IDEController
337 *
338 * Description:
339 * Returns an instance list which matches the query if any are found.
340 *
341 * Parameters:
342 *      CCIMObjectPath *op - An CCIMObjectPath * which contains the
343 *      information on the class for which to find the instances.
344 *
345 *      selectList - Not used
346 *      nonJoinExp - Not used
347 *
348 * Returns:
349 *      CCIMInstanceList * if matched instances are found. Otherwise, NULL.
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 */
359CCIMInstanceList*
360cp_execQuery_Solaris_IDEController(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(IDE_EXECQUERY, CIM_ERR_INVALID_PARAMETER, NULL,
371		NULL, &error);
372	    return ((CCIMInstanceList *)NULL);
373	}
374
375	instList = cp_enumInstances_Solaris_IDEController(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(IDE_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(IDE_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(IDE_EXECQUERY, CIM_ERR_FAILED,
409		ADD_INSTANCE_FAILURE, ex, &error);
410	    cim_freeInstanceList(instList);
411	    return ((CCIMInstanceList *)NULL);
412	}
413
414	/*
415	 * Since copying the original list to the new list will
416	 * leave no way to free the original list, manually
417	 * concatenate the original list to the new one.
418	 */
419
420	result->mNext = instList;
421	return (result);
422}
423