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