/usr/src/cmd/wbem/provider/c/wbem_disk/assoc/Solaris_IDEInterface.c
C | 1183 lines | 689 code | 167 blank | 327 comment | 188 complexity | 98103da80a8b9a3f39dfac8c5bd385cf MD5 | raw file
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 <errno.h> 31 32#include "util.h" 33#include "cimKeys.h" 34#include "providerNames.h" 35#include "messageStrings.h" 36#include "drive_descriptors.h" 37#include "ctrl_descriptors.h" 38#include "Solaris_IDEInterface.h" 39 40#define IDE_GETINSTANCE "IDE_INTERFACE,GET_INSTANCE" 41#define IDE_ENUMINSTANCES "IDE_INTERFACE,ENUM_INSTANCES" 42#define IDE_ENUMINSTANCENAMES "IDE_INTERFACE,ENUM_INSTANCENAMES" 43#define IDE_CREATEINSTANCE "IDE_INTERFACE,CREATE_INSTANCE" 44#define IDE_DELETEINSTANCE "IDE_INTERFACE,DELETE_INSTANCE" 45#define IDE_SETINSTANCE "IDE_INTERFACE,SET_INSTANCE" 46#define IDE_GETPROPERTY "IDE_INTERFACE,GET_PROPERTY" 47#define IDE_SETPROPERTY "IDE_INTERFACE,SET_PROPERTY" 48#define IDE_INVOKEMETHOD "IDE_INTERFACE,INVOKE_METHOD" 49#define IDE_EXECQUERY "IDE_INTERFACE,EXEC_QUERY" 50#define IDE_ASSOCIATORS "IDE_INTERFACE,ASSOCIATORS" 51#define IDE_ASSOCIATORNAMES "IDE_INTERFACE,ASSOCIATOR_NAMES" 52#define IDE_REFERENCES "IDE_INTERFACE,REFERENCES" 53#define IDE_REFERENCENAMES "IDE_INTERFACE,REFERENCE_NAMES" 54 55 56static 57CCIMInstanceList * 58ideIntAssocToInstList(CCIMObjectPath *pObjectName, cimchar *pObjectNameRole, 59 CCIMObjectPathList *objList, cimchar *objRole, int *error); 60 61static 62CCIMInstance * 63ideIntAssocToInst(CCIMObjectPath *obj1, cimchar *obj1Role, 64 CCIMObjectPath *obj2, cimchar *obj2Role, int *error); 65 66/* 67 * Solaris_IDEInterface provider 68 * 69 * It is important to note that all memory allocated by these functions 70 * and passed to the CIMOM, is freed by the door process prior to 71 * sending a copy of the data to the CIMOM. 72 */ 73 74/* 75 * Name: cp_getInstance_Solaris_IDEInterface 76 * 77 * Description: Returns an instance which matches the passed in object path 78 * if found. 79 * 80 * Parameters: 81 * pOP - An CCIMObjectPath * which contains the information on 82 * the class for which to find the instance. 83 * Returns: 84 * CCIMInstance * if matched instance is found. Otherwise, NULL. 85 */ 86 87/* ARGSUSED */ 88CCIMInstance* 89cp_getInstance_Solaris_IDEInterface(CCIMObjectPath* pOP) 90{ 91 CCIMInstance* inst = NULL; 92 CCIMPropertyList* pCurPropList; 93 dm_descriptor_t d_descriptor; 94 dm_descriptor_t c_descriptor; 95 CCIMObjectPath *antOp = NULL; 96 CCIMObjectPath *depOp = NULL; 97 int error; 98 char *name; 99 100 if (pOP == NULL) { 101 util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL, 102 NULL, &error); 103 return ((CCIMInstance *)NULL); 104 } 105 106 if ((pCurPropList = pOP->mKeyProperties) == NULL) { 107 util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL, 108 NULL, &error); 109 return ((CCIMInstance *)NULL); 110 } 111 112 antOp = (CCIMObjectPath *)util_getKeyValue(pCurPropList, reference, 113 ANTECEDENT, &error); 114 115 if (error == 0) { 116 depOp = (CCIMObjectPath *)util_getKeyValue(pCurPropList, reference, 117 DEPENDENT, &error); 118 } 119 120 if (error != 0) { 121 util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, 122 NULL, NULL, &error); 123 return ((CCIMInstance *)NULL); 124 } 125 126 /* 127 * Now, get the name of the antecedent from the object path. 128 */ 129 130 if ((pCurPropList = antOp->mKeyProperties) == NULL) { 131 util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL, 132 NULL, &error); 133 return ((CCIMInstance *)NULL); 134 } 135 136 name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID, 137 &error); 138 139 if (error != 0) { 140 util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, 141 NULL, NULL, &error); 142 } 143 144 /* 145 * The only reason it is needed to get the descriptor for these 146 * two devices is to verify that they still exist and are valid. 147 * If they are not found, then getting the instance for this 148 * association as passed in by the client is not possible. 149 */ 150 c_descriptor = dm_get_descriptor_by_name(DM_CONTROLLER, name, 151 &error); 152 /* 153 * Not found. Return a null instance. 154 */ 155 156 if (c_descriptor == NULL || error == ENODEV) { 157 return ((CCIMInstance *)NULL); 158 } 159 160 if (error != 0) { 161 util_handleError(IDE_GETINSTANCE, CIM_ERR_FAILED, 162 DM_GET_DESC_BYNAME_FAILURE, NULL, &error); 163 return ((CCIMInstance*)NULL); 164 } 165 dm_free_descriptor(c_descriptor); 166 167 /* 168 * Now, get the name of the dependent from the object path. 169 */ 170 171 if ((pCurPropList = depOp->mKeyProperties) == NULL) { 172 util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, NULL, 173 NULL, &error); 174 return ((CCIMInstance *)NULL); 175 } 176 177 name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID, 178 &error); 179 180 if (error != 0) { 181 util_handleError(IDE_GETINSTANCE, CIM_ERR_INVALID_PARAMETER, 182 NULL, NULL, &error); 183 return ((CCIMInstance *)NULL); 184 } 185 186 d_descriptor = dm_get_descriptor_by_name(DM_DRIVE, name, 187 &error); 188 /* 189 * Not found. Return a null instance. 190 */ 191 192 if (d_descriptor == NULL || error == ENODEV) { 193 d_descriptor = dm_get_descriptor_by_name(DM_ALIAS, name, 194 &error); 195 if (d_descriptor == NULL || error == ENODEV) { 196 util_handleError(IDE_GETINSTANCE, CIM_ERR_NOT_FOUND, 197 NULL, NULL, &error); 198 return ((CCIMInstance *)NULL); 199 } 200 } 201 202 if (error != 0) { 203 util_handleError(IDE_GETINSTANCE, CIM_ERR_FAILED, 204 DM_GET_DESC_BYNAME_FAILURE, NULL, &error); 205 return ((CCIMInstance *)NULL); 206 } 207 208 dm_free_descriptor(d_descriptor); 209 210 /* 211 * At this point I have verified I have the two devices that 212 * are part of this association. Use the object paths I got 213 * earlier to create the ideinterface instance. 214 */ 215 inst = ideIntAssocToInst(antOp, ANTECEDENT, depOp, DEPENDENT, &error); 216 217 if (error != 0) { 218 util_handleError(IDE_GETINSTANCE, CIM_ERR_FAILED, 219 IDEINT_ASSOC_TO_INSTANCE_FAILURE, NULL, &error); 220 return ((CCIMInstance *)NULL); 221 } 222 223 return (inst); 224} 225 226/* 227 * Name: cp_enumInstances_Solaris_IDEInterface 228 * 229 * Description: Returns a linked list of instances of 230 * Solaris_IDEInterface if found. 231 * 232 * Parameters: 233 * pOP - An CCIMObjectPath * which contains the information on 234 * the class for which to find the instances. 235 * Returns: 236 * CCIMInstanceList * if istances are found. If no instances, 237 * NULL is returned. On error, NULL is returned. 238 */ 239 240/* ARGSUSED */ 241CCIMInstanceList* 242cp_enumInstances_Solaris_IDEInterface(CCIMObjectPath* pOP) 243{ 244 CCIMInstanceList *instList = NULL; 245 CCIMObjectPathList *cObjList = NULL; 246 CCIMObjectPathList *tmpObjList; 247 CCIMObjectPath *objPath; 248 CCIMInstance *inst; 249 CCIMException *ex; 250 dm_descriptor_t *d_descriptorp = NULL; 251 int error = 0; 252 253 /* 254 * Get the list of IDE Controllers. Then get the associated drives 255 * via the device api. 256 */ 257 258 objPath = cim_createEmptyObjectPath(IDE_CONTROLLER); 259 if (objPath == NULL) { 260 ex = cim_getLastError(); 261 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 262 CREATE_OBJECT_PATH, ex, &error); 263 return ((CCIMInstanceList *)NULL); 264 } 265 266 cObjList = cimom_enumerateInstanceNames(objPath, cim_false); 267 cim_freeObjectPath(objPath); 268 269 /* 270 * NULL means error. 271 */ 272 if (cObjList == NULL) { 273 ex = cim_getLastError(); 274 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 275 ENUM_INSTANCENAMES_FAILURE, ex, &error); 276 return ((CCIMInstanceList *)NULL); 277 } 278 279 if (cObjList->mDataObject == NULL) { 280 return ((CCIMInstanceList *)NULL); 281 } 282 283 instList = cim_createInstanceList(); 284 if (instList == NULL) { 285 ex = cim_getLastError(); 286 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 287 CREATE_INSTANCE_LIST_FAILURE, ex, &error); 288 return ((CCIMInstanceList *)NULL); 289 } 290 /* 291 * Loop through all of these controller objects and get the associated 292 * disks. 293 */ 294 295 for (tmpObjList = cObjList; 296 tmpObjList != NULL && tmpObjList->mDataObject != NULL; 297 tmpObjList = tmpObjList->mNext) { 298 299 char *name = NULL; 300 CCIMObjectPath *cOp; 301 CCIMInstanceList *tmpList = NULL; 302 CCIMInstanceList *tmpList1; 303 CCIMPropertyList *pCurPropList; 304 CCIMObjectPathList *dObjList; 305 CCIMInstanceList *tL; 306 dm_descriptor_t c_descriptor = NULL; 307 error = 0; 308 309 cOp = tmpObjList->mDataObject; 310 if ((pCurPropList = cOp->mKeyProperties) == NULL) { 311 util_handleError(IDE_ENUMINSTANCES, 312 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 313 cim_freeObjectPathList(cObjList); 314 cim_freeInstanceList(instList); 315 return ((CCIMInstanceList *)NULL); 316 } 317 318 name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID, 319 &error); 320 321 if (error != 0) { 322 util_handleError(IDE_ENUMINSTANCES, 323 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 324 cim_freeObjectPathList(cObjList); 325 cim_freeInstanceList(instList); 326 return ((CCIMInstanceList *)NULL); 327 } 328 329 c_descriptor = dm_get_descriptor_by_name(DM_CONTROLLER, name, 330 &error); 331 if (c_descriptor == NULL || error == ENODEV) { 332 continue; 333 } 334 if (error != 0) { 335 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 336 DM_GET_DESC_BYNAME_FAILURE, NULL, 337 &error); 338 cim_freeObjectPathList(cObjList); 339 cim_freeInstanceList(instList); 340 return ((CCIMInstanceList *)NULL); 341 } 342 343 d_descriptorp = dm_get_associated_descriptors(c_descriptor, 344 DM_DRIVE, &error); 345 dm_free_descriptor(c_descriptor); 346 347 /* 348 * If there are no drives associated with this controller, 349 * continue on to the next controller. 350 */ 351 352 if (d_descriptorp == NULL) { 353 continue; 354 } 355 356 if (d_descriptorp[0] == NULL) { 357 dm_free_descriptors(d_descriptorp); 358 continue; 359 } 360 361 if (error == ENODEV) { 362 continue; 363 } 364 365 if (error != 0) { 366 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 367 DM_GET_ASSOC_FAILURE, NULL, &error); 368 cim_freeInstanceList(instList); 369 cim_freeObjectPathList(cObjList); 370 return ((CCIMInstanceList *)NULL); 371 } 372 373 tmpList = drive_descriptors_toCCIMObjPathInstList( 374 DISK_DRIVE, d_descriptorp, &error); 375 dm_free_descriptors(d_descriptorp); 376 d_descriptorp = NULL; 377 378 if (error != 0) { 379 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 380 DRIVE_DESC_TO_INSTANCE_FAILURE, NULL, &error); 381 cim_freeInstanceList(instList); 382 cim_freeObjectPathList(cObjList); 383 return ((CCIMInstanceList *)NULL); 384 } 385 386 /* 387 * It is possible that the controller does not have a drive 388 * associated with it. If this is true, the list will be 389 * NULL. 390 */ 391 392 if (tmpList == NULL) { 393 continue; 394 } 395 396 dObjList = cim_createObjectPathList(tmpList); 397 cim_freeInstanceList(tmpList); 398 399 if (dObjList == NULL) { 400 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 401 DRIVE_DESC_TO_INSTANCE_FAILURE, NULL, &error); 402 cim_freeInstanceList(instList); 403 cim_freeObjectPathList(cObjList); 404 return ((CCIMInstanceList *)NULL); 405 } 406 tmpList1 = ideIntAssocToInstList( 407 cOp, ANTECEDENT, dObjList, DEPENDENT, &error); 408 cim_freeObjectPathList(dObjList); 409 410 if (error != 0) { 411 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 412 IDECTRL_DESC_TO_INSTANCE_FAILURE, NULL, &error); 413 cim_freeInstanceList(instList); 414 cim_freeObjectPathList(cObjList); 415 return ((CCIMInstanceList *)NULL); 416 } 417 418 tL = tmpList1; 419 do { 420 inst = cim_copyInstance(tL->mDataObject); 421 instList = cim_addInstance(instList, inst); 422 if (instList == NULL) { 423 util_handleError(IDE_ENUMINSTANCES, CIM_ERR_FAILED, 424 ADD_INSTANCE_FAILURE, NULL, &error); 425 cim_freeObjectPathList(cObjList); 426 cim_freeObjectPathList(tmpList1); 427 return ((CCIMInstanceList *)NULL); 428 } 429 tL = tL->mNext; 430 } while (tL && tL->mDataObject != NULL); 431 432 cim_freeInstanceList(tmpList1); 433 } /* end for */ 434 435 cim_freeObjectPathList(cObjList); 436 /* 437 * It is possible I will have an empty instance list at 438 * this point. So, I must check and NULL this out if 439 * there are no entries. 440 */ 441 if (instList->mDataObject == NULL) { 442 cim_freeInstanceList(instList); 443 instList = NULL; 444 } 445 return (instList); 446} 447 448/* 449 * Name: cp_enumInstanceNames_Solaris_IDEInterface 450 * 451 * Description: Returns a linked list of CCIMObjectPath * 452 * of Solaris_IDEInterface if found. 453 * 454 * Parameters: 455 * pOP - An CCIMObjectPath * which contains the information on 456 * the class for which to find the instances. 457 * Returns: 458 * CCIMObjectPathList * if objects are found. If no objects, 459 * an empty list is returned. On error, NULL is returned. 460 */ 461 462CCIMObjectPathList* 463cp_enumInstanceNames_Solaris_IDEInterface(CCIMObjectPath * pOP) { 464 465 CCIMInstanceList *instList; 466 CCIMObjectPathList *objList = NULL; 467 int error; 468 469 if (pOP == NULL) { 470 util_handleError(IDE_ENUMINSTANCENAMES, 471 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 472 return ((CCIMObjectPathList *)NULL); 473 } 474 475 /* 476 * Call in to enumInstances and then convert the instance list in 477 * to an object list. 478 */ 479 480 instList = cp_enumInstances_Solaris_IDEInterface(pOP); 481 482 if (instList != NULL) { 483 objList = cim_createObjectPathList(instList); 484 cim_freeInstanceList(instList); 485 } 486 487 return (objList); 488} 489 490/* 491 * Creating an instance of a Solaris_IDEInterface is not supported. 492 */ 493 494/* ARGSUSED */ 495CCIMObjectPath* 496cp_createInstance_Solaris_IDEInterface(CCIMObjectPath* pOP, 497 CCIMInstance* pInst) 498{ 499 int error; 500 501 util_handleError(IDE_CREATEINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL, 502 NULL, &error); 503 return ((CCIMObjectPath *)NULL); 504} 505 506/* 507 * Deleting an instance of a Solaris_IDEInterface is not supported. 508 */ 509 510/* ARGSUSED */ 511CIMBool 512cp_deleteInstance_Solaris_IDEInterface(CCIMObjectPath* pInst) 513{ 514 int error; 515 516 util_handleError( 517 IDE_DELETEINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL, NULL, &error); 518 return (cim_false); 519} 520/* 521 * Name: cp_getProperty_Solaris_IIDEInterface 522 * 523 * Description: Returns the property requested, if found. 524 * 525 * Parameters: 526 * pOP - An CCIMObjectPath * which contains the information on 527 * the class for which to find the instances. 528 * Returns: 529 * CCIMProperty * if found. 530 */ 531 532/* ARGSUSED */ 533CCIMProperty * 534cp_getProperty_Solaris_IDEInterface(CCIMObjectPath *pOP, 535 char *pPropName) 536{ 537 538 CCIMProperty *prop = NULL; 539 CCIMInstance *inst = NULL; 540 int error = 0; 541 542 if (pOP == NULL) { 543 util_handleError(IDE_GETPROPERTY, CIM_ERR_INVALID_PARAMETER, NULL, 544 NULL, &error); 545 return ((CCIMProperty *)NULL); 546 } 547 548 inst = cp_getInstance_Solaris_IDEInterface(pOP); 549 if (inst == NULL) { 550 return ((CCIMProperty *)NULL); 551 } 552 553 prop = cim_getProperty(inst, pPropName); 554 cim_freeInstance(inst); 555 return (prop); 556} 557 558/* 559 * Setting an instance of a Solaris_IDEInterface is not supported. 560 */ 561 562/* ARGSUSED */ 563CIMBool 564cp_setInstance_Solaris_IDEInterface(CCIMObjectPath* pOP, CCIMInstance* pInst) 565{ 566 int error; 567 568 util_handleError( 569 IDE_SETINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL, NULL, &error); 570 return (cim_false); 571} 572 573 574/* 575 * Setting a property on a Solaris_IDEInterface is not supported. 576 */ 577 578/* ARGSUSED */ 579CIMBool 580cp_setProperty_Solaris_IDEInterface(CCIMObjectPath* pOP, CCIMProperty* pProp) 581{ 582 int error; 583 584 util_handleError( 585 IDE_SETPROPERTY, CIM_ERR_NOT_SUPPORTED, NULL, NULL, &error); 586 return (cim_false); 587} 588 589/* 590 * No Methods for Solaris_IDEInterface. 591 */ 592 593/* ARGSUSED */ 594CCIMProperty* 595cp_invokeMethod_Solaris_IDEInterface( 596 CCIMObjectPath* op, cimchar* methodName, 597 CCIMPropertyList* inParams, CCIMPropertyList* outParams) 598{ 599 CCIMProperty *retVal = (CCIMProperty *)NULL; 600 return (retVal); 601} 602 603/* 604 * Name: cp_execQuery_Solaris_IDEInterface 605 * 606 * Description: 607 * Returns an instance list which matches the query if any are found. 608 * 609 * Parameters: 610 * CCIMObjectPath *op - An CCIMObjectPath * which contains the 611 * information on the class for which to find the instances. 612 * 613 * selectList - Not used 614 * nonJoinExp - Not used 615 * 616 * Returns: 617 * CCIMInstanceList * if matched instance is found. Otherwise, NULL. 618 */ 619/* 620 * Currently, there is no WQL parser for the C providers. As a result, 621 * what is returned to the CIMOM is a list of instances with 622 * a NULL value at the beginning of the list. This NULL value indicates 623 * to the CIMOM that it must do the filtering for the client. 624 */ 625 626/* ARGSUSED */ 627CCIMInstanceList* 628cp_execQuery_Solaris_IDEInterface(CCIMObjectPath *op, 629 cimchar *selectList, cimchar *nonJoinExp, cimchar *queryExp, int queryType) 630{ 631 CCIMInstanceList *instList = NULL; 632 CCIMInstanceList *result; 633 CCIMInstance *emptyInst; 634 CCIMException *ex; 635 int error; 636 637 if (op == NULL) { 638 util_handleError(IDE_EXECQUERY, CIM_ERR_INVALID_PARAMETER, NULL, 639 NULL, &error); 640 return ((CCIMInstanceList *)NULL); 641 } 642 643 instList = cimom_enumerateInstances(op, cim_false, cim_false, cim_false, 644 cim_false, cim_false, NULL, 0); 645 646 /* 647 * NULL means error. 648 */ 649 if (instList == NULL) { 650 ex = cim_getLastError(); 651 util_handleError(IDE_EXECQUERY, CIM_ERR_FAILED, 652 ENUM_INSTANCES_FAILURE, ex, &error); 653 return ((CCIMInstanceList *)NULL); 654 } 655 656 if (instList->mDataObject == NULL) { 657 return ((CCIMInstanceList *)NULL); 658 } 659 /* 660 * Create a null instance and add it to the beginning 661 * of the list to indicate to the CIMOM that no filtering 662 * was done. 663 */ 664 665 emptyInst = cim_createInstance(""); 666 if (emptyInst == NULL) { 667 ex = cim_getLastError(); 668 util_handleError(IDE_EXECQUERY, CIM_ERR_FAILED, 669 CREATE_INSTANCE_FAILURE, ex, &error); 670 return ((CCIMInstanceList *)NULL); 671 } 672 673 result = cim_createInstanceList(); 674 if (result == NULL) { 675 ex = cim_getLastError(); 676 util_handleError(IDE_EXECQUERY, CIM_ERR_FAILED, 677 CREATE_INSTANCE_LIST_FAILURE, ex, &error); 678 cim_freeInstance(emptyInst); 679 cim_freeInstanceList(instList); 680 return ((CCIMInstanceList *)NULL); 681 } 682 683 result = cim_addInstance(result, emptyInst); 684 if (result == NULL) { 685 ex = cim_getLastError(); 686 util_handleError(IDE_EXECQUERY, CIM_ERR_FAILED, 687 ADD_INSTANCE_FAILURE, ex, &error); 688 cim_freeInstance(emptyInst); 689 cim_freeInstanceList(instList); 690 return ((CCIMInstanceList *)NULL); 691 } 692 693 /* 694 * Since copying the original list to the new list will 695 * leave no way to free the original list, manually 696 * concatenate the original list to the new one. 697 */ 698 699 result->mNext = instList; 700 return (result); 701} 702 703/* 704 * Name: cp_associators_Solaris_IDEInterface 705 * 706 * Description: 707 * Returns instances of objects associated with the passed in 708 * object if there are any. 709 * 710 * Parameters: 711 * 712 * CCIMObjectPath *pAssocName - The name of the association that 713 * the client wants information about. 714 * 715 * CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the 716 * information on the class for which to find the associated instances. 717 * 718 * cimchar *pResultClass - If specified, only return instances that 719 * are of this class type. 720 * 721 * cimchar *pRole - If specified, must be valid for the object path 722 * passed in requesting the associated instances. 723 * 724 * cimchar *pResultRole - If specified, only return instances that 725 * are playing this role in the association. 726 * 727 * 728 * Returns: 729 * CCIMInstanceList * if associated objects are found. Thist list 730 * may be empty. NULL is returned on error. 731 */ 732 733/* ARGSUSED */ 734CCIMInstanceList * 735cp_associators_Solaris_IDEInterface(CCIMObjectPath *pAssocName, 736 CCIMObjectPath *pObjectName, cimchar *pResultClass, cimchar *pRole, 737 cimchar *pResultRole) 738{ 739 CCIMPropertyList *pCurPropList; 740 CCIMInstanceList *instList = NULL; 741 dm_descriptor_t *assoc_descriptors = NULL; 742 dm_descriptor_t *tmpList = NULL; 743 dm_descriptor_t obj_desc = NULL; 744 char *name; 745 int error = 0; 746 int isAntecedent = 0; 747 int isAlias = 0; 748 749 if ((pObjectName == NULL || 750 (pCurPropList = pObjectName->mKeyProperties) == NULL)) { 751 util_handleError(IDE_ASSOCIATORS, CIM_ERR_INVALID_PARAMETER, NULL, 752 NULL, &error); 753 return ((CCIMInstanceList *)NULL); 754 } 755 756 if (strcasecmp(pObjectName->mName, IDE_CONTROLLER) == 0) { 757 isAntecedent = 1; 758 } 759 760 if (pRole != NULL) { 761 if (strcasecmp(pRole, ANTECEDENT) == 0) { 762 if (isAntecedent != 1) { 763 util_handleError(IDE_ASSOCIATORS, 764 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 765 return ((CCIMInstanceList *)NULL); 766 } 767 } else if (strcasecmp(pRole, DEPENDENT) == 0) { 768 if (isAntecedent == 1) { 769 util_handleError(IDE_ASSOCIATORS, 770 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 771 return ((CCIMInstanceList *)NULL); 772 } 773 } 774 } 775 776 /* 777 * Both ide controller and disk drive have deviceid as the 778 * key. 779 */ 780 781 name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID, 782 &error); 783 if (error != 0) { 784 util_handleError(IDE_ASSOCIATORS, CIM_ERR_INVALID_PARAMETER, NULL, 785 NULL, &error); 786 return ((CCIMInstanceList *)NULL); 787 } 788 789 if (isAntecedent) { 790 obj_desc = dm_get_descriptor_by_name(DM_CONTROLLER, name, 791 &error); 792 } else { 793 obj_desc = dm_get_descriptor_by_name(DM_DRIVE, name, 794 &error); 795 if (obj_desc == NULL || error == ENODEV) { 796 isAlias = 1; 797 obj_desc = dm_get_descriptor_by_name(DM_ALIAS, name, &error); 798 } 799 } 800 801 if (obj_desc == NULL) { 802 return ((CCIMInstanceList *)NULL); 803 } 804 805 if (error != 0) { 806 util_handleError(IDE_ASSOCIATORS, CIM_ERR_FAILED, 807 DM_GET_DESC_BYNAME_FAILURE, NULL, &error); 808 return ((CCIMInstanceList *)NULL); 809 } 810 811 if (isAlias) { 812 tmpList = dm_get_associated_descriptors(obj_desc, DM_DRIVE, 813 &error); 814 if (tmpList == NULL) { 815 return ((CCIMInstanceList *)NULL); 816 } 817 818 if (tmpList[0] == NULL) { 819 dm_free_descriptors(tmpList); 820 return ((CCIMInstanceList *)NULL); 821 } 822 } 823 824 825 if (isAntecedent) { 826 /* 827 * Get associated descriptors. 828 */ 829 830 assoc_descriptors = dm_get_associated_descriptors(obj_desc, 831 DM_DRIVE, &error); 832 dm_free_descriptor(obj_desc); 833 834 if (assoc_descriptors == NULL) { 835 return (instList); 836 } 837 838 if (assoc_descriptors[0] == NULL) { 839 dm_free_descriptors(assoc_descriptors); 840 return (instList); 841 } 842 843 if (error != 0) { 844 util_handleError(IDE_ASSOCIATORS, CIM_ERR_FAILED, 845 DM_GET_ASSOC_FAILURE, NULL, &error); 846 return ((CCIMInstanceList *)NULL); 847 } 848 849 /* 850 * Generate the inst list of the associated disk drives. 851 */ 852 853 instList = drive_descriptors_toCCIMObjPathInstList(DISK_DRIVE, 854 assoc_descriptors, &error); 855 dm_free_descriptors(assoc_descriptors); 856 857 if (error != 0) { 858 util_handleError(IDE_ASSOCIATORS, CIM_ERR_FAILED, 859 DRIVE_DESC_TO_INSTANCE_FAILURE, NULL, &error); 860 return ((CCIMInstanceList *)NULL); 861 } 862 } else { 863 /* 864 * This is the disk drive calling this function. Return the 865 * controllers that are associated with this disk. 866 */ 867 868 if (tmpList == NULL && obj_desc == NULL) { 869 return ((CCIMInstanceList *)NULL); 870 } 871 872 if (tmpList != NULL) { 873 assoc_descriptors = dm_get_associated_descriptors(tmpList[0], 874 DM_CONTROLLER, &error); 875 dm_free_descriptors(tmpList); 876 } else { 877 assoc_descriptors = dm_get_associated_descriptors(obj_desc, 878 DM_CONTROLLER, &error); 879 dm_free_descriptor(obj_desc); 880 } 881 882 if (assoc_descriptors == NULL) { 883 return ((CCIMInstanceList *)NULL); 884 } 885 886 if (assoc_descriptors[0] == NULL) { 887 dm_free_descriptors(assoc_descriptors); 888 return ((CCIMInstanceList *)NULL); 889 } 890 891 if (error != 0) { 892 util_handleError(IDE_ASSOCIATORS, CIM_ERR_FAILED, 893 DM_GET_ASSOC_FAILURE, NULL, &error); 894 return ((CCIMInstanceList *)NULL); 895 } 896 897 instList = ctrl_descriptors_toCCIMInstanceList(IDE_CONTROLLER, 898 assoc_descriptors, &error, 2, "ata", "pcata"); 899 dm_free_descriptors(assoc_descriptors); 900 901 if (error != 0) { 902 util_handleError(IDE_ASSOCIATORS, CIM_ERR_FAILED, 903 IDECTRL_DESC_TO_INSTANCE_FAILURE, NULL, &error); 904 return ((CCIMInstanceList *)NULL); 905 } 906 } 907 908 return (instList); 909} 910 911/* 912 * Name: cp_associatorNames_Solaris_IDEInterface 913 * 914 * Description: 915 * Returns a list of objects associated with the passed in 916 * object if there are any via the object CCIMObjectPath. 917 * 918 * Parameters: 919 * 920 * CCIMObjectPath *pAssocName - The name of the association that 921 * the client wants information about. 922 * 923 * CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the 924 * information on the class for which to find the associated instances. 925 * 926 * cimchar *pResultClass - If specified, only return instances that 927 * are of this class type. 928 * 929 * cimchar *pRole - If specified, must be valid for the object path 930 * passed in requesting the associated instances. 931 * 932 * cimchar *pResultRole - If specified, only return instances that 933 * are playing this role in the association. 934 * 935 * 936 * Returns: 937 * CCIMObjectPathList * if associated objects are found. Thist list 938 * may be empty. NULL is returned on error. 939 */ 940/* ARGSUSED */ 941CCIMObjectPathList * 942cp_associatorNames_Solaris_IDEInterface(CCIMObjectPath *pAssocName, 943 CCIMObjectPath *pObjectName, cimchar *pResultClass, cimchar *pRole, 944 cimchar *pResultRole) 945{ 946 947 CCIMInstanceList *instList; 948 CCIMObjectPathList *objList = NULL; 949 int error; 950 951 if (pObjectName == NULL) { 952 util_handleError(IDE_ASSOCIATORNAMES, 953 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 954 return ((CCIMObjectPathList *)NULL); 955 } 956 957 instList = 958 cp_associators_Solaris_IDEInterface( 959 pAssocName, pObjectName, pResultClass, pRole, pResultRole); 960 961 if (instList != NULL) { 962 objList = cim_createObjectPathList(instList); 963 cim_freeInstanceList(instList); 964 } 965 966 return (objList); 967} 968 969/* 970 * Name: cp_references_Solaris_IDEInterface 971 * 972 * Description: 973 * Returns instances of objects that have references to the passed in 974 * object if there are any. 975 * 976 * Parameters: 977 * 978 * CCIMObjectPath *pAssocName - The name of the association that 979 * the client wants information about. 980 * 981 * CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the 982 * information on the class for which to find the associated instances. 983 * 984 * cimchar *pRole - If specified, must be valid for the object path 985 * passed in requesting the associated instances. 986 * 987 * Returns: 988 * CCIMInstanceList * if associated objects are found. Thist list 989 * may be empty. NULL is returned on error. 990 */ 991 992/* ARGSUSED */ 993CCIMInstanceList * 994cp_references_Solaris_IDEInterface(CCIMObjectPath *pAssocName, 995CCIMObjectPath *pObjectName, char *pRole) 996{ 997 998 CCIMInstanceList *instList = NULL; 999 CCIMObjectPathList *objList; 1000 int error; 1001 1002 if (pObjectName == NULL) { 1003 util_handleError(IDE_REFERENCES, CIM_ERR_INVALID_PARAMETER, 1004 NULL, NULL, &error); 1005 return ((CCIMInstanceList *)NULL); 1006 } 1007 1008 /* 1009 * Get the list of those objects that are referred to by 1010 * the calling object. 1011 */ 1012 1013 objList = 1014 cp_associatorNames_Solaris_IDEInterface( 1015 pAssocName, pObjectName, NULL, NULL, NULL); 1016 1017 if (objList == NULL) { 1018 return ((CCIMInstanceList *)NULL); 1019 } 1020 1021 /* 1022 * Now generate the list of instances to return. 1023 */ 1024 1025 if ((strcasecmp(pObjectName->mName, IDE_CONTROLLER)) == 0) { 1026 instList = ideIntAssocToInstList(pObjectName, 1027 ANTECEDENT, objList, DEPENDENT, &error); 1028 } else { 1029 instList = ideIntAssocToInstList(pObjectName, 1030 DEPENDENT, objList, ANTECEDENT, &error); 1031 } 1032 1033 cim_freeObjectPathList(objList); 1034 return (instList); 1035} 1036 1037/* 1038 * Name: cp_referenceNames_Solaris_IDEInterface 1039 * 1040 * Description: 1041 * Returns a instances of objects that have references to the passed in 1042 * object if there are any. 1043 * 1044 * Parameters: 1045 * 1046 * CCIMObjectPath *pAssocName - The name of the association that 1047 * the client wants information about. 1048 * 1049 * CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the 1050 * information on the class for which to find the associated instances. 1051 * 1052 * cimchar *pRole - If specified, must be valid for the object path 1053 * passed in requesting the associated instances. 1054 * 1055 * 1056 * Returns: 1057 * CCIMInstanceList * if associated objects are found. Thist list 1058 * may be empty. NULL is returned on error. 1059 * 1060 */ 1061/* ARGSUSED */ 1062CCIMObjectPathList * 1063cp_referenceNames_Solaris_IDEInterface(CCIMObjectPath *pAssocName, 1064 CCIMObjectPath *pObjectName, cimchar *pRole) 1065{ 1066 1067 CCIMInstanceList *instList; 1068 CCIMObjectPathList *objList = NULL; 1069 int error; 1070 1071 if (pObjectName == NULL) { 1072 util_handleError(IDE_REFERENCENAMES, 1073 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 1074 return ((CCIMObjectPathList *)NULL); 1075 } 1076 1077 instList = 1078 cp_references_Solaris_IDEInterface(pAssocName, pObjectName, pRole); 1079 1080 if (instList != NULL) { 1081 objList = cim_createObjectPathList(instList); 1082 cim_freeInstanceList(instList); 1083 } 1084 1085 return (objList); 1086} 1087 1088/* 1089 * Create the association class with the passed in attributes. 1090 */ 1091static 1092CCIMInstanceList * 1093ideIntAssocToInstList(CCIMObjectPath *pObjectName, cimchar *pObjectNameRole, 1094 CCIMObjectPathList *objList, cimchar *objRole, int *error) 1095{ 1096 1097 CCIMObjectPathList *tmpList; 1098 CCIMInstanceList *instList = NULL; 1099 CCIMInstance *inst; 1100 CCIMObjectPath *obj1; 1101 CCIMObjectPath *obj2; 1102 CCIMException *ex; 1103 1104 *error = 0; 1105 1106 if (objList == NULL) { 1107 return ((CCIMInstanceList *)NULL); 1108 } 1109 1110 instList = cim_createInstanceList(); 1111 if (instList == NULL) { 1112 ex = cim_getLastError(); 1113 util_handleError(IDE_INTERFACE, CIM_ERR_FAILED, 1114 CREATE_INSTANCE_FAILURE, ex, error); 1115 return ((CCIMInstanceList *)NULL); 1116 } 1117 1118 tmpList = objList; 1119 while (tmpList != NULL) { 1120 obj1 = tmpList->mDataObject; 1121 obj2 = cim_copyObjectPath(pObjectName); 1122 if (obj2 == NULL) { 1123 ex = cim_getLastError(); 1124 util_handleError(IDE_INTERFACE, CIM_ERR_FAILED, 1125 COPY_OBJPATH_FAILURE, ex, error); 1126 return ((CCIMInstanceList *)NULL); 1127 } 1128 1129 inst = ideIntAssocToInst(obj1, objRole, obj2, pObjectNameRole, 1130 error); 1131 cim_freeObjectPath(obj2); 1132 1133 if (*error != 0) { 1134 cim_freeInstanceList(instList); 1135 return ((CCIMInstanceList *)NULL); 1136 } 1137 1138 instList = cim_addInstance(instList, inst); 1139 if (instList == NULL) { 1140 ex = cim_getLastError(); 1141 util_handleError(IDE_INTERFACE, CIM_ERR_FAILED, 1142 ADD_INSTANCE_FAILURE, ex, error); 1143 cim_freeInstance(inst); 1144 return ((CCIMInstanceList *)NULL); 1145 } 1146 tmpList = tmpList->mNext; 1147 } 1148 return (instList); 1149} 1150 1151/* 1152 * Create an instance of the class with the passed in attributes. 1153 */ 1154static 1155CCIMInstance * 1156ideIntAssocToInst(CCIMObjectPath *obj1, cimchar *obj1Role, 1157 CCIMObjectPath *obj2, cimchar *obj2Role, int *error) 1158{ 1159 1160 CCIMInstance *inst = NULL; 1161 CCIMException *ex; 1162 1163 *error = 0; 1164 1165 inst = cim_createInstance(IDE_INTERFACE); 1166 if (inst == NULL) { 1167 ex = cim_getLastError(); 1168 util_handleError(IDE_INTERFACE, CIM_ERR_FAILED, 1169 IDEINT_ASSOC_TO_INSTANCE_FAILURE, ex, error); 1170 return ((CCIMInstance *)NULL); 1171 } 1172 1173 util_doReferenceProperty(obj2Role, obj2, cim_true, inst, error); 1174 util_doReferenceProperty(obj1Role, obj1, cim_true, inst, error); 1175 if (*error != 0) { 1176 ex = cim_getLastError(); 1177 util_handleError(IDE_INTERFACE, CIM_ERR_FAILED, 1178 CREATE_REFPROP_FAILURE, ex, error); 1179 cim_freeInstance(inst); 1180 return ((CCIMInstance *)NULL); 1181 } 1182 return (inst); 1183}