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 "providerNames.h" 36#include "messageStrings.h" 37#include "disk_descriptors.h" 38#include "logicaldisk_descriptors.h" 39#include "realizesextent_descriptors.h" 40#include "Solaris_RealizesExtent.h" 41 42#define REALIZES_GETINSTANCE "REALIZES_EXTENT,GET_INSTANCE" 43#define REALIZES_ENUMINSTANCES "REALIZES_EXTENT,ENUM_INSTANCES" 44#define REALIZES_ENUMINSTANCENAMES \ 45 "REALIZES_EXTENT,ENUM_INSTANCENAMES" 46#define REALIZES_CREATEINSTANCE "REALIZES_EXTENT,CREATE_INSTANCE" 47#define REALIZES_DELETEINSTANCE "REALIZES_EXTENT,DELETE_INSTANCE" 48#define REALIZES_SETINSTANCE "REALIZES_EXTENT,SET_INSTANCE" 49#define REALIZES_SETPROPERTY "REALIZES_EXTENT,SET_PROPERTY" 50#define REALIZES_GETPROPERTY "REALIZES_EXTENT,GET_PROPERTY" 51#define REALIZES_INVOKEMETHOD "REALIZES_EXTENT,INVOKE_METHOD" 52#define REALIZES_EXECQUERY "REALIZES_EXTENT,EXEC_QUERY" 53#define REALIZES_ASSOCIATORS "REALIZES_EXTENT,ASSOCIATORS" 54#define REALIZES_ASSOCIATORNAMES "REALIZES_EXTENT,ASSOCIATOR_NAMES" 55#define REALIZES_REFERENCES "REALIZES_EXTENT,REFERENCES" 56#define REALIZES_REFERENCENAMES "REALIZES_EXTENT,REFERENCE_NAMES" 57 58static 59CCIMInstanceList * 60createRealizesExtentList(CCIMObjectPath *pObjectName, 61 cimchar *pObjectNameRole, 62 CCIMObjectPathList *objList, cimchar *objRole, int *error); 63/* 64 * Solaris_RealizesExtent provider 65 * 66 * It is important to note that all memory allocated by these functions 67 * and passed to the CIMOM, is freed by the door process prior to 68 * sending a copy of the data to the CIMOM. 69 */ 70 71/* 72 * Name: cp_getInstance_Solaris_RealizesExtent 73 * 74 * Description: Returns an instance of Solaris_RealizesExtent if one 75 * is found that matches the object path passed in . 76 * 77 * Parameters: 78 * pOP - An CCIMObjectPath * which contains the information on 79 * the class for which to find the instance. 80 * Returns: CCIMInstance * if match is found, or NULL if not. 81 * 82 */ 83 84CCIMInstance* 85cp_getInstance_Solaris_RealizesExtent(CCIMObjectPath* pOP) 86{ 87 88 CCIMInstance *inst = NULL; 89 CCIMPropertyList *pCurPropList; 90 CCIMObjectPath *antOp = NULL; 91 CCIMObjectPath *depOp = NULL; 92 dm_descriptor_t d_descriptor; 93 char *name; 94 int error; 95 96 97 if (pOP == NULL || pOP->mKeyProperties == NULL) { 98 util_handleError(REALIZES_GETINSTANCE, 99 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 100 } 101 102 pCurPropList = pOP->mKeyProperties; 103 antOp = (CCIMObjectPath *)util_getKeyValue(pCurPropList, reference, 104 ANTECEDENT, &error); 105 106 if (error == 0) { 107 depOp = (CCIMObjectPath *)util_getKeyValue(pCurPropList, reference, 108 DEPENDENT, &error); 109 } 110 111 /* 112 * Make sure we have both keys. If not, this is an error. 113 */ 114 115 if (error != 0) { 116 util_handleError(REALIZES_GETINSTANCE, 117 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 118 return ((CCIMInstance *)NULL); 119 } 120 121 /* 122 * Now get the name of the antecedent from the object path. 123 */ 124 125 if (antOp->mKeyProperties == NULL || 126 depOp->mKeyProperties == NULL) { 127 util_handleError(REALIZES_GETINSTANCE, 128 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 129 return ((CCIMInstance *)NULL); 130 } 131 132 pCurPropList = antOp->mKeyProperties; 133 name = (cimchar *)util_getKeyValue(pCurPropList, string, TAG, &error); 134 135 if (error != 0 || name == NULL) { 136 util_handleError(REALIZES_GETINSTANCE, 137 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 138 return ((CCIMInstance *)NULL); 139 } 140 141 d_descriptor = dm_get_descriptor_by_name(DM_MEDIA, name, &error); 142 143 /* 144 * Not found. Return a null instance. 145 */ 146 147 if (error == ENODEV || d_descriptor == NULL) { 148 return ((CCIMInstance *)NULL); 149 } 150 151 if (error != 0) { 152 util_handleError(REALIZES_GETINSTANCE, CIM_ERR_FAILED, 153 DM_GET_DESC_BYNAME_FAILURE, NULL, &error); 154 return ((CCIMInstance *)NULL); 155 } 156 157 /* 158 * Turn this in to a realizes extent instance. 159 */ 160 161 inst = realizesextent_descriptor_toCCIMInstance(hostName, d_descriptor, 162 REALIZES_EXTENT, &error); 163 dm_free_descriptor(d_descriptor); 164 165 if (error != 0) { 166 util_handleError(REALIZES_GETINSTANCE, CIM_ERR_FAILED, 167 REALIZESEXT_DESC_TO_INSTANCE_FAILURE, NULL, &error); 168 return ((CCIMInstance *)NULL); 169 } 170 171 return (inst); 172} 173 174/* 175 * Name: cp_enumInstances_Solaris_RealizesExtent 176 * 177 * Description: Returns a linked list of instances of this association. 178 * 179 * Parameters: 180 * pOP - An CCIMObjectPath * which contains the information on 181 * the class for which to find the instances. 182 * Returns: 183 * CCIMInstanceList * if istances are found. NULL otherwise. 184 */ 185 186/* ARGSUSED */ 187CCIMInstanceList* 188cp_enumInstances_Solaris_RealizesExtent(CCIMObjectPath* pOP) 189{ 190 CCIMInstanceList* instList = NULL; 191 CCIMInstance* inst; 192 CCIMException* ex; 193 dm_descriptor_t *disk_descriptorp = NULL; 194 int error = 0; 195 int filter[2]; 196 int i = 0; 197 198 filter[0] = DM_MT_FIXED; 199 filter[1] = DM_FILTER_END; 200 201 202 disk_descriptorp = dm_get_descriptors(DM_MEDIA, filter, &error); 203 if (disk_descriptorp == NULL || 204 disk_descriptorp[0] == NULL) { 205 return ((CCIMInstanceList *)NULL); 206 } 207 if (error != 0) { 208 util_handleError(REALIZES_ENUMINSTANCES, CIM_ERR_FAILED, 209 DM_GET_DESCRIPTORS, NULL, &error); 210 return ((CCIMInstanceList *)NULL); 211 } 212 213 /* 214 * For each one of the disks found, generate the physical and 215 * logical views and create an association instance. 216 */ 217 218 instList = cim_createInstanceList(); 219 if (instList == NULL) { 220 ex = cim_getLastError(); 221 util_handleError(REALIZES_ENUMINSTANCES, CIM_ERR_FAILED, 222 CREATE_INSTANCE_LIST_FAILURE, ex, &error); 223 dm_free_descriptors(disk_descriptorp); 224 return ((CCIMInstanceList *)NULL); 225 } 226 227 for (i = 0; disk_descriptorp[i] != NULL; i ++) { 228 inst = realizesextent_descriptor_toCCIMInstance(hostName, 229 disk_descriptorp[i], REALIZES_EXTENT, &error); 230 if (error != 0) { 231 util_handleError(REALIZES_ENUMINSTANCES, CIM_ERR_FAILED, 232 REALIZESEXT_DESC_TO_INSTANCE_FAILURE, NULL, &error); 233 cim_freeInstanceList(instList); 234 dm_free_descriptors(disk_descriptorp); 235 return ((CCIMInstanceList *)NULL); 236 } 237 instList = cim_addInstance(instList, inst); 238 if (instList == NULL) { 239 util_handleError(REALIZES_ENUMINSTANCES, CIM_ERR_FAILED, 240 ADD_INSTANCE_FAILURE, NULL, &error); 241 dm_free_descriptors(disk_descriptorp); 242 cim_freeInstance(inst); 243 return ((CCIMInstanceList *)NULL); 244 } 245 } 246 247 dm_free_descriptors(disk_descriptorp); 248 if (instList->mDataObject == NULL) { 249 cim_freeInstanceList(instList); 250 instList = NULL; 251 } 252 return (instList); 253} 254 255/* 256 * Name: cp_enumInstanceNames_Solaris_RealizesExtent 257 * 258 * Description: Returns a linked list of CCIMObjectPath * 259 * of Solaris_RealizesExtent objects if found. 260 * 261 * Parameters: 262 * pOP - An CCIMObjectPath * which contains the information on 263 * the class for which to find the instances. 264 * Returns: 265 * CCIMObjectPathList * if objects are found. NULL otherwise. 266 */ 267 268/* ARGSUSED */ 269CCIMObjectPathList* 270cp_enumInstanceNames_Solaris_RealizesExtent(CCIMObjectPath * pOP) { 271 272 CCIMInstanceList *instList; 273 CCIMObjectPathList *objList = NULL; 274 int error; 275 276 if (pOP == NULL) { 277 util_handleError(REALIZES_ENUMINSTANCENAMES, 278 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 279 return ((CCIMObjectPathList *)NULL); 280 } 281 282 /* 283 * Call in to enumInstances and then convert the instance list in 284 * to an object list. 285 */ 286 287 instList = cp_enumInstances_Solaris_RealizesExtent(pOP); 288 289 if (instList != NULL) { 290 objList = cim_createObjectPathList(instList); 291 cim_freeInstanceList(instList); 292 } 293 294 return (objList); 295} 296 297/* 298 * Creating an instance of a Solaris_RealizesExtent is not supported. 299 */ 300 301/* ARGSUSED */ 302CCIMObjectPath* 303cp_createInstance_Solaris_RealizesExtent( 304 CCIMObjectPath* pOP, CCIMInstance* pInst) 305{ 306 int error; 307 308 util_handleError(REALIZES_CREATEINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL, 309 NULL, &error); 310 return ((CCIMObjectPath *)NULL); 311} 312 313 314/* 315 * Deleting an instance of a Solaris_RealizesExtent is not supported. 316 */ 317 318/* ARGSUSED */ 319CIMBool 320cp_deleteInstance_Solaris_RealizesExtent(CCIMObjectPath* pInst) 321{ 322 int error; 323 324 util_handleError(REALIZES_DELETEINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL, 325 NULL, &error); 326 return (cim_false); 327} 328 329/* 330 * Name: cp_getProperty_Solaris_RealizesExtent 331 * 332 * Description: Returns the property requested, if found. 333 * 334 * Parameters: 335 * pOP - An CCIMObjectPath * which contains the information on 336 * the class for which to find the instances. 337 * Returns: 338 * CCIMProperty * if found. 339 */ 340 341/* ARGSUSED */ 342CCIMProperty * 343cp_getProperty_Solaris_RealizesExtent(CCIMObjectPath *pOP, 344 char *pPropName) 345{ 346 347 CCIMProperty *prop = NULL; 348 CCIMInstance *inst = NULL; 349 int error = 0; 350 351 if (pOP == NULL) { 352 util_handleError(REALIZES_GETPROPERTY, 353 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 354 return ((CCIMProperty *)NULL); 355 } 356 357 inst = cp_getInstance_Solaris_RealizesExtent(pOP); 358 if (inst == NULL) { 359 return ((CCIMProperty *)NULL); 360 } 361 362 prop = cim_getProperty(inst, pPropName); 363 cim_freeInstance(inst); 364 return (prop); 365} 366 367/* 368 * Setting an instance of a Solaris_RealizesExtent is not supported. 369 */ 370 371/* ARGSUSED */ 372CIMBool 373cp_setInstance_Solaris_RealizesExtent( 374 CCIMObjectPath* pOP, CCIMInstance* pInst) 375{ 376 int error; 377 378 util_handleError(REALIZES_SETINSTANCE, CIM_ERR_NOT_SUPPORTED, NULL, 379 NULL, &error); 380 return (cim_false); 381} 382 383 384/* 385 * Setting a property on a Solaris_RealizesExtent is not supported. 386 */ 387 388/* ARGSUSED */ 389CIMBool 390cp_setProperty_Solaris_RealizesExtent( 391 CCIMObjectPath* pOP, CCIMProperty* pProp) 392{ 393 int error; 394 395 util_handleError(REALIZES_SETPROPERTY, CIM_ERR_NOT_SUPPORTED, NULL, 396 NULL, &error); 397 return (cim_false); 398} 399 400/* 401 * No Methods for Solaris_RealizesExtent. 402 */ 403 404/* ARGSUSED */ 405CCIMProperty* 406cp_invokeMethod_Solaris_RealizesExtent( 407 CCIMObjectPath* op, cimchar* methodName, 408 CCIMPropertyList* inParams, CCIMPropertyList* outParams) 409{ 410 CCIMProperty *retVal = (CCIMProperty *)NULL; 411 return (retVal); 412} 413 414/* 415 * Name: cp_execQuery_Solaris_RealizesExtent 416 * 417 * Description: 418 * Returns an instance list which matches the query if any are found. 419 * 420 * Parameters: 421 * CCIMObjectPath *op - An CCIMObjectPath * which contains the 422 * information on the class for which to find the instances. 423 * 424 * selectList - Not used 425 * nonJoinExp - Not used 426 * 427 * Returns: 428 * CCIMInstance * if matched instance is found. Otherwise, NULL. 429 */ 430/* 431 * Currently, there is no WQL parser for the C providers. As a result, 432 * what is returned to the CIMOM is a list of instances with 433 * a NULL value at the beginning of the list. This NULL value indicates 434 * to the CIMOM that it must do the filtering for the client. 435 */ 436 437/* ARGSUSED */ 438CCIMInstanceList* 439cp_execQuery_Solaris_RealizesExtent( 440 CCIMObjectPath *op, cimchar *selectList, cimchar *nonJoinExp, 441 cimchar *queryExp, int queryType) 442{ 443 CCIMInstanceList *instList = NULL; 444 CCIMInstanceList *result; 445 CCIMInstance *emptyInst; 446 CCIMException *ex; 447 int error; 448 449 if (op == NULL) { 450 util_handleError(REALIZES_EXECQUERY, 451 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 452 return ((CCIMInstanceList *)NULL); 453 } 454 455 instList = cp_enumInstances_Solaris_RealizesExtent(op); 456 457 if (instList == NULL) { 458 return ((CCIMInstanceList *)NULL); 459 } 460 /* 461 * Create a null instance and add it to the beginning 462 * of the list to indicate to the CIMOM that no filtering 463 * was done. 464 */ 465 466 emptyInst = cim_createInstance(""); 467 if (emptyInst == NULL) { 468 ex = cim_getLastError(); 469 util_handleError(REALIZES_EXECQUERY, CIM_ERR_FAILED, 470 CREATE_INSTANCE_FAILURE, ex, &error); 471 return ((CCIMInstanceList *)NULL); 472 } 473 474 result = cim_createInstanceList(); 475 if (result == NULL) { 476 ex = cim_getLastError(); 477 util_handleError(REALIZES_EXECQUERY, CIM_ERR_FAILED, 478 CREATE_INSTANCE_LIST_FAILURE, ex, &error); 479 cim_freeInstance(emptyInst); 480 cim_freeInstanceList(instList); 481 return ((CCIMInstanceList *)NULL); 482 } 483 484 result = cim_addInstance(result, emptyInst); 485 if (result == NULL) { 486 ex = cim_getLastError(); 487 util_handleError(REALIZES_EXECQUERY, CIM_ERR_FAILED, 488 ADD_INSTANCE_FAILURE, ex, &error); 489 cim_freeInstance(emptyInst); 490 cim_freeInstanceList(instList); 491 return ((CCIMInstanceList *)NULL); 492 } 493 494 /* 495 * Since copying the original list to the new list will 496 * leave no way to free the original list, manually 497 * concatenate the original list to the new one. 498 */ 499 500 result->mNext = instList; 501 return (result); 502} 503 504/* 505 * Name: cp_associators_Solaris_RealizesExtent 506 * 507 * Description: 508 * Returns a instances of objects associated with the passed in 509 * object if there are any. 510 * 511 * Parameters: 512 * 513 * CCIMObjectPath *pAssocName - The name of the association that 514 * the client wants information about. 515 * 516 * CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the 517 * information on the class for which to find the associated instances. 518 * 519 * cimchar *pResultClass - If specified, only return instances that 520 * are of this class type. 521 * 522 * cimchar *pRole - If specified, must be valid for the object path 523 * passed in requesting the associated instances. 524 * 525 * cimchar *pResultRole - If specified, only return instances that 526 * are playing this role in the association. 527 * 528 * 529 * Returns: 530 * CCIMInstanceList * if associated objects are found. NULL otherwise. 531 */ 532 533/* ARGSUSED */ 534CCIMInstanceList * 535cp_associators_Solaris_RealizesExtent(CCIMObjectPath *pAssocName, 536 CCIMObjectPath *pObjectName, cimchar *pResultClass, cimchar *pRole, 537 cimchar *pResultRole) 538{ 539 CCIMPropertyList *pCurPropList; 540 CCIMInstanceList *instList = NULL; 541 CCIMInstance *inst; 542 CCIMException *ex; 543 dm_descriptor_t obj_desc; 544 char *name; 545 int error = 0; 546 int isAntecedent = 0; 547 548 549 if (pObjectName == NULL || 550 pObjectName->mName == NULL || 551 pObjectName->mKeyProperties == NULL) { 552 util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_INVALID_PARAMETER, 553 NULL, NULL, &error); 554 } 555 556 if (strcasecmp(pObjectName->mName, DISK) == 0) { 557 isAntecedent = 1; 558 } 559 560 if (pRole != NULL) { 561 if (strcasecmp(pRole, ANTECEDENT) == 0) { 562 if (isAntecedent != 1) { 563 util_handleError(REALIZES_ASSOCIATORS, 564 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 565 return ((CCIMInstanceList *)NULL); 566 } 567 } 568 } 569 570 pCurPropList = pObjectName->mKeyProperties; 571 572 /* 573 * Get the key. It will either be deviceid or tag. These are 574 * mutually exclusive. 575 */ 576 577 if (isAntecedent) { 578 name = (cimchar *)util_getKeyValue(pCurPropList, string, TAG, 579 &error); 580 } else { 581 name = (cimchar *)util_getKeyValue(pCurPropList, string, DEVICEID, 582 &error); 583 } 584 585 /* 586 * We went through the whole list and didn't find the necessary 587 * key value. 588 */ 589 590 if (error != 0 || name == NULL) { 591 util_handleError(REALIZES_ASSOCIATORS, 592 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 593 return ((CCIMInstanceList *)NULL); 594 } 595 596 obj_desc = dm_get_descriptor_by_name(DM_MEDIA, name, &error); 597 /* 598 * No device found. 599 */ 600 if (error == ENODEV || obj_desc == NULL) { 601 return (instList); 602 } 603 604 if (error != 0) { 605 util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED, 606 DM_GET_DESC_BYNAME_FAILURE, NULL, &error); 607 return ((CCIMInstanceList *)NULL); 608 } 609 610 if (isAntecedent == 1) { 611 /* 612 * Physical disk calling this method, return instances of the 613 * logical disk associated with this disk. 614 */ 615 616 inst = logicaldisk_descriptor_toCCIMInstance(hostName, 617 obj_desc, LOGICAL_DISK, &error); 618 dm_free_descriptor(obj_desc); 619 620 if (error != 0) { 621 util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED, 622 LOGICALDISK_DESC_TO_INSTANCE_FAILURE, NULL, &error); 623 return ((CCIMInstanceList *)NULL); 624 } 625 626 instList = cim_createInstanceList(); 627 if (instList == NULL) { 628 ex = cim_getLastError(); 629 util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED, 630 CREATE_INSTANCE_FAILURE, ex, &error); 631 return ((CCIMInstanceList *)NULL); 632 } 633 instList = cim_addInstance(instList, inst); 634 if (instList == NULL) { 635 ex = cim_getLastError(); 636 util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED, 637 ADD_INSTANCE_FAILURE, ex, &error); 638 cim_freeInstance(inst); 639 return ((CCIMInstanceList *)NULL); 640 } 641 } else { 642 /* 643 * This is the logical disk calling this function. Return the 644 * disk that this belongs to. 645 */ 646 647 inst = disk_descriptor_toCCIMInstance(hostName, obj_desc, 648 DISK, &error); 649 dm_free_descriptor(obj_desc); 650 651 if (error != 0) { 652 util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED, 653 DISK_DESC_TO_INSTANCE_FAILURE, NULL, &error); 654 return ((CCIMInstanceList *)NULL); 655 } 656 657 instList = cim_createInstanceList(); 658 if (instList == NULL) { 659 ex = cim_getLastError(); 660 util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED, 661 CREATE_INSTANCE_FAILURE, ex, &error); 662 cim_freeInstance(inst); 663 return ((CCIMInstanceList *)NULL); 664 } 665 instList = cim_addInstance(instList, inst); 666 if (instList == NULL) { 667 ex = cim_getLastError(); 668 util_handleError(REALIZES_ASSOCIATORS, CIM_ERR_FAILED, 669 ADD_INSTANCE_FAILURE, ex, &error); 670 return ((CCIMInstanceList *)NULL); 671 } 672 } 673 674 return (instList); 675} 676 677/* 678 * Name: cp_associatorNames_Solaris_RealizesExtent 679 * 680 * Description: 681 * Returns a list of objects associated with the passed in 682 * object if there are any via the object CCIMObjectPath. 683 * 684 * Parameters: 685 * 686 * CCIMObjectPath *pAssocName - The name of the association that 687 * the client wants information about. 688 * 689 * CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the 690 * information on the class for which to find the associated instances. 691 * 692 * cimchar *pResultClass - If specified, only return instances that 693 * are of this class type. 694 * 695 * cimchar *pRole - If specified, must be valid for the object path 696 * passed in requesting the associated instances. 697 * 698 * cimchar *pResultRole - If specified, only return instances that 699 * are playing this role in the association. 700 * 701 * 702 * Returns: 703 * CCIMObjectPathList * if associated objects are found. NULL otherwise. 704 */ 705 706/* ARGSUSED */ 707CCIMObjectPathList * 708cp_associatorNames_Solaris_RealizesExtent(CCIMObjectPath *pAssocName, 709 CCIMObjectPath *pObjectName, cimchar *pResultClass, cimchar *pRole, 710 cimchar *pResultRole) 711{ 712 713 CCIMInstanceList *instList; 714 CCIMObjectPathList *objList = NULL; 715 int error; 716 717 718 if (pObjectName == NULL) { 719 util_handleError(REALIZES_ASSOCIATORNAMES, 720 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 721 return ((CCIMObjectPathList *)NULL); 722 } 723 724 instList = 725 cp_associators_Solaris_RealizesExtent( 726 pAssocName, pObjectName, pResultClass, pRole, pResultRole); 727 728 if (instList != NULL) { 729 objList = cim_createObjectPathList(instList); 730 cim_freeInstanceList(instList); 731 } 732 733 return (objList); 734} 735 736/* 737 * Name: cp_references_Solaris_RealizesExtent 738 * 739 * Description: 740 * Returns a instances of objects that have references to the passed in 741 * object if there are any. 742 * 743 * Parameters: 744 * 745 * CCIMObjectPath *pAssocName - The name of the association that 746 * the client wants information about. 747 * 748 * CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the 749 * information on the class for which to find the associated instances. 750 * 751 * cimchar *pRole - If specified, must be valid for the object path 752 * passed in requesting the associated instances. 753 * 754 * Returns: 755 * CCIMObjectPathList * if associated objects are found. NULL otherwise. 756 */ 757 758/* ARGSUSED */ 759CCIMInstanceList * 760cp_references_Solaris_RealizesExtent(CCIMObjectPath *pAssocName, 761CCIMObjectPath *pObjectName, char *pRole) 762{ 763 764 CCIMInstanceList *instList; 765 CCIMObjectPathList *objList = NULL; 766 int error; 767 768 769 if (pObjectName == NULL) { 770 util_handleError(REALIZES_REFERENCES, 771 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 772 return ((CCIMInstanceList *)NULL); 773 } 774 /* 775 * Get the list of those objects that are referred to by 776 * the calling object. 777 */ 778 779 objList = 780 cp_associatorNames_Solaris_RealizesExtent( 781 pAssocName, pObjectName, NULL, NULL, NULL); 782 783 if (objList == NULL) { 784 return ((CCIMInstanceList *)NULL); 785 } 786 787 /* 788 * Now generate the list of instances to return. 789 */ 790 791 if (strcasecmp(pObjectName->mName, DISK) == 0) { 792 instList = createRealizesExtentList(pObjectName, 793 ANTECEDENT, objList, DEPENDENT, &error); 794 } else { 795 instList = createRealizesExtentList(pObjectName, 796 DEPENDENT, objList, ANTECEDENT, &error); 797 } 798 799 cim_freeObjectPathList(objList); 800 return (instList); 801} 802 803/* 804 * Name: cp_referenceNames_Solaris_RealizesExtent 805 * 806 * Description: 807 * Returns a instances of objects that have references to the passed in 808 * object if there are any. 809 * 810 * Parameters: 811 * 812 * CCIMObjectPath *pAssocName - The name of the association that 813 * the client wants information about. 814 * 815 * CCIMObjectPath *pObjectName - An CCIMObjectPath * which contains the 816 * information on the class for which to find the associated instances. 817 * 818 * cimchar *pRole - If specified, must be valid for the object path 819 * passed in requesting the associated instances. 820 * 821 * 822 * Returns: 823 * CCIMObjectPathList * if associated objects are found. NULL otherwise. 824 * 825 */ 826 827/* ARGSUSED */ 828CCIMObjectPathList * 829cp_referenceNames_Solaris_RealizesExtent(CCIMObjectPath *pAssocName, 830 CCIMObjectPath *pObjectName, cimchar *pRole) 831{ 832 833 CCIMInstanceList *instList = NULL; 834 CCIMObjectPathList *objList = NULL; 835 int error; 836 837 if (pObjectName == NULL) { 838 util_handleError(REALIZES_REFERENCENAMES, 839 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &error); 840 return ((CCIMObjectPathList *)NULL); 841 } 842 843 instList = 844 cp_references_Solaris_RealizesExtent(pAssocName, 845 pObjectName, pRole); 846 847 if (instList != NULL) { 848 objList = cim_createObjectPathList(instList); 849 cim_freeInstanceList(instList); 850 } 851 852 return (objList); 853} 854 855/* 856 * Create the association class with the passed in attributes. 857 */ 858static 859CCIMInstanceList * 860createRealizesExtentList(CCIMObjectPath *pObjectName, 861 cimchar *pObjectNameRole, 862 CCIMObjectPathList *objList, cimchar *objRole, int *error) 863{ 864 865 CCIMObjectPathList *tmpList; 866 CCIMInstanceList *instList = NULL; 867 CCIMInstance *inst; 868 CCIMObjectPath *obj1; 869 CCIMObjectPath *obj2; 870 CCIMException *ex; 871 872 *error = 0; 873 874 /* 875 * If no objects associated with this one, return NULL. 876 */ 877 if (objList == NULL) { 878 return ((CCIMInstanceList *)NULL); 879 } 880 881 instList = cim_createInstanceList(); 882 if (instList == NULL) { 883 ex = cim_getLastError(); 884 util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED, 885 CREATE_INSTANCE_FAILURE, ex, error); 886 return ((CCIMInstanceList *)NULL); 887 } 888 889 tmpList = objList; 890 while (tmpList != NULL) { 891 obj1 = tmpList->mDataObject; 892 obj2 = cim_copyObjectPath(pObjectName); 893 if (obj2 == NULL) { 894 ex = cim_getLastError(); 895 util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED, 896 COPY_OBJPATH_FAILURE, ex, error); 897 return ((CCIMInstanceList *)NULL); 898 } 899 900 inst = cim_createInstance(REALIZES_EXTENT); 901 if (inst == NULL) { 902 ex = cim_getLastError(); 903 util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED, 904 CREATE_INSTANCE_FAILURE, ex, error); 905 return ((CCIMInstanceList *)NULL); 906 } 907 908 util_doReferenceProperty(pObjectNameRole, obj2, cim_true, inst, 909 error); 910 cim_freeObjectPath(obj2); 911 912 if (*error != 0) { 913 ex = cim_getLastError(); 914 util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED, 915 ADD_PROPERTY_FAILURE, ex, error); 916 cim_freeInstance(inst); 917 return ((CCIMInstanceList *)NULL); 918 } 919 920 util_doReferenceProperty(objRole, obj1, cim_true, inst, error); 921 922 if (*error != 0) { 923 ex = cim_getLastError(); 924 util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED, 925 ADD_PROPERTY_FAILURE, ex, error); 926 cim_freeInstance(inst); 927 return ((CCIMInstanceList *)NULL); 928 } 929 930 instList = cim_addInstance(instList, inst); 931 if (instList == NULL) { 932 ex = cim_getLastError(); 933 util_handleError(REALIZES_EXTENT, CIM_ERR_FAILED, 934 ADD_INSTANCE_FAILURE, ex, error); 935 cim_freeInstance(inst); 936 return ((CCIMInstanceList *)NULL); 937 } 938 939 tmpList = tmpList->mNext; 940 } 941 return (instList); 942} 943