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 2003 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 "Solaris_HostedShare.h" 30#include "nfs_keys.h" 31#include "nfs_providers_msgstrings.h" 32#include "messageStrings.h" 33#include "nfs_provider_names.h" 34#include "util.h" 35#include "libfsmgt.h" 36#include "common_functions.h" 37#include "createprop_methods.h" 38 39/* 40 * Private method declarations 41 */ 42static CIMBool does_share_exist(char *dir); 43static CCIMObjectPath* get_Antecedent(); 44 45/* 46 * Public methods 47 */ 48 49/* 50 * Instance provider methods 51 */ 52 53/* 54 * Method: cp_createInstance_Solaris_HostedShare 55 * 56 * Description: This method is not supported. It is not supported because in 57 * order for a Solaris_HostedShare association to exist a corresponding 58 * Solaris_NFSShare and Solaris_ComputerSystem must exist. 59 * 60 * Parameters: 61 * - CCIMObjectPath *hostedShareOP - An object path containing the name of 62 * the class of which to create an instance of. 63 * - CCIMInstance *hostedShareInst - Not used. 64 * 65 * Returns: 66 * - Always returns NULL because the method is not supported. 67 */ 68/* ARGSUSED */ 69CCIMObjectPath * 70cp_createInstance_Solaris_HostedShare(CCIMObjectPath *hostedShareOP, 71 CCIMInstance *hostedShareInst) { 72 73 int err = 0; 74 75 util_handleError("SOLARIS_HOSTEDSHARE::CREATE_INSTANCE", 76 CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err); 77 78 return ((CCIMObjectPath *)NULL); 79} /* cp_createInstance_Solaris_HostedShare */ 80 81/* 82 * Method: cp_deleteInstance_Solaris_HostedShare 83 * 84 * Description: This method is not supported. It is not supported because in 85 * order for it to be actually deleted the corresponding Solaris_NFSShare would 86 * need to be deleted. That action is not appropriate for this provider. 87 * 88 * Parameters: 89 * - CCIMObjectPath *hostedShareOP - An object path containing the 90 * information about the class of which to delete the instance of. 91 * 92 * Returns: 93 * - Always returns cim_false because the method is not supported. 94 */ 95/* ARGSUSED */ 96CIMBool 97cp_deleteInstance_Solaris_HostedShare(CCIMObjectPath *hostedShareOP) { 98 int err = 0; 99 100 util_handleError("SOLARIS_HOSTEDSHARE::DELETE_INSTANCE", 101 CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err); 102 103 return (cim_false); 104} /* cp_deleteInstance_Solaris_HostedShare */ 105 106/* 107 * Method: cp_enumInstances_Solaris_HostedShare 108 * 109 * Description: Enumerates the instances of Solaris_HostedShare on a host. 110 * An instance of Solaris_HostedShare is an association that links a share to 111 * the hosting machine. 112 * 113 * Parameters: 114 * - CCIMObjectPath *hostedShareOP - An object path containing the name of 115 * the class of which to enumerate the instances of. 116 * 117 * Returns: 118 * - A pointer to a list of Solaris_HostedShare instances. 119 * - NULL if an error occurred or if there are no instances of 120 * Solaris_HostedShare on the host. In the case of an error, the error 121 * will be logged. 122 */ 123CCIMInstanceList * 124cp_enumInstances_Solaris_HostedShare(CCIMObjectPath* hostedShareOP) { 125 CCIMInstanceList *hostedShareInstList; 126 CCIMObjectPath *nfsShareOP; 127 CCIMObjectPathList *nfsShareOPList, *currentShareOP; 128 CCIMObjectPath *antOP; 129 CCIMException *ex; 130 int err = 0; 131 132 /* 133 * The Antecedent property is a Solaris_ComputerSystem reference. 134 * The Dependent property is a Solaris_NFSShare reference. 135 */ 136 if (hostedShareOP == NULL) { 137 util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES", 138 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 139 return ((CCIMInstanceList *)NULL); 140 } 141 142 nfsShareOP = cim_createEmptyObjectPath(SOLARIS_NFSSHARE); 143 if (nfsShareOP == NULL) { 144 ex = cim_getLastError(); 145 util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES", 146 CIM_ERR_FAILED, CREATE_EMPTY_OBJPATH_FAILURE, ex, &err); 147 return ((CCIMInstanceList *)NULL); 148 } 149 150 /* 151 * Enumerate all of the Solaris_NFSShare object paths on the system. 152 */ 153 nfsShareOPList = cimom_enumerateInstanceNames(nfsShareOP, cim_false); 154 155 /* 156 * A NULL return value indicates an error, an empty list does not. 157 */ 158 if (nfsShareOPList == NULL) { 159 cim_logDebug("cp_enumInstances_Solaris_HostedShare", 160 "nfsShareOPList = NULL"); 161 ex = cim_getLastError(); 162 util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES", 163 CIM_ERR_FAILED, CIMOM_ENUM_INSTNAMES_FAILURE, ex, &err); 164 cim_freeObjectPath(nfsShareOP); 165 return ((CCIMInstanceList *)NULL); 166 167 } 168 169 cim_freeObjectPath(nfsShareOP); 170 171 if (nfsShareOPList->mDataObject == NULL) { 172 return ((CCIMInstanceList *)NULL); 173 } 174 175 antOP = get_Antecedent(); 176 if (antOP == NULL) { 177 /* 178 * The error was logged in get_Antecedent. 179 */ 180 cim_freeObjectPathList(nfsShareOPList); 181 return ((CCIMInstanceList *)NULL); 182 } 183 184 hostedShareInstList = cim_createInstanceList(); 185 if (hostedShareInstList == NULL) { 186 ex = cim_getLastError(); 187 util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES", 188 CIM_ERR_FAILED, CREATE_INSTANCE_LIST_FAILURE, ex, &err); 189 cim_freeObjectPathList(nfsShareOPList); 190 cim_freeObjectPath(antOP); 191 return ((CCIMInstanceList *)NULL); 192 } 193 194 /* 195 * Each share on the system will be associated with the same 196 * Solaris_ComputerSystem object path. 197 */ 198 for (currentShareOP = nfsShareOPList; currentShareOP != NULL; 199 currentShareOP = currentShareOP->mNext) { 200 201 CCIMInstance *hostedShareInst; 202 cimchar *propValue; 203 204 hostedShareInst = cim_createInstance(SOLARIS_HOSTEDSHARE); 205 if (hostedShareInst == NULL) { 206 ex = cim_getLastError(); 207 util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES", 208 CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, 209 &err); 210 cim_freeInstanceList(hostedShareInstList); 211 cim_freeObjectPath(antOP); 212 cim_freeObjectPathList(nfsShareOPList); 213 return ((CCIMInstanceList *)NULL); 214 } 215 216 propValue = NULL; 217 if (add_property_to_instance( 218 hostedShareProps[ANT].name, hostedShareProps[ANT].type, 219 propValue, antOP, hostedShareProps[ANT].isKey, 220 hostedShareInst) == cim_false) { 221 222 cim_freeInstance(hostedShareInst); 223 cim_freeInstanceList(hostedShareInstList); 224 cim_freeObjectPathList(nfsShareOPList); 225 cim_freeObjectPath(antOP); 226 return ((CCIMInstanceList *)NULL); 227 } 228 229 if (add_property_to_instance(hostedShareProps[DEP].name, 230 hostedShareProps[DEP].type, propValue, 231 currentShareOP->mDataObject, 232 hostedShareProps[DEP].isKey, hostedShareInst) 233 == cim_false) { 234 235 cim_freeInstance(hostedShareInst); 236 cim_freeInstanceList(hostedShareInstList); 237 cim_freeObjectPathList(nfsShareOPList); 238 cim_freeObjectPath(antOP); 239 return ((CCIMInstanceList *)NULL); 240 } 241 242 hostedShareInstList = cim_addInstance(hostedShareInstList, 243 hostedShareInst); 244 if (hostedShareInstList == NULL) { 245 ex = cim_getLastError(); 246 util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCES", 247 CIM_ERR_FAILED, ADD_INSTANCE_FAILURE, ex, &err); 248 cim_freeInstance(hostedShareInst); 249 cim_freeObjectPathList(nfsShareOPList); 250 cim_freeObjectPath(antOP); 251 return ((CCIMInstanceList *)NULL); 252 } 253 } 254 255 cim_freeObjectPath(antOP); 256 cim_freeObjectPathList(nfsShareOPList); 257 258 return (hostedShareInstList); 259} /* cp_enumInstances_Solaris_HostedShare */ 260 261/* 262 * Method: cp_enumInstanceNames_Solaris_HostedShare 263 * 264 * Description: Enumerates the instances of Solaris_HostedShare on the host. 265 * 266 * Parameters: 267 * - CCIMObjectPath *hostedShareOP - An object path containing the name of 268 * the class of which to enumerate the instance names of. 269 * 270 * Returns: 271 * - A list of object paths corresponding to the instances of 272 * Solaris_HostedShare on the host. 273 * - NULL if an error occurred or if there are no instances of 274 * Solaris_HostedShare on the host. In the case of an error, the error 275 * will be logged. 276 */ 277CCIMObjectPathList * 278cp_enumInstanceNames_Solaris_HostedShare(CCIMObjectPath *hostedShareOP) { 279 CCIMInstanceList *hostedShareInstList; 280 CCIMObjectPathList *hostedShareOPList; 281 int err = 0; 282 283 if (hostedShareOP == NULL) { 284 util_handleError("SOLARIS_HOSTEDSHARE::ENUM_INSTANCENAMES", 285 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 286 return ((CCIMObjectPathList *)NULL); 287 } 288 289 hostedShareInstList = 290 cp_enumInstances_Solaris_HostedShare(hostedShareOP); 291 if (hostedShareInstList == NULL) { 292 /* 293 * An error occurred in enumInstances or there are simply 294 * no Solaris_HostedShare instances to enumerate. In the case, 295 * of an error, the error would have been handled in the 296 * cp_enumInstances_Solaris_HostedShare function. 297 */ 298 return ((CCIMObjectPathList *)NULL); 299 } 300 301 hostedShareOPList = cim_createObjectPathList(hostedShareInstList); 302 303 cim_freeInstanceList(hostedShareInstList); 304 /* 305 * If an error occurred it will be handled in cim_createObjectPathList. 306 */ 307 return (hostedShareOPList); 308} /* cp_enumInstanceNames_Solaris_HostedShare */ 309 310/* 311 * Method: cp_execQuery_Solaris_HostedShare 312 * 313 * Description: Queries the host to find those Solaris_HostedShare instances 314 * that meet the search criteria. 315 * 316 * Parameters: 317 * - CCIMObjectPath *hostedShareOP - An object path containing the name of 318 * the class of which to query. 319 * - char *selectClause - Not used. 320 * - char *nonJoinExp - Not used. 321 * - char *queryExp - Not used. 322 * - char *queryLang - Not used. 323 * 324 * Returns: 325 * - A pointer to a list of Solaris_HostedShare instances that match the 326 * criteria. 327 * - NULL if an error occurred or if there are no Solaris_HostedShare 328 * instances that match the criteria. In the case of an error, the error 329 * will be logged. 330 * 331 * NOTE: Currently, there is no WQL parser for the C providers. As a result, 332 * what is returned to the CIMOM is a list of instances with 333 * a NULL value at the beginning of the list. This NULL value indicates 334 * to the CIMOM that it must do the filtering for the client. 335 */ 336/* ARGSUSED */ 337CCIMInstanceList * 338cp_execQuery_Solaris_HostedShare(CCIMObjectPath *hostedShareOP, 339 char *selectClause, char *nonJoinExp, char *queryExp, char *queryLang) { 340 341 CCIMInstance *emptyInst; 342 CCIMInstanceList *hostedShareInstList; 343 CCIMException *ex; 344 int err = 0; 345 346 if (hostedShareOP == NULL) { 347 util_handleError("SOLARIS_HOSTEDSHARE::EXEC_QUERY", 348 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 349 return ((CCIMInstanceList *)NULL); 350 } 351 352 hostedShareInstList = cp_enumInstances_Solaris_HostedShare( 353 hostedShareOP); 354 if (hostedShareInstList == NULL) { 355 return ((CCIMInstanceList *)NULL); 356 } 357 358 emptyInst = cim_createInstance(""); 359 if (emptyInst == NULL) { 360 ex = cim_getLastError(); 361 util_handleError("SOLARIS_HOSTEDSHARE::EXEC_QUERY", 362 CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err); 363 cim_freeInstanceList(hostedShareInstList); 364 return ((CCIMInstanceList *)NULL); 365 } 366 367 hostedShareInstList = cim_prependInstance(hostedShareInstList, 368 emptyInst); 369 370 if (hostedShareInstList == NULL) { 371 ex = cim_getLastError(); 372 util_handleError("SOLARIS_HOSTEDSHARE::EXEC_QUERY", 373 CIM_ERR_FAILED, PREPEND_INSTANCE_FAILURE, ex, &err); 374 cim_freeInstance(emptyInst); 375 return ((CCIMInstanceList *)NULL); 376 } 377 378 return (hostedShareInstList); 379} /* cp_execQuery_Solaris_HostedShare */ 380 381/* 382 * Method: cp_getInstance_Solaris_HostedShare 383 * 384 * Description: Gets the instance corresponding to the passed in object path. 385 * 386 * Parameters: 387 * - CCIMObjectPath *hostedShareOP - The object path containing all the 388 * keys of the instance that is supposed to be returned. 389 * 390 * Returns: 391 * - A pointer to the instance of Solaris_HostedShare corresponding to 392 * hostedShareOP. 393 * - NULL if an error occurred or if the instance doesn't exist on the 394 * host. In the case of an error, the error will be logged. 395 */ 396CCIMInstance * 397cp_getInstance_Solaris_HostedShare(CCIMObjectPath *hostedShareOP) { 398 CCIMInstance *inst; 399 CCIMInstanceList *instList; 400 CCIMPropertyList *hsPropList; 401 CCIMObjectPath *depOP; 402 CCIMObjectPath *antOP; 403 int err = 0; 404 405 if (hostedShareOP == NULL || hostedShareOP->mKeyProperties == NULL) { 406 util_handleError("SOLARIS_HOSTEDSHARE::GET_INSTANCE", 407 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 408 return ((CCIMInstance *)NULL); 409 } 410 411 /* 412 * Get the Dependent and Antecedent properties. 413 */ 414 hsPropList = hostedShareOP->mKeyProperties; 415 depOP = util_getKeyValue(hsPropList, hostedShareProps[DEP].type, 416 hostedShareProps[DEP].name, &err); 417 antOP = util_getKeyValue(hsPropList, hostedShareProps[ANT].type, 418 hostedShareProps[ANT].name, &err); 419 420 /* 421 * Check if we have the Antecedent and Dependent properties. 422 */ 423 if (depOP == NULL || antOP == NULL || 424 depOP->mKeyProperties == NULL || 425 antOP->mKeyProperties == NULL) { 426 util_handleError("SOLARIS_HOSTEDSHARE::GET_INSTANCE", 427 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 428 return ((CCIMInstance *)NULL); 429 } 430 431 instList = cp_enumInstances_Solaris_HostedShare(hostedShareOP); 432 if (instList == NULL) { 433 return ((CCIMInstance *)NULL); 434 } 435 436 inst = cim_getInstance(instList, hostedShareOP); 437 438 cim_freeInstanceList(instList); 439 return (inst); 440} /* cp_getInstance_Solaris_HostedShare */ 441 442/* 443 * Method: cp_setInstance_Solaris_HostedShare 444 * 445 * Description: This method is not supported. It is not supported because in 446 * order to change a Solaris_HostedShare instance the underlying share and 447 * computer system must be modified. Those actions must be done on the 448 * appropriate share and computer system objects, not here. 449 * 450 * Parameters: 451 * - CCIMObjectPath *pOP - An object path containing the name of the class 452 * of which to set the instance. 453 * - CCIMInstance *pInst - Not used. 454 * 455 * Returns: 456 * - Always returns cim_false, because the method is not supported. 457 */ 458/* ARGSUSED */ 459CIMBool 460cp_setInstance_Solaris_HostedShare(CCIMObjectPath *pOP, CCIMInstance *pInst) { 461 462 int err = 0; 463 464 util_handleError("SOLARIS_HOSTEDSHARE::SET_INSTANCE", 465 CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err); 466 467 return (cim_false); 468} /* cp_setInstance_Solaris_HostedShare */ 469 470/* 471 * Method: cp_setInstanceWithList_Solaris_HostedShare 472 * 473 * Description: This method is not supported. It is not supported because in 474 * order to change a Solaris_HostedShare instance the underlying share and 475 * computer system must be modified. Those actions must be done on the 476 * appropriate share and computer system objects, not here. 477 * 478 * Parameters: 479 * - CCIMObjectPath *hostedShareOP - The object path containing the name 480 * of the class of which to set the instance. 481 * - CCIMInstance *hostedShareInst - Not used. 482 * - char **props - Not used. 483 * - int num_props - Not used. 484 * 485 * Returns: 486 * - Always returns cim_false, because the method is not supported. 487 */ 488/* ARGSUSED */ 489CIMBool 490cp_setInstanceWithList_Solaris_HostedShare(CCIMObjectPath *hostedShareOP, 491 CCIMInstance *hostedShareInst, char **props, int num_props) { 492 493 int err = 0; 494 495 util_handleError("SOLARIS_HOSTEDSHARE::SET_INSTANCE", 496 CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err); 497 498 return (cim_false); 499} /* cp_setInstanceWithList_Solaris_HostedShare */ 500 501/* 502 * Association provider methods 503 */ 504 505/* 506 * Method: cp_associators_Solaris_HostedShare 507 * 508 * Description: Returns the instances associated, via the Solaris_HostedShare 509 * association, to the pObjectName parameter. 510 * 511 * Parameters: 512 * - CCIMObjectPath *pAssocName - An object path containing the name of 513 * the association that the caller is trying to reach. 514 * - CCIMObjectPath *pObjectName - The object path containing information 515 * (Class Name, Key Properties) about the object whose associated objects 516 * are to be returned. 517 * - char *pResultClass - If specified, only return instances that are of 518 * this class type. 519 * - char *pRole - If specified, this is the role of the pObjectName 520 * object path passed in. If this is not valid, NULL is returned. 521 * - char *pResultRole - If specified, only return instances that are 522 * playing this role in the association. 523 * 524 * Returns: 525 * - A list of Solaris_NFSShare (if pRole == Antecedent && pObjectName is 526 * a Solaris_ComputerSystem object path) or Solaris_ComputerSystem (if 527 * pRole == Dependent && pObjectName is a Solaris_NFSShare object path) 528 * instances which are associated to the pObjectName parameter. 529 * - NULL if an error occurred or if there are no instances associated to 530 * the pObjectName passed in. In the case of an error, the error will be 531 * logged. 532 */ 533/* ARGSUSED */ 534CCIMInstanceList * 535cp_associators_Solaris_HostedShare(CCIMObjectPath *pAssocName, 536 CCIMObjectPath *pObjectName, char *pResultClass, char *pRole, 537 char *pResultRole) { 538 539 CCIMInstanceList *returnInstList = NULL; 540 CCIMPropertyList *propList; 541 CCIMObjectPath *resultOP; 542 CCIMException *ex; 543 CIMBool pDeep, pLocalOnly, pIncludeQualifiers, 544 pIncludeClassOrigin, pUseInternal; 545 cimchar *resultClassName; 546 char *name; 547 char **pPropertyList; 548 unsigned int pNumProps; 549 int err = 0; 550 /* 551 * Check if the needed parameters are NULL. 552 */ 553 if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) { 554 util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS", 555 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 556 return ((CCIMInstanceList *)NULL); 557 } 558 559 /* 560 * The Name key property is the defining property for each the 561 * Antecedent (Solaris_ComputerSystem) and the Dependent 562 * (Solaris_NFSShare) so retrieve that property. 563 */ 564 propList = pObjectName->mKeyProperties; 565 name = (cimchar *)util_getKeyValue(propList, string, NAME, &err); 566 567 if (name == NULL || err != 0) { 568 /* 569 * We don't have the appropriate information. 570 */ 571 util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS", 572 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 573 return ((CCIMInstanceList *)NULL); 574 } 575 576 /* 577 * Determine whether the pObjectName is the Antecedent or the Dependent 578 * of the association. Antecedent == Solaris_ComputerSystem, 579 * Dependent == Solaris_NFSShare 580 */ 581 if ((strcasecmp(pObjectName->mName, COMPUTER_SYSTEM) == 0)) { 582 char *hostname; 583 584 resultClassName = SOLARIS_NFSSHARE; 585 586 /* 587 * If a value was passed in with pRole and it does not match 588 * the role that pObjectName actually is then log an invalid 589 * param error. 590 */ 591 if (pRole != NULL && (strcasecmp(pRole, ANTECEDENT) != 0)) { 592 util_handleError("SOLARIS_NFSMOUNT::ASSOCIATORS", 593 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 594 return ((CCIMInstanceList *)NULL); 595 } 596 597 /* 598 * Get the current host name and compare it to the name 599 * property of the passed in pObjectName. 600 */ 601 hostname = sys_get_hostname(&err); 602 if (hostname == NULL) { 603 util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS", 604 CIM_ERR_FAILED, GET_HOSTNAME_FAILURE, NULL, 605 &err); 606 return ((CCIMInstanceList *)NULL); 607 } 608 609 if ((strcmp(name, hostname) != 0)) { 610 /* 611 * We can only determine shares on the current host. 612 * The providers are not distributed. 613 */ 614 util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS", 615 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 616 free(hostname); 617 return ((CCIMInstanceList *)NULL); 618 } 619 free(hostname); 620 } else if ((strcasecmp(pObjectName->mName, SOLARIS_NFSSHARE) == 0)) { 621 CIMBool shareExists; 622 623 resultClassName = COMPUTER_SYSTEM; 624 625 /* 626 * pObjectName is the Dependent (Solaris_NFSShare) so determine 627 * if the share actually exists by comparing the Name property 628 * of pObjectName, which is populated with the shared directory, 629 * to existing nfs shares on the system. 630 */ 631 shareExists = does_share_exist(name); 632 if (shareExists == cim_false) { 633 return ((CCIMInstanceList *)NULL); 634 } 635 } else { 636 util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS", 637 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 638 return ((CCIMInstanceList *)NULL); 639 } 640 641 resultOP = cim_createEmptyObjectPath(resultClassName); 642 if (resultOP == NULL) { 643 ex = cim_getLastError(); 644 util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS", 645 CIM_ERR_FAILED, CREATE_EMPTY_OBJPATH_FAILURE, 646 ex, &err); 647 return ((CCIMInstanceList *)NULL); 648 } 649 650 pDeep = cim_false; 651 pLocalOnly = cim_false; 652 pIncludeQualifiers = cim_false; 653 pIncludeClassOrigin = cim_false; 654 pUseInternal = cim_false; 655 pPropertyList = NULL; 656 pNumProps = 0; 657 returnInstList = cimom_enumerateInstances(resultOP, pDeep, 658 pLocalOnly, pIncludeQualifiers, pIncludeClassOrigin, 659 pUseInternal, pPropertyList, pNumProps); 660 /* 661 * A NULL return value indicates an error, an empty list 662 * doesn't. 663 */ 664 if (returnInstList == NULL) { 665 ex = cim_getLastError(); 666 util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATORS", 667 CIM_ERR_FAILED, CIMOM_ENUM_INST_FAILURE, ex, 668 &err); 669 cim_freeObjectPath(resultOP); 670 return ((CCIMInstanceList *)NULL); 671 } 672 673 cim_freeObjectPath(resultOP); 674 675 if (returnInstList->mDataObject == NULL) { 676 return ((CCIMInstanceList *)NULL); 677 } 678 679 return (returnInstList); 680} /* cp_associators_Solaris_HostedShare */ 681 682/* 683 * Method: cp_associatorNames_Solaris_HostedShare 684 * 685 * Description: Returns the object paths of the instances on the other side of 686 * the association which are associated via the Solaris_HostedShare association 687 * and having the passed in parameter, pObjectName, as the opposite key. 688 * 689 * Parameters: 690 * - CCIMObjectPath *pAssocName - An object path containing information 691 * about the association that the caller is trying to reach. 692 * - CCIMObjectPath *pObjectName - The object path which contains the 693 * information on whose associated objects are to be returned. 694 * - char *pResultClass - If specified, only return instances that are of 695 * this class type. 696 * - char *pRole - If specified, this is the role of the pObjectName 697 * object path passed in. If this is not valid, NULL is returned. 698 * - char *pResultRole - If specified, only return instances that are 699 * playing this role in the association. 700 * 701 * Returns: 702 * - A list of Solaris_NFSShare (if pRole == Antecedent && pObjectName is 703 * a Solaris_ComputerSystem object path) or Solaris_ComputerSystem (if 704 * pRole == Dependent && pObjectName is a Solaris_NFSShare object path) 705 * object paths which are associated to the pObjectName parameter. 706 * - NULL if an error occurred or if there are no instances associated to 707 * the pObjectName passed in. In the case of an error, the error will be 708 * logged. 709 */ 710CCIMObjectPathList * 711cp_associatorNames_Solaris_HostedShare(CCIMObjectPath *pAssocName, 712 CCIMObjectPath *pObjectName, char *pResultClass, char *pRole, 713 char *pResultRole) { 714 715 CCIMInstanceList *instList; 716 CCIMObjectPathList *objPathList = NULL; 717 int err = 0; 718 719 if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) { 720 util_handleError("SOLARIS_HOSTEDSHARE::ASSOCIATOR_NAMES", 721 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 722 return ((CCIMObjectPathList *)NULL); 723 } 724 725 instList = cp_associators_Solaris_HostedShare(pAssocName, pObjectName, 726 pResultClass, pRole, pResultRole); 727 if (instList == NULL) { 728 return ((CCIMObjectPathList *)NULL); 729 } 730 731 objPathList = cim_createObjectPathList(instList); 732 cim_freeInstanceList(instList); 733 734 return (objPathList); 735} /* cp_associatorNames_Solaris_HostedShare */ 736 737/* 738 * Method: cp_references_Solaris_HostedShare 739 * 740 * Description: Returns the Solaris_HostedShare instances that have the passed 741 * in parameter, pObjectName, as one of it's keys. 742 * 743 * Parameters: 744 * - CCIMObjectPath *pAssocName - An object path containing information 745 * about the association that the caller is trying to reach. 746 * - CCIMObjectPath *pObjectName - The object path which contains the 747 * information on whose associated objects are to be returned. 748 * - char *pRole - If specified, this is the role of the pObjectName 749 * object path passed in. If this is not valid, NULL is returned. 750 * 751 * Returns: 752 * - A pointer to a list of Solaris_HostedShare instances. 753 * - NULL if an error occurred or if there are no Solaris_HostedShare 754 * instances having pObjectName as one of it's keys. 755 */ 756CCIMInstanceList * 757cp_references_Solaris_HostedShare(CCIMObjectPath *pAssocName, 758 CCIMObjectPath *pObjectName, char *pRole) { 759 760 CCIMInstanceList *instList; 761 CCIMObjectPathList *objPathList; 762 char *pObjectNameRole; 763 char *objPathListRole; 764 int err = 0; 765 766 if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) { 767 util_handleError("SOLARIS_HOSTEDSHARE::REFERENCES", 768 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 769 return ((CCIMInstanceList *)NULL); 770 } 771 772 /* 773 * Get everything that is related to the pObjectName passed in. 774 */ 775 objPathList = cp_associatorNames_Solaris_HostedShare(pAssocName, 776 pObjectName, NULL, pRole, NULL); 777 if (objPathList == NULL) { 778 return ((CCIMInstanceList *)NULL); 779 } 780 781 /* 782 * Now use the object paths in the object path list and the pObjectName 783 * variable to create the association instances. 784 */ 785 if ((strcasecmp(pObjectName->mName, SOLARIS_NFSSHARE) == 0)) { 786 /* 787 * pObjectName is the Dependent. 788 */ 789 pObjectNameRole = DEPENDENT; 790 objPathListRole = ANTECEDENT; 791 instList = create_association_instList(SOLARIS_HOSTEDSHARE, 792 pObjectName, pObjectNameRole, objPathList, 793 objPathListRole, &err); 794 } else { 795 /* 796 * pObjectName is the Antecedent. 797 */ 798 pObjectNameRole = ANTECEDENT; 799 objPathListRole = DEPENDENT; 800 instList = create_association_instList(SOLARIS_HOSTEDSHARE, 801 pObjectName, pObjectNameRole, objPathList, 802 objPathListRole, &err); 803 } 804 cim_freeObjectPathList(objPathList); 805 806 return (instList); 807} /* cp_references_Solaris_HostedShare */ 808 809/* 810 * Method: cp_referenceNames_Solaris_HostedShare 811 * 812 * Description: Returns the Solaris_HostedShare object paths of the instances 813 * that have the passed in parameter, pObjectName, as one of it's keys. 814 * 815 * Parameters: 816 * - CCIMObjectPath *pAssocName - An object path containing information 817 * about the association that the caller is trying to reach. 818 * - CCIMObjectPath *pObjectName - The object path which contains the 819 * information on whose associated objects are to be returned. 820 * - char *pRole - If specified, this is the role of the pObjectName 821 * object path passed in. If this is not valid, NULL is returned. 822 * 823 * Returns: 824 * - A pointer to a list of Solaris_HostedShare object paths. 825 * - NULL if an error occurred or if there are no Solaris_HostedShare 826 * instances having pObjectName as one of it's keys. 827 */ 828CCIMObjectPathList * 829cp_referenceNames_Solaris_HostedShare(CCIMObjectPath *pAssocName, 830 CCIMObjectPath *pObjectName, char *pRole) { 831 832 CCIMInstanceList *hostedShareInstList; 833 CCIMObjectPathList *hostedShareOPList; 834 int err = 0; 835 836 if (pObjectName == NULL || pObjectName->mKeyProperties == NULL) { 837 util_handleError("SOLARIS_HOSTEDSHARE::REFERENCE_NAMES", 838 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 839 return ((CCIMObjectPathList *)NULL); 840 } 841 842 hostedShareInstList = cp_references_Solaris_HostedShare(pAssocName, 843 pObjectName, pRole); 844 845 if (hostedShareInstList == NULL) { 846 return ((CCIMObjectPathList *)NULL); 847 } 848 849 hostedShareOPList = cim_createObjectPathList(hostedShareInstList); 850 851 cim_freeInstanceList(hostedShareInstList); 852 /* 853 * If an error occurred it will be handled in cim_createObjectPathList. 854 */ 855 return (hostedShareOPList); 856} /* cp_referenceNames_Solaris_HostedShare */ 857 858/* 859 * Property provider methods 860 */ 861 862/* 863 * Method: cp_getProperty_Solaris_HostedShare 864 * 865 * Description: Retrieves a certain property from the instance of 866 * Solaris_HostedShare on the host that is described by the parameter 867 * hostedShareOP. 868 * 869 * Parameters: 870 * - CCIMObjectPath *hostedShareOP - The object path containing all the 871 * information needed to find the instance in which the property is to 872 * be returned. 873 * - cimchar *pPropName - The name of the property to be found. 874 * 875 * Returns: 876 * - A pointer to the property corresponding to the name passed in with 877 * pPropName. 878 * - NULL if an error occurred or if the property doesn't exist. In the 879 * case of an error, the error will be logged. 880 */ 881CCIMProperty * 882cp_getProperty_Solaris_HostedShare(CCIMObjectPath *hostedShareOP, 883 cimchar *pPropName) { 884 885 CCIMInstance *hostedShareInst; 886 CCIMProperty *hostedShareProp; 887 int err = 0; 888 889 if (hostedShareOP == NULL) { 890 util_handleError("SOLARIS_HOSTEDSHARE::GET_PROPERTY", 891 CIM_ERR_INVALID_PARAMETER, NULL, NULL, &err); 892 return ((CCIMProperty *)NULL); 893 } 894 895 hostedShareInst = cp_getInstance_Solaris_HostedShare(hostedShareOP); 896 if (hostedShareInst == NULL) { 897 return ((CCIMProperty *)NULL); 898 } 899 900 hostedShareProp = cim_getProperty(hostedShareInst, pPropName); 901 cim_freeInstance(hostedShareInst); 902 903 return (hostedShareProp); 904 905} /* cp_getProperty_Solaris_HostedShare */ 906 907/* 908 * Method: cp_setProperty_Solaris_HostedShare 909 * 910 * Description: This method is not supported. It is not supported because in 911 * order to change the properties of a Solaris_HostedShare instance, the 912 * underlying classes being associated must be changed. This provider isn't 913 * the appropriate place to be changing other things on the host. 914 * 915 * Parameters: 916 * - CCIMObjectPath *hostedShareOP - Not used. 917 * - CCIMProperty *pProp - Not used. 918 * 919 * Returns: 920 * - Always returns cim_false because the method is not supported. 921 */ 922/* ARGSUSED */ 923CIMBool 924cp_setProperty_Solaris_HostedShare(CCIMObjectPath *hostedShareOP, 925 CCIMProperty *pProp) { 926 927 int err = 0; 928 929 util_handleError("SOLARIS_HOSTEDSHARE::SET_PROPERTY", 930 CIM_ERR_NOT_SUPPORTED, NULL, NULL, &err); 931 932 return (cim_false); 933} /* cp_setProperty_Solaris_HostedShare */ 934 935/* 936 * Method provider methods 937 */ 938 939/* 940 * Method: cp_invokeMethod_Solaris_HostedShare 941 * 942 * Description: This method is not supported because the provider doesn't have 943 * any methods. 944 * 945 * Parameters: 946 * - CCIMObjectPath* op - Not used. 947 * - cimchar* methodName - Not used. 948 * - CCIMPropertyList* inParams - Not used. 949 * - CCIMPropertyList* outParams - Not used. 950 * 951 * Returns: 952 * - Always returns null because the method is not supported. 953 */ 954/* ARGSUSED */ 955CCIMProperty * 956cp_invokeMethod_Solaris_HostedShare(CCIMObjectPath* op, cimchar* methodName, 957 CCIMPropertyList* inParams, CCIMPropertyList* outParams) { 958 959 return ((CCIMProperty *)NULL); 960} /* cp_invokeMethod_Solaris_HostedShare */ 961 962/* 963 * Private methods 964 */ 965 966/* 967 * Method: does_share_exist 968 * 969 * Description: Determines if a given share exists on the host. 970 * 971 * Parameters: 972 * - char *dir - The name of the directory to see if it is shared. 973 * 974 * Returns: 975 * - An integer corresponding to the existence of the share on the system. 976 * 1 is returned if the share exists, 0 is returned if the share does not 977 * exist. 978 */ 979static CIMBool 980does_share_exist(char *dir) { 981 fs_sharelist_t *share_list; 982 fs_sharelist_t *currentShare; 983 CIMBool return_val = cim_false; 984 int err = 0; 985 986 share_list = fs_get_share_list(&err); 987 if (share_list == NULL) { 988 /* 989 * Either there was an error or there are no shares on the 990 * system. If there was an error err should be a non-zero 991 * value. 992 */ 993 if (err != 0) { 994 util_handleError("SOLARIS_HOSTEDSHARE::SHARE_EXISTS", 995 CIM_ERR_FAILED, FS_GET_SHARE_FAILURE, NULL, 996 &err); 997 } 998 999 return (return_val); 1000 } 1001 1002 currentShare = share_list; 1003 while (currentShare != NULL && return_val == cim_false) { 1004 if ((strcmp(currentShare->path, dir) == 0)) { 1005 return_val = cim_true; 1006 } 1007 1008 currentShare = currentShare->next; 1009 } 1010 1011 fs_free_share_list(share_list); 1012 return (return_val); 1013 1014} /* does_share_exist */ 1015 1016/* 1017 * Method: get_Antecedent 1018 * 1019 * Description: Retrieves a reference property of the host's 1020 * Solaris_ComputerSystem class. 1021 * 1022 * Parameters: 1023 * - NONE 1024 * Returns: 1025 * - A pointer to a property which is a reference property of the host's 1026 * Solaris_ComputerSystem instance. 1027 * - Upon error, NULL is returned and the error is logged. 1028 */ 1029static CCIMObjectPath * 1030get_Antecedent() { 1031 CCIMInstance *compSysInst; 1032 CCIMObjectPath *compSysOP; 1033 CCIMException *ex; 1034 char *hostname; 1035 int err = 0; 1036 1037 compSysInst = cim_createInstance(COMPUTER_SYSTEM); 1038 if (compSysInst == NULL) { 1039 ex = cim_getLastError(); 1040 util_handleError("SOLARIS_HOSTEDSHARE::GET_ANT", 1041 CIM_ERR_FAILED, CREATE_INSTANCE_FAILURE, ex, &err); 1042 return ((CCIMObjectPath *)NULL); 1043 } 1044 1045 /* 1046 * Create the key properties on the Solaris_ComputerSystem instance. 1047 * 1048 * The Solaris_ComputerSystem keys are as follows: 1049 * CreationClassName = "Solaris_ComputerSystem" 1050 * Name = < host name > 1051 */ 1052 if (add_property_to_instance(CREATION_CLASS, string, COMPUTER_SYSTEM, 1053 NULL, cim_true, compSysInst) == cim_false) { 1054 1055 cim_freeInstance(compSysInst); 1056 return ((CCIMObjectPath *)NULL); 1057 } 1058 1059 hostname = sys_get_hostname(&err); 1060 if (hostname == NULL) { 1061 util_handleError("SOLARIS_HOSTEDSHARE::GET_ANT", 1062 CIM_ERR_FAILED, GET_HOSTNAME_FAILURE, NULL, &err); 1063 return ((CCIMObjectPath *)NULL); 1064 } 1065 1066 if (add_property_to_instance(NAME, string, hostname, NULL, 1067 cim_true, compSysInst) == cim_false) { 1068 1069 free(hostname); 1070 cim_freeInstance(compSysInst); 1071 return ((CCIMObjectPath *)NULL); 1072 } 1073 free(hostname); 1074 1075 compSysOP = cim_createObjectPath(compSysInst); 1076 if (compSysOP == NULL) { 1077 ex = cim_getLastError(); 1078 util_handleError("SOLARIS_HOSTEDSHARE::GET_ANT", 1079 CIM_ERR_FAILED, CREATE_OBJECT_PATH_FAILURE, 1080 ex, &err); 1081 cim_freeInstance(compSysInst); 1082 return ((CCIMObjectPath *)NULL); 1083 } 1084 1085 return (compSysOP); 1086} /* get_Antecedent */ 1087