1*7836SJohn.Forte@Sun.COM /****************************************************************************** 2*7836SJohn.Forte@Sun.COM * 3*7836SJohn.Forte@Sun.COM * Description 4*7836SJohn.Forte@Sun.COM * mpapi.c - Implements Multipath Management API Version 1.0 5*7836SJohn.Forte@Sun.COM * 6*7836SJohn.Forte@Sun.COM * License: 7*7836SJohn.Forte@Sun.COM * The contents of this file are subject to the SNIA Public License 8*7836SJohn.Forte@Sun.COM * Version 1.1 (the "License"); you may not use this file except in 9*7836SJohn.Forte@Sun.COM * compliance with the License. You may obtain a copy of the License at 10*7836SJohn.Forte@Sun.COM * 11*7836SJohn.Forte@Sun.COM * http://mp-mgmt-api.sourceforge.net 12*7836SJohn.Forte@Sun.COM * 13*7836SJohn.Forte@Sun.COM * Software distributed under the License is distributed on an "AS IS" 14*7836SJohn.Forte@Sun.COM * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 15*7836SJohn.Forte@Sun.COM * the License for the specific language governing rights and limitations 16*7836SJohn.Forte@Sun.COM * under the License. 17*7836SJohn.Forte@Sun.COM * 18*7836SJohn.Forte@Sun.COM * The Original Code is SNIA iSCSI Management API and Multipath Management 19*7836SJohn.Forte@Sun.COM * API header files. 20*7836SJohn.Forte@Sun.COM * 21*7836SJohn.Forte@Sun.COM * The Initial Developer of the Original Code is: 22*7836SJohn.Forte@Sun.COM * Benjamin F. Kuo Troika Networks, Inc. (benk@troikanetworks.com) 23*7836SJohn.Forte@Sun.COM * David Dillard VERITAS Software(david.dillard@veritas.com) 24*7836SJohn.Forte@Sun.COM * Jeff Ding Adaptec, Inc. (jding@corp.adaptec.com) 25*7836SJohn.Forte@Sun.COM * Hyon Kim Sun Microsystems(hyon.kim@sun.com) 26*7836SJohn.Forte@Sun.COM * 27*7836SJohn.Forte@Sun.COM * Contributor(s): 28*7836SJohn.Forte@Sun.COM * Paul von Behren Sun Microsystems(paul.vonbehren@sun.com) 29*7836SJohn.Forte@Sun.COM * 30*7836SJohn.Forte@Sun.COM ****************************************************************************** 31*7836SJohn.Forte@Sun.COM * 32*7836SJohn.Forte@Sun.COM * Changes: 33*7836SJohn.Forte@Sun.COM * 1/15/2005 Implemented SNIA MP API specification 1.0 34*7836SJohn.Forte@Sun.COM * 10/11/2005 35*7836SJohn.Forte@Sun.COM * - License location was specified in the header comment. 36*7836SJohn.Forte@Sun.COM * - validate_object() routine was updated per the latest 37*7836SJohn.Forte@Sun.COM * specification. 38*7836SJohn.Forte@Sun.COM * - is_zero_oid() routine was added. 39*7836SJohn.Forte@Sun.COM * - MP_GetObjectType() was updated with validate_object(). 40*7836SJohn.Forte@Sun.COM * - pplist argument checking added in MP_GetMultipathLus(). 41*7836SJohn.Forte@Sun.COM * - Corrected typo in MP_GetTaregetPortGroupProperties() 42*7836SJohn.Forte@Sun.COM * - MP_RegisterForObjectPropertyChanges() was updated with 43*7836SJohn.Forte@Sun.COM * is_zero_oid() routine. 44*7836SJohn.Forte@Sun.COM * - MP_DeregisterForObjectPropertyChanges() was updated with 45*7836SJohn.Forte@Sun.COM * is_zero_oid() routine. 46*7836SJohn.Forte@Sun.COM * - MP_RegisterForObjectVisibilityChanges() was updated with 47*7836SJohn.Forte@Sun.COM * is_zero_oid() routine. 48*7836SJohn.Forte@Sun.COM * - MP_DeregisterForObjectVisibilityChanges() was updated with 49*7836SJohn.Forte@Sun.COM * is_zero_oid() routine. 50*7836SJohn.Forte@Sun.COM * - Added stat() check in MP_RegisterPlugin() to validate the 51*7836SJohn.Forte@Sun.COM * the given plugin file name. 52*7836SJohn.Forte@Sun.COM * - Made MP_DeregisterPlugin() return MP_STATUS_UNKNOWN_FN 53*7836SJohn.Forte@Sun.COM * to mach the specification description. 54*7836SJohn.Forte@Sun.COM ****************************************************************************** 55*7836SJohn.Forte@Sun.COM */ 56*7836SJohn.Forte@Sun.COM 57*7836SJohn.Forte@Sun.COM #include <sys/sem.h> 58*7836SJohn.Forte@Sun.COM #include <dlfcn.h> 59*7836SJohn.Forte@Sun.COM #include <stdarg.h> 60*7836SJohn.Forte@Sun.COM #include <unistd.h> 61*7836SJohn.Forte@Sun.COM #include <sys/stat.h> 62*7836SJohn.Forte@Sun.COM #include <sys/types.h> 63*7836SJohn.Forte@Sun.COM #include <sys/mman.h> 64*7836SJohn.Forte@Sun.COM #include <errno.h> 65*7836SJohn.Forte@Sun.COM #include <stdio.h> 66*7836SJohn.Forte@Sun.COM #include <fcntl.h> 67*7836SJohn.Forte@Sun.COM #include <time.h> 68*7836SJohn.Forte@Sun.COM #include <pthread.h> 69*7836SJohn.Forte@Sun.COM #include "mpapi.h" 70*7836SJohn.Forte@Sun.COM #include "mpapi-sun.h" 71*7836SJohn.Forte@Sun.COM #include "mpapi-plugin.h" 72*7836SJohn.Forte@Sun.COM 73*7836SJohn.Forte@Sun.COM #define LIBRARY_SUPPORTED_MP_VERSION 1 74*7836SJohn.Forte@Sun.COM #define LIBRARY_IMPLEMENTATION_VERSION L"1.0.0" 75*7836SJohn.Forte@Sun.COM #define LIBRARY_VENDOR L"Sun Microsystems Inc." 76*7836SJohn.Forte@Sun.COM 77*7836SJohn.Forte@Sun.COM #define LIBRARY_FILE_NAME "libMPAPI.so" 78*7836SJohn.Forte@Sun.COM 79*7836SJohn.Forte@Sun.COM 80*7836SJohn.Forte@Sun.COM MPPLUGININFO_T plugintable[MP_MAX_NUM_PLUGINS]; 81*7836SJohn.Forte@Sun.COM pthread_mutex_t mp_lib_mutex = PTHREAD_MUTEX_INITIALIZER; 82*7836SJohn.Forte@Sun.COM 83*7836SJohn.Forte@Sun.COM static int number_of_plugins = -1; 84*7836SJohn.Forte@Sun.COM 85*7836SJohn.Forte@Sun.COM 86*7836SJohn.Forte@Sun.COM void InitLibrary(); 87*7836SJohn.Forte@Sun.COM void ExitLibrary(); 88*7836SJohn.Forte@Sun.COM static int lock_register(int fd, int cmd, int type, off_t offset, int whence, 89*7836SJohn.Forte@Sun.COM off_t len); 90*7836SJohn.Forte@Sun.COM static int search_line(MP_CHAR *buf, size_t buflen, MP_CHAR *srch_id, 91*7836SJohn.Forte@Sun.COM size_t id_len, int *write_offset, int *bytes_left); 92*7836SJohn.Forte@Sun.COM static int is_zero_oid(MP_OID); 93*7836SJohn.Forte@Sun.COM 94*7836SJohn.Forte@Sun.COM /** 95*7836SJohn.Forte@Sun.COM ****************************************************************************** 96*7836SJohn.Forte@Sun.COM * 97*7836SJohn.Forte@Sun.COM * Validate the oid. 98*7836SJohn.Forte@Sun.COM * 99*7836SJohn.Forte@Sun.COM * - Return MP_STATUS_OBJECT_NOT_FOUND when no plugin is found or the ownerId 100*7836SJohn.Forte@Sun.COM * of input OID is not found. 101*7836SJohn.Forte@Sun.COM * - Return MP_STATUS_INVALID_OBJECT_TYPE when no plugin is found or 102*7836SJohn.Forte@Sun.COM * the type of input OID is not one of legitimate types defined SNIA 103*7836SJohn.Forte@Sun.COM * Multipath Management spec. 104*7836SJohn.Forte@Sun.COM * - Return MP_STATUS_INVALID_PARAMETER when the type of input OID is 105*7836SJohn.Forte@Sun.COM * legitimate but its object type doesn't match with the object type 106*7836SJohn.Forte@Sun.COM * argument. 107*7836SJohn.Forte@Sun.COM * - Otherwise return MP_STATUS_SUCCESS. 108*7836SJohn.Forte@Sun.COM * 109*7836SJohn.Forte@Sun.COM ****************************************************************************** 110*7836SJohn.Forte@Sun.COM */ 111*7836SJohn.Forte@Sun.COM MP_STATUS validate_object(MP_OID obj, MP_OBJECT_TYPE objType, 112*7836SJohn.Forte@Sun.COM MP_UINT32 flag) 113*7836SJohn.Forte@Sun.COM { 114*7836SJohn.Forte@Sun.COM 115*7836SJohn.Forte@Sun.COM if ((number_of_plugins == 0) || 116*7836SJohn.Forte@Sun.COM (obj.ownerId > number_of_plugins || obj.ownerId <= 0)) { 117*7836SJohn.Forte@Sun.COM return (MP_STATUS_OBJECT_NOT_FOUND); 118*7836SJohn.Forte@Sun.COM } else if (obj.objectType < 0 || obj.objectType > MP_OBJECT_TYPE_MAX) { 119*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_OBJECT_TYPE); 120*7836SJohn.Forte@Sun.COM } else if (obj.objectType == MP_OBJECT_TYPE_PLUGIN) { 121*7836SJohn.Forte@Sun.COM if (obj.objectSequenceNumber != 0) { 122*7836SJohn.Forte@Sun.COM return (MP_STATUS_OBJECT_NOT_FOUND); 123*7836SJohn.Forte@Sun.COM } 124*7836SJohn.Forte@Sun.COM } 125*7836SJohn.Forte@Sun.COM 126*7836SJohn.Forte@Sun.COM if (flag == MP_OBJECT_TYPE_MATCH) { 127*7836SJohn.Forte@Sun.COM if (obj.objectType != objType) { 128*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 129*7836SJohn.Forte@Sun.COM } 130*7836SJohn.Forte@Sun.COM } 131*7836SJohn.Forte@Sun.COM return (MP_STATUS_SUCCESS); 132*7836SJohn.Forte@Sun.COM } 133*7836SJohn.Forte@Sun.COM 134*7836SJohn.Forte@Sun.COM /** 135*7836SJohn.Forte@Sun.COM ****************************************************************************** 136*7836SJohn.Forte@Sun.COM * 137*7836SJohn.Forte@Sun.COM * Check if an oid is ZERO_OID or not. 138*7836SJohn.Forte@Sun.COM * 139*7836SJohn.Forte@Sun.COM * - Return 1 if the input OID is ZERO_OID 140*7836SJohn.Forte@Sun.COM * 141*7836SJohn.Forte@Sun.COM * - Return 0 if not. 142*7836SJohn.Forte@Sun.COM * 143*7836SJohn.Forte@Sun.COM ****************************************************************************** 144*7836SJohn.Forte@Sun.COM */ 145*7836SJohn.Forte@Sun.COM static int is_zero_oid(MP_OID oid) 146*7836SJohn.Forte@Sun.COM { 147*7836SJohn.Forte@Sun.COM 148*7836SJohn.Forte@Sun.COM if ((oid.objectType != MP_OBJECT_TYPE_UNKNOWN) || (oid.ownerId != 0) || 149*7836SJohn.Forte@Sun.COM (oid.objectSequenceNumber != 0)) { 150*7836SJohn.Forte@Sun.COM return (0); 151*7836SJohn.Forte@Sun.COM } 152*7836SJohn.Forte@Sun.COM 153*7836SJohn.Forte@Sun.COM return (1); 154*7836SJohn.Forte@Sun.COM } 155*7836SJohn.Forte@Sun.COM 156*7836SJohn.Forte@Sun.COM /** 157*7836SJohn.Forte@Sun.COM ****************************************************************************** 158*7836SJohn.Forte@Sun.COM * 159*7836SJohn.Forte@Sun.COM * Initialize by loading plugin libraries and calling Initialize routine. 160*7836SJohn.Forte@Sun.COM * Note: The build of libMPAPI.so should include a linker option to make this 161*7836SJohn.Forte@Sun.COM * routine executed when it is loaded. 162*7836SJohn.Forte@Sun.COM * 163*7836SJohn.Forte@Sun.COM * - This routine bypasses a plugin library if it is not found. 164*7836SJohn.Forte@Sun.COM * - The implementation of this routine is based on configuration file 165*7836SJohn.Forte@Sun.COM * /etc/mpapi.conf that contains a list of plugin libraries. 166*7836SJohn.Forte@Sun.COM * 167*7836SJohn.Forte@Sun.COM ****************************************************************************** 168*7836SJohn.Forte@Sun.COM */ 169*7836SJohn.Forte@Sun.COM void InitLibrary() 170*7836SJohn.Forte@Sun.COM { 171*7836SJohn.Forte@Sun.COM FILE *mpconf; 172*7836SJohn.Forte@Sun.COM int fd_mpconf; 173*7836SJohn.Forte@Sun.COM MP_WCHAR fullline[MAX_LINE_SIZE]; /* line read in from mpapi.conf */ 174*7836SJohn.Forte@Sun.COM MP_WCHAR name[MAX_NAME_SIZE]; /* Read in from file mpapi.conf */ 175*7836SJohn.Forte@Sun.COM char path[MAX_NAME_SIZE]; /* Read in from file mpapi.conf */ 176*7836SJohn.Forte@Sun.COM char systemPath[MAX_NAME_SIZE], mpConfFilePath[MAX_NAME_SIZE]; 177*7836SJohn.Forte@Sun.COM MP_WCHAR *charPtr; 178*7836SJohn.Forte@Sun.COM MP_WCHAR *sol; 179*7836SJohn.Forte@Sun.COM struct stat stat_buf; 180*7836SJohn.Forte@Sun.COM 181*7836SJohn.Forte@Sun.COM MP_UINT32 i = 0; /* index for plugin table */ 182*7836SJohn.Forte@Sun.COM 183*7836SJohn.Forte@Sun.COM if(number_of_plugins != -1) { 184*7836SJohn.Forte@Sun.COM return; 185*7836SJohn.Forte@Sun.COM } 186*7836SJohn.Forte@Sun.COM 187*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 188*7836SJohn.Forte@Sun.COM 189*7836SJohn.Forte@Sun.COM number_of_plugins = 0; 190*7836SJohn.Forte@Sun.COM 191*7836SJohn.Forte@Sun.COM /* Open configuration file from known location */ 192*7836SJohn.Forte@Sun.COM strncpy(mpConfFilePath, "/etc/mpapi.conf", MAX_NAME_SIZE); 193*7836SJohn.Forte@Sun.COM 194*7836SJohn.Forte@Sun.COM if ((fd_mpconf = open(mpConfFilePath, O_RDONLY)) < 0) { 195*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 196*7836SJohn.Forte@Sun.COM return; 197*7836SJohn.Forte@Sun.COM } 198*7836SJohn.Forte@Sun.COM 199*7836SJohn.Forte@Sun.COM if (lock_register(fd_mpconf, F_SETLKW, F_RDLCK, 0, SEEK_SET, 0) < 0) { 200*7836SJohn.Forte@Sun.COM close(fd_mpconf); 201*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 202*7836SJohn.Forte@Sun.COM return; 203*7836SJohn.Forte@Sun.COM } 204*7836SJohn.Forte@Sun.COM 205*7836SJohn.Forte@Sun.COM if ((mpconf = fdopen(fd_mpconf, "r")) == NULL) { 206*7836SJohn.Forte@Sun.COM lock_register(fd_mpconf, F_SETLK, F_UNLCK, 0, SEEK_SET, 0); 207*7836SJohn.Forte@Sun.COM close(fd_mpconf); 208*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 209*7836SJohn.Forte@Sun.COM return; 210*7836SJohn.Forte@Sun.COM } 211*7836SJohn.Forte@Sun.COM 212*7836SJohn.Forte@Sun.COM /* Read in each line and load library */ 213*7836SJohn.Forte@Sun.COM while ((mpconf != NULL) && 214*7836SJohn.Forte@Sun.COM (charPtr = fgetws(fullline, MAX_LINE_SIZE, mpconf))) { 215*7836SJohn.Forte@Sun.COM if ((*charPtr != L'#') && (*charPtr != L'\n')) { 216*7836SJohn.Forte@Sun.COM /* Take out the '\n' */ 217*7836SJohn.Forte@Sun.COM if ((charPtr = wcschr(fullline, L'\n')) != NULL) 218*7836SJohn.Forte@Sun.COM *charPtr = L'\0'; 219*7836SJohn.Forte@Sun.COM 220*7836SJohn.Forte@Sun.COM charPtr = fullline; 221*7836SJohn.Forte@Sun.COM /* remove leading blank or taps. */ 222*7836SJohn.Forte@Sun.COM while ((fullline[0] == L' ') || (fullline[0] == L'\t')) 223*7836SJohn.Forte@Sun.COM charPtr++; 224*7836SJohn.Forte@Sun.COM 225*7836SJohn.Forte@Sun.COM sol = charPtr; 226*7836SJohn.Forte@Sun.COM 227*7836SJohn.Forte@Sun.COM /* 228*7836SJohn.Forte@Sun.COM * look for first tab or space. 229*7836SJohn.Forte@Sun.COM */ 230*7836SJohn.Forte@Sun.COM if ((charPtr = wcschr(fullline, L'\t')) == NULL) 231*7836SJohn.Forte@Sun.COM charPtr = wcschr(fullline, L' '); 232*7836SJohn.Forte@Sun.COM 233*7836SJohn.Forte@Sun.COM /* Set Null termination for library name if found */ 234*7836SJohn.Forte@Sun.COM if (charPtr != NULL) { 235*7836SJohn.Forte@Sun.COM *charPtr++ = L'\0'; 236*7836SJohn.Forte@Sun.COM wcsncpy(name, sol, MAX_NAME_SIZE); 237*7836SJohn.Forte@Sun.COM /* Skip space and tab until the next character found */ 238*7836SJohn.Forte@Sun.COM while ((*charPtr == L' ') || (*charPtr == L'\t')) 239*7836SJohn.Forte@Sun.COM charPtr++; 240*7836SJohn.Forte@Sun.COM } else { 241*7836SJohn.Forte@Sun.COM continue; /* May be invalid entry */ 242*7836SJohn.Forte@Sun.COM } 243*7836SJohn.Forte@Sun.COM 244*7836SJohn.Forte@Sun.COM /* Copy library name and path */ 245*7836SJohn.Forte@Sun.COM wcstombs(path, charPtr, MAX_NAME_SIZE); 246*7836SJohn.Forte@Sun.COM 247*7836SJohn.Forte@Sun.COM /* 248*7836SJohn.Forte@Sun.COM * Continue to the next line if library name or path is 249*7836SJohn.Forte@Sun.COM * invalid 250*7836SJohn.Forte@Sun.COM */ 251*7836SJohn.Forte@Sun.COM if ((wcslen(name) == 0) || 252*7836SJohn.Forte@Sun.COM (strlen(path) == 0)) 253*7836SJohn.Forte@Sun.COM continue; 254*7836SJohn.Forte@Sun.COM 255*7836SJohn.Forte@Sun.COM /* Load the plugin now */ 256*7836SJohn.Forte@Sun.COM if (stat(path, &stat_buf) != -1) { 257*7836SJohn.Forte@Sun.COM plugintable[i].hdlPlugin = dlopen(path, RTLD_LAZY); 258*7836SJohn.Forte@Sun.COM } else { 259*7836SJohn.Forte@Sun.COM continue; 260*7836SJohn.Forte@Sun.COM } 261*7836SJohn.Forte@Sun.COM 262*7836SJohn.Forte@Sun.COM if (plugintable[i].hdlPlugin != NULL) { 263*7836SJohn.Forte@Sun.COM InitializeFn PassFunc; 264*7836SJohn.Forte@Sun.COM MP_STATUS status; 265*7836SJohn.Forte@Sun.COM 266*7836SJohn.Forte@Sun.COM wcsncpy(plugintable[i].pluginName, 267*7836SJohn.Forte@Sun.COM name, MAX_NAME_SIZE); 268*7836SJohn.Forte@Sun.COM strncpy(plugintable[i].pluginPath, 269*7836SJohn.Forte@Sun.COM path, MAX_NAME_SIZE); 270*7836SJohn.Forte@Sun.COM 271*7836SJohn.Forte@Sun.COM plugintable[i].ownerId = i + 1; 272*7836SJohn.Forte@Sun.COM 273*7836SJohn.Forte@Sun.COM PassFunc = (InitializeFn) 274*7836SJohn.Forte@Sun.COM dlsym(plugintable[i].hdlPlugin, "Initialize"); 275*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 276*7836SJohn.Forte@Sun.COM status = PassFunc(plugintable[i].ownerId); 277*7836SJohn.Forte@Sun.COM } 278*7836SJohn.Forte@Sun.COM 279*7836SJohn.Forte@Sun.COM i++; 280*7836SJohn.Forte@Sun.COM } 281*7836SJohn.Forte@Sun.COM } 282*7836SJohn.Forte@Sun.COM } 283*7836SJohn.Forte@Sun.COM 284*7836SJohn.Forte@Sun.COM if (lock_register(fd_mpconf, F_SETLK, F_UNLCK, 0, SEEK_SET, 0) < 0) { 285*7836SJohn.Forte@Sun.COM fclose(mpconf); 286*7836SJohn.Forte@Sun.COM close(fd_mpconf); 287*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 288*7836SJohn.Forte@Sun.COM return; 289*7836SJohn.Forte@Sun.COM } 290*7836SJohn.Forte@Sun.COM fclose(mpconf); 291*7836SJohn.Forte@Sun.COM close(fd_mpconf); 292*7836SJohn.Forte@Sun.COM 293*7836SJohn.Forte@Sun.COM number_of_plugins = i; 294*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 295*7836SJohn.Forte@Sun.COM } 296*7836SJohn.Forte@Sun.COM 297*7836SJohn.Forte@Sun.COM /** 298*7836SJohn.Forte@Sun.COM ****************************************************************************** 299*7836SJohn.Forte@Sun.COM * 300*7836SJohn.Forte@Sun.COM * Exit by calling Terminate routine of plugin libraries. 301*7836SJohn.Forte@Sun.COM * 302*7836SJohn.Forte@Sun.COM * Note: The build of libMPAPI.so should include a linker option to make this 303*7836SJohn.Forte@Sun.COM * routine executed when it is unloaded. 304*7836SJohn.Forte@Sun.COM * 305*7836SJohn.Forte@Sun.COM ****************************************************************************** 306*7836SJohn.Forte@Sun.COM */ 307*7836SJohn.Forte@Sun.COM void ExitLibrary() 308*7836SJohn.Forte@Sun.COM { 309*7836SJohn.Forte@Sun.COM MP_UINT32 i, j; 310*7836SJohn.Forte@Sun.COM 311*7836SJohn.Forte@Sun.COM if(number_of_plugins == -1) 312*7836SJohn.Forte@Sun.COM return; 313*7836SJohn.Forte@Sun.COM 314*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 315*7836SJohn.Forte@Sun.COM for (i = 0; i < number_of_plugins; i++) { 316*7836SJohn.Forte@Sun.COM if (plugintable[i].hdlPlugin != NULL) { 317*7836SJohn.Forte@Sun.COM TerminateFn ExitPassFunc; 318*7836SJohn.Forte@Sun.COM 319*7836SJohn.Forte@Sun.COM ExitPassFunc = (TerminateFn) 320*7836SJohn.Forte@Sun.COM dlsym(plugintable[i].hdlPlugin, "Terminate"); 321*7836SJohn.Forte@Sun.COM 322*7836SJohn.Forte@Sun.COM if (ExitPassFunc != NULL) { 323*7836SJohn.Forte@Sun.COM ExitPassFunc(); 324*7836SJohn.Forte@Sun.COM } 325*7836SJohn.Forte@Sun.COM 326*7836SJohn.Forte@Sun.COM /* Unload plugin from memory */ 327*7836SJohn.Forte@Sun.COM dlclose(plugintable[i].hdlPlugin); 328*7836SJohn.Forte@Sun.COM } 329*7836SJohn.Forte@Sun.COM } 330*7836SJohn.Forte@Sun.COM 331*7836SJohn.Forte@Sun.COM number_of_plugins = -1; 332*7836SJohn.Forte@Sun.COM 333*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 334*7836SJohn.Forte@Sun.COM (void) pthread_mutex_destroy(&mp_lib_mutex); 335*7836SJohn.Forte@Sun.COM } 336*7836SJohn.Forte@Sun.COM 337*7836SJohn.Forte@Sun.COM /** 338*7836SJohn.Forte@Sun.COM ****************************************************************************** 339*7836SJohn.Forte@Sun.COM * 340*7836SJohn.Forte@Sun.COM * Gets the properties of the MP API library that is being used. 341*7836SJohn.Forte@Sun.COM * 342*7836SJohn.Forte@Sun.COM * @param pProps 343*7836SJohn.Forte@Sun.COM * A pointer to an @ref MP_LIBRARY_PROPERTIES structure allocated by 344*7836SJohn.Forte@Sun.COM * the caller. On successful return this structure will contain the 345*7836SJohn.Forte@Sun.COM * properties of the MP library. 346*7836SJohn.Forte@Sun.COM * 347*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or 348*7836SJohn.Forte@Sun.COM * if an error occurred. 349*7836SJohn.Forte@Sun.COM * 350*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 351*7836SJohn.Forte@Sun.COM * Returned if the library properties were successfully returned. 352*7836SJohn.Forte@Sun.COM * 353*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER Returned if @a pProps is NULL or 354*7836SJohn.Forte@Sun.COM * specifies a memory area to which data cannot be written. 355*7836SJohn.Forte@Sun.COM * 356*7836SJohn.Forte@Sun.COM ****************************************************************************** 357*7836SJohn.Forte@Sun.COM */ 358*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetLibraryProperties( 359*7836SJohn.Forte@Sun.COM MP_LIBRARY_PROPERTIES *pProps) 360*7836SJohn.Forte@Sun.COM { 361*7836SJohn.Forte@Sun.COM char mpPath[MAX_NAME_SIZE]; 362*7836SJohn.Forte@Sun.COM 363*7836SJohn.Forte@Sun.COM if(pProps == NULL) { 364*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 365*7836SJohn.Forte@Sun.COM } 366*7836SJohn.Forte@Sun.COM 367*7836SJohn.Forte@Sun.COM /* Fill in properties */ 368*7836SJohn.Forte@Sun.COM if (mbstowcs(pProps->buildTime, BUILD_TIME, 256) != 369*7836SJohn.Forte@Sun.COM strlen(BUILD_TIME)) { 370*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 371*7836SJohn.Forte@Sun.COM } 372*7836SJohn.Forte@Sun.COM pProps->supportedMpVersion = LIBRARY_SUPPORTED_MP_VERSION; 373*7836SJohn.Forte@Sun.COM 374*7836SJohn.Forte@Sun.COM wcsncpy(pProps->implementationVersion, 375*7836SJohn.Forte@Sun.COM LIBRARY_IMPLEMENTATION_VERSION, MAX_NAME_SIZE); 376*7836SJohn.Forte@Sun.COM wcsncpy(pProps->vendor, LIBRARY_VENDOR, MAX_NAME_SIZE); 377*7836SJohn.Forte@Sun.COM 378*7836SJohn.Forte@Sun.COM snprintf(pProps->fileName, MAX_NAME_SIZE, "%s", 379*7836SJohn.Forte@Sun.COM LIBRARY_FILE_NAME); 380*7836SJohn.Forte@Sun.COM 381*7836SJohn.Forte@Sun.COM return MP_STATUS_SUCCESS; 382*7836SJohn.Forte@Sun.COM } 383*7836SJohn.Forte@Sun.COM 384*7836SJohn.Forte@Sun.COM 385*7836SJohn.Forte@Sun.COM /** 386*7836SJohn.Forte@Sun.COM ****************************************************************************** 387*7836SJohn.Forte@Sun.COM * 388*7836SJohn.Forte@Sun.COM * Gets a list of the object IDs of all currently loaded plugins. 389*7836SJohn.Forte@Sun.COM * 390*7836SJohn.Forte@Sun.COM * @param ppList A pointer to a pointer to an @ref MP_OID_LIST. On successful 391*7836SJohn.Forte@Sun.COM * return this will contain a pointer to an @ref MP_OID_LIST 392*7836SJohn.Forte@Sun.COM * which contains the object IDs of all of the plugins currently loaded 393*7836SJohn.Forte@Sun.COM * by the library. 394*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 395*7836SJohn.Forte@Sun.COM * an error 396*7836SJohn.Forte@Sun.COM * occurred. 397*7836SJohn.Forte@Sun.COM * @retval MP_SUCCESS Returned if the plugin ID list was successfully returned. 398*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER Returned if @a ppList is NULL or 399*7836SJohn.Forte@Sun.COM * specifies a memory area to which data cannot be written. 400*7836SJohn.Forte@Sun.COM * 401*7836SJohn.Forte@Sun.COM ****************************************************************************** 402*7836SJohn.Forte@Sun.COM */ 403*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetPluginOidList( 404*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 405*7836SJohn.Forte@Sun.COM { 406*7836SJohn.Forte@Sun.COM MP_UINT32 i; 407*7836SJohn.Forte@Sun.COM 408*7836SJohn.Forte@Sun.COM if (ppList == NULL) 409*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 410*7836SJohn.Forte@Sun.COM 411*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 412*7836SJohn.Forte@Sun.COM 413*7836SJohn.Forte@Sun.COM if (number_of_plugins == 0) { 414*7836SJohn.Forte@Sun.COM *ppList = (MP_OID_LIST*)calloc(1, sizeof(MP_OID_LIST)); 415*7836SJohn.Forte@Sun.COM } else { 416*7836SJohn.Forte@Sun.COM *ppList = (MP_OID_LIST*)calloc(1, 417*7836SJohn.Forte@Sun.COM sizeof(MP_OID_LIST) + (number_of_plugins - 1)* sizeof(MP_OID) ); 418*7836SJohn.Forte@Sun.COM } 419*7836SJohn.Forte@Sun.COM 420*7836SJohn.Forte@Sun.COM if ((*ppList) == NULL) { 421*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 422*7836SJohn.Forte@Sun.COM return (MP_STATUS_INSUFFICIENT_MEMORY); 423*7836SJohn.Forte@Sun.COM } 424*7836SJohn.Forte@Sun.COM 425*7836SJohn.Forte@Sun.COM (*ppList)->oidCount = number_of_plugins; 426*7836SJohn.Forte@Sun.COM 427*7836SJohn.Forte@Sun.COM if (number_of_plugins != 0) { 428*7836SJohn.Forte@Sun.COM for (i = 0; i < number_of_plugins; i++) { 429*7836SJohn.Forte@Sun.COM (*ppList)->oids[i].objectType = MP_OBJECT_TYPE_PLUGIN; 430*7836SJohn.Forte@Sun.COM (*ppList)->oids[i].ownerId = plugintable[i].ownerId; 431*7836SJohn.Forte@Sun.COM (*ppList)->oids[i].objectSequenceNumber = 0; 432*7836SJohn.Forte@Sun.COM } 433*7836SJohn.Forte@Sun.COM } 434*7836SJohn.Forte@Sun.COM 435*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 436*7836SJohn.Forte@Sun.COM return MP_STATUS_SUCCESS; 437*7836SJohn.Forte@Sun.COM } 438*7836SJohn.Forte@Sun.COM 439*7836SJohn.Forte@Sun.COM /** 440*7836SJohn.Forte@Sun.COM ******************************************************************************* 441*7836SJohn.Forte@Sun.COM * 442*7836SJohn.Forte@Sun.COM * Gets the properties of the specified vendor plugin. 443*7836SJohn.Forte@Sun.COM * 444*7836SJohn.Forte@Sun.COM * @param oid 445*7836SJohn.Forte@Sun.COM * The ID of the plugin whose properties are being retrieved. 446*7836SJohn.Forte@Sun.COM * 447*7836SJohn.Forte@Sun.COM * @param pProps 448*7836SJohn.Forte@Sun.COM * A pointer to an @ref MP_PLUGIN_PROPERTIES structure allocated by 449*7836SJohn.Forte@Sun.COM * the caller. On successful return this will contain the properties 450*7836SJohn.Forte@Sun.COM * of the plugin specified by pluginOid. 451*7836SJohn.Forte@Sun.COM * 452*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if an 453*7836SJohn.Forte@Sun.COM * error occurred. 454*7836SJohn.Forte@Sun.COM * 455*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 456*7836SJohn.Forte@Sun.COM * Returned if the plugin properties were successfully returned. 457*7836SJohn.Forte@Sun.COM * 458*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 459*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 460*7836SJohn.Forte@Sun.COM * 461*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 462*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 463*7836SJohn.Forte@Sun.COM * the system. 464*7836SJohn.Forte@Sun.COM * 465*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 466*7836SJohn.Forte@Sun.COM * Returned if 'pProps' is NULL or specifies a memory area to 467*7836SJohn.Forte@Sun.COM * which data cannot be written. 468*7836SJohn.Forte@Sun.COM * 469*7836SJohn.Forte@Sun.COM ******************************************************************************* 470*7836SJohn.Forte@Sun.COM */ 471*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetPluginProperties( 472*7836SJohn.Forte@Sun.COM MP_OID pluginOid, 473*7836SJohn.Forte@Sun.COM MP_PLUGIN_PROPERTIES *pProps) 474*7836SJohn.Forte@Sun.COM { 475*7836SJohn.Forte@Sun.COM MP_GetPluginPropertiesPluginFn PassFunc; 476*7836SJohn.Forte@Sun.COM MP_UINT32 index; 477*7836SJohn.Forte@Sun.COM MP_STATUS status; 478*7836SJohn.Forte@Sun.COM 479*7836SJohn.Forte@Sun.COM if(pProps == NULL) 480*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 481*7836SJohn.Forte@Sun.COM 482*7836SJohn.Forte@Sun.COM if ((status = validate_object(pluginOid, MP_OBJECT_TYPE_PLUGIN, 483*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 484*7836SJohn.Forte@Sun.COM return (status); 485*7836SJohn.Forte@Sun.COM } 486*7836SJohn.Forte@Sun.COM 487*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 488*7836SJohn.Forte@Sun.COM 489*7836SJohn.Forte@Sun.COM index = pluginOid.ownerId - 1; 490*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 491*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetPluginPropertiesPluginFn) 492*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, "MP_GetPluginPropertiesPlugin"); 493*7836SJohn.Forte@Sun.COM 494*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 495*7836SJohn.Forte@Sun.COM status = PassFunc(pProps); 496*7836SJohn.Forte@Sun.COM } else { 497*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 498*7836SJohn.Forte@Sun.COM } 499*7836SJohn.Forte@Sun.COM } else { 500*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 501*7836SJohn.Forte@Sun.COM } 502*7836SJohn.Forte@Sun.COM 503*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 504*7836SJohn.Forte@Sun.COM return status; 505*7836SJohn.Forte@Sun.COM } 506*7836SJohn.Forte@Sun.COM 507*7836SJohn.Forte@Sun.COM /** 508*7836SJohn.Forte@Sun.COM ******************************************************************************* 509*7836SJohn.Forte@Sun.COM * 510*7836SJohn.Forte@Sun.COM * Gets the object ID for the plugin associated with the specified object ID. 511*7836SJohn.Forte@Sun.COM * 512*7836SJohn.Forte@Sun.COM * @param oid 513*7836SJohn.Forte@Sun.COM * The object ID of an object that has been received from a previous 514*7836SJohn.Forte@Sun.COM * library call. 515*7836SJohn.Forte@Sun.COM * 516*7836SJohn.Forte@Sun.COM * @param pPluginOid 517*7836SJohn.Forte@Sun.COM * A pointer to an MP_OID structure allocated by the caller. On 518*7836SJohn.Forte@Sun.COM * successful return this will contain the object ID of the plugin 519*7836SJohn.Forte@Sun.COM * associated with the object specified by @a objectId. 520*7836SJohn.Forte@Sun.COM * 521*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 522*7836SJohn.Forte@Sun.COM * an error occurred. 523*7836SJohn.Forte@Sun.COM * 524*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 525*7836SJohn.Forte@Sun.COM * Returned if the associated plugin ID was successfully returned. 526*7836SJohn.Forte@Sun.COM * 527*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 528*7836SJohn.Forte@Sun.COM * Returned if oid does not specify a plugin that is currently known to 529*7836SJohn.Forte@Sun.COM * the system. 530*7836SJohn.Forte@Sun.COM * 531*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 532*7836SJohn.Forte@Sun.COM * Returned if 'oid' specifies an object not owned by a plugin or 533*7836SJohn.Forte@Sun.COM * if pPluginOid is NULL or specifies a memory area to which data 534*7836SJohn.Forte@Sun.COM * cannot be written. 535*7836SJohn.Forte@Sun.COM * 536*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 537*7836SJohn.Forte@Sun.COM * Returned if 'oid' specifies an object with an invalid type. 538*7836SJohn.Forte@Sun.COM * 539*7836SJohn.Forte@Sun.COM ******************************************************************************* 540*7836SJohn.Forte@Sun.COM */ 541*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetAssociatedPluginOid( 542*7836SJohn.Forte@Sun.COM MP_OID objectId, 543*7836SJohn.Forte@Sun.COM MP_OID *pPluginId) 544*7836SJohn.Forte@Sun.COM { 545*7836SJohn.Forte@Sun.COM MP_UINT32 i; 546*7836SJohn.Forte@Sun.COM MP_STATUS status; 547*7836SJohn.Forte@Sun.COM 548*7836SJohn.Forte@Sun.COM if (pPluginId == NULL) 549*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 550*7836SJohn.Forte@Sun.COM 551*7836SJohn.Forte@Sun.COM if ((status = validate_object(objectId, 0, MP_OBJECT_TYPE_ANY)) != 552*7836SJohn.Forte@Sun.COM MP_STATUS_SUCCESS) { 553*7836SJohn.Forte@Sun.COM return (status); 554*7836SJohn.Forte@Sun.COM } 555*7836SJohn.Forte@Sun.COM 556*7836SJohn.Forte@Sun.COM pPluginId->objectType = MP_OBJECT_TYPE_PLUGIN; 557*7836SJohn.Forte@Sun.COM pPluginId->ownerId = objectId.ownerId; 558*7836SJohn.Forte@Sun.COM pPluginId->objectSequenceNumber = 0; 559*7836SJohn.Forte@Sun.COM 560*7836SJohn.Forte@Sun.COM return (MP_STATUS_SUCCESS); 561*7836SJohn.Forte@Sun.COM } 562*7836SJohn.Forte@Sun.COM 563*7836SJohn.Forte@Sun.COM /** 564*7836SJohn.Forte@Sun.COM ******************************************************************************* 565*7836SJohn.Forte@Sun.COM * 566*7836SJohn.Forte@Sun.COM * Gets the object type of an initialized object ID. 567*7836SJohn.Forte@Sun.COM * 568*7836SJohn.Forte@Sun.COM * @param oid 569*7836SJohn.Forte@Sun.COM * The object ID of an object that has been received from a previous 570*7836SJohn.Forte@Sun.COM * library call. 571*7836SJohn.Forte@Sun.COM * 572*7836SJohn.Forte@Sun.COM * @param pObjectType 573*7836SJohn.Forte@Sun.COM * A pointer to an MP_OBJECT_TYPE variable allocated by the caller. 574*7836SJohn.Forte@Sun.COM * On successful return this will contain the object type of oid. 575*7836SJohn.Forte@Sun.COM * 576*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or 577*7836SJohn.Forte@Sun.COM * if an error occurred. 578*7836SJohn.Forte@Sun.COM * 579*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 580*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 581*7836SJohn.Forte@Sun.COM * the system. 582*7836SJohn.Forte@Sun.COM * 583*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 584*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 585*7836SJohn.Forte@Sun.COM * 586*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 587*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 588*7836SJohn.Forte@Sun.COM * 589*7836SJohn.Forte@Sun.COM ******************************************************************************* 590*7836SJohn.Forte@Sun.COM */ 591*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetObjectType( 592*7836SJohn.Forte@Sun.COM MP_OID oid, 593*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE *pObjectType) 594*7836SJohn.Forte@Sun.COM { 595*7836SJohn.Forte@Sun.COM MP_STATUS status; 596*7836SJohn.Forte@Sun.COM 597*7836SJohn.Forte@Sun.COM if (pObjectType == NULL) 598*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 599*7836SJohn.Forte@Sun.COM 600*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, 0, MP_OBJECT_TYPE_ANY)) 601*7836SJohn.Forte@Sun.COM != MP_STATUS_SUCCESS) { 602*7836SJohn.Forte@Sun.COM return (status); 603*7836SJohn.Forte@Sun.COM } 604*7836SJohn.Forte@Sun.COM 605*7836SJohn.Forte@Sun.COM *pObjectType = oid.objectType; 606*7836SJohn.Forte@Sun.COM return MP_STATUS_SUCCESS; 607*7836SJohn.Forte@Sun.COM } 608*7836SJohn.Forte@Sun.COM 609*7836SJohn.Forte@Sun.COM /** 610*7836SJohn.Forte@Sun.COM ******************************************************************************* 611*7836SJohn.Forte@Sun.COM * 612*7836SJohn.Forte@Sun.COM * Gets a list of the object IDs of all the device product properties 613*7836SJohn.Forte@Sun.COM * associated with this plugin. 614*7836SJohn.Forte@Sun.COM * 615*7836SJohn.Forte@Sun.COM * @param oid 616*7836SJohn.Forte@Sun.COM * The object ID of plugin. 617*7836SJohn.Forte@Sun.COM * 618*7836SJohn.Forte@Sun.COM * @param ppList 619*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_OID_LIST structure. 620*7836SJohn.Forte@Sun.COM * On a successful return, this will contain a pointer to 621*7836SJohn.Forte@Sun.COM * an MP_OID_LIST that contains the object IDs of all the device 622*7836SJohn.Forte@Sun.COM * product descriptors associated with the specified plugin. 623*7836SJohn.Forte@Sun.COM * 624*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 625*7836SJohn.Forte@Sun.COM * an error occurred. 626*7836SJohn.Forte@Sun.COM * 627*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 628*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 629*7836SJohn.Forte@Sun.COM * 630*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 631*7836SJohn.Forte@Sun.COM * Returned if ppList pointer passed as placeholder for holding 632*7836SJohn.Forte@Sun.COM * the device product list is found to be invalid. 633*7836SJohn.Forte@Sun.COM * 634*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 635*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 636*7836SJohn.Forte@Sun.COM * 637*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 638*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 639*7836SJohn.Forte@Sun.COM * 640*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 641*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 642*7836SJohn.Forte@Sun.COM * 643*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 644*7836SJohn.Forte@Sun.COM * Returned when the API is not supported. 645*7836SJohn.Forte@Sun.COM * 646*7836SJohn.Forte@Sun.COM ******************************************************************************* 647*7836SJohn.Forte@Sun.COM */ 648*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetDeviceProductOidList( 649*7836SJohn.Forte@Sun.COM MP_OID oid, 650*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 651*7836SJohn.Forte@Sun.COM { 652*7836SJohn.Forte@Sun.COM MP_GetDeviceProductOidListPluginFn PassFunc; 653*7836SJohn.Forte@Sun.COM MP_UINT32 index; 654*7836SJohn.Forte@Sun.COM MP_STATUS status; 655*7836SJohn.Forte@Sun.COM 656*7836SJohn.Forte@Sun.COM if (ppList == NULL) 657*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 658*7836SJohn.Forte@Sun.COM 659*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 660*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 661*7836SJohn.Forte@Sun.COM return (status); 662*7836SJohn.Forte@Sun.COM } 663*7836SJohn.Forte@Sun.COM 664*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 665*7836SJohn.Forte@Sun.COM 666*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 667*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 668*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetDeviceProductOidListPluginFn) 669*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 670*7836SJohn.Forte@Sun.COM "MP_GetDeviceProductOidListPlugin"); 671*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 672*7836SJohn.Forte@Sun.COM status = PassFunc(ppList); 673*7836SJohn.Forte@Sun.COM } else { 674*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 675*7836SJohn.Forte@Sun.COM } 676*7836SJohn.Forte@Sun.COM } else { 677*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 678*7836SJohn.Forte@Sun.COM } 679*7836SJohn.Forte@Sun.COM 680*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 681*7836SJohn.Forte@Sun.COM return status; 682*7836SJohn.Forte@Sun.COM } 683*7836SJohn.Forte@Sun.COM 684*7836SJohn.Forte@Sun.COM /** 685*7836SJohn.Forte@Sun.COM ******************************************************************************* 686*7836SJohn.Forte@Sun.COM * 687*7836SJohn.Forte@Sun.COM * Gets the device product properties of the specified plugin oid. 688*7836SJohn.Forte@Sun.COM * 689*7836SJohn.Forte@Sun.COM * @param oid 690*7836SJohn.Forte@Sun.COM * The object ID of the plugin. 691*7836SJohn.Forte@Sun.COM * 692*7836SJohn.Forte@Sun.COM * @param ppProps 693*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_DEVICE_PRODUCT_PROPERTIES structure 694*7836SJohn.Forte@Sun.COM * allocated by the caller. On successful return it will contain 695*7836SJohn.Forte@Sun.COM * a pointer to an MP_DEVICE_PRODUCT_PROPERTIES structure allocated 696*7836SJohn.Forte@Sun.COM * by the library. 697*7836SJohn.Forte@Sun.COM * 698*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 699*7836SJohn.Forte@Sun.COM * an error occurred. 700*7836SJohn.Forte@Sun.COM * 701*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 702*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 703*7836SJohn.Forte@Sun.COM * 704*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 705*7836SJohn.Forte@Sun.COM * Returned if ppProps pointer passed as placeholder for holding 706*7836SJohn.Forte@Sun.COM * the device product properties is found to be invalid. 707*7836SJohn.Forte@Sun.COM * 708*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 709*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 710*7836SJohn.Forte@Sun.COM * 711*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 712*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 713*7836SJohn.Forte@Sun.COM * 714*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 715*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 716*7836SJohn.Forte@Sun.COM * 717*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 718*7836SJohn.Forte@Sun.COM * Returned when the API is not supported. 719*7836SJohn.Forte@Sun.COM * 720*7836SJohn.Forte@Sun.COM ******************************************************************************* 721*7836SJohn.Forte@Sun.COM */ 722*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetDeviceProductProperties( 723*7836SJohn.Forte@Sun.COM MP_OID oid, 724*7836SJohn.Forte@Sun.COM MP_DEVICE_PRODUCT_PROPERTIES *pProps) 725*7836SJohn.Forte@Sun.COM { 726*7836SJohn.Forte@Sun.COM MP_GetDeviceProductPropertiesFn PassFunc; 727*7836SJohn.Forte@Sun.COM MP_UINT32 index; 728*7836SJohn.Forte@Sun.COM MP_STATUS status; 729*7836SJohn.Forte@Sun.COM 730*7836SJohn.Forte@Sun.COM if (pProps == NULL) 731*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 732*7836SJohn.Forte@Sun.COM 733*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_DEVICE_PRODUCT, 734*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 735*7836SJohn.Forte@Sun.COM return (status); 736*7836SJohn.Forte@Sun.COM } 737*7836SJohn.Forte@Sun.COM 738*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 739*7836SJohn.Forte@Sun.COM 740*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 741*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 742*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetDeviceProductPropertiesFn) 743*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 744*7836SJohn.Forte@Sun.COM "MP_GetDeviceProductProperties"); 745*7836SJohn.Forte@Sun.COM 746*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 747*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pProps); 748*7836SJohn.Forte@Sun.COM } else { 749*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 750*7836SJohn.Forte@Sun.COM } 751*7836SJohn.Forte@Sun.COM } else { 752*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 753*7836SJohn.Forte@Sun.COM } 754*7836SJohn.Forte@Sun.COM 755*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 756*7836SJohn.Forte@Sun.COM return status; 757*7836SJohn.Forte@Sun.COM } 758*7836SJohn.Forte@Sun.COM 759*7836SJohn.Forte@Sun.COM /** 760*7836SJohn.Forte@Sun.COM ******************************************************************************* 761*7836SJohn.Forte@Sun.COM * 762*7836SJohn.Forte@Sun.COM * Gets a list of the object IDs of all the initiator ports associated 763*7836SJohn.Forte@Sun.COM * with this plugin. 764*7836SJohn.Forte@Sun.COM * 765*7836SJohn.Forte@Sun.COM * @param oid 766*7836SJohn.Forte@Sun.COM * The object ID of plugin. 767*7836SJohn.Forte@Sun.COM * 768*7836SJohn.Forte@Sun.COM * @param ppList 769*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_OID_LIST structure. 770*7836SJohn.Forte@Sun.COM * On a successful return, this will contain a pointer to 771*7836SJohn.Forte@Sun.COM * an MP_OID_LIST that contains the object IDs of all the initiator 772*7836SJohn.Forte@Sun.COM * ports associated with the specified plugin. 773*7836SJohn.Forte@Sun.COM * 774*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 775*7836SJohn.Forte@Sun.COM * an error occurred. 776*7836SJohn.Forte@Sun.COM * 777*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 778*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 779*7836SJohn.Forte@Sun.COM * 780*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 781*7836SJohn.Forte@Sun.COM * Returned if ppList pointer passed as placeholder for holding 782*7836SJohn.Forte@Sun.COM * the initiator port list is found to be invalid. 783*7836SJohn.Forte@Sun.COM * 784*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 785*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 786*7836SJohn.Forte@Sun.COM * 787*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 788*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 789*7836SJohn.Forte@Sun.COM * 790*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 791*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 792*7836SJohn.Forte@Sun.COM * 793*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 794*7836SJohn.Forte@Sun.COM * Returned when the API is not supported. 795*7836SJohn.Forte@Sun.COM * 796*7836SJohn.Forte@Sun.COM ******************************************************************************* 797*7836SJohn.Forte@Sun.COM */ 798*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetInitiatorPortOidList( 799*7836SJohn.Forte@Sun.COM MP_OID oid, 800*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 801*7836SJohn.Forte@Sun.COM { 802*7836SJohn.Forte@Sun.COM MP_GetInitiatorPortOidListPluginFn PassFunc; 803*7836SJohn.Forte@Sun.COM MP_UINT32 index; 804*7836SJohn.Forte@Sun.COM MP_STATUS status; 805*7836SJohn.Forte@Sun.COM 806*7836SJohn.Forte@Sun.COM if (ppList == NULL) 807*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 808*7836SJohn.Forte@Sun.COM 809*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 810*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 811*7836SJohn.Forte@Sun.COM return (status); 812*7836SJohn.Forte@Sun.COM } 813*7836SJohn.Forte@Sun.COM 814*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 815*7836SJohn.Forte@Sun.COM 816*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 817*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 818*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetDeviceProductOidListPluginFn) 819*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, "MP_GetInitiatorPortOidListPlugin"); 820*7836SJohn.Forte@Sun.COM 821*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 822*7836SJohn.Forte@Sun.COM status = PassFunc(ppList); 823*7836SJohn.Forte@Sun.COM } else { 824*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 825*7836SJohn.Forte@Sun.COM } 826*7836SJohn.Forte@Sun.COM } else { 827*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 828*7836SJohn.Forte@Sun.COM } 829*7836SJohn.Forte@Sun.COM 830*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 831*7836SJohn.Forte@Sun.COM return (status); 832*7836SJohn.Forte@Sun.COM } 833*7836SJohn.Forte@Sun.COM 834*7836SJohn.Forte@Sun.COM /** 835*7836SJohn.Forte@Sun.COM ******************************************************************************* 836*7836SJohn.Forte@Sun.COM * 837*7836SJohn.Forte@Sun.COM * Gets the properties of the specified initiator port. 838*7836SJohn.Forte@Sun.COM * 839*7836SJohn.Forte@Sun.COM * @param oid 840*7836SJohn.Forte@Sun.COM * The object ID of the initiator port. 841*7836SJohn.Forte@Sun.COM * 842*7836SJohn.Forte@Sun.COM * @param pProps 843*7836SJohn.Forte@Sun.COM * A pointer to an MP_INITIATOR_PORT_PROPERTIES structure 844*7836SJohn.Forte@Sun.COM * allocated by the caller. On successful return, this structure 845*7836SJohn.Forte@Sun.COM * will contain the properties of the port specified by oid. 846*7836SJohn.Forte@Sun.COM * 847*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 848*7836SJohn.Forte@Sun.COM * an error occurred. 849*7836SJohn.Forte@Sun.COM * 850*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 851*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 852*7836SJohn.Forte@Sun.COM * 853*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 854*7836SJohn.Forte@Sun.COM * Returned if pProps is NULL or specifies a memory area to 855*7836SJohn.Forte@Sun.COM * which data cannot be written. 856*7836SJohn.Forte@Sun.COM * 857*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 858*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 859*7836SJohn.Forte@Sun.COM * 860*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 861*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 862*7836SJohn.Forte@Sun.COM * the system. 863*7836SJohn.Forte@Sun.COM * 864*7836SJohn.Forte@Sun.COM ******************************************************************************* 865*7836SJohn.Forte@Sun.COM */ 866*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetInitiatorPortProperties( 867*7836SJohn.Forte@Sun.COM MP_OID oid, 868*7836SJohn.Forte@Sun.COM MP_INITIATOR_PORT_PROPERTIES *pProps) 869*7836SJohn.Forte@Sun.COM { 870*7836SJohn.Forte@Sun.COM MP_GetInitiatorPortPropertiesFn PassFunc; 871*7836SJohn.Forte@Sun.COM MP_UINT32 index; 872*7836SJohn.Forte@Sun.COM MP_STATUS status; 873*7836SJohn.Forte@Sun.COM 874*7836SJohn.Forte@Sun.COM if (pProps == NULL) 875*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 876*7836SJohn.Forte@Sun.COM 877*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_INITIATOR_PORT, 878*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 879*7836SJohn.Forte@Sun.COM return (status); 880*7836SJohn.Forte@Sun.COM } 881*7836SJohn.Forte@Sun.COM 882*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 883*7836SJohn.Forte@Sun.COM 884*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 885*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 886*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetInitiatorPortPropertiesFn) 887*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 888*7836SJohn.Forte@Sun.COM "MP_GetInitiatorPortProperties"); 889*7836SJohn.Forte@Sun.COM 890*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 891*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pProps); 892*7836SJohn.Forte@Sun.COM } else { 893*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 894*7836SJohn.Forte@Sun.COM } 895*7836SJohn.Forte@Sun.COM } else { 896*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 897*7836SJohn.Forte@Sun.COM } 898*7836SJohn.Forte@Sun.COM 899*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 900*7836SJohn.Forte@Sun.COM return status; 901*7836SJohn.Forte@Sun.COM } 902*7836SJohn.Forte@Sun.COM 903*7836SJohn.Forte@Sun.COM /** 904*7836SJohn.Forte@Sun.COM ******************************************************************************* 905*7836SJohn.Forte@Sun.COM * 906*7836SJohn.Forte@Sun.COM * Gets a list of multipath logical units associated to a plugin. 907*7836SJohn.Forte@Sun.COM * 908*7836SJohn.Forte@Sun.COM * @param oid 909*7836SJohn.Forte@Sun.COM * The object ID of plugin. 910*7836SJohn.Forte@Sun.COM * 911*7836SJohn.Forte@Sun.COM * @param ppList 912*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_OID_LIST structure. 913*7836SJohn.Forte@Sun.COM * On a successful return, this will contain a pointer to 914*7836SJohn.Forte@Sun.COM * an MP_OID_LIST that contains the object IDs of all the multipath 915*7836SJohn.Forte@Sun.COM * logical units associated with the specified plugin. 916*7836SJohn.Forte@Sun.COM * 917*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 918*7836SJohn.Forte@Sun.COM * an error occurred. 919*7836SJohn.Forte@Sun.COM * 920*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 921*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 922*7836SJohn.Forte@Sun.COM * 923*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 924*7836SJohn.Forte@Sun.COM * Returned if ppList pointer passed as placeholder for holding 925*7836SJohn.Forte@Sun.COM * the multipath logical unit list is found to be invalid. 926*7836SJohn.Forte@Sun.COM * 927*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 928*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 929*7836SJohn.Forte@Sun.COM * 930*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 931*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 932*7836SJohn.Forte@Sun.COM * 933*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 934*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 935*7836SJohn.Forte@Sun.COM * 936*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 937*7836SJohn.Forte@Sun.COM * Returned when the API is not supported. 938*7836SJohn.Forte@Sun.COM * 939*7836SJohn.Forte@Sun.COM ******************************************************************************* 940*7836SJohn.Forte@Sun.COM */ 941*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetMultipathLus( 942*7836SJohn.Forte@Sun.COM MP_OID oid, 943*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 944*7836SJohn.Forte@Sun.COM { 945*7836SJohn.Forte@Sun.COM MP_UINT32 index; 946*7836SJohn.Forte@Sun.COM MP_STATUS status; 947*7836SJohn.Forte@Sun.COM 948*7836SJohn.Forte@Sun.COM if (ppList == NULL) 949*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 950*7836SJohn.Forte@Sun.COM 951*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 952*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 953*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_DEVICE_PRODUCT, 954*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 955*7836SJohn.Forte@Sun.COM return (status); 956*7836SJohn.Forte@Sun.COM } 957*7836SJohn.Forte@Sun.COM 958*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 959*7836SJohn.Forte@Sun.COM 960*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 961*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 962*7836SJohn.Forte@Sun.COM if (oid.objectType == MP_OBJECT_TYPE_PLUGIN) { 963*7836SJohn.Forte@Sun.COM MP_GetMultipathLusPluginFn PassFunc; 964*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetMultipathLusPluginFn) 965*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 966*7836SJohn.Forte@Sun.COM "MP_GetMultipathLusPlugin"); 967*7836SJohn.Forte@Sun.COM 968*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 969*7836SJohn.Forte@Sun.COM status = PassFunc(ppList); 970*7836SJohn.Forte@Sun.COM } else { 971*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 972*7836SJohn.Forte@Sun.COM } 973*7836SJohn.Forte@Sun.COM } else if (oid.objectType == MP_OBJECT_TYPE_DEVICE_PRODUCT) { 974*7836SJohn.Forte@Sun.COM MP_GetMultipathLusDevProdFn PassFunc; 975*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetMultipathLusDevProdFn) 976*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 977*7836SJohn.Forte@Sun.COM "MP_GetMultipathLusDevProd"); 978*7836SJohn.Forte@Sun.COM 979*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 980*7836SJohn.Forte@Sun.COM status = PassFunc(oid, ppList); 981*7836SJohn.Forte@Sun.COM } else { 982*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 983*7836SJohn.Forte@Sun.COM } 984*7836SJohn.Forte@Sun.COM } else { 985*7836SJohn.Forte@Sun.COM status = MP_STATUS_INVALID_PARAMETER; 986*7836SJohn.Forte@Sun.COM } 987*7836SJohn.Forte@Sun.COM } 988*7836SJohn.Forte@Sun.COM 989*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 990*7836SJohn.Forte@Sun.COM return (status); 991*7836SJohn.Forte@Sun.COM } 992*7836SJohn.Forte@Sun.COM 993*7836SJohn.Forte@Sun.COM 994*7836SJohn.Forte@Sun.COM /** 995*7836SJohn.Forte@Sun.COM ******************************************************************************* 996*7836SJohn.Forte@Sun.COM * 997*7836SJohn.Forte@Sun.COM * Gets the properties of the specified logical unit. 998*7836SJohn.Forte@Sun.COM * 999*7836SJohn.Forte@Sun.COM * @param oid 1000*7836SJohn.Forte@Sun.COM * The object ID of the multipath logical unit. 1001*7836SJohn.Forte@Sun.COM * 1002*7836SJohn.Forte@Sun.COM * @param pProps 1003*7836SJohn.Forte@Sun.COM * A pointer to an MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES structure 1004*7836SJohn.Forte@Sun.COM * allocated by the caller. On successful return, this structure 1005*7836SJohn.Forte@Sun.COM * will contain the properties of the port specified by oid. 1006*7836SJohn.Forte@Sun.COM * 1007*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1008*7836SJohn.Forte@Sun.COM * an error occurred. 1009*7836SJohn.Forte@Sun.COM * 1010*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1011*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1012*7836SJohn.Forte@Sun.COM * 1013*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1014*7836SJohn.Forte@Sun.COM * Returned if pProps is NULL or specifies a memory area to 1015*7836SJohn.Forte@Sun.COM * which data cannot be written. 1016*7836SJohn.Forte@Sun.COM * 1017*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1018*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1019*7836SJohn.Forte@Sun.COM * 1020*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 1021*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 1022*7836SJohn.Forte@Sun.COM * the system. 1023*7836SJohn.Forte@Sun.COM * 1024*7836SJohn.Forte@Sun.COM ******************************************************************************* 1025*7836SJohn.Forte@Sun.COM */ 1026*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetMPLogicalUnitProperties( 1027*7836SJohn.Forte@Sun.COM MP_OID oid, 1028*7836SJohn.Forte@Sun.COM MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES *pProps) 1029*7836SJohn.Forte@Sun.COM { 1030*7836SJohn.Forte@Sun.COM MP_GetMPLogicalUnitPropertiesFn PassFunc; 1031*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1032*7836SJohn.Forte@Sun.COM MP_STATUS status; 1033*7836SJohn.Forte@Sun.COM 1034*7836SJohn.Forte@Sun.COM if (pProps == NULL) 1035*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1036*7836SJohn.Forte@Sun.COM 1037*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 1038*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1039*7836SJohn.Forte@Sun.COM return (status); 1040*7836SJohn.Forte@Sun.COM } 1041*7836SJohn.Forte@Sun.COM 1042*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1043*7836SJohn.Forte@Sun.COM 1044*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1045*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1046*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetMPLogicalUnitPropertiesFn) 1047*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1048*7836SJohn.Forte@Sun.COM "MP_GetMPLogicalUnitProperties"); 1049*7836SJohn.Forte@Sun.COM 1050*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1051*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pProps); 1052*7836SJohn.Forte@Sun.COM } else { 1053*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1054*7836SJohn.Forte@Sun.COM } 1055*7836SJohn.Forte@Sun.COM } else { 1056*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1057*7836SJohn.Forte@Sun.COM } 1058*7836SJohn.Forte@Sun.COM 1059*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1060*7836SJohn.Forte@Sun.COM return (status); 1061*7836SJohn.Forte@Sun.COM } 1062*7836SJohn.Forte@Sun.COM 1063*7836SJohn.Forte@Sun.COM /** 1064*7836SJohn.Forte@Sun.COM ******************************************************************************* 1065*7836SJohn.Forte@Sun.COM * 1066*7836SJohn.Forte@Sun.COM * Gets a list of the object IDs of all the path logical units associated 1067*7836SJohn.Forte@Sun.COM * with the specified multipath logical unit, initiator port, or target port. 1068*7836SJohn.Forte@Sun.COM * 1069*7836SJohn.Forte@Sun.COM * @param oid 1070*7836SJohn.Forte@Sun.COM * The object ID of multipath logical unit, initiator port, or 1071*7836SJohn.Forte@Sun.COM * target port. 1072*7836SJohn.Forte@Sun.COM * 1073*7836SJohn.Forte@Sun.COM * @param ppList 1074*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_OID_LIST structure. 1075*7836SJohn.Forte@Sun.COM * On a successful return, this will contain a pointer to 1076*7836SJohn.Forte@Sun.COM * an MP_OID_LIST that contains the object IDs of all the mp path 1077*7836SJohn.Forte@Sun.COM * logical units associated with the specified OID. 1078*7836SJohn.Forte@Sun.COM * 1079*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1080*7836SJohn.Forte@Sun.COM * an error occurred. 1081*7836SJohn.Forte@Sun.COM * 1082*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1083*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1084*7836SJohn.Forte@Sun.COM * 1085*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1086*7836SJohn.Forte@Sun.COM * Returned if ppList pointer passed as placeholder for holding 1087*7836SJohn.Forte@Sun.COM * the device product list is found to be invalid. 1088*7836SJohn.Forte@Sun.COM * 1089*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1090*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1091*7836SJohn.Forte@Sun.COM * 1092*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 1093*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 1094*7836SJohn.Forte@Sun.COM * 1095*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 1096*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 1097*7836SJohn.Forte@Sun.COM * 1098*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 1099*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 1100*7836SJohn.Forte@Sun.COM * the system. 1101*7836SJohn.Forte@Sun.COM * 1102*7836SJohn.Forte@Sun.COM ******************************************************************************* 1103*7836SJohn.Forte@Sun.COM */ 1104*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetAssociatedPathOidList( 1105*7836SJohn.Forte@Sun.COM MP_OID oid, 1106*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 1107*7836SJohn.Forte@Sun.COM { 1108*7836SJohn.Forte@Sun.COM MP_GetAssociatedPathOidListFn PassFunc; 1109*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1110*7836SJohn.Forte@Sun.COM MP_STATUS status; 1111*7836SJohn.Forte@Sun.COM 1112*7836SJohn.Forte@Sun.COM if (ppList == NULL) 1113*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1114*7836SJohn.Forte@Sun.COM 1115*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_INITIATOR_PORT, 1116*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 1117*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_TARGET_PORT, 1118*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 1119*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 1120*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 1121*7836SJohn.Forte@Sun.COM return (status); 1122*7836SJohn.Forte@Sun.COM } 1123*7836SJohn.Forte@Sun.COM 1124*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1125*7836SJohn.Forte@Sun.COM 1126*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1127*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1128*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetAssociatedPathOidListFn) 1129*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1130*7836SJohn.Forte@Sun.COM "MP_GetAssociatedPathOidList"); 1131*7836SJohn.Forte@Sun.COM 1132*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1133*7836SJohn.Forte@Sun.COM status = PassFunc(oid, ppList); 1134*7836SJohn.Forte@Sun.COM } else { 1135*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1136*7836SJohn.Forte@Sun.COM } 1137*7836SJohn.Forte@Sun.COM } else { 1138*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1139*7836SJohn.Forte@Sun.COM } 1140*7836SJohn.Forte@Sun.COM 1141*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1142*7836SJohn.Forte@Sun.COM return (status); 1143*7836SJohn.Forte@Sun.COM } 1144*7836SJohn.Forte@Sun.COM 1145*7836SJohn.Forte@Sun.COM /** 1146*7836SJohn.Forte@Sun.COM ******************************************************************************* 1147*7836SJohn.Forte@Sun.COM * 1148*7836SJohn.Forte@Sun.COM * Gets the properties of the specified path logical unit. 1149*7836SJohn.Forte@Sun.COM * 1150*7836SJohn.Forte@Sun.COM * @param oid 1151*7836SJohn.Forte@Sun.COM * The object ID of the path logical unit. 1152*7836SJohn.Forte@Sun.COM * 1153*7836SJohn.Forte@Sun.COM * @param pProps 1154*7836SJohn.Forte@Sun.COM * A pointer to an MP_PATH_LOGICAL_UNIT_PROPERTIES structure 1155*7836SJohn.Forte@Sun.COM * allocated by the caller. On successful return, this structure 1156*7836SJohn.Forte@Sun.COM * will contain the properties of the port specified by oid. 1157*7836SJohn.Forte@Sun.COM * 1158*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1159*7836SJohn.Forte@Sun.COM * an error occurred. 1160*7836SJohn.Forte@Sun.COM * 1161*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1162*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1163*7836SJohn.Forte@Sun.COM * 1164*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1165*7836SJohn.Forte@Sun.COM * Returned if pProps is NULL or specifies a memory area to 1166*7836SJohn.Forte@Sun.COM * which data cannot be written. 1167*7836SJohn.Forte@Sun.COM * 1168*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1169*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1170*7836SJohn.Forte@Sun.COM * 1171*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 1172*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 1173*7836SJohn.Forte@Sun.COM * the system. 1174*7836SJohn.Forte@Sun.COM * 1175*7836SJohn.Forte@Sun.COM ******************************************************************************* 1176*7836SJohn.Forte@Sun.COM */ 1177*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetPathLogicalUnitProperties( 1178*7836SJohn.Forte@Sun.COM MP_OID oid, 1179*7836SJohn.Forte@Sun.COM MP_PATH_LOGICAL_UNIT_PROPERTIES *pProps) 1180*7836SJohn.Forte@Sun.COM { 1181*7836SJohn.Forte@Sun.COM MP_GetPathLogicalUnitPropertiesFn PassFunc; 1182*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1183*7836SJohn.Forte@Sun.COM MP_STATUS status; 1184*7836SJohn.Forte@Sun.COM 1185*7836SJohn.Forte@Sun.COM if (pProps == NULL) 1186*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1187*7836SJohn.Forte@Sun.COM 1188*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_PATH_LU, 1189*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1190*7836SJohn.Forte@Sun.COM return (status); 1191*7836SJohn.Forte@Sun.COM } 1192*7836SJohn.Forte@Sun.COM 1193*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1194*7836SJohn.Forte@Sun.COM 1195*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1196*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1197*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetPathLogicalUnitPropertiesFn) 1198*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1199*7836SJohn.Forte@Sun.COM "MP_GetPathLogicalUnitProperties"); 1200*7836SJohn.Forte@Sun.COM 1201*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1202*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pProps); 1203*7836SJohn.Forte@Sun.COM } else { 1204*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1205*7836SJohn.Forte@Sun.COM } 1206*7836SJohn.Forte@Sun.COM } else { 1207*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1208*7836SJohn.Forte@Sun.COM } 1209*7836SJohn.Forte@Sun.COM 1210*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1211*7836SJohn.Forte@Sun.COM return (status); 1212*7836SJohn.Forte@Sun.COM } 1213*7836SJohn.Forte@Sun.COM 1214*7836SJohn.Forte@Sun.COM /** 1215*7836SJohn.Forte@Sun.COM ******************************************************************************* 1216*7836SJohn.Forte@Sun.COM * 1217*7836SJohn.Forte@Sun.COM * Gets a list of the object IDs of all the target port group associated 1218*7836SJohn.Forte@Sun.COM * with the specified multipath logical unit. 1219*7836SJohn.Forte@Sun.COM * 1220*7836SJohn.Forte@Sun.COM * @param oid 1221*7836SJohn.Forte@Sun.COM * The object ID of the multiple logical unit. 1222*7836SJohn.Forte@Sun.COM * 1223*7836SJohn.Forte@Sun.COM * @param ppList 1224*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_OID_LIST structure. 1225*7836SJohn.Forte@Sun.COM * On a successful return, this will contain a pointer to 1226*7836SJohn.Forte@Sun.COM * an MP_OID_LIST that contains the object IDs of all the target 1227*7836SJohn.Forte@Sun.COM * port group associated with the specified multipath logical unit. 1228*7836SJohn.Forte@Sun.COM * 1229*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1230*7836SJohn.Forte@Sun.COM * an error occurred. 1231*7836SJohn.Forte@Sun.COM * 1232*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1233*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1234*7836SJohn.Forte@Sun.COM * 1235*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1236*7836SJohn.Forte@Sun.COM * Returned if ppList pointer passed as placeholder for holding 1237*7836SJohn.Forte@Sun.COM * the target port group list is found to be invalid. 1238*7836SJohn.Forte@Sun.COM * 1239*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1240*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1241*7836SJohn.Forte@Sun.COM * 1242*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 1243*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 1244*7836SJohn.Forte@Sun.COM * 1245*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 1246*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 1247*7836SJohn.Forte@Sun.COM * 1248*7836SJohn.Forte@Sun.COM * 1249*7836SJohn.Forte@Sun.COM ******************************************************************************* 1250*7836SJohn.Forte@Sun.COM */ 1251*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetAssociatedTPGOidList( 1252*7836SJohn.Forte@Sun.COM MP_OID oid, 1253*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 1254*7836SJohn.Forte@Sun.COM { 1255*7836SJohn.Forte@Sun.COM MP_GetAssociatedTPGOidListFn PassFunc; 1256*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1257*7836SJohn.Forte@Sun.COM MP_STATUS status; 1258*7836SJohn.Forte@Sun.COM 1259*7836SJohn.Forte@Sun.COM if (ppList == NULL) 1260*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1261*7836SJohn.Forte@Sun.COM 1262*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 1263*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1264*7836SJohn.Forte@Sun.COM return (status); 1265*7836SJohn.Forte@Sun.COM } 1266*7836SJohn.Forte@Sun.COM 1267*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1268*7836SJohn.Forte@Sun.COM 1269*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1270*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1271*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetAssociatedTPGOidListFn) 1272*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1273*7836SJohn.Forte@Sun.COM "MP_GetAssociatedTPGOidList"); 1274*7836SJohn.Forte@Sun.COM 1275*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1276*7836SJohn.Forte@Sun.COM status = PassFunc(oid, ppList); 1277*7836SJohn.Forte@Sun.COM } else { 1278*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1279*7836SJohn.Forte@Sun.COM } 1280*7836SJohn.Forte@Sun.COM } else { 1281*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1282*7836SJohn.Forte@Sun.COM } 1283*7836SJohn.Forte@Sun.COM 1284*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1285*7836SJohn.Forte@Sun.COM return (status); 1286*7836SJohn.Forte@Sun.COM } 1287*7836SJohn.Forte@Sun.COM 1288*7836SJohn.Forte@Sun.COM /** 1289*7836SJohn.Forte@Sun.COM ******************************************************************************* 1290*7836SJohn.Forte@Sun.COM * 1291*7836SJohn.Forte@Sun.COM * Gets the properties of the specified target port group. 1292*7836SJohn.Forte@Sun.COM * 1293*7836SJohn.Forte@Sun.COM * @param oid 1294*7836SJohn.Forte@Sun.COM * The object ID of the target port group. 1295*7836SJohn.Forte@Sun.COM * 1296*7836SJohn.Forte@Sun.COM * @param pProps 1297*7836SJohn.Forte@Sun.COM * A pointer to an MP_TARGET_PORT_GROUP_PROPERTIES structure 1298*7836SJohn.Forte@Sun.COM * allocated by the caller. On successful return, this structure 1299*7836SJohn.Forte@Sun.COM * will contain the properties of the port specified by oid. 1300*7836SJohn.Forte@Sun.COM * 1301*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1302*7836SJohn.Forte@Sun.COM * an error occurred. 1303*7836SJohn.Forte@Sun.COM * 1304*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1305*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1306*7836SJohn.Forte@Sun.COM * 1307*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1308*7836SJohn.Forte@Sun.COM * Returned if pProps is NULL or specifies a memory area to 1309*7836SJohn.Forte@Sun.COM * which data cannot be written. 1310*7836SJohn.Forte@Sun.COM * 1311*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1312*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1313*7836SJohn.Forte@Sun.COM * 1314*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 1315*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 1316*7836SJohn.Forte@Sun.COM * the system. 1317*7836SJohn.Forte@Sun.COM * 1318*7836SJohn.Forte@Sun.COM ******************************************************************************* 1319*7836SJohn.Forte@Sun.COM */ 1320*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetTargetPortGroupProperties( 1321*7836SJohn.Forte@Sun.COM MP_OID oid, 1322*7836SJohn.Forte@Sun.COM MP_TARGET_PORT_GROUP_PROPERTIES *pProps) 1323*7836SJohn.Forte@Sun.COM { 1324*7836SJohn.Forte@Sun.COM MP_GetTargetPortGroupPropertiesFn PassFunc; 1325*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1326*7836SJohn.Forte@Sun.COM MP_STATUS status; 1327*7836SJohn.Forte@Sun.COM 1328*7836SJohn.Forte@Sun.COM if (pProps == NULL) 1329*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1330*7836SJohn.Forte@Sun.COM 1331*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_TARGET_PORT_GROUP, 1332*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1333*7836SJohn.Forte@Sun.COM return (status); 1334*7836SJohn.Forte@Sun.COM } 1335*7836SJohn.Forte@Sun.COM 1336*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1337*7836SJohn.Forte@Sun.COM 1338*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1339*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1340*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetTargetPortGroupPropertiesFn) 1341*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1342*7836SJohn.Forte@Sun.COM "MP_GetTargetPortGroupProperties"); 1343*7836SJohn.Forte@Sun.COM 1344*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1345*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pProps); 1346*7836SJohn.Forte@Sun.COM } else { 1347*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1348*7836SJohn.Forte@Sun.COM } 1349*7836SJohn.Forte@Sun.COM } else { 1350*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1351*7836SJohn.Forte@Sun.COM } 1352*7836SJohn.Forte@Sun.COM 1353*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1354*7836SJohn.Forte@Sun.COM return (status); 1355*7836SJohn.Forte@Sun.COM } 1356*7836SJohn.Forte@Sun.COM 1357*7836SJohn.Forte@Sun.COM /** 1358*7836SJohn.Forte@Sun.COM ******************************************************************************* 1359*7836SJohn.Forte@Sun.COM * 1360*7836SJohn.Forte@Sun.COM * Gets a list of multipath logical units associated with the specific target 1361*7836SJohn.Forte@Sun.COM * port group. 1362*7836SJohn.Forte@Sun.COM * 1363*7836SJohn.Forte@Sun.COM * @param oid 1364*7836SJohn.Forte@Sun.COM * The object ID of the target port group. 1365*7836SJohn.Forte@Sun.COM * 1366*7836SJohn.Forte@Sun.COM * @param ppList 1367*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_OID_LIST structure. 1368*7836SJohn.Forte@Sun.COM * On a successful return, this will contain a pointer to 1369*7836SJohn.Forte@Sun.COM * an MP_OID_LIST that contains the object IDs of all the multipath 1370*7836SJohn.Forte@Sun.COM * logical units associated with the specified target port group. 1371*7836SJohn.Forte@Sun.COM * 1372*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1373*7836SJohn.Forte@Sun.COM * an error occurred. 1374*7836SJohn.Forte@Sun.COM * 1375*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1376*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1377*7836SJohn.Forte@Sun.COM * 1378*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1379*7836SJohn.Forte@Sun.COM * Returned if ppList pointer passed as placeholder for holding 1380*7836SJohn.Forte@Sun.COM * the multipath logical unit list is found to be invalid. 1381*7836SJohn.Forte@Sun.COM * 1382*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1383*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1384*7836SJohn.Forte@Sun.COM * 1385*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 1386*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 1387*7836SJohn.Forte@Sun.COM * 1388*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 1389*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 1390*7836SJohn.Forte@Sun.COM * 1391*7836SJohn.Forte@Sun.COM ******************************************************************************* 1392*7836SJohn.Forte@Sun.COM */ 1393*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetMPLuOidListFromTPG( 1394*7836SJohn.Forte@Sun.COM MP_OID oid, 1395*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 1396*7836SJohn.Forte@Sun.COM { 1397*7836SJohn.Forte@Sun.COM MP_GetMPLuOidListFromTPGFn PassFunc; 1398*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1399*7836SJohn.Forte@Sun.COM MP_STATUS status; 1400*7836SJohn.Forte@Sun.COM 1401*7836SJohn.Forte@Sun.COM if (ppList == NULL) 1402*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1403*7836SJohn.Forte@Sun.COM 1404*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_TARGET_PORT_GROUP, 1405*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1406*7836SJohn.Forte@Sun.COM return (status); 1407*7836SJohn.Forte@Sun.COM } 1408*7836SJohn.Forte@Sun.COM 1409*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1410*7836SJohn.Forte@Sun.COM 1411*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1412*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1413*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetMPLuOidListFromTPGFn) 1414*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1415*7836SJohn.Forte@Sun.COM "MP_GetMPLuOidListFromTPG"); 1416*7836SJohn.Forte@Sun.COM 1417*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1418*7836SJohn.Forte@Sun.COM status = PassFunc(oid, ppList); 1419*7836SJohn.Forte@Sun.COM } else { 1420*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1421*7836SJohn.Forte@Sun.COM } 1422*7836SJohn.Forte@Sun.COM } else { 1423*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1424*7836SJohn.Forte@Sun.COM } 1425*7836SJohn.Forte@Sun.COM 1426*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1427*7836SJohn.Forte@Sun.COM return (status); 1428*7836SJohn.Forte@Sun.COM } 1429*7836SJohn.Forte@Sun.COM 1430*7836SJohn.Forte@Sun.COM /** 1431*7836SJohn.Forte@Sun.COM ******************************************************************************* 1432*7836SJohn.Forte@Sun.COM * 1433*7836SJohn.Forte@Sun.COM * Gets a list of the object IDs of all the proprietary load balance 1434*7836SJohn.Forte@Sun.COM * algorithms associated with this plugin. 1435*7836SJohn.Forte@Sun.COM * 1436*7836SJohn.Forte@Sun.COM * @param oid 1437*7836SJohn.Forte@Sun.COM * The object ID of the plugin. 1438*7836SJohn.Forte@Sun.COM * 1439*7836SJohn.Forte@Sun.COM * @param ppList 1440*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_OID_LIST structure. 1441*7836SJohn.Forte@Sun.COM * On a successful return, this will contain a pointer to 1442*7836SJohn.Forte@Sun.COM * an MP_OID_LIST that contains the object IDs of all the proprietary 1443*7836SJohn.Forte@Sun.COM * load balance algorithms associated with the specified plugin. 1444*7836SJohn.Forte@Sun.COM * 1445*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1446*7836SJohn.Forte@Sun.COM * an error occurred. 1447*7836SJohn.Forte@Sun.COM * 1448*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1449*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1450*7836SJohn.Forte@Sun.COM * 1451*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1452*7836SJohn.Forte@Sun.COM * Returned if ppList pointer passed as placeholder for holding 1453*7836SJohn.Forte@Sun.COM * the proprietary load balance oid list is found to be invalid. 1454*7836SJohn.Forte@Sun.COM * 1455*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1456*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1457*7836SJohn.Forte@Sun.COM * 1458*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 1459*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 1460*7836SJohn.Forte@Sun.COM * 1461*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 1462*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 1463*7836SJohn.Forte@Sun.COM * 1464*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 1465*7836SJohn.Forte@Sun.COM * Returned when the API is not supported. 1466*7836SJohn.Forte@Sun.COM * 1467*7836SJohn.Forte@Sun.COM ******************************************************************************* 1468*7836SJohn.Forte@Sun.COM */ 1469*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetProprietaryLoadBalanceOidList( 1470*7836SJohn.Forte@Sun.COM MP_OID oid, 1471*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 1472*7836SJohn.Forte@Sun.COM { 1473*7836SJohn.Forte@Sun.COM MP_GetProprietaryLoadBalanceOidListPluginFn PassFunc; 1474*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1475*7836SJohn.Forte@Sun.COM MP_STATUS status; 1476*7836SJohn.Forte@Sun.COM 1477*7836SJohn.Forte@Sun.COM if (ppList == NULL) 1478*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1479*7836SJohn.Forte@Sun.COM 1480*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 1481*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1482*7836SJohn.Forte@Sun.COM return (status); 1483*7836SJohn.Forte@Sun.COM } 1484*7836SJohn.Forte@Sun.COM 1485*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1486*7836SJohn.Forte@Sun.COM 1487*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1488*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1489*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetProprietaryLoadBalanceOidListPluginFn) 1490*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1491*7836SJohn.Forte@Sun.COM "MP_GetProprietaryLoadBalanceOidListPlugin"); 1492*7836SJohn.Forte@Sun.COM 1493*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1494*7836SJohn.Forte@Sun.COM status = PassFunc(ppList); 1495*7836SJohn.Forte@Sun.COM } else { 1496*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1497*7836SJohn.Forte@Sun.COM } 1498*7836SJohn.Forte@Sun.COM } else { 1499*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1500*7836SJohn.Forte@Sun.COM } 1501*7836SJohn.Forte@Sun.COM 1502*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1503*7836SJohn.Forte@Sun.COM return (status); 1504*7836SJohn.Forte@Sun.COM } 1505*7836SJohn.Forte@Sun.COM 1506*7836SJohn.Forte@Sun.COM /** 1507*7836SJohn.Forte@Sun.COM ******************************************************************************* 1508*7836SJohn.Forte@Sun.COM * 1509*7836SJohn.Forte@Sun.COM * Gets the properties of the specified load balance properties structure. 1510*7836SJohn.Forte@Sun.COM * 1511*7836SJohn.Forte@Sun.COM * @param oid 1512*7836SJohn.Forte@Sun.COM * The object ID of the load balance properties structure. 1513*7836SJohn.Forte@Sun.COM * 1514*7836SJohn.Forte@Sun.COM * @param pProps 1515*7836SJohn.Forte@Sun.COM * A pointer to an MP_LOAD_BALANCE_PROPRIETARY_TYPE structure 1516*7836SJohn.Forte@Sun.COM * allocated by the caller. On successful return, this structure 1517*7836SJohn.Forte@Sun.COM * will contain the properties of the proprietary load balance algorithm 1518*7836SJohn.Forte@Sun.COM * specified by oid. 1519*7836SJohn.Forte@Sun.COM * 1520*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1521*7836SJohn.Forte@Sun.COM * an error occurred. 1522*7836SJohn.Forte@Sun.COM * 1523*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1524*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1525*7836SJohn.Forte@Sun.COM * 1526*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1527*7836SJohn.Forte@Sun.COM * Returned if pProps is NULL or specifies a memory area to 1528*7836SJohn.Forte@Sun.COM * which data cannot be written. 1529*7836SJohn.Forte@Sun.COM * 1530*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1531*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1532*7836SJohn.Forte@Sun.COM * 1533*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 1534*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 1535*7836SJohn.Forte@Sun.COM * the system. 1536*7836SJohn.Forte@Sun.COM * 1537*7836SJohn.Forte@Sun.COM ******************************************************************************* 1538*7836SJohn.Forte@Sun.COM */ 1539*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetProprietaryLoadBalanceProperties ( 1540*7836SJohn.Forte@Sun.COM MP_OID oid, 1541*7836SJohn.Forte@Sun.COM MP_PROPRIETARY_LOAD_BALANCE_PROPERTIES *pProps) 1542*7836SJohn.Forte@Sun.COM { 1543*7836SJohn.Forte@Sun.COM MP_GetProprietaryLoadBalancePropertiesFn PassFunc; 1544*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1545*7836SJohn.Forte@Sun.COM MP_STATUS status; 1546*7836SJohn.Forte@Sun.COM 1547*7836SJohn.Forte@Sun.COM if (pProps == NULL) 1548*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1549*7836SJohn.Forte@Sun.COM 1550*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_PROPRIETARY_LOAD_BALANCE, 1551*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1552*7836SJohn.Forte@Sun.COM return (status); 1553*7836SJohn.Forte@Sun.COM } 1554*7836SJohn.Forte@Sun.COM 1555*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1556*7836SJohn.Forte@Sun.COM 1557*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1558*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1559*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetProprietaryLoadBalancePropertiesFn) 1560*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1561*7836SJohn.Forte@Sun.COM "MP_GetProprietaryLoadBalanceProperties"); 1562*7836SJohn.Forte@Sun.COM 1563*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1564*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pProps); 1565*7836SJohn.Forte@Sun.COM } else { 1566*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1567*7836SJohn.Forte@Sun.COM } 1568*7836SJohn.Forte@Sun.COM } else { 1569*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1570*7836SJohn.Forte@Sun.COM } 1571*7836SJohn.Forte@Sun.COM 1572*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1573*7836SJohn.Forte@Sun.COM return (status); 1574*7836SJohn.Forte@Sun.COM } 1575*7836SJohn.Forte@Sun.COM 1576*7836SJohn.Forte@Sun.COM /** 1577*7836SJohn.Forte@Sun.COM ******************************************************************************* 1578*7836SJohn.Forte@Sun.COM * 1579*7836SJohn.Forte@Sun.COM * Gets a list of the object IDs of the target ports in the specified target 1580*7836SJohn.Forte@Sun.COM * port group. 1581*7836SJohn.Forte@Sun.COM * 1582*7836SJohn.Forte@Sun.COM * @param oid 1583*7836SJohn.Forte@Sun.COM * The object ID of the target port group. 1584*7836SJohn.Forte@Sun.COM * 1585*7836SJohn.Forte@Sun.COM * @param ppList 1586*7836SJohn.Forte@Sun.COM * A pointer to a pointer to an MP_OID_LIST structure. 1587*7836SJohn.Forte@Sun.COM * On a successful return, this will contain a pointer to 1588*7836SJohn.Forte@Sun.COM * an MP_OID_LIST that contains the object IDs of all the target ports 1589*7836SJohn.Forte@Sun.COM * associated with the specified target port group. 1590*7836SJohn.Forte@Sun.COM * 1591*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1592*7836SJohn.Forte@Sun.COM * an error occurred. 1593*7836SJohn.Forte@Sun.COM * 1594*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1595*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1596*7836SJohn.Forte@Sun.COM * 1597*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1598*7836SJohn.Forte@Sun.COM * Returned if ppList pointer passed as placeholder for holding 1599*7836SJohn.Forte@Sun.COM * the multipath logical unit list is found to be invalid. 1600*7836SJohn.Forte@Sun.COM * 1601*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1602*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1603*7836SJohn.Forte@Sun.COM * 1604*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 1605*7836SJohn.Forte@Sun.COM * Returned when the plugin for the specified oid is not found. 1606*7836SJohn.Forte@Sun.COM * 1607*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INSUFFICIENT_MEMORY 1608*7836SJohn.Forte@Sun.COM * Returned when memory allocation failure occurs 1609*7836SJohn.Forte@Sun.COM * 1610*7836SJohn.Forte@Sun.COM ******************************************************************************* 1611*7836SJohn.Forte@Sun.COM */ 1612*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetTargetPortOidList( 1613*7836SJohn.Forte@Sun.COM MP_OID oid, 1614*7836SJohn.Forte@Sun.COM MP_OID_LIST **ppList) 1615*7836SJohn.Forte@Sun.COM { 1616*7836SJohn.Forte@Sun.COM MP_GetTargetPortOidListFn PassFunc; 1617*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1618*7836SJohn.Forte@Sun.COM MP_STATUS status; 1619*7836SJohn.Forte@Sun.COM 1620*7836SJohn.Forte@Sun.COM if (ppList == NULL) 1621*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1622*7836SJohn.Forte@Sun.COM 1623*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_TARGET_PORT_GROUP, 1624*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1625*7836SJohn.Forte@Sun.COM return (status); 1626*7836SJohn.Forte@Sun.COM } 1627*7836SJohn.Forte@Sun.COM 1628*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1629*7836SJohn.Forte@Sun.COM 1630*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1631*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1632*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetTargetPortOidListFn) 1633*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1634*7836SJohn.Forte@Sun.COM "MP_GetTargetPortOidList"); 1635*7836SJohn.Forte@Sun.COM 1636*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1637*7836SJohn.Forte@Sun.COM status = PassFunc(oid, ppList); 1638*7836SJohn.Forte@Sun.COM } else { 1639*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1640*7836SJohn.Forte@Sun.COM } 1641*7836SJohn.Forte@Sun.COM } else { 1642*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1643*7836SJohn.Forte@Sun.COM } 1644*7836SJohn.Forte@Sun.COM 1645*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1646*7836SJohn.Forte@Sun.COM return (status); 1647*7836SJohn.Forte@Sun.COM } 1648*7836SJohn.Forte@Sun.COM 1649*7836SJohn.Forte@Sun.COM /** 1650*7836SJohn.Forte@Sun.COM ******************************************************************************* 1651*7836SJohn.Forte@Sun.COM * 1652*7836SJohn.Forte@Sun.COM * Gets the properties of the specified target port. 1653*7836SJohn.Forte@Sun.COM * 1654*7836SJohn.Forte@Sun.COM * @param oid 1655*7836SJohn.Forte@Sun.COM * The object ID of the target port. 1656*7836SJohn.Forte@Sun.COM * 1657*7836SJohn.Forte@Sun.COM * @param pProps 1658*7836SJohn.Forte@Sun.COM * A pointer to an MP_TARGET_PORT_PROPERTIES structure 1659*7836SJohn.Forte@Sun.COM * allocated by the caller. On successful return, this structure 1660*7836SJohn.Forte@Sun.COM * will contain the properties of the port specified by oid. 1661*7836SJohn.Forte@Sun.COM * 1662*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1663*7836SJohn.Forte@Sun.COM * an error occurred. 1664*7836SJohn.Forte@Sun.COM * 1665*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1666*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1667*7836SJohn.Forte@Sun.COM * 1668*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1669*7836SJohn.Forte@Sun.COM * Returned if pProps is NULL or specifies a memory area to 1670*7836SJohn.Forte@Sun.COM * which data cannot be written. 1671*7836SJohn.Forte@Sun.COM * 1672*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1673*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1674*7836SJohn.Forte@Sun.COM * 1675*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 1676*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 1677*7836SJohn.Forte@Sun.COM * the system. 1678*7836SJohn.Forte@Sun.COM * 1679*7836SJohn.Forte@Sun.COM ******************************************************************************* 1680*7836SJohn.Forte@Sun.COM */ 1681*7836SJohn.Forte@Sun.COM MP_STATUS MP_GetTargetPortProperties( 1682*7836SJohn.Forte@Sun.COM MP_OID oid, 1683*7836SJohn.Forte@Sun.COM MP_TARGET_PORT_PROPERTIES *pProps) 1684*7836SJohn.Forte@Sun.COM { 1685*7836SJohn.Forte@Sun.COM MP_GetTargetPortPropertiesFn PassFunc; 1686*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1687*7836SJohn.Forte@Sun.COM MP_STATUS status; 1688*7836SJohn.Forte@Sun.COM 1689*7836SJohn.Forte@Sun.COM if (pProps == NULL) 1690*7836SJohn.Forte@Sun.COM return MP_STATUS_INVALID_PARAMETER; 1691*7836SJohn.Forte@Sun.COM 1692*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_TARGET_PORT, 1693*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1694*7836SJohn.Forte@Sun.COM return (status); 1695*7836SJohn.Forte@Sun.COM } 1696*7836SJohn.Forte@Sun.COM 1697*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1698*7836SJohn.Forte@Sun.COM 1699*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1700*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1701*7836SJohn.Forte@Sun.COM PassFunc = (MP_GetTargetPortPropertiesFn) 1702*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1703*7836SJohn.Forte@Sun.COM "MP_GetTargetPortProperties"); 1704*7836SJohn.Forte@Sun.COM 1705*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1706*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pProps); 1707*7836SJohn.Forte@Sun.COM } else { 1708*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1709*7836SJohn.Forte@Sun.COM } 1710*7836SJohn.Forte@Sun.COM } else { 1711*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1712*7836SJohn.Forte@Sun.COM } 1713*7836SJohn.Forte@Sun.COM 1714*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1715*7836SJohn.Forte@Sun.COM return (status); 1716*7836SJohn.Forte@Sun.COM } 1717*7836SJohn.Forte@Sun.COM 1718*7836SJohn.Forte@Sun.COM 1719*7836SJohn.Forte@Sun.COM /** 1720*7836SJohn.Forte@Sun.COM ******************************************************************************* 1721*7836SJohn.Forte@Sun.COM * 1722*7836SJohn.Forte@Sun.COM * Assign a multipath logical unit to a target port group. 1723*7836SJohn.Forte@Sun.COM * 1724*7836SJohn.Forte@Sun.COM * @param tpgOid 1725*7836SJohn.Forte@Sun.COM * An MP_TARGET_PORT_GROUP oid. The target port group currently in 1726*7836SJohn.Forte@Sun.COM * active access state that the administrator would like the LU 1727*7836SJohn.Forte@Sun.COM * assigned to. 1728*7836SJohn.Forte@Sun.COM * 1729*7836SJohn.Forte@Sun.COM * @param luOid 1730*7836SJohn.Forte@Sun.COM * An MP_MULTIPATH_LOGICAL_UNIT oid. 1731*7836SJohn.Forte@Sun.COM * 1732*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1733*7836SJohn.Forte@Sun.COM * an error occurred. 1734*7836SJohn.Forte@Sun.COM * 1735*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1736*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1737*7836SJohn.Forte@Sun.COM * 1738*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1739*7836SJohn.Forte@Sun.COM * Returned when luOid is not associated with tpgOid. 1740*7836SJohn.Forte@Sun.COM * 1741*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1742*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1743*7836SJohn.Forte@Sun.COM * 1744*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 1745*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 1746*7836SJohn.Forte@Sun.COM * the system. 1747*7836SJohn.Forte@Sun.COM * 1748*7836SJohn.Forte@Sun.COM ******************************************************************************* 1749*7836SJohn.Forte@Sun.COM */ 1750*7836SJohn.Forte@Sun.COM MP_STATUS MP_AssignLogicalUnitToTPG( 1751*7836SJohn.Forte@Sun.COM MP_OID tpgOid, 1752*7836SJohn.Forte@Sun.COM MP_OID luOid) 1753*7836SJohn.Forte@Sun.COM { 1754*7836SJohn.Forte@Sun.COM MP_AssignLogicalUnitToTPGFn PassFunc; 1755*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1756*7836SJohn.Forte@Sun.COM MP_STATUS status; 1757*7836SJohn.Forte@Sun.COM 1758*7836SJohn.Forte@Sun.COM if (luOid.ownerId != tpgOid.ownerId) { 1759*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 1760*7836SJohn.Forte@Sun.COM } 1761*7836SJohn.Forte@Sun.COM 1762*7836SJohn.Forte@Sun.COM if ((status = validate_object(tpgOid, MP_OBJECT_TYPE_TARGET_PORT_GROUP, 1763*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1764*7836SJohn.Forte@Sun.COM return (status); 1765*7836SJohn.Forte@Sun.COM } 1766*7836SJohn.Forte@Sun.COM 1767*7836SJohn.Forte@Sun.COM if ((status = validate_object(luOid, MP_OBJECT_TYPE_MULTIPATH_LU, 1768*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1769*7836SJohn.Forte@Sun.COM return (status); 1770*7836SJohn.Forte@Sun.COM } 1771*7836SJohn.Forte@Sun.COM 1772*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1773*7836SJohn.Forte@Sun.COM 1774*7836SJohn.Forte@Sun.COM index = tpgOid.ownerId - 1; 1775*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1776*7836SJohn.Forte@Sun.COM PassFunc = (MP_AssignLogicalUnitToTPGFn) 1777*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1778*7836SJohn.Forte@Sun.COM "MP_AssignLogicalUnitToTPG"); 1779*7836SJohn.Forte@Sun.COM 1780*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1781*7836SJohn.Forte@Sun.COM status = PassFunc(tpgOid, luOid); 1782*7836SJohn.Forte@Sun.COM } else { 1783*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1784*7836SJohn.Forte@Sun.COM } 1785*7836SJohn.Forte@Sun.COM } else { 1786*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1787*7836SJohn.Forte@Sun.COM } 1788*7836SJohn.Forte@Sun.COM 1789*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1790*7836SJohn.Forte@Sun.COM return (status); 1791*7836SJohn.Forte@Sun.COM } 1792*7836SJohn.Forte@Sun.COM 1793*7836SJohn.Forte@Sun.COM /** 1794*7836SJohn.Forte@Sun.COM ******************************************************************************* 1795*7836SJohn.Forte@Sun.COM * 1796*7836SJohn.Forte@Sun.COM * Manually override the path for a logical unit. The path exclusively used to 1797*7836SJohn.Forte@Sun.COM * access the logical unit until cleared. 1798*7836SJohn.Forte@Sun.COM * 1799*7836SJohn.Forte@Sun.COM * @param logicalUnitOid 1800*7836SJohn.Forte@Sun.COM * The object ID of the multipath logical unit. 1801*7836SJohn.Forte@Sun.COM * 1802*7836SJohn.Forte@Sun.COM * @param pathOid 1803*7836SJohn.Forte@Sun.COM * The object ID of the path logical unit. 1804*7836SJohn.Forte@Sun.COM * 1805*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1806*7836SJohn.Forte@Sun.COM * an error occurred. 1807*7836SJohn.Forte@Sun.COM * 1808*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1809*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1810*7836SJohn.Forte@Sun.COM * 1811*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1812*7836SJohn.Forte@Sun.COM * Returned if the oid of the object is not valid 1813*7836SJohn.Forte@Sun.COM * 1814*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 1815*7836SJohn.Forte@Sun.COM * Returned when the implementation does not support the API 1816*7836SJohn.Forte@Sun.COM * 1817*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1818*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1819*7836SJohn.Forte@Sun.COM * 1820*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_PATH_NONOPERATIONAL 1821*7836SJohn.Forte@Sun.COM * Returned when the driver cannot communicate through selected path. 1822*7836SJohn.Forte@Sun.COM * 1823*7836SJohn.Forte@Sun.COM ******************************************************************************* 1824*7836SJohn.Forte@Sun.COM */ 1825*7836SJohn.Forte@Sun.COM MP_STATUS MP_SetOverridePath( 1826*7836SJohn.Forte@Sun.COM MP_OID logicalUnitOid, 1827*7836SJohn.Forte@Sun.COM MP_OID pathOid) 1828*7836SJohn.Forte@Sun.COM { 1829*7836SJohn.Forte@Sun.COM MP_SetOverridePathFn PassFunc; 1830*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1831*7836SJohn.Forte@Sun.COM MP_STATUS status; 1832*7836SJohn.Forte@Sun.COM 1833*7836SJohn.Forte@Sun.COM if ((status = validate_object(logicalUnitOid, MP_OBJECT_TYPE_MULTIPATH_LU, 1834*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1835*7836SJohn.Forte@Sun.COM return (status); 1836*7836SJohn.Forte@Sun.COM } 1837*7836SJohn.Forte@Sun.COM if ((status = validate_object(pathOid, MP_OBJECT_TYPE_PATH_LU, 1838*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1839*7836SJohn.Forte@Sun.COM return (status); 1840*7836SJohn.Forte@Sun.COM } 1841*7836SJohn.Forte@Sun.COM 1842*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1843*7836SJohn.Forte@Sun.COM 1844*7836SJohn.Forte@Sun.COM index = pathOid.ownerId - 1; 1845*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1846*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetOverridePathFn) 1847*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1848*7836SJohn.Forte@Sun.COM "MP_SetOverridePath"); 1849*7836SJohn.Forte@Sun.COM 1850*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1851*7836SJohn.Forte@Sun.COM status = PassFunc(logicalUnitOid, pathOid); 1852*7836SJohn.Forte@Sun.COM } else { 1853*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1854*7836SJohn.Forte@Sun.COM } 1855*7836SJohn.Forte@Sun.COM } else { 1856*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1857*7836SJohn.Forte@Sun.COM } 1858*7836SJohn.Forte@Sun.COM 1859*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1860*7836SJohn.Forte@Sun.COM return (status); 1861*7836SJohn.Forte@Sun.COM } 1862*7836SJohn.Forte@Sun.COM 1863*7836SJohn.Forte@Sun.COM /** 1864*7836SJohn.Forte@Sun.COM ******************************************************************************* 1865*7836SJohn.Forte@Sun.COM * 1866*7836SJohn.Forte@Sun.COM * Cancel a path override and re-enable load balancing. 1867*7836SJohn.Forte@Sun.COM * 1868*7836SJohn.Forte@Sun.COM * @param luOid 1869*7836SJohn.Forte@Sun.COM * An MP_MULTIPATH_LOGICAL_UNIT oid. 1870*7836SJohn.Forte@Sun.COM * 1871*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1872*7836SJohn.Forte@Sun.COM * an error occurred. 1873*7836SJohn.Forte@Sun.COM * 1874*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1875*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1876*7836SJohn.Forte@Sun.COM * 1877*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1878*7836SJohn.Forte@Sun.COM * Returned if MP_MULTIPATH_LOGICAL_UNIT with the luOid is not found. 1879*7836SJohn.Forte@Sun.COM * 1880*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1881*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1882*7836SJohn.Forte@Sun.COM * 1883*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 1884*7836SJohn.Forte@Sun.COM * Returned if oid has an owner that is not currently known to 1885*7836SJohn.Forte@Sun.COM * the system. 1886*7836SJohn.Forte@Sun.COM * 1887*7836SJohn.Forte@Sun.COM ******************************************************************************* 1888*7836SJohn.Forte@Sun.COM */ 1889*7836SJohn.Forte@Sun.COM MP_STATUS MP_CancelOverridePath( 1890*7836SJohn.Forte@Sun.COM MP_OID luOid) 1891*7836SJohn.Forte@Sun.COM { 1892*7836SJohn.Forte@Sun.COM MP_CancelOverridePathFn PassFunc; 1893*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1894*7836SJohn.Forte@Sun.COM MP_STATUS status; 1895*7836SJohn.Forte@Sun.COM 1896*7836SJohn.Forte@Sun.COM if ((status = validate_object(luOid, MP_OBJECT_TYPE_MULTIPATH_LU, 1897*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 1898*7836SJohn.Forte@Sun.COM return (status); 1899*7836SJohn.Forte@Sun.COM } 1900*7836SJohn.Forte@Sun.COM 1901*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1902*7836SJohn.Forte@Sun.COM 1903*7836SJohn.Forte@Sun.COM index = luOid.ownerId - 1; 1904*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1905*7836SJohn.Forte@Sun.COM PassFunc = (MP_CancelOverridePathFn) 1906*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1907*7836SJohn.Forte@Sun.COM "MP_CancelOverridePath"); 1908*7836SJohn.Forte@Sun.COM 1909*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1910*7836SJohn.Forte@Sun.COM status = PassFunc(luOid); 1911*7836SJohn.Forte@Sun.COM } else { 1912*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1913*7836SJohn.Forte@Sun.COM } 1914*7836SJohn.Forte@Sun.COM } else { 1915*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 1916*7836SJohn.Forte@Sun.COM } 1917*7836SJohn.Forte@Sun.COM 1918*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1919*7836SJohn.Forte@Sun.COM return (status); 1920*7836SJohn.Forte@Sun.COM } 1921*7836SJohn.Forte@Sun.COM 1922*7836SJohn.Forte@Sun.COM /** 1923*7836SJohn.Forte@Sun.COM ******************************************************************************* 1924*7836SJohn.Forte@Sun.COM * 1925*7836SJohn.Forte@Sun.COM * Enables Auto-failback. 1926*7836SJohn.Forte@Sun.COM * 1927*7836SJohn.Forte@Sun.COM * @param oid 1928*7836SJohn.Forte@Sun.COM * The oid of the plugin. 1929*7836SJohn.Forte@Sun.COM * 1930*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 1931*7836SJohn.Forte@Sun.COM * an error occurred. 1932*7836SJohn.Forte@Sun.COM * 1933*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 1934*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 1935*7836SJohn.Forte@Sun.COM * 1936*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 1937*7836SJohn.Forte@Sun.COM * Returned if oid is NULL or specifies a memory area that is not 1938*7836SJohn.Forte@Sun.COM * a valid plugin oid. 1939*7836SJohn.Forte@Sun.COM * 1940*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 1941*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 1942*7836SJohn.Forte@Sun.COM * 1943*7836SJohn.Forte@Sun.COM ******************************************************************************* 1944*7836SJohn.Forte@Sun.COM */ 1945*7836SJohn.Forte@Sun.COM MP_STATUS MP_EnableAutoFailback( 1946*7836SJohn.Forte@Sun.COM MP_OID oid) 1947*7836SJohn.Forte@Sun.COM { 1948*7836SJohn.Forte@Sun.COM MP_UINT32 index; 1949*7836SJohn.Forte@Sun.COM MP_STATUS status; 1950*7836SJohn.Forte@Sun.COM 1951*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 1952*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 1953*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 1954*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 1955*7836SJohn.Forte@Sun.COM return (status); 1956*7836SJohn.Forte@Sun.COM } 1957*7836SJohn.Forte@Sun.COM 1958*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 1959*7836SJohn.Forte@Sun.COM 1960*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 1961*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 1962*7836SJohn.Forte@Sun.COM if (oid.objectType == MP_OBJECT_TYPE_PLUGIN) { 1963*7836SJohn.Forte@Sun.COM MP_EnableAutoFailbackPluginFn PassFunc; 1964*7836SJohn.Forte@Sun.COM PassFunc = (MP_EnableAutoFailbackPluginFn) 1965*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1966*7836SJohn.Forte@Sun.COM "MP_EnableAutoFailbackPlugin"); 1967*7836SJohn.Forte@Sun.COM 1968*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1969*7836SJohn.Forte@Sun.COM status = PassFunc(); 1970*7836SJohn.Forte@Sun.COM } else { 1971*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1972*7836SJohn.Forte@Sun.COM } 1973*7836SJohn.Forte@Sun.COM } else if (oid.objectType == MP_OBJECT_TYPE_MULTIPATH_LU) { 1974*7836SJohn.Forte@Sun.COM MP_EnableAutoFailbackLuFn PassFunc; 1975*7836SJohn.Forte@Sun.COM PassFunc = (MP_EnableAutoFailbackLuFn) 1976*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 1977*7836SJohn.Forte@Sun.COM "MP_EnableAutoFailbackLu"); 1978*7836SJohn.Forte@Sun.COM 1979*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 1980*7836SJohn.Forte@Sun.COM status = PassFunc(oid); 1981*7836SJohn.Forte@Sun.COM } else { 1982*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 1983*7836SJohn.Forte@Sun.COM } 1984*7836SJohn.Forte@Sun.COM } else { 1985*7836SJohn.Forte@Sun.COM status = MP_STATUS_INVALID_PARAMETER; 1986*7836SJohn.Forte@Sun.COM } 1987*7836SJohn.Forte@Sun.COM } 1988*7836SJohn.Forte@Sun.COM 1989*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 1990*7836SJohn.Forte@Sun.COM return (status); 1991*7836SJohn.Forte@Sun.COM } 1992*7836SJohn.Forte@Sun.COM 1993*7836SJohn.Forte@Sun.COM /** 1994*7836SJohn.Forte@Sun.COM ******************************************************************************* 1995*7836SJohn.Forte@Sun.COM * 1996*7836SJohn.Forte@Sun.COM * Enables Auto-probing. 1997*7836SJohn.Forte@Sun.COM * 1998*7836SJohn.Forte@Sun.COM * @param oid 1999*7836SJohn.Forte@Sun.COM * The oid of the plugin or the multipath logical unit. 2000*7836SJohn.Forte@Sun.COM * 2001*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2002*7836SJohn.Forte@Sun.COM * an error occurred. 2003*7836SJohn.Forte@Sun.COM * 2004*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2005*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2006*7836SJohn.Forte@Sun.COM * 2007*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2008*7836SJohn.Forte@Sun.COM * Returned if oid is NULL or specifies a memory area that is not 2009*7836SJohn.Forte@Sun.COM * a valid plugin oid. 2010*7836SJohn.Forte@Sun.COM * 2011*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2012*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2013*7836SJohn.Forte@Sun.COM * 2014*7836SJohn.Forte@Sun.COM ******************************************************************************* 2015*7836SJohn.Forte@Sun.COM */ 2016*7836SJohn.Forte@Sun.COM MP_STATUS MP_EnableAutoProbing( 2017*7836SJohn.Forte@Sun.COM MP_OID oid) 2018*7836SJohn.Forte@Sun.COM { 2019*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2020*7836SJohn.Forte@Sun.COM MP_STATUS status; 2021*7836SJohn.Forte@Sun.COM 2022*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 2023*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 2024*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 2025*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 2026*7836SJohn.Forte@Sun.COM return (status); 2027*7836SJohn.Forte@Sun.COM } 2028*7836SJohn.Forte@Sun.COM 2029*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2030*7836SJohn.Forte@Sun.COM 2031*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2032*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2033*7836SJohn.Forte@Sun.COM if (oid.objectType == MP_OBJECT_TYPE_PLUGIN) { 2034*7836SJohn.Forte@Sun.COM MP_EnableAutoProbingPluginFn PassFunc; 2035*7836SJohn.Forte@Sun.COM PassFunc = (MP_EnableAutoProbingPluginFn) 2036*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2037*7836SJohn.Forte@Sun.COM "MP_EnableAutoProbingPlugin"); 2038*7836SJohn.Forte@Sun.COM 2039*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2040*7836SJohn.Forte@Sun.COM status = PassFunc(); 2041*7836SJohn.Forte@Sun.COM } else { 2042*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2043*7836SJohn.Forte@Sun.COM } 2044*7836SJohn.Forte@Sun.COM } else if (oid.objectType == MP_OBJECT_TYPE_MULTIPATH_LU) { 2045*7836SJohn.Forte@Sun.COM MP_EnableAutoProbingLuFn PassFunc; 2046*7836SJohn.Forte@Sun.COM PassFunc = (MP_EnableAutoProbingLuFn) 2047*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2048*7836SJohn.Forte@Sun.COM "MP_EnableAutoProbingLu"); 2049*7836SJohn.Forte@Sun.COM 2050*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2051*7836SJohn.Forte@Sun.COM status = PassFunc(oid); 2052*7836SJohn.Forte@Sun.COM } else { 2053*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2054*7836SJohn.Forte@Sun.COM } 2055*7836SJohn.Forte@Sun.COM } else { 2056*7836SJohn.Forte@Sun.COM status = MP_STATUS_INVALID_PARAMETER; 2057*7836SJohn.Forte@Sun.COM } 2058*7836SJohn.Forte@Sun.COM } 2059*7836SJohn.Forte@Sun.COM 2060*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2061*7836SJohn.Forte@Sun.COM return (status); 2062*7836SJohn.Forte@Sun.COM } 2063*7836SJohn.Forte@Sun.COM 2064*7836SJohn.Forte@Sun.COM /** 2065*7836SJohn.Forte@Sun.COM ******************************************************************************* 2066*7836SJohn.Forte@Sun.COM * 2067*7836SJohn.Forte@Sun.COM * Disables Auto-failback. 2068*7836SJohn.Forte@Sun.COM * 2069*7836SJohn.Forte@Sun.COM * @param oid 2070*7836SJohn.Forte@Sun.COM * The oid of the plugin. 2071*7836SJohn.Forte@Sun.COM * 2072*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2073*7836SJohn.Forte@Sun.COM * an error occurred. 2074*7836SJohn.Forte@Sun.COM * 2075*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2076*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2077*7836SJohn.Forte@Sun.COM * 2078*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2079*7836SJohn.Forte@Sun.COM * Returned if oid is NULL or specifies a memory area that is not 2080*7836SJohn.Forte@Sun.COM * a valid plugin oid. 2081*7836SJohn.Forte@Sun.COM * 2082*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2083*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2084*7836SJohn.Forte@Sun.COM * 2085*7836SJohn.Forte@Sun.COM ******************************************************************************* 2086*7836SJohn.Forte@Sun.COM */ 2087*7836SJohn.Forte@Sun.COM MP_STATUS MP_DisableAutoFailback( 2088*7836SJohn.Forte@Sun.COM MP_OID oid) 2089*7836SJohn.Forte@Sun.COM { 2090*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2091*7836SJohn.Forte@Sun.COM MP_STATUS status; 2092*7836SJohn.Forte@Sun.COM 2093*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 2094*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 2095*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 2096*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 2097*7836SJohn.Forte@Sun.COM return (status); 2098*7836SJohn.Forte@Sun.COM } 2099*7836SJohn.Forte@Sun.COM 2100*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2101*7836SJohn.Forte@Sun.COM 2102*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2103*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2104*7836SJohn.Forte@Sun.COM if (oid.objectType == MP_OBJECT_TYPE_PLUGIN) { 2105*7836SJohn.Forte@Sun.COM MP_DisableAutoFailbackPluginFn PassFunc; 2106*7836SJohn.Forte@Sun.COM PassFunc = (MP_DisableAutoFailbackPluginFn) 2107*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2108*7836SJohn.Forte@Sun.COM "MP_DisableAutoFailbackPlugin"); 2109*7836SJohn.Forte@Sun.COM 2110*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2111*7836SJohn.Forte@Sun.COM status = PassFunc(); 2112*7836SJohn.Forte@Sun.COM } else { 2113*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2114*7836SJohn.Forte@Sun.COM } 2115*7836SJohn.Forte@Sun.COM } else if (oid.objectType == MP_OBJECT_TYPE_MULTIPATH_LU) { 2116*7836SJohn.Forte@Sun.COM MP_DisableAutoFailbackLuFn PassFunc; 2117*7836SJohn.Forte@Sun.COM PassFunc = (MP_DisableAutoFailbackLuFn) 2118*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2119*7836SJohn.Forte@Sun.COM "MP_DisableAutoFailbackLu"); 2120*7836SJohn.Forte@Sun.COM 2121*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2122*7836SJohn.Forte@Sun.COM status = PassFunc(oid); 2123*7836SJohn.Forte@Sun.COM } else { 2124*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2125*7836SJohn.Forte@Sun.COM } 2126*7836SJohn.Forte@Sun.COM } else { 2127*7836SJohn.Forte@Sun.COM status = MP_STATUS_INVALID_PARAMETER; 2128*7836SJohn.Forte@Sun.COM } 2129*7836SJohn.Forte@Sun.COM } 2130*7836SJohn.Forte@Sun.COM 2131*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2132*7836SJohn.Forte@Sun.COM return (status); 2133*7836SJohn.Forte@Sun.COM } 2134*7836SJohn.Forte@Sun.COM 2135*7836SJohn.Forte@Sun.COM /** 2136*7836SJohn.Forte@Sun.COM ******************************************************************************* 2137*7836SJohn.Forte@Sun.COM * 2138*7836SJohn.Forte@Sun.COM * Disables Auto-probing. 2139*7836SJohn.Forte@Sun.COM * 2140*7836SJohn.Forte@Sun.COM * @param oid 2141*7836SJohn.Forte@Sun.COM * The oid of the plugin or the multipath logical unit. 2142*7836SJohn.Forte@Sun.COM * 2143*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2144*7836SJohn.Forte@Sun.COM * an error occurred. 2145*7836SJohn.Forte@Sun.COM * 2146*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2147*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2148*7836SJohn.Forte@Sun.COM * 2149*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2150*7836SJohn.Forte@Sun.COM * Returned if oid is NULL or specifies a memory area that is not 2151*7836SJohn.Forte@Sun.COM * a valid plugin oid. 2152*7836SJohn.Forte@Sun.COM * 2153*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2154*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2155*7836SJohn.Forte@Sun.COM * 2156*7836SJohn.Forte@Sun.COM ******************************************************************************* 2157*7836SJohn.Forte@Sun.COM */ 2158*7836SJohn.Forte@Sun.COM MP_STATUS MP_DisableAutoProbing( 2159*7836SJohn.Forte@Sun.COM MP_OID oid) 2160*7836SJohn.Forte@Sun.COM { 2161*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2162*7836SJohn.Forte@Sun.COM MP_STATUS status; 2163*7836SJohn.Forte@Sun.COM 2164*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 2165*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 2166*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 2167*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 2168*7836SJohn.Forte@Sun.COM return (status); 2169*7836SJohn.Forte@Sun.COM } 2170*7836SJohn.Forte@Sun.COM 2171*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2172*7836SJohn.Forte@Sun.COM 2173*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2174*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2175*7836SJohn.Forte@Sun.COM if (oid.objectType == MP_OBJECT_TYPE_PLUGIN) { 2176*7836SJohn.Forte@Sun.COM MP_DisableAutoProbingPluginFn PassFunc; 2177*7836SJohn.Forte@Sun.COM PassFunc = (MP_DisableAutoProbingPluginFn) 2178*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2179*7836SJohn.Forte@Sun.COM "MP_DisableAutoProbingPlugin"); 2180*7836SJohn.Forte@Sun.COM 2181*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2182*7836SJohn.Forte@Sun.COM status = PassFunc(); 2183*7836SJohn.Forte@Sun.COM } else { 2184*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2185*7836SJohn.Forte@Sun.COM } 2186*7836SJohn.Forte@Sun.COM } else if (oid.objectType == MP_OBJECT_TYPE_MULTIPATH_LU) { 2187*7836SJohn.Forte@Sun.COM MP_DisableAutoFailbackLuFn PassFunc; 2188*7836SJohn.Forte@Sun.COM PassFunc = (MP_DisableAutoProbingLuFn) 2189*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2190*7836SJohn.Forte@Sun.COM "MP_DisableAutoProbingLu"); 2191*7836SJohn.Forte@Sun.COM 2192*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2193*7836SJohn.Forte@Sun.COM status = PassFunc(oid); 2194*7836SJohn.Forte@Sun.COM } else { 2195*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2196*7836SJohn.Forte@Sun.COM } 2197*7836SJohn.Forte@Sun.COM } else { 2198*7836SJohn.Forte@Sun.COM status = MP_STATUS_INVALID_PARAMETER; 2199*7836SJohn.Forte@Sun.COM } 2200*7836SJohn.Forte@Sun.COM } 2201*7836SJohn.Forte@Sun.COM 2202*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2203*7836SJohn.Forte@Sun.COM return (status); 2204*7836SJohn.Forte@Sun.COM } 2205*7836SJohn.Forte@Sun.COM 2206*7836SJohn.Forte@Sun.COM /** 2207*7836SJohn.Forte@Sun.COM ******************************************************************************* 2208*7836SJohn.Forte@Sun.COM * 2209*7836SJohn.Forte@Sun.COM * Enables a path. This API may cause failover in a logical unit with 2210*7836SJohn.Forte@Sun.COM * asymmetric access. 2211*7836SJohn.Forte@Sun.COM * 2212*7836SJohn.Forte@Sun.COM * @param oid 2213*7836SJohn.Forte@Sun.COM * The oid of the path. 2214*7836SJohn.Forte@Sun.COM * 2215*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2216*7836SJohn.Forte@Sun.COM * an error occurred. 2217*7836SJohn.Forte@Sun.COM * 2218*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2219*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2220*7836SJohn.Forte@Sun.COM * 2221*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2222*7836SJohn.Forte@Sun.COM * Returned if oid is NULL or specifies a memory area that is not 2223*7836SJohn.Forte@Sun.COM * a valid path oid. 2224*7836SJohn.Forte@Sun.COM * 2225*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2226*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2227*7836SJohn.Forte@Sun.COM * 2228*7836SJohn.Forte@Sun.COM ******************************************************************************* 2229*7836SJohn.Forte@Sun.COM */ 2230*7836SJohn.Forte@Sun.COM MP_STATUS MP_EnablePath( 2231*7836SJohn.Forte@Sun.COM MP_OID oid) 2232*7836SJohn.Forte@Sun.COM { 2233*7836SJohn.Forte@Sun.COM MP_EnablePathFn PassFunc; 2234*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2235*7836SJohn.Forte@Sun.COM MP_STATUS status; 2236*7836SJohn.Forte@Sun.COM 2237*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_PATH_LU, 2238*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 2239*7836SJohn.Forte@Sun.COM return (status); 2240*7836SJohn.Forte@Sun.COM } 2241*7836SJohn.Forte@Sun.COM 2242*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2243*7836SJohn.Forte@Sun.COM 2244*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2245*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2246*7836SJohn.Forte@Sun.COM PassFunc = (MP_EnablePathFn) 2247*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2248*7836SJohn.Forte@Sun.COM "MP_EnablePath"); 2249*7836SJohn.Forte@Sun.COM 2250*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2251*7836SJohn.Forte@Sun.COM status = PassFunc(oid); 2252*7836SJohn.Forte@Sun.COM } else { 2253*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2254*7836SJohn.Forte@Sun.COM } 2255*7836SJohn.Forte@Sun.COM } else { 2256*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 2257*7836SJohn.Forte@Sun.COM } 2258*7836SJohn.Forte@Sun.COM 2259*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2260*7836SJohn.Forte@Sun.COM return (status); 2261*7836SJohn.Forte@Sun.COM } 2262*7836SJohn.Forte@Sun.COM 2263*7836SJohn.Forte@Sun.COM /** 2264*7836SJohn.Forte@Sun.COM ******************************************************************************* 2265*7836SJohn.Forte@Sun.COM * 2266*7836SJohn.Forte@Sun.COM * Disables a path. This API may cause failover in a logical unit with 2267*7836SJohn.Forte@Sun.COM * asymmetric access. This API may cause a logical unit to become unavailable. 2268*7836SJohn.Forte@Sun.COM * 2269*7836SJohn.Forte@Sun.COM * @param oid 2270*7836SJohn.Forte@Sun.COM * The oid of the path. 2271*7836SJohn.Forte@Sun.COM * 2272*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2273*7836SJohn.Forte@Sun.COM * an error occurred. 2274*7836SJohn.Forte@Sun.COM * 2275*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2276*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2277*7836SJohn.Forte@Sun.COM * 2278*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2279*7836SJohn.Forte@Sun.COM * Returned if oid is NULL or specifies a memory area that is not 2280*7836SJohn.Forte@Sun.COM * a valid path oid. 2281*7836SJohn.Forte@Sun.COM * 2282*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2283*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2284*7836SJohn.Forte@Sun.COM * 2285*7836SJohn.Forte@Sun.COM ******************************************************************************* 2286*7836SJohn.Forte@Sun.COM */ 2287*7836SJohn.Forte@Sun.COM MP_STATUS MP_DisablePath( 2288*7836SJohn.Forte@Sun.COM MP_OID oid) 2289*7836SJohn.Forte@Sun.COM { 2290*7836SJohn.Forte@Sun.COM MP_DisablePathFn PassFunc; 2291*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2292*7836SJohn.Forte@Sun.COM MP_STATUS status; 2293*7836SJohn.Forte@Sun.COM 2294*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_PATH_LU, 2295*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 2296*7836SJohn.Forte@Sun.COM return (status); 2297*7836SJohn.Forte@Sun.COM } 2298*7836SJohn.Forte@Sun.COM 2299*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2300*7836SJohn.Forte@Sun.COM 2301*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2302*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2303*7836SJohn.Forte@Sun.COM PassFunc = (MP_DisablePathFn) 2304*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2305*7836SJohn.Forte@Sun.COM "MP_DisablePath"); 2306*7836SJohn.Forte@Sun.COM 2307*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2308*7836SJohn.Forte@Sun.COM status = PassFunc(oid); 2309*7836SJohn.Forte@Sun.COM } else { 2310*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2311*7836SJohn.Forte@Sun.COM } 2312*7836SJohn.Forte@Sun.COM } else { 2313*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 2314*7836SJohn.Forte@Sun.COM } 2315*7836SJohn.Forte@Sun.COM 2316*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2317*7836SJohn.Forte@Sun.COM return (status); 2318*7836SJohn.Forte@Sun.COM } 2319*7836SJohn.Forte@Sun.COM 2320*7836SJohn.Forte@Sun.COM /** 2321*7836SJohn.Forte@Sun.COM ******************************************************************************* 2322*7836SJohn.Forte@Sun.COM * 2323*7836SJohn.Forte@Sun.COM * Set the multipath logical unit s load balancing policy. 2324*7836SJohn.Forte@Sun.COM * 2325*7836SJohn.Forte@Sun.COM * @param logicalUnitoid 2326*7836SJohn.Forte@Sun.COM * The object ID of the multipath logical unit. 2327*7836SJohn.Forte@Sun.COM * 2328*7836SJohn.Forte@Sun.COM * @param loadBanlance 2329*7836SJohn.Forte@Sun.COM * The desired load balance policy for the specified logical unit. 2330*7836SJohn.Forte@Sun.COM * 2331*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2332*7836SJohn.Forte@Sun.COM * an error occurred. 2333*7836SJohn.Forte@Sun.COM * 2334*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2335*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2336*7836SJohn.Forte@Sun.COM * 2337*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2338*7836SJohn.Forte@Sun.COM * Returned if no MP_MULTIPATH_LOGICAL_UNIT associated with 2339*7836SJohn.Forte@Sun.COM * @ref ligicalUnitrOid is found or invalid MP_LOAD_BALANCE_TYPE is 2340*7836SJohn.Forte@Sun.COM * specified. 2341*7836SJohn.Forte@Sun.COM * 2342*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 2343*7836SJohn.Forte@Sun.COM * Returned when the specified loadBalance type cannot be handled 2344*7836SJohn.Forte@Sun.COM * by the plugin. 2345*7836SJohn.Forte@Sun.COM * 2346*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2347*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2348*7836SJohn.Forte@Sun.COM * 2349*7836SJohn.Forte@Sun.COM ******************************************************************************* 2350*7836SJohn.Forte@Sun.COM */ 2351*7836SJohn.Forte@Sun.COM MP_STATUS MP_SetLogicalUnitLoadBalanceType( 2352*7836SJohn.Forte@Sun.COM MP_OID logicalUnitOid, 2353*7836SJohn.Forte@Sun.COM MP_LOAD_BALANCE_TYPE loadBalance) 2354*7836SJohn.Forte@Sun.COM { 2355*7836SJohn.Forte@Sun.COM MP_SetLogicalUnitLoadBalanceTypeFn PassFunc; 2356*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2357*7836SJohn.Forte@Sun.COM MP_STATUS status; 2358*7836SJohn.Forte@Sun.COM 2359*7836SJohn.Forte@Sun.COM if ((status = validate_object(logicalUnitOid, 2360*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MULTIPATH_LU, 2361*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 2362*7836SJohn.Forte@Sun.COM return (status); 2363*7836SJohn.Forte@Sun.COM } 2364*7836SJohn.Forte@Sun.COM 2365*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2366*7836SJohn.Forte@Sun.COM 2367*7836SJohn.Forte@Sun.COM index = logicalUnitOid.ownerId - 1; 2368*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2369*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetLogicalUnitLoadBalanceTypeFn) 2370*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2371*7836SJohn.Forte@Sun.COM "MP_SetLogicalUnitLoadBalanceType"); 2372*7836SJohn.Forte@Sun.COM 2373*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2374*7836SJohn.Forte@Sun.COM status = PassFunc(logicalUnitOid, loadBalance); 2375*7836SJohn.Forte@Sun.COM } else { 2376*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2377*7836SJohn.Forte@Sun.COM } 2378*7836SJohn.Forte@Sun.COM } else { 2379*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 2380*7836SJohn.Forte@Sun.COM } 2381*7836SJohn.Forte@Sun.COM 2382*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2383*7836SJohn.Forte@Sun.COM return (status); 2384*7836SJohn.Forte@Sun.COM } 2385*7836SJohn.Forte@Sun.COM 2386*7836SJohn.Forte@Sun.COM /** 2387*7836SJohn.Forte@Sun.COM ******************************************************************************* 2388*7836SJohn.Forte@Sun.COM * 2389*7836SJohn.Forte@Sun.COM * Set the weight to be assigned to a particular path. 2390*7836SJohn.Forte@Sun.COM * 2391*7836SJohn.Forte@Sun.COM * @param pathOid 2392*7836SJohn.Forte@Sun.COM * The object ID of the path logical unit. 2393*7836SJohn.Forte@Sun.COM * 2394*7836SJohn.Forte@Sun.COM * @param weight 2395*7836SJohn.Forte@Sun.COM * weight that will be assigned to the path logical unit. 2396*7836SJohn.Forte@Sun.COM * 2397*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2398*7836SJohn.Forte@Sun.COM * an error occurred. 2399*7836SJohn.Forte@Sun.COM * 2400*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2401*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2402*7836SJohn.Forte@Sun.COM * 2403*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 2404*7836SJohn.Forte@Sun.COM * Returned when the MP Path specified by the PathOid could not be 2405*7836SJohn.Forte@Sun.COM * found. 2406*7836SJohn.Forte@Sun.COM * 2407*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 2408*7836SJohn.Forte@Sun.COM * Returned when the implementation does not support the API 2409*7836SJohn.Forte@Sun.COM * 2410*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2411*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2412*7836SJohn.Forte@Sun.COM * 2413*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 2414*7836SJohn.Forte@Sun.COM * Returned when the operation failed. 2415*7836SJohn.Forte@Sun.COM * 2416*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_PATH_NONOPERATIONAL 2417*7836SJohn.Forte@Sun.COM * Returned when the driver cannot communicate through selected path. 2418*7836SJohn.Forte@Sun.COM * 2419*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_WEIGHT 2420*7836SJohn.Forte@Sun.COM * Returned when the weight parameter is greater than the plugin's 2421*7836SJohn.Forte@Sun.COM * maxWeight property. 2422*7836SJohn.Forte@Sun.COM * 2423*7836SJohn.Forte@Sun.COM ******************************************************************************* 2424*7836SJohn.Forte@Sun.COM */ 2425*7836SJohn.Forte@Sun.COM MP_STATUS MP_SetPathWeight( 2426*7836SJohn.Forte@Sun.COM MP_OID pathOid, 2427*7836SJohn.Forte@Sun.COM MP_UINT32 weight) 2428*7836SJohn.Forte@Sun.COM { 2429*7836SJohn.Forte@Sun.COM MP_SetPathWeightFn PassFunc; 2430*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2431*7836SJohn.Forte@Sun.COM MP_STATUS status; 2432*7836SJohn.Forte@Sun.COM 2433*7836SJohn.Forte@Sun.COM if ((status = validate_object(pathOid, MP_OBJECT_TYPE_PATH_LU, 2434*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 2435*7836SJohn.Forte@Sun.COM return (status); 2436*7836SJohn.Forte@Sun.COM } 2437*7836SJohn.Forte@Sun.COM 2438*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2439*7836SJohn.Forte@Sun.COM 2440*7836SJohn.Forte@Sun.COM index = pathOid.ownerId - 1; 2441*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2442*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetPathWeightFn) 2443*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2444*7836SJohn.Forte@Sun.COM "MP_SetPathWeight"); 2445*7836SJohn.Forte@Sun.COM 2446*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2447*7836SJohn.Forte@Sun.COM status = PassFunc(pathOid, weight); 2448*7836SJohn.Forte@Sun.COM } else { 2449*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2450*7836SJohn.Forte@Sun.COM } 2451*7836SJohn.Forte@Sun.COM } else { 2452*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 2453*7836SJohn.Forte@Sun.COM } 2454*7836SJohn.Forte@Sun.COM 2455*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2456*7836SJohn.Forte@Sun.COM return (status); 2457*7836SJohn.Forte@Sun.COM } 2458*7836SJohn.Forte@Sun.COM 2459*7836SJohn.Forte@Sun.COM /** 2460*7836SJohn.Forte@Sun.COM ******************************************************************************* 2461*7836SJohn.Forte@Sun.COM * 2462*7836SJohn.Forte@Sun.COM * Set the default load balance policy for the plugin. 2463*7836SJohn.Forte@Sun.COM * 2464*7836SJohn.Forte@Sun.COM * @param oid 2465*7836SJohn.Forte@Sun.COM * The object ID of the plugin 2466*7836SJohn.Forte@Sun.COM * 2467*7836SJohn.Forte@Sun.COM * @param loadBalance 2468*7836SJohn.Forte@Sun.COM * The desired default load balance policy for the specified plugin. 2469*7836SJohn.Forte@Sun.COM * 2470*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2471*7836SJohn.Forte@Sun.COM * an error occurred. 2472*7836SJohn.Forte@Sun.COM * 2473*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2474*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2475*7836SJohn.Forte@Sun.COM * 2476*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 2477*7836SJohn.Forte@Sun.COM * Returned when the the plugin specified by @ref oid could not be 2478*7836SJohn.Forte@Sun.COM * found. 2479*7836SJohn.Forte@Sun.COM * 2480*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2481*7836SJohn.Forte@Sun.COM * Returned if the oid of the object is not valid. 2482*7836SJohn.Forte@Sun.COM * 2483*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 2484*7836SJohn.Forte@Sun.COM * Returned when the implementation does not support the API 2485*7836SJohn.Forte@Sun.COM * 2486*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2487*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2488*7836SJohn.Forte@Sun.COM * 2489*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 2490*7836SJohn.Forte@Sun.COM * Returned when the specified loadBalance type cannot be handled 2491*7836SJohn.Forte@Sun.COM * by the plugin. 2492*7836SJohn.Forte@Sun.COM * 2493*7836SJohn.Forte@Sun.COM ******************************************************************************* 2494*7836SJohn.Forte@Sun.COM */ 2495*7836SJohn.Forte@Sun.COM MP_STATUS MP_SetPluginLoadBalanceType( 2496*7836SJohn.Forte@Sun.COM MP_OID oid, 2497*7836SJohn.Forte@Sun.COM MP_LOAD_BALANCE_TYPE loadBalance) 2498*7836SJohn.Forte@Sun.COM { 2499*7836SJohn.Forte@Sun.COM MP_SetPluginLoadBalanceTypePluginFn PassFunc; 2500*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2501*7836SJohn.Forte@Sun.COM MP_STATUS status; 2502*7836SJohn.Forte@Sun.COM 2503*7836SJohn.Forte@Sun.COM if ((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 2504*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 2505*7836SJohn.Forte@Sun.COM return (status); 2506*7836SJohn.Forte@Sun.COM } 2507*7836SJohn.Forte@Sun.COM 2508*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2509*7836SJohn.Forte@Sun.COM 2510*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2511*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2512*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetPluginLoadBalanceTypePluginFn) 2513*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2514*7836SJohn.Forte@Sun.COM "MP_SetPluginLoadBalanceTypePlugin"); 2515*7836SJohn.Forte@Sun.COM 2516*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2517*7836SJohn.Forte@Sun.COM status = PassFunc(loadBalance); 2518*7836SJohn.Forte@Sun.COM } else { 2519*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2520*7836SJohn.Forte@Sun.COM } 2521*7836SJohn.Forte@Sun.COM } else { 2522*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 2523*7836SJohn.Forte@Sun.COM } 2524*7836SJohn.Forte@Sun.COM 2525*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2526*7836SJohn.Forte@Sun.COM return (status); 2527*7836SJohn.Forte@Sun.COM } 2528*7836SJohn.Forte@Sun.COM 2529*7836SJohn.Forte@Sun.COM /** 2530*7836SJohn.Forte@Sun.COM ******************************************************************************* 2531*7836SJohn.Forte@Sun.COM * 2532*7836SJohn.Forte@Sun.COM * Set the failback polling rates. Setting both rates to zero disables polling. 2533*7836SJohn.Forte@Sun.COM * 2534*7836SJohn.Forte@Sun.COM * @param pluginOid 2535*7836SJohn.Forte@Sun.COM * The object ID of the plugin or multipath lu. 2536*7836SJohn.Forte@Sun.COM * 2537*7836SJohn.Forte@Sun.COM * @param pollingRate 2538*7836SJohn.Forte@Sun.COM * The value to be set in MP_PLUGIN_PROPERTIES currentPollingRate.or 2539*7836SJohn.Forte@Sun.COM * MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES pollingRate. 2540*7836SJohn.Forte@Sun.COM * 2541*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2542*7836SJohn.Forte@Sun.COM * an error occurred. 2543*7836SJohn.Forte@Sun.COM * 2544*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2545*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2546*7836SJohn.Forte@Sun.COM * 2547*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 2548*7836SJohn.Forte@Sun.COM * Returned when the the plugin specified by @ref oid could not be 2549*7836SJohn.Forte@Sun.COM * found. 2550*7836SJohn.Forte@Sun.COM * 2551*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2552*7836SJohn.Forte@Sun.COM * Returned if one of the polling values is outside the range 2553*7836SJohn.Forte@Sun.COM * supported by the driver. 2554*7836SJohn.Forte@Sun.COM * 2555*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 2556*7836SJohn.Forte@Sun.COM * Returned when the implementation does not support the API 2557*7836SJohn.Forte@Sun.COM * 2558*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2559*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2560*7836SJohn.Forte@Sun.COM * 2561*7836SJohn.Forte@Sun.COM ******************************************************************************* 2562*7836SJohn.Forte@Sun.COM */ 2563*7836SJohn.Forte@Sun.COM MP_STATUS MP_SetFailbackPollingRate( 2564*7836SJohn.Forte@Sun.COM MP_OID oid, 2565*7836SJohn.Forte@Sun.COM MP_UINT32 pollingRate) 2566*7836SJohn.Forte@Sun.COM { 2567*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2568*7836SJohn.Forte@Sun.COM MP_STATUS status; 2569*7836SJohn.Forte@Sun.COM 2570*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 2571*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 2572*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 2573*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 2574*7836SJohn.Forte@Sun.COM return (status); 2575*7836SJohn.Forte@Sun.COM } 2576*7836SJohn.Forte@Sun.COM 2577*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2578*7836SJohn.Forte@Sun.COM 2579*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2580*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2581*7836SJohn.Forte@Sun.COM if (oid.objectType == MP_OBJECT_TYPE_PLUGIN) { 2582*7836SJohn.Forte@Sun.COM MP_SetFailbackPollingRatePluginFn PassFunc; 2583*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetFailbackPollingRatePluginFn) 2584*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2585*7836SJohn.Forte@Sun.COM "MP_SetFailbackPollingRatePlugin"); 2586*7836SJohn.Forte@Sun.COM 2587*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2588*7836SJohn.Forte@Sun.COM status = PassFunc(pollingRate); 2589*7836SJohn.Forte@Sun.COM } else { 2590*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2591*7836SJohn.Forte@Sun.COM } 2592*7836SJohn.Forte@Sun.COM } else if (oid.objectType == MP_OBJECT_TYPE_MULTIPATH_LU) { 2593*7836SJohn.Forte@Sun.COM MP_SetFailbackPollingRateLuFn PassFunc; 2594*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetFailbackPollingRateLuFn) 2595*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2596*7836SJohn.Forte@Sun.COM "MP_SetFailbackPollingRateLu"); 2597*7836SJohn.Forte@Sun.COM 2598*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2599*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pollingRate); 2600*7836SJohn.Forte@Sun.COM } else { 2601*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2602*7836SJohn.Forte@Sun.COM } 2603*7836SJohn.Forte@Sun.COM } else { 2604*7836SJohn.Forte@Sun.COM status = MP_STATUS_INVALID_PARAMETER; 2605*7836SJohn.Forte@Sun.COM } 2606*7836SJohn.Forte@Sun.COM } 2607*7836SJohn.Forte@Sun.COM 2608*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2609*7836SJohn.Forte@Sun.COM return (status); 2610*7836SJohn.Forte@Sun.COM } 2611*7836SJohn.Forte@Sun.COM 2612*7836SJohn.Forte@Sun.COM /** 2613*7836SJohn.Forte@Sun.COM ******************************************************************************* 2614*7836SJohn.Forte@Sun.COM * 2615*7836SJohn.Forte@Sun.COM * Set the probing polling rates. Setting both rates to zero disables polling. 2616*7836SJohn.Forte@Sun.COM * 2617*7836SJohn.Forte@Sun.COM * @param pluginOid 2618*7836SJohn.Forte@Sun.COM * The object ID of either the plugin or a multipath logical unit. 2619*7836SJohn.Forte@Sun.COM * 2620*7836SJohn.Forte@Sun.COM * @param pollingRate 2621*7836SJohn.Forte@Sun.COM * The value to be set in MP_PLUGIN_PROPERTIES current pollingRate or 2622*7836SJohn.Forte@Sun.COM * MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES pollingRate. 2623*7836SJohn.Forte@Sun.COM * 2624*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2625*7836SJohn.Forte@Sun.COM * an error occurred. 2626*7836SJohn.Forte@Sun.COM * 2627*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2628*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2629*7836SJohn.Forte@Sun.COM * 2630*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 2631*7836SJohn.Forte@Sun.COM * Returned when the the plugin specified by @ref oid could not be 2632*7836SJohn.Forte@Sun.COM * found. 2633*7836SJohn.Forte@Sun.COM * 2634*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2635*7836SJohn.Forte@Sun.COM * Returned if one of the polling values is outside the range 2636*7836SJohn.Forte@Sun.COM * supported by the driver. 2637*7836SJohn.Forte@Sun.COM * 2638*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 2639*7836SJohn.Forte@Sun.COM * Returned when the implementation does not support the API 2640*7836SJohn.Forte@Sun.COM * 2641*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2642*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2643*7836SJohn.Forte@Sun.COM * 2644*7836SJohn.Forte@Sun.COM ******************************************************************************* 2645*7836SJohn.Forte@Sun.COM */ 2646*7836SJohn.Forte@Sun.COM MP_STATUS MP_SetProbingPollingRate( 2647*7836SJohn.Forte@Sun.COM MP_OID oid, 2648*7836SJohn.Forte@Sun.COM MP_UINT32 pollingRate) 2649*7836SJohn.Forte@Sun.COM { 2650*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2651*7836SJohn.Forte@Sun.COM MP_STATUS status; 2652*7836SJohn.Forte@Sun.COM 2653*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 2654*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 2655*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 2656*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 2657*7836SJohn.Forte@Sun.COM return (status); 2658*7836SJohn.Forte@Sun.COM } 2659*7836SJohn.Forte@Sun.COM 2660*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2661*7836SJohn.Forte@Sun.COM 2662*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2663*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2664*7836SJohn.Forte@Sun.COM if (oid.objectType == MP_OBJECT_TYPE_PLUGIN) { 2665*7836SJohn.Forte@Sun.COM MP_SetProbingPollingRatePluginFn PassFunc; 2666*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetProbingPollingRatePluginFn) 2667*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2668*7836SJohn.Forte@Sun.COM "MP_SetProbingPollingRatePlugin"); 2669*7836SJohn.Forte@Sun.COM 2670*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2671*7836SJohn.Forte@Sun.COM status = PassFunc(pollingRate); 2672*7836SJohn.Forte@Sun.COM } else { 2673*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2674*7836SJohn.Forte@Sun.COM } 2675*7836SJohn.Forte@Sun.COM } else if (oid.objectType == MP_OBJECT_TYPE_MULTIPATH_LU) { 2676*7836SJohn.Forte@Sun.COM MP_SetProbingPollingRateLuFn PassFunc; 2677*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetProbingPollingRateLuFn) 2678*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2679*7836SJohn.Forte@Sun.COM "MP_SetProbingPollingRateLu"); 2680*7836SJohn.Forte@Sun.COM 2681*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2682*7836SJohn.Forte@Sun.COM status = PassFunc(oid, pollingRate); 2683*7836SJohn.Forte@Sun.COM } else { 2684*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2685*7836SJohn.Forte@Sun.COM } 2686*7836SJohn.Forte@Sun.COM } else { 2687*7836SJohn.Forte@Sun.COM status = MP_STATUS_INVALID_PARAMETER; 2688*7836SJohn.Forte@Sun.COM } 2689*7836SJohn.Forte@Sun.COM } 2690*7836SJohn.Forte@Sun.COM 2691*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2692*7836SJohn.Forte@Sun.COM return (status); 2693*7836SJohn.Forte@Sun.COM } 2694*7836SJohn.Forte@Sun.COM 2695*7836SJohn.Forte@Sun.COM /** 2696*7836SJohn.Forte@Sun.COM ******************************************************************************* 2697*7836SJohn.Forte@Sun.COM * 2698*7836SJohn.Forte@Sun.COM * Set proprietary properties in supported object instances. 2699*7836SJohn.Forte@Sun.COM * 2700*7836SJohn.Forte@Sun.COM * @param pluginOid 2701*7836SJohn.Forte@Sun.COM * The object ID of MP_LOAD_BALANCE_PROPRIETARY_TYPE, MP_PLUGIN_PROPERTIES 2702*7836SJohn.Forte@Sun.COM * or MP_MULTIPATH_LOGICAL_UNIT_PROPERTIES. 2703*7836SJohn.Forte@Sun.COM * 2704*7836SJohn.Forte@Sun.COM * @param count 2705*7836SJohn.Forte@Sun.COM * The number of valid items in pPropertyList. 2706*7836SJohn.Forte@Sun.COM * 2707*7836SJohn.Forte@Sun.COM * @param pPropertyList 2708*7836SJohn.Forte@Sun.COM * A pointer to an array of property name/value pairs. This array must 2709*7836SJohn.Forte@Sun.COM * contain the same number of elements as count. 2710*7836SJohn.Forte@Sun.COM * 2711*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2712*7836SJohn.Forte@Sun.COM * an error occurred. 2713*7836SJohn.Forte@Sun.COM * 2714*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2715*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2716*7836SJohn.Forte@Sun.COM * 2717*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 2718*7836SJohn.Forte@Sun.COM * Returned when the the plugin specified by @ref oid could not be 2719*7836SJohn.Forte@Sun.COM * found. 2720*7836SJohn.Forte@Sun.COM * 2721*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2722*7836SJohn.Forte@Sun.COM * Returned if one of the polling values is outside the range 2723*7836SJohn.Forte@Sun.COM * supported by the driver. 2724*7836SJohn.Forte@Sun.COM * 2725*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 2726*7836SJohn.Forte@Sun.COM * Returned when the implementation does not support the API 2727*7836SJohn.Forte@Sun.COM * 2728*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2729*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2730*7836SJohn.Forte@Sun.COM * 2731*7836SJohn.Forte@Sun.COM ******************************************************************************* 2732*7836SJohn.Forte@Sun.COM */ 2733*7836SJohn.Forte@Sun.COM MP_STATUS MP_SetProprietaryProperties( 2734*7836SJohn.Forte@Sun.COM MP_OID oid, 2735*7836SJohn.Forte@Sun.COM MP_UINT32 count, 2736*7836SJohn.Forte@Sun.COM MP_PROPRIETARY_PROPERTY *pPropertyList) 2737*7836SJohn.Forte@Sun.COM { 2738*7836SJohn.Forte@Sun.COM MP_SetProprietaryPropertiesFn PassFunc; 2739*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2740*7836SJohn.Forte@Sun.COM MP_STATUS status; 2741*7836SJohn.Forte@Sun.COM 2742*7836SJohn.Forte@Sun.COM if (((status = validate_object(oid, MP_OBJECT_TYPE_PLUGIN, 2743*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 2744*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_MULTIPATH_LU, 2745*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) && 2746*7836SJohn.Forte@Sun.COM ((status = validate_object(oid, MP_OBJECT_TYPE_PROPRIETARY_LOAD_BALANCE, 2747*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS)) { 2748*7836SJohn.Forte@Sun.COM return (status); 2749*7836SJohn.Forte@Sun.COM } 2750*7836SJohn.Forte@Sun.COM 2751*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2752*7836SJohn.Forte@Sun.COM 2753*7836SJohn.Forte@Sun.COM index = oid.ownerId - 1; 2754*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2755*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetProprietaryPropertiesFn) 2756*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2757*7836SJohn.Forte@Sun.COM "MP_SetProprietaryProperties"); 2758*7836SJohn.Forte@Sun.COM 2759*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2760*7836SJohn.Forte@Sun.COM status = PassFunc(oid, count, pPropertyList); 2761*7836SJohn.Forte@Sun.COM } else { 2762*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2763*7836SJohn.Forte@Sun.COM } 2764*7836SJohn.Forte@Sun.COM } else { 2765*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 2766*7836SJohn.Forte@Sun.COM } 2767*7836SJohn.Forte@Sun.COM 2768*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2769*7836SJohn.Forte@Sun.COM return (status); 2770*7836SJohn.Forte@Sun.COM } 2771*7836SJohn.Forte@Sun.COM 2772*7836SJohn.Forte@Sun.COM /** 2773*7836SJohn.Forte@Sun.COM ******************************************************************************* 2774*7836SJohn.Forte@Sun.COM * 2775*7836SJohn.Forte@Sun.COM * Set the access state for a list of target port groups. This allows 2776*7836SJohn.Forte@Sun.COM * a client to force a failover or failback to a desired set of target port 2777*7836SJohn.Forte@Sun.COM * groups. 2778*7836SJohn.Forte@Sun.COM * 2779*7836SJohn.Forte@Sun.COM * @param luOid 2780*7836SJohn.Forte@Sun.COM * The object ID of the logical unit where the command is sent. 2781*7836SJohn.Forte@Sun.COM * 2782*7836SJohn.Forte@Sun.COM * @param count 2783*7836SJohn.Forte@Sun.COM * The number of valid items in the pTpgStateList. 2784*7836SJohn.Forte@Sun.COM * 2785*7836SJohn.Forte@Sun.COM * @param pTpgStateList 2786*7836SJohn.Forte@Sun.COM * A pointer to an array of TPG/access-state values. This array must 2787*7836SJohn.Forte@Sun.COM * contain the same number of elements as @ref count. 2788*7836SJohn.Forte@Sun.COM * 2789*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2790*7836SJohn.Forte@Sun.COM * an error occurred. 2791*7836SJohn.Forte@Sun.COM * 2792*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2793*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2794*7836SJohn.Forte@Sun.COM * 2795*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_OBJECT_NOT_FOUND 2796*7836SJohn.Forte@Sun.COM * Returned when the MP_MULTIPATH_LOGICAL_UNIT associated with @ref 2797*7836SJohn.Forte@Sun.COM * oid could not be found. 2798*7836SJohn.Forte@Sun.COM * 2799*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2800*7836SJohn.Forte@Sun.COM * Returned if pTpgStateList is null or if one of the TPGs referenced 2801*7836SJohn.Forte@Sun.COM * in the list is not associated with the specified MP logical unit. 2802*7836SJohn.Forte@Sun.COM * 2803*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNSUPPORTED 2804*7836SJohn.Forte@Sun.COM * Returned when the implementation does not support the API 2805*7836SJohn.Forte@Sun.COM * 2806*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2807*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2808*7836SJohn.Forte@Sun.COM * 2809*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_ACCESS_STATE_INVALID 2810*7836SJohn.Forte@Sun.COM * Returned if the target device returns a status indicating the caller 2811*7836SJohn.Forte@Sun.COM * is attempting to establish an illegal combination of access states. 2812*7836SJohn.Forte@Sun.COM * 2813*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 2814*7836SJohn.Forte@Sun.COM * Returned if the underlying interface failed the commend for some 2815*7836SJohn.Forte@Sun.COM * reason other than MP_STATUS_ACCESS_STATE_INVALID 2816*7836SJohn.Forte@Sun.COM * 2817*7836SJohn.Forte@Sun.COM ******************************************************************************* 2818*7836SJohn.Forte@Sun.COM */ 2819*7836SJohn.Forte@Sun.COM MP_STATUS MP_SetTPGAccess( 2820*7836SJohn.Forte@Sun.COM MP_OID luOid, 2821*7836SJohn.Forte@Sun.COM MP_UINT32 count, 2822*7836SJohn.Forte@Sun.COM MP_TPG_STATE_PAIR *pTpgStateList) 2823*7836SJohn.Forte@Sun.COM { 2824*7836SJohn.Forte@Sun.COM MP_SetTPGAccessFn PassFunc; 2825*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2826*7836SJohn.Forte@Sun.COM MP_STATUS status; 2827*7836SJohn.Forte@Sun.COM 2828*7836SJohn.Forte@Sun.COM if ((status = validate_object(luOid, MP_OBJECT_TYPE_MULTIPATH_LU, 2829*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 2830*7836SJohn.Forte@Sun.COM return (status); 2831*7836SJohn.Forte@Sun.COM } 2832*7836SJohn.Forte@Sun.COM 2833*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2834*7836SJohn.Forte@Sun.COM 2835*7836SJohn.Forte@Sun.COM index = luOid.ownerId - 1; 2836*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2837*7836SJohn.Forte@Sun.COM PassFunc = (MP_SetTPGAccessFn) 2838*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2839*7836SJohn.Forte@Sun.COM "MP_SetTPGAccess"); 2840*7836SJohn.Forte@Sun.COM 2841*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2842*7836SJohn.Forte@Sun.COM status = PassFunc(luOid, count, pTpgStateList); 2843*7836SJohn.Forte@Sun.COM } else { 2844*7836SJohn.Forte@Sun.COM status = MP_STATUS_UNSUPPORTED; 2845*7836SJohn.Forte@Sun.COM } 2846*7836SJohn.Forte@Sun.COM } else { 2847*7836SJohn.Forte@Sun.COM status = MP_STATUS_FAILED; 2848*7836SJohn.Forte@Sun.COM } 2849*7836SJohn.Forte@Sun.COM 2850*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2851*7836SJohn.Forte@Sun.COM return (status); 2852*7836SJohn.Forte@Sun.COM } 2853*7836SJohn.Forte@Sun.COM 2854*7836SJohn.Forte@Sun.COM /** 2855*7836SJohn.Forte@Sun.COM ******************************************************************************* 2856*7836SJohn.Forte@Sun.COM * 2857*7836SJohn.Forte@Sun.COM * Registers a client function that is to be called 2858*7836SJohn.Forte@Sun.COM * whenever the property of an an object changes. 2859*7836SJohn.Forte@Sun.COM * 2860*7836SJohn.Forte@Sun.COM * @param pClientFn, 2861*7836SJohn.Forte@Sun.COM * A pointer to an MP_OBJECT_PROPERTY_FN function defined by the 2862*7836SJohn.Forte@Sun.COM * client. On successful return this function will be called to 2863*7836SJohn.Forte@Sun.COM * inform the client of objects that have had one or more properties 2864*7836SJohn.Forte@Sun.COM * change. 2865*7836SJohn.Forte@Sun.COM * 2866*7836SJohn.Forte@Sun.COM * @param objectType 2867*7836SJohn.Forte@Sun.COM * The type of object the client wishes to deregister for 2868*7836SJohn.Forte@Sun.COM * property change callbacks. If null, then all objects types are 2869*7836SJohn.Forte@Sun.COM * deregistered. 2870*7836SJohn.Forte@Sun.COM * 2871*7836SJohn.Forte@Sun.COM * @param pCallerData 2872*7836SJohn.Forte@Sun.COM * A pointer that is passed to the callback routine with each event. 2873*7836SJohn.Forte@Sun.COM * This may be used by the caller to correlate the event to source of 2874*7836SJohn.Forte@Sun.COM * the registration. 2875*7836SJohn.Forte@Sun.COM * 2876*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2877*7836SJohn.Forte@Sun.COM * an error occurred. 2878*7836SJohn.Forte@Sun.COM * 2879*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2880*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2881*7836SJohn.Forte@Sun.COM * 2882*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2883*7836SJohn.Forte@Sun.COM * Returned if pClientFn is NULL or specifies a memory area 2884*7836SJohn.Forte@Sun.COM * that is not executable. 2885*7836SJohn.Forte@Sun.COM * 2886*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FN_REPLACED 2887*7836SJohn.Forte@Sun.COM * Returned when an existing client function is replaced with the one 2888*7836SJohn.Forte@Sun.COM * specified in pClientFn. 2889*7836SJohn.Forte@Sun.COM * 2890*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2891*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2892*7836SJohn.Forte@Sun.COM * 2893*7836SJohn.Forte@Sun.COM ******************************************************************************* 2894*7836SJohn.Forte@Sun.COM */ 2895*7836SJohn.Forte@Sun.COM MP_STATUS MP_RegisterForObjectPropertyChanges( 2896*7836SJohn.Forte@Sun.COM MP_OBJECT_PROPERTY_FN pClientFn, 2897*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE objectType, 2898*7836SJohn.Forte@Sun.COM void *pCallerData, 2899*7836SJohn.Forte@Sun.COM MP_OID pluginOid) 2900*7836SJohn.Forte@Sun.COM { 2901*7836SJohn.Forte@Sun.COM MP_RegisterForObjectPropertyChangesPluginFn PassFunc; 2902*7836SJohn.Forte@Sun.COM MP_UINT32 i; 2903*7836SJohn.Forte@Sun.COM MP_UINT32 index; 2904*7836SJohn.Forte@Sun.COM MP_STATUS status; 2905*7836SJohn.Forte@Sun.COM 2906*7836SJohn.Forte@Sun.COM if (pClientFn == NULL) { 2907*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 2908*7836SJohn.Forte@Sun.COM } 2909*7836SJohn.Forte@Sun.COM 2910*7836SJohn.Forte@Sun.COM if (objectType > MP_OBJECT_TYPE_MAX) { 2911*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_OBJECT_TYPE); 2912*7836SJohn.Forte@Sun.COM } 2913*7836SJohn.Forte@Sun.COM 2914*7836SJohn.Forte@Sun.COM if (!(is_zero_oid(pluginOid))) { 2915*7836SJohn.Forte@Sun.COM if ((status = validate_object(pluginOid, MP_OBJECT_TYPE_PLUGIN, 2916*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 2917*7836SJohn.Forte@Sun.COM return (status); 2918*7836SJohn.Forte@Sun.COM } 2919*7836SJohn.Forte@Sun.COM } 2920*7836SJohn.Forte@Sun.COM 2921*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 2922*7836SJohn.Forte@Sun.COM 2923*7836SJohn.Forte@Sun.COM if (is_zero_oid(pluginOid)) { 2924*7836SJohn.Forte@Sun.COM for (i = 0; i < number_of_plugins; i++) { 2925*7836SJohn.Forte@Sun.COM if (plugintable[i].hdlPlugin != NULL) { 2926*7836SJohn.Forte@Sun.COM PassFunc = (MP_RegisterForObjectPropertyChangesPluginFn) 2927*7836SJohn.Forte@Sun.COM dlsym(plugintable[i].hdlPlugin, 2928*7836SJohn.Forte@Sun.COM "MP_RegisterForObjectPropertyChangesPlugin"); 2929*7836SJohn.Forte@Sun.COM } 2930*7836SJohn.Forte@Sun.COM 2931*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2932*7836SJohn.Forte@Sun.COM status = 2933*7836SJohn.Forte@Sun.COM PassFunc(pClientFn, objectType, pCallerData); 2934*7836SJohn.Forte@Sun.COM /* ignore an error and continue */ 2935*7836SJohn.Forte@Sun.COM } 2936*7836SJohn.Forte@Sun.COM } 2937*7836SJohn.Forte@Sun.COM } else { 2938*7836SJohn.Forte@Sun.COM index = pluginOid.ownerId - 1; 2939*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 2940*7836SJohn.Forte@Sun.COM PassFunc = (MP_RegisterForObjectPropertyChangesPluginFn) 2941*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 2942*7836SJohn.Forte@Sun.COM "MP_RegisterForObjectPropertyChangesPlugin"); 2943*7836SJohn.Forte@Sun.COM } 2944*7836SJohn.Forte@Sun.COM 2945*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 2946*7836SJohn.Forte@Sun.COM status = PassFunc(pClientFn, objectType, pCallerData); 2947*7836SJohn.Forte@Sun.COM } 2948*7836SJohn.Forte@Sun.COM } 2949*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 2950*7836SJohn.Forte@Sun.COM return (status); 2951*7836SJohn.Forte@Sun.COM } 2952*7836SJohn.Forte@Sun.COM 2953*7836SJohn.Forte@Sun.COM /** 2954*7836SJohn.Forte@Sun.COM ******************************************************************************* 2955*7836SJohn.Forte@Sun.COM * 2956*7836SJohn.Forte@Sun.COM * Deregisters a previously registered client function that is to be invoked 2957*7836SJohn.Forte@Sun.COM * whenever an object's property changes. 2958*7836SJohn.Forte@Sun.COM * 2959*7836SJohn.Forte@Sun.COM * @param pClientFn, 2960*7836SJohn.Forte@Sun.COM * A pointer to an MP_OBJECT_PROPERTY_FN function defined by the 2961*7836SJohn.Forte@Sun.COM * client that was previously registered using 2962*7836SJohn.Forte@Sun.COM * the MP_RegisterForObjectPropertyChanges API. On successful return 2963*7836SJohn.Forte@Sun.COM * this function will no longer be called to inform the client of 2964*7836SJohn.Forte@Sun.COM * object property changes. 2965*7836SJohn.Forte@Sun.COM * 2966*7836SJohn.Forte@Sun.COM * @param objectType 2967*7836SJohn.Forte@Sun.COM * The type of object the client wishes to deregister for 2968*7836SJohn.Forte@Sun.COM * property change callbacks. If null, then all objects types are 2969*7836SJohn.Forte@Sun.COM * deregistered. 2970*7836SJohn.Forte@Sun.COM * 2971*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 2972*7836SJohn.Forte@Sun.COM * an error occurred. 2973*7836SJohn.Forte@Sun.COM * 2974*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 2975*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 2976*7836SJohn.Forte@Sun.COM * 2977*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 2978*7836SJohn.Forte@Sun.COM * Returned if pClientFn is NULL or specifies a memory area 2979*7836SJohn.Forte@Sun.COM * that is not executable. 2980*7836SJohn.Forte@Sun.COM * 2981*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNKNOWN_FN 2982*7836SJohn.Forte@Sun.COM * Returned if pClientFn is not the same as the previously registered 2983*7836SJohn.Forte@Sun.COM * function. 2984*7836SJohn.Forte@Sun.COM * 2985*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 2986*7836SJohn.Forte@Sun.COM * Returned if oid does not specify any valid object type. 2987*7836SJohn.Forte@Sun.COM * 2988*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 2989*7836SJohn.Forte@Sun.COM * Returned if pClientFn deregistration is not possible at this time. 2990*7836SJohn.Forte@Sun.COM * 2991*7836SJohn.Forte@Sun.COM ******************************************************************************* 2992*7836SJohn.Forte@Sun.COM */ 2993*7836SJohn.Forte@Sun.COM MP_STATUS MP_DeregisterForObjectPropertyChanges( 2994*7836SJohn.Forte@Sun.COM MP_OBJECT_PROPERTY_FN pClientFn, 2995*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE objectType, 2996*7836SJohn.Forte@Sun.COM MP_OID pluginOid) 2997*7836SJohn.Forte@Sun.COM { 2998*7836SJohn.Forte@Sun.COM MP_DeregisterForObjectPropertyChangesPluginFn PassFunc; 2999*7836SJohn.Forte@Sun.COM MP_UINT32 i; 3000*7836SJohn.Forte@Sun.COM MP_UINT32 index; 3001*7836SJohn.Forte@Sun.COM MP_STATUS status; 3002*7836SJohn.Forte@Sun.COM 3003*7836SJohn.Forte@Sun.COM if (pClientFn == NULL) { 3004*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3005*7836SJohn.Forte@Sun.COM } 3006*7836SJohn.Forte@Sun.COM 3007*7836SJohn.Forte@Sun.COM if (objectType > MP_OBJECT_TYPE_MAX) { 3008*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_OBJECT_TYPE); 3009*7836SJohn.Forte@Sun.COM } 3010*7836SJohn.Forte@Sun.COM 3011*7836SJohn.Forte@Sun.COM if (!(is_zero_oid(pluginOid))) { 3012*7836SJohn.Forte@Sun.COM if ((status = validate_object(pluginOid, MP_OBJECT_TYPE_PLUGIN, 3013*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 3014*7836SJohn.Forte@Sun.COM return (status); 3015*7836SJohn.Forte@Sun.COM } 3016*7836SJohn.Forte@Sun.COM } 3017*7836SJohn.Forte@Sun.COM 3018*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 3019*7836SJohn.Forte@Sun.COM 3020*7836SJohn.Forte@Sun.COM if (is_zero_oid(pluginOid)) { 3021*7836SJohn.Forte@Sun.COM for (i = 0; i < number_of_plugins; i++) { 3022*7836SJohn.Forte@Sun.COM if (plugintable[i].hdlPlugin != NULL) { 3023*7836SJohn.Forte@Sun.COM PassFunc = (MP_DeregisterForObjectPropertyChangesPluginFn) 3024*7836SJohn.Forte@Sun.COM dlsym(plugintable[i].hdlPlugin, 3025*7836SJohn.Forte@Sun.COM "MP_DeregisterForObjectPropertyChangesPlugin"); 3026*7836SJohn.Forte@Sun.COM } 3027*7836SJohn.Forte@Sun.COM 3028*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 3029*7836SJohn.Forte@Sun.COM status = PassFunc(pClientFn, objectType); 3030*7836SJohn.Forte@Sun.COM } 3031*7836SJohn.Forte@Sun.COM } 3032*7836SJohn.Forte@Sun.COM } else { 3033*7836SJohn.Forte@Sun.COM index = pluginOid.ownerId - 1; 3034*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 3035*7836SJohn.Forte@Sun.COM PassFunc = (MP_DeregisterForObjectPropertyChangesPluginFn) 3036*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 3037*7836SJohn.Forte@Sun.COM "MP_DeregisterForObjectPropertyChangesPlugin"); 3038*7836SJohn.Forte@Sun.COM } 3039*7836SJohn.Forte@Sun.COM 3040*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 3041*7836SJohn.Forte@Sun.COM status = PassFunc(pClientFn, objectType); 3042*7836SJohn.Forte@Sun.COM } 3043*7836SJohn.Forte@Sun.COM } 3044*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 3045*7836SJohn.Forte@Sun.COM return (status); 3046*7836SJohn.Forte@Sun.COM } 3047*7836SJohn.Forte@Sun.COM 3048*7836SJohn.Forte@Sun.COM /** 3049*7836SJohn.Forte@Sun.COM ******************************************************************************* 3050*7836SJohn.Forte@Sun.COM * 3051*7836SJohn.Forte@Sun.COM * Registers a client function that is to be called 3052*7836SJohn.Forte@Sun.COM * whenever a high level object appears or disappears. 3053*7836SJohn.Forte@Sun.COM * 3054*7836SJohn.Forte@Sun.COM * @param pClientFn, 3055*7836SJohn.Forte@Sun.COM * A pointer to an MP_OBJECT_VISIBILITY_FN function defined by the 3056*7836SJohn.Forte@Sun.COM * client. On successful return this function will be called to 3057*7836SJohn.Forte@Sun.COM * inform the client of objects whose visibility has changed. 3058*7836SJohn.Forte@Sun.COM * 3059*7836SJohn.Forte@Sun.COM * @param objectType 3060*7836SJohn.Forte@Sun.COM * The type of object the client wishes to deregister for 3061*7836SJohn.Forte@Sun.COM * property change callbacks. If null, then all objects types are 3062*7836SJohn.Forte@Sun.COM * deregistered. 3063*7836SJohn.Forte@Sun.COM * 3064*7836SJohn.Forte@Sun.COM * @param pCallerData 3065*7836SJohn.Forte@Sun.COM * A pointer that is passed to the callback routine with each event. 3066*7836SJohn.Forte@Sun.COM * This may be used by the caller to correlate the event to source of 3067*7836SJohn.Forte@Sun.COM * the registration. 3068*7836SJohn.Forte@Sun.COM * 3069*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 3070*7836SJohn.Forte@Sun.COM * an error occurred. 3071*7836SJohn.Forte@Sun.COM * 3072*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 3073*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 3074*7836SJohn.Forte@Sun.COM * 3075*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 3076*7836SJohn.Forte@Sun.COM * Returned if pClientFn is NULL or specifies a memory area 3077*7836SJohn.Forte@Sun.COM * that is not executable. 3078*7836SJohn.Forte@Sun.COM * 3079*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FN_REPLACED 3080*7836SJohn.Forte@Sun.COM * Returned when an existing client function is replaced with the one 3081*7836SJohn.Forte@Sun.COM * specified in pClientFn. 3082*7836SJohn.Forte@Sun.COM * 3083*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 3084*7836SJohn.Forte@Sun.COM * Returned if objectType does not specify any valid object type. 3085*7836SJohn.Forte@Sun.COM * 3086*7836SJohn.Forte@Sun.COM ******************************************************************************* 3087*7836SJohn.Forte@Sun.COM */ 3088*7836SJohn.Forte@Sun.COM MP_STATUS MP_RegisterForObjectVisibilityChanges( 3089*7836SJohn.Forte@Sun.COM MP_OBJECT_VISIBILITY_FN pClientFn, 3090*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE objectType, 3091*7836SJohn.Forte@Sun.COM void *pCallerData, 3092*7836SJohn.Forte@Sun.COM MP_OID pluginOid) 3093*7836SJohn.Forte@Sun.COM { 3094*7836SJohn.Forte@Sun.COM MP_RegisterForObjectVisibilityChangesPluginFn PassFunc; 3095*7836SJohn.Forte@Sun.COM MP_UINT32 i; 3096*7836SJohn.Forte@Sun.COM MP_UINT32 index; 3097*7836SJohn.Forte@Sun.COM MP_STATUS status; 3098*7836SJohn.Forte@Sun.COM 3099*7836SJohn.Forte@Sun.COM if (pClientFn == NULL) { 3100*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3101*7836SJohn.Forte@Sun.COM } 3102*7836SJohn.Forte@Sun.COM 3103*7836SJohn.Forte@Sun.COM if (objectType > MP_OBJECT_TYPE_MAX) { 3104*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_OBJECT_TYPE); 3105*7836SJohn.Forte@Sun.COM } 3106*7836SJohn.Forte@Sun.COM 3107*7836SJohn.Forte@Sun.COM if (!(is_zero_oid(pluginOid))) { 3108*7836SJohn.Forte@Sun.COM if ((status = validate_object(pluginOid, MP_OBJECT_TYPE_PLUGIN, 3109*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 3110*7836SJohn.Forte@Sun.COM return (status); 3111*7836SJohn.Forte@Sun.COM } 3112*7836SJohn.Forte@Sun.COM } 3113*7836SJohn.Forte@Sun.COM 3114*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 3115*7836SJohn.Forte@Sun.COM 3116*7836SJohn.Forte@Sun.COM if (is_zero_oid(pluginOid)) { 3117*7836SJohn.Forte@Sun.COM for (i = 0; i < number_of_plugins; i++) { 3118*7836SJohn.Forte@Sun.COM if (plugintable[i].hdlPlugin != NULL) { 3119*7836SJohn.Forte@Sun.COM PassFunc = (MP_RegisterForObjectVisibilityChangesPluginFn) 3120*7836SJohn.Forte@Sun.COM dlsym(plugintable[i].hdlPlugin, 3121*7836SJohn.Forte@Sun.COM "MP_RegisterForObjectVisibilityChangesPlugin"); 3122*7836SJohn.Forte@Sun.COM } 3123*7836SJohn.Forte@Sun.COM 3124*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 3125*7836SJohn.Forte@Sun.COM status = PassFunc(pClientFn, objectType, pCallerData); 3126*7836SJohn.Forte@Sun.COM /* ignore an error and continue. */ 3127*7836SJohn.Forte@Sun.COM } 3128*7836SJohn.Forte@Sun.COM } 3129*7836SJohn.Forte@Sun.COM } else { 3130*7836SJohn.Forte@Sun.COM index = pluginOid.ownerId - 1; 3131*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 3132*7836SJohn.Forte@Sun.COM PassFunc = (MP_RegisterForObjectVisibilityChangesPluginFn) 3133*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 3134*7836SJohn.Forte@Sun.COM "MP_RegisterForObjectVisibilityChangesPlugin"); 3135*7836SJohn.Forte@Sun.COM } 3136*7836SJohn.Forte@Sun.COM 3137*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 3138*7836SJohn.Forte@Sun.COM status = PassFunc(pClientFn, objectType, pCallerData); 3139*7836SJohn.Forte@Sun.COM } 3140*7836SJohn.Forte@Sun.COM } 3141*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 3142*7836SJohn.Forte@Sun.COM return (status); 3143*7836SJohn.Forte@Sun.COM 3144*7836SJohn.Forte@Sun.COM } 3145*7836SJohn.Forte@Sun.COM 3146*7836SJohn.Forte@Sun.COM /** 3147*7836SJohn.Forte@Sun.COM ******************************************************************************* 3148*7836SJohn.Forte@Sun.COM * 3149*7836SJohn.Forte@Sun.COM * Deregisters a previously registered client function that is to be invoked 3150*7836SJohn.Forte@Sun.COM * whenever a high level object appears or disappears. 3151*7836SJohn.Forte@Sun.COM * 3152*7836SJohn.Forte@Sun.COM * @param pClientFn, 3153*7836SJohn.Forte@Sun.COM * A pointer to an MP_OBJECT_VISIBILITY_FN function defined by the 3154*7836SJohn.Forte@Sun.COM * client that was previously registered using 3155*7836SJohn.Forte@Sun.COM * the MP_RegisterForObjectVisibilityChanges API. On successful return 3156*7836SJohn.Forte@Sun.COM * this function will no longer be called to inform the client of 3157*7836SJohn.Forte@Sun.COM * object property changes. 3158*7836SJohn.Forte@Sun.COM * 3159*7836SJohn.Forte@Sun.COM * @param objectType 3160*7836SJohn.Forte@Sun.COM * The type of object the client wishes to deregister for visibility 3161*7836SJohn.Forte@Sun.COM * change callbacks. If null, then all objects types are 3162*7836SJohn.Forte@Sun.COM * deregistered. 3163*7836SJohn.Forte@Sun.COM * 3164*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 3165*7836SJohn.Forte@Sun.COM * an error occurred. 3166*7836SJohn.Forte@Sun.COM * 3167*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 3168*7836SJohn.Forte@Sun.COM * Returned when the operation is successful. 3169*7836SJohn.Forte@Sun.COM * 3170*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 3171*7836SJohn.Forte@Sun.COM * Returned if pClientFn is NULL or specifies a memory area 3172*7836SJohn.Forte@Sun.COM * that is not executable. 3173*7836SJohn.Forte@Sun.COM * 3174*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_UNKNOWN_FN 3175*7836SJohn.Forte@Sun.COM * Returned if pClientFn is not the same as the previously registered 3176*7836SJohn.Forte@Sun.COM * function. 3177*7836SJohn.Forte@Sun.COM * 3178*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_OBJECT_TYPE 3179*7836SJohn.Forte@Sun.COM * Returned if objectType does not specify any valid object type. 3180*7836SJohn.Forte@Sun.COM * 3181*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 3182*7836SJohn.Forte@Sun.COM * Returned if pClientFn deregistration is not possible at this time. 3183*7836SJohn.Forte@Sun.COM * 3184*7836SJohn.Forte@Sun.COM ******************************************************************************* 3185*7836SJohn.Forte@Sun.COM */ 3186*7836SJohn.Forte@Sun.COM MP_STATUS MP_DeregisterForObjectVisibilityChanges( 3187*7836SJohn.Forte@Sun.COM MP_OBJECT_VISIBILITY_FN pClientFn, 3188*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE objectType, 3189*7836SJohn.Forte@Sun.COM MP_OID pluginOid) 3190*7836SJohn.Forte@Sun.COM { 3191*7836SJohn.Forte@Sun.COM MP_DeregisterForObjectVisibilityChangesPluginFn PassFunc; 3192*7836SJohn.Forte@Sun.COM MP_UINT32 i; 3193*7836SJohn.Forte@Sun.COM MP_UINT32 index; 3194*7836SJohn.Forte@Sun.COM MP_STATUS status; 3195*7836SJohn.Forte@Sun.COM 3196*7836SJohn.Forte@Sun.COM if (pClientFn == NULL) { 3197*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3198*7836SJohn.Forte@Sun.COM } 3199*7836SJohn.Forte@Sun.COM 3200*7836SJohn.Forte@Sun.COM if (objectType > MP_OBJECT_TYPE_MAX) { 3201*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_OBJECT_TYPE); 3202*7836SJohn.Forte@Sun.COM } 3203*7836SJohn.Forte@Sun.COM 3204*7836SJohn.Forte@Sun.COM if (!(is_zero_oid(pluginOid))) { 3205*7836SJohn.Forte@Sun.COM if ((status = validate_object(pluginOid, MP_OBJECT_TYPE_PLUGIN, 3206*7836SJohn.Forte@Sun.COM MP_OBJECT_TYPE_MATCH)) != MP_STATUS_SUCCESS) { 3207*7836SJohn.Forte@Sun.COM return (status); 3208*7836SJohn.Forte@Sun.COM } 3209*7836SJohn.Forte@Sun.COM } 3210*7836SJohn.Forte@Sun.COM 3211*7836SJohn.Forte@Sun.COM (void) pthread_mutex_lock(&mp_lib_mutex); 3212*7836SJohn.Forte@Sun.COM 3213*7836SJohn.Forte@Sun.COM if (is_zero_oid(pluginOid)) { 3214*7836SJohn.Forte@Sun.COM for (i = 0; i < number_of_plugins; i++) { 3215*7836SJohn.Forte@Sun.COM if (plugintable[i].hdlPlugin != NULL) { 3216*7836SJohn.Forte@Sun.COM PassFunc = (MP_DeregisterForObjectVisibilityChangesPluginFn) 3217*7836SJohn.Forte@Sun.COM dlsym(plugintable[i].hdlPlugin, 3218*7836SJohn.Forte@Sun.COM "MP_DeregisterForObjectVisibilityChangesPlugin"); 3219*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 3220*7836SJohn.Forte@Sun.COM status = PassFunc(pClientFn, objectType); 3221*7836SJohn.Forte@Sun.COM } 3222*7836SJohn.Forte@Sun.COM } 3223*7836SJohn.Forte@Sun.COM } 3224*7836SJohn.Forte@Sun.COM } else { 3225*7836SJohn.Forte@Sun.COM index = pluginOid.ownerId - 1; 3226*7836SJohn.Forte@Sun.COM if (plugintable[index].hdlPlugin != NULL) { 3227*7836SJohn.Forte@Sun.COM PassFunc = (MP_DeregisterForObjectVisibilityChangesPluginFn) 3228*7836SJohn.Forte@Sun.COM dlsym(plugintable[index].hdlPlugin, 3229*7836SJohn.Forte@Sun.COM "MP_DeregisterForObjectVisibilityChangesPlugin"); 3230*7836SJohn.Forte@Sun.COM if (PassFunc != NULL) { 3231*7836SJohn.Forte@Sun.COM status = PassFunc(pClientFn, objectType); 3232*7836SJohn.Forte@Sun.COM } 3233*7836SJohn.Forte@Sun.COM } 3234*7836SJohn.Forte@Sun.COM } 3235*7836SJohn.Forte@Sun.COM 3236*7836SJohn.Forte@Sun.COM (void) pthread_mutex_unlock(&mp_lib_mutex); 3237*7836SJohn.Forte@Sun.COM return (status); 3238*7836SJohn.Forte@Sun.COM } 3239*7836SJohn.Forte@Sun.COM 3240*7836SJohn.Forte@Sun.COM /** 3241*7836SJohn.Forte@Sun.COM ******************************************************************************* 3242*7836SJohn.Forte@Sun.COM * 3243*7836SJohn.Forte@Sun.COM * Compare two Oids for equality to see whether they refer to the same object. 3244*7836SJohn.Forte@Sun.COM * 3245*7836SJohn.Forte@Sun.COM * @param oid1 3246*7836SJohn.Forte@Sun.COM * Oid to compare. 3247*7836SJohn.Forte@Sun.COM * 3248*7836SJohn.Forte@Sun.COM * @param oid2 3249*7836SJohn.Forte@Sun.COM * Oid to compare. 3250*7836SJohn.Forte@Sun.COM * 3251*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 3252*7836SJohn.Forte@Sun.COM * an error occurred. 3253*7836SJohn.Forte@Sun.COM * 3254*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 3255*7836SJohn.Forte@Sun.COM * Returned when the two Oids do refer to the same object. 3256*7836SJohn.Forte@Sun.COM * 3257*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 3258*7836SJohn.Forte@Sun.COM * Returned if the Oids don't compare. 3259*7836SJohn.Forte@Sun.COM * 3260*7836SJohn.Forte@Sun.COM ******************************************************************************* 3261*7836SJohn.Forte@Sun.COM */ 3262*7836SJohn.Forte@Sun.COM MP_STATUS MP_CompareOIDs( 3263*7836SJohn.Forte@Sun.COM MP_OID oid1, 3264*7836SJohn.Forte@Sun.COM MP_OID oid2) 3265*7836SJohn.Forte@Sun.COM { 3266*7836SJohn.Forte@Sun.COM if ((oid1.objectType == oid2.objectType) && (oid1.ownerId == oid2.ownerId) 3267*7836SJohn.Forte@Sun.COM && (oid1.objectSequenceNumber == oid2.objectSequenceNumber)) { 3268*7836SJohn.Forte@Sun.COM return (MP_STATUS_SUCCESS); 3269*7836SJohn.Forte@Sun.COM } else { 3270*7836SJohn.Forte@Sun.COM return (MP_STATUS_FAILED); 3271*7836SJohn.Forte@Sun.COM } 3272*7836SJohn.Forte@Sun.COM } 3273*7836SJohn.Forte@Sun.COM 3274*7836SJohn.Forte@Sun.COM /** 3275*7836SJohn.Forte@Sun.COM ******************************************************************************* 3276*7836SJohn.Forte@Sun.COM * 3277*7836SJohn.Forte@Sun.COM * Frees memory returned by an MP API. 3278*7836SJohn.Forte@Sun.COM * 3279*7836SJohn.Forte@Sun.COM * @param pOidList 3280*7836SJohn.Forte@Sun.COM * A pointer to the memory returned by an MP API. On successful 3281*7836SJohn.Forte@Sun.COM return, the allocated memory is freed. 3282*7836SJohn.Forte@Sun.COM * 3283*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 3284*7836SJohn.Forte@Sun.COM * an error occurred. 3285*7836SJohn.Forte@Sun.COM * 3286*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 3287*7836SJohn.Forte@Sun.COM * Returned when pPluginId is deregistered successfully. 3288*7836SJohn.Forte@Sun.COM * 3289*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 3290*7836SJohn.Forte@Sun.COM * Returned if pMemory is NULL or specifies a memory area to which 3291*7836SJohn.Forte@Sun.COM * data cannot be written. 3292*7836SJohn.Forte@Sun.COM * 3293*7836SJohn.Forte@Sun.COM ******************************************************************************* 3294*7836SJohn.Forte@Sun.COM */ 3295*7836SJohn.Forte@Sun.COM MP_STATUS MP_FreeOidList(MP_OID_LIST *pOidList) 3296*7836SJohn.Forte@Sun.COM { 3297*7836SJohn.Forte@Sun.COM if (pOidList == NULL) { 3298*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3299*7836SJohn.Forte@Sun.COM } 3300*7836SJohn.Forte@Sun.COM 3301*7836SJohn.Forte@Sun.COM free(pOidList); 3302*7836SJohn.Forte@Sun.COM 3303*7836SJohn.Forte@Sun.COM return (MP_STATUS_SUCCESS); 3304*7836SJohn.Forte@Sun.COM } 3305*7836SJohn.Forte@Sun.COM 3306*7836SJohn.Forte@Sun.COM static MP_CHAR *HDR = 3307*7836SJohn.Forte@Sun.COM "#\n" 3308*7836SJohn.Forte@Sun.COM "# This file contains names and references to MP API plugin libraries\n" 3309*7836SJohn.Forte@Sun.COM "#\n" 3310*7836SJohn.Forte@Sun.COM "# Do NOT manually edit this file\n" 3311*7836SJohn.Forte@Sun.COM "#\n" 3312*7836SJohn.Forte@Sun.COM "# Format:\n" 3313*7836SJohn.Forte@Sun.COM "#\n" 3314*7836SJohn.Forte@Sun.COM "# <library ID> <library pathname>\n" 3315*7836SJohn.Forte@Sun.COM "#\n"; 3316*7836SJohn.Forte@Sun.COM 3317*7836SJohn.Forte@Sun.COM #define CLEANUP_N_RET(fd, ret) \ 3318*7836SJohn.Forte@Sun.COM if (lock_register(fd, F_SETLK, F_UNLCK, 0, SEEK_SET, 0) < 0) { \ 3319*7836SJohn.Forte@Sun.COM close(fd); \ 3320*7836SJohn.Forte@Sun.COM return (MP_STATUS_FAILED); \ 3321*7836SJohn.Forte@Sun.COM } \ 3322*7836SJohn.Forte@Sun.COM close(fd); \ 3323*7836SJohn.Forte@Sun.COM return (ret) 3324*7836SJohn.Forte@Sun.COM 3325*7836SJohn.Forte@Sun.COM /* 3326*7836SJohn.Forte@Sun.COM * This function sets an advisory lock on the file pointed to by the argument 3327*7836SJohn.Forte@Sun.COM * fd, which is a file descriptor. The lock is set using fcntl() which uses 3328*7836SJohn.Forte@Sun.COM * flock structure. 3329*7836SJohn.Forte@Sun.COM */ 3330*7836SJohn.Forte@Sun.COM static int 3331*7836SJohn.Forte@Sun.COM lock_register(int fd, int cmd, int type, off_t offset, int whence, off_t len) 3332*7836SJohn.Forte@Sun.COM { 3333*7836SJohn.Forte@Sun.COM struct flock lock; 3334*7836SJohn.Forte@Sun.COM 3335*7836SJohn.Forte@Sun.COM lock.l_type = type; 3336*7836SJohn.Forte@Sun.COM lock.l_start = offset; 3337*7836SJohn.Forte@Sun.COM lock.l_whence = whence; 3338*7836SJohn.Forte@Sun.COM lock.l_len = len; 3339*7836SJohn.Forte@Sun.COM 3340*7836SJohn.Forte@Sun.COM return (fcntl(fd, cmd, &lock)); 3341*7836SJohn.Forte@Sun.COM } 3342*7836SJohn.Forte@Sun.COM 3343*7836SJohn.Forte@Sun.COM /* 3344*7836SJohn.Forte@Sun.COM * This function searches for "srch_str" (of length "slen") in "buf" (of length 3345*7836SJohn.Forte@Sun.COM * "buflen"). If it is not found, "write_offset" has the offset in "buf" where 3346*7836SJohn.Forte@Sun.COM * "srch_str" would have to be added in "buf". If "srch_str" is found in "buf", 3347*7836SJohn.Forte@Sun.COM * "write_offset" has its offset in "buf" 3348*7836SJohn.Forte@Sun.COM * 3349*7836SJohn.Forte@Sun.COM * ARGUMENTS : 3350*7836SJohn.Forte@Sun.COM * buf - buffer to search in 3351*7836SJohn.Forte@Sun.COM * buflen - length of buffer 3352*7836SJohn.Forte@Sun.COM * srch_id - id to search 3353*7836SJohn.Forte@Sun.COM * id_len - length of srch_id 3354*7836SJohn.Forte@Sun.COM * write_offset - Set in function on exit 3355*7836SJohn.Forte@Sun.COM * - It is the offset in buf where srch_str is or should be 3356*7836SJohn.Forte@Sun.COM * bytes_left - Set in function on exit 3357*7836SJohn.Forte@Sun.COM * - It is the # of bytes left beyond write_offset in buf 3358*7836SJohn.Forte@Sun.COM * RETURN VALUES : 3359*7836SJohn.Forte@Sun.COM * Zero - "srch_id" found in "buf"... "write_offset" has offset in "buf" 3360*7836SJohn.Forte@Sun.COM * != 0 - "srch_str" NOT found in "buf" ... "write_offset" points to the end of 3361*7836SJohn.Forte@Sun.COM * "buf". 3362*7836SJohn.Forte@Sun.COM */ 3363*7836SJohn.Forte@Sun.COM static int 3364*7836SJohn.Forte@Sun.COM search_line(MP_CHAR *buf, size_t buflen, MP_CHAR *srch_id, size_t id_len, 3365*7836SJohn.Forte@Sun.COM int *write_offset, int *bytes_left) 3366*7836SJohn.Forte@Sun.COM { 3367*7836SJohn.Forte@Sun.COM int retval, sizeof_conf_hdr = strlen(HDR); 3368*7836SJohn.Forte@Sun.COM MP_CHAR *sol; /* Pointer to Start-Of-Line */ 3369*7836SJohn.Forte@Sun.COM MP_CHAR *cur_pos; /* current position */ 3370*7836SJohn.Forte@Sun.COM 3371*7836SJohn.Forte@Sun.COM *bytes_left = buflen; 3372*7836SJohn.Forte@Sun.COM *write_offset = 0; 3373*7836SJohn.Forte@Sun.COM 3374*7836SJohn.Forte@Sun.COM if (buf == NULL || buflen <= 0) 3375*7836SJohn.Forte@Sun.COM return (-1); 3376*7836SJohn.Forte@Sun.COM 3377*7836SJohn.Forte@Sun.COM if (srch_id == NULL || id_len <= 0) 3378*7836SJohn.Forte@Sun.COM return (0); 3379*7836SJohn.Forte@Sun.COM 3380*7836SJohn.Forte@Sun.COM sol = cur_pos = buf; 3381*7836SJohn.Forte@Sun.COM 3382*7836SJohn.Forte@Sun.COM /* 3383*7836SJohn.Forte@Sun.COM * mp conf file should not be edited but takes care of 3384*7836SJohn.Forte@Sun.COM * any extra white space when parsing the line. 3385*7836SJohn.Forte@Sun.COM * 3386*7836SJohn.Forte@Sun.COM * The line should have id + delimiter + name + newline. 3387*7836SJohn.Forte@Sun.COM */ 3388*7836SJohn.Forte@Sun.COM while (*bytes_left >= (id_len + 3)) { 3389*7836SJohn.Forte@Sun.COM /* skip leading blank or space. */ 3390*7836SJohn.Forte@Sun.COM while ((*cur_pos == ' ') || (*cur_pos == '\t')) { 3391*7836SJohn.Forte@Sun.COM cur_pos++; 3392*7836SJohn.Forte@Sun.COM } 3393*7836SJohn.Forte@Sun.COM 3394*7836SJohn.Forte@Sun.COM if (strncmp(cur_pos, srch_id, id_len) == 0) { 3395*7836SJohn.Forte@Sun.COM /* id matched. */ 3396*7836SJohn.Forte@Sun.COM cur_pos += id_len; 3397*7836SJohn.Forte@Sun.COM 3398*7836SJohn.Forte@Sun.COM while (*cur_pos != '\n') { 3399*7836SJohn.Forte@Sun.COM cur_pos++; 3400*7836SJohn.Forte@Sun.COM } 3401*7836SJohn.Forte@Sun.COM *write_offset = (sol - buf); 3402*7836SJohn.Forte@Sun.COM *bytes_left = buflen - ((cur_pos + 1) - buf); 3403*7836SJohn.Forte@Sun.COM return (0); 3404*7836SJohn.Forte@Sun.COM } else { 3405*7836SJohn.Forte@Sun.COM /* move to the next line */ 3406*7836SJohn.Forte@Sun.COM while (*cur_pos != '\n') { 3407*7836SJohn.Forte@Sun.COM cur_pos++; 3408*7836SJohn.Forte@Sun.COM } 3409*7836SJohn.Forte@Sun.COM *bytes_left = buflen - ((cur_pos + 1) - buf); 3410*7836SJohn.Forte@Sun.COM } 3411*7836SJohn.Forte@Sun.COM sol = cur_pos = cur_pos + 1; 3412*7836SJohn.Forte@Sun.COM } 3413*7836SJohn.Forte@Sun.COM 3414*7836SJohn.Forte@Sun.COM /* Given strings are not found. */ 3415*7836SJohn.Forte@Sun.COM *write_offset = buflen; 3416*7836SJohn.Forte@Sun.COM return (-1); 3417*7836SJohn.Forte@Sun.COM } 3418*7836SJohn.Forte@Sun.COM 3419*7836SJohn.Forte@Sun.COM /** 3420*7836SJohn.Forte@Sun.COM ******************************************************************************* 3421*7836SJohn.Forte@Sun.COM * 3422*7836SJohn.Forte@Sun.COM * Registers a plugin with common library. The implementation of this routine 3423*7836SJohn.Forte@Sun.COM * is based on configuration file /etc/mpapi.conf that contains a list of 3424*7836SJohn.Forte@Sun.COM * plugin libraries. 3425*7836SJohn.Forte@Sun.COM * 3426*7836SJohn.Forte@Sun.COM * @param pPluginId 3427*7836SJohn.Forte@Sun.COM * A pointer to the key name shall be the reversed domain name of 3428*7836SJohn.Forte@Sun.COM * the vendor followed by followed by the vendor specific name for 3429*7836SJohn.Forte@Sun.COM * the plugin that uniquely identifies the plugin. Should be NULL 3430*7836SJohn.Forte@Sun.COM * terminated. 3431*7836SJohn.Forte@Sun.COM * 3432*7836SJohn.Forte@Sun.COM * @param pFileName 3433*7836SJohn.Forte@Sun.COM * The full path to the plugin library. 3434*7836SJohn.Forte@Sun.COM * Should be NULL terminated. 3435*7836SJohn.Forte@Sun.COM * 3436*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 3437*7836SJohn.Forte@Sun.COM * an error occurred. 3438*7836SJohn.Forte@Sun.COM * 3439*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 3440*7836SJohn.Forte@Sun.COM * Returned when pPluginId is deregistered successfully. 3441*7836SJohn.Forte@Sun.COM * 3442*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 3443*7836SJohn.Forte@Sun.COM * Returned if pPluginId is NULL or specifies a memory area that 3444*7836SJohn.Forte@Sun.COM * is not executable. 3445*7836SJohn.Forte@Sun.COM * 3446*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 3447*7836SJohn.Forte@Sun.COM * Returned if pClientFn deregistration is not possible at this time. 3448*7836SJohn.Forte@Sun.COM * 3449*7836SJohn.Forte@Sun.COM ******************************************************************************* 3450*7836SJohn.Forte@Sun.COM */ 3451*7836SJohn.Forte@Sun.COM MP_STATUS MP_RegisterPlugin( 3452*7836SJohn.Forte@Sun.COM MP_WCHAR *pPluginId, 3453*7836SJohn.Forte@Sun.COM char *pFileName) 3454*7836SJohn.Forte@Sun.COM { 3455*7836SJohn.Forte@Sun.COM int mpconf, bytes_left, write_offset; 3456*7836SJohn.Forte@Sun.COM MP_CHAR fullline[MAX_LINE_SIZE]; /* Full line to add to mpapi.conf */ 3457*7836SJohn.Forte@Sun.COM MP_CHAR *mpconf_buf; 3458*7836SJohn.Forte@Sun.COM MP_CHAR pluginid[MAX_NAME_SIZE]; 3459*7836SJohn.Forte@Sun.COM char systemPath[MAX_NAME_SIZE], mpConfFilePath[MAX_NAME_SIZE]; 3460*7836SJohn.Forte@Sun.COM MP_UINT32 new_file_flag = 0; 3461*7836SJohn.Forte@Sun.COM MP_UINT32 sizeof_conf_hdr = strlen(HDR); 3462*7836SJohn.Forte@Sun.COM struct stat stbuf; 3463*7836SJohn.Forte@Sun.COM 3464*7836SJohn.Forte@Sun.COM if ((pPluginId == NULL) || (pFileName == NULL)) { 3465*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3466*7836SJohn.Forte@Sun.COM } 3467*7836SJohn.Forte@Sun.COM 3468*7836SJohn.Forte@Sun.COM if (stat(pFileName, &stbuf) != 0) { 3469*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3470*7836SJohn.Forte@Sun.COM } 3471*7836SJohn.Forte@Sun.COM 3472*7836SJohn.Forte@Sun.COM if (wcstombs(pluginid, pPluginId, MAX_NAME_SIZE) != wcslen(pPluginId)) { 3473*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3474*7836SJohn.Forte@Sun.COM } 3475*7836SJohn.Forte@Sun.COM 3476*7836SJohn.Forte@Sun.COM *fullline = '\0'; 3477*7836SJohn.Forte@Sun.COM strncpy(fullline, pluginid, MAX_NAME_SIZE); 3478*7836SJohn.Forte@Sun.COM /* add tab */ 3479*7836SJohn.Forte@Sun.COM strncat(fullline, "\t", MAX_LINE_SIZE - strlen(pluginid)); 3480*7836SJohn.Forte@Sun.COM strncat(fullline, pFileName, MAX_LINE_SIZE - strlen(pluginid) - 1); 3481*7836SJohn.Forte@Sun.COM /* add a new line. */ 3482*7836SJohn.Forte@Sun.COM strncat(fullline, "\n", 3483*7836SJohn.Forte@Sun.COM MAX_LINE_SIZE - strlen(pluginid) - strlen(pFileName) -1); 3484*7836SJohn.Forte@Sun.COM 3485*7836SJohn.Forte@Sun.COM /* Open configuration file from known location */ 3486*7836SJohn.Forte@Sun.COM strncpy(mpConfFilePath, "/etc/mpapi.conf", MAX_NAME_SIZE); 3487*7836SJohn.Forte@Sun.COM 3488*7836SJohn.Forte@Sun.COM if ((chmod(mpConfFilePath, S_IRUSR|S_IRGRP|S_IROTH) == -1) && 3489*7836SJohn.Forte@Sun.COM (errno == ENOENT)) { 3490*7836SJohn.Forte@Sun.COM new_file_flag = 1; 3491*7836SJohn.Forte@Sun.COM } 3492*7836SJohn.Forte@Sun.COM 3493*7836SJohn.Forte@Sun.COM if ((mpconf = open(mpConfFilePath, O_RDWR | O_CREAT)) == -1) { 3494*7836SJohn.Forte@Sun.COM return (MP_STATUS_FAILED); 3495*7836SJohn.Forte@Sun.COM } 3496*7836SJohn.Forte@Sun.COM 3497*7836SJohn.Forte@Sun.COM if (fchmod(mpconf, S_IRUSR | S_IRGRP | S_IROTH) < 0) { 3498*7836SJohn.Forte@Sun.COM close(mpconf); 3499*7836SJohn.Forte@Sun.COM return (MP_STATUS_FAILED); 3500*7836SJohn.Forte@Sun.COM } 3501*7836SJohn.Forte@Sun.COM 3502*7836SJohn.Forte@Sun.COM if (lock_register(mpconf, F_SETLKW, F_WRLCK, 0, SEEK_SET, 0) < 0) { 3503*7836SJohn.Forte@Sun.COM close(mpconf); 3504*7836SJohn.Forte@Sun.COM return (MP_STATUS_FAILED); 3505*7836SJohn.Forte@Sun.COM } 3506*7836SJohn.Forte@Sun.COM 3507*7836SJohn.Forte@Sun.COM if (fstat(mpconf, &stbuf) == -1) { 3508*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3509*7836SJohn.Forte@Sun.COM } 3510*7836SJohn.Forte@Sun.COM 3511*7836SJohn.Forte@Sun.COM if ((new_file_flag) || (stbuf.st_size == 0)) { 3512*7836SJohn.Forte@Sun.COM if (write(mpconf, HDR, sizeof_conf_hdr) != 3513*7836SJohn.Forte@Sun.COM sizeof_conf_hdr) { 3514*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3515*7836SJohn.Forte@Sun.COM } 3516*7836SJohn.Forte@Sun.COM 3517*7836SJohn.Forte@Sun.COM if (pwrite(mpconf, fullline, strlen(fullline), 3518*7836SJohn.Forte@Sun.COM sizeof_conf_hdr) != 3519*7836SJohn.Forte@Sun.COM strlen(fullline)) { 3520*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3521*7836SJohn.Forte@Sun.COM } 3522*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_SUCCESS); 3523*7836SJohn.Forte@Sun.COM } 3524*7836SJohn.Forte@Sun.COM 3525*7836SJohn.Forte@Sun.COM if ((mpconf_buf = (MP_CHAR *)mmap(0, stbuf.st_size, 3526*7836SJohn.Forte@Sun.COM PROT_READ | PROT_WRITE, 3527*7836SJohn.Forte@Sun.COM MAP_SHARED, mpconf, 0)) == MAP_FAILED) { 3528*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3529*7836SJohn.Forte@Sun.COM } 3530*7836SJohn.Forte@Sun.COM 3531*7836SJohn.Forte@Sun.COM if (search_line(mpconf_buf, stbuf.st_size, 3532*7836SJohn.Forte@Sun.COM pluginid, strlen(pluginid), &write_offset, &bytes_left) == 0) { 3533*7836SJohn.Forte@Sun.COM /* found a match. */ 3534*7836SJohn.Forte@Sun.COM munmap((void *)mpconf_buf, stbuf.st_size); 3535*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_SUCCESS); 3536*7836SJohn.Forte@Sun.COM } else { 3537*7836SJohn.Forte@Sun.COM munmap((void *)mpconf_buf, stbuf.st_size); 3538*7836SJohn.Forte@Sun.COM /* append the fullline to the mpconf. */ 3539*7836SJohn.Forte@Sun.COM if (pwrite(mpconf, fullline, strlen(fullline), 3540*7836SJohn.Forte@Sun.COM write_offset) != 3541*7836SJohn.Forte@Sun.COM strlen(fullline)) { 3542*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3543*7836SJohn.Forte@Sun.COM } else { 3544*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_SUCCESS); 3545*7836SJohn.Forte@Sun.COM } 3546*7836SJohn.Forte@Sun.COM } 3547*7836SJohn.Forte@Sun.COM } 3548*7836SJohn.Forte@Sun.COM 3549*7836SJohn.Forte@Sun.COM /** 3550*7836SJohn.Forte@Sun.COM ******************************************************************************* 3551*7836SJohn.Forte@Sun.COM * 3552*7836SJohn.Forte@Sun.COM * Deregisters a plugin from the common library. This routine is based on 3553*7836SJohn.Forte@Sun.COM * configuration file /etc/mpapi.conf that contains a list of plugin libraries. 3554*7836SJohn.Forte@Sun.COM * 3555*7836SJohn.Forte@Sun.COM * @param pPluginId 3556*7836SJohn.Forte@Sun.COM * A pointer to a Plugin ID previously registered using 3557*7836SJohn.Forte@Sun.COM * the MP_RegisterPlugin API.. 3558*7836SJohn.Forte@Sun.COM * 3559*7836SJohn.Forte@Sun.COM * @return An MP_STATUS indicating if the operation was successful or if 3560*7836SJohn.Forte@Sun.COM * an error occurred. 3561*7836SJohn.Forte@Sun.COM * 3562*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_SUCCESS 3563*7836SJohn.Forte@Sun.COM * Returned when pPluginId is deregistered successfully. 3564*7836SJohn.Forte@Sun.COM * 3565*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_INVALID_PARAMETER 3566*7836SJohn.Forte@Sun.COM * Returned if pPluginId is NULL or specifies a memory area that 3567*7836SJohn.Forte@Sun.COM * is not executable. 3568*7836SJohn.Forte@Sun.COM * 3569*7836SJohn.Forte@Sun.COM * @retval MP_STATUS_FAILED 3570*7836SJohn.Forte@Sun.COM * Returned if pClientFn deregistration is not possible at this time. 3571*7836SJohn.Forte@Sun.COM * 3572*7836SJohn.Forte@Sun.COM ******************************************************************************* 3573*7836SJohn.Forte@Sun.COM */ 3574*7836SJohn.Forte@Sun.COM MP_STATUS MP_DeregisterPlugin( 3575*7836SJohn.Forte@Sun.COM MP_WCHAR *pPluginId) 3576*7836SJohn.Forte@Sun.COM { 3577*7836SJohn.Forte@Sun.COM int mpconf, tmp_mpconf, bytes_left, write_offset; 3578*7836SJohn.Forte@Sun.COM char systemPath[MAX_NAME_SIZE], mpConfFilePath[MAX_NAME_SIZE], 3579*7836SJohn.Forte@Sun.COM tmp_mpConfFilePath[MAX_NAME_SIZE + sizeof(pid_t)]; 3580*7836SJohn.Forte@Sun.COM MP_CHAR pluginid[MAX_NAME_SIZE]; 3581*7836SJohn.Forte@Sun.COM MP_CHAR *mpconf_buf; 3582*7836SJohn.Forte@Sun.COM MP_UINT32 sizeof_conf_hdr = strlen(HDR); 3583*7836SJohn.Forte@Sun.COM struct stat stbuf; 3584*7836SJohn.Forte@Sun.COM 3585*7836SJohn.Forte@Sun.COM if (pPluginId == NULL) { 3586*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3587*7836SJohn.Forte@Sun.COM } 3588*7836SJohn.Forte@Sun.COM 3589*7836SJohn.Forte@Sun.COM if (wcstombs(pluginid, pPluginId, MAX_NAME_SIZE) != wcslen(pPluginId)) { 3590*7836SJohn.Forte@Sun.COM return (MP_STATUS_INVALID_PARAMETER); 3591*7836SJohn.Forte@Sun.COM } 3592*7836SJohn.Forte@Sun.COM 3593*7836SJohn.Forte@Sun.COM /* Open configuration file from known location */ 3594*7836SJohn.Forte@Sun.COM strncpy(mpConfFilePath, "/etc/mpapi.conf", MAX_NAME_SIZE); 3595*7836SJohn.Forte@Sun.COM 3596*7836SJohn.Forte@Sun.COM if ((chmod(mpConfFilePath, S_IRUSR|S_IRGRP|S_IROTH) == -1) && 3597*7836SJohn.Forte@Sun.COM (errno == ENOENT)) { 3598*7836SJohn.Forte@Sun.COM /* no file found */ 3599*7836SJohn.Forte@Sun.COM return (MP_STATUS_UNKNOWN_FN); 3600*7836SJohn.Forte@Sun.COM } 3601*7836SJohn.Forte@Sun.COM 3602*7836SJohn.Forte@Sun.COM if ((mpconf = open(mpConfFilePath, O_RDWR)) == -1) { 3603*7836SJohn.Forte@Sun.COM return (MP_STATUS_FAILED); 3604*7836SJohn.Forte@Sun.COM } 3605*7836SJohn.Forte@Sun.COM 3606*7836SJohn.Forte@Sun.COM if (fchmod(mpconf, S_IRUSR | S_IRGRP | S_IROTH) < 0) { 3607*7836SJohn.Forte@Sun.COM close(mpconf); 3608*7836SJohn.Forte@Sun.COM return (MP_STATUS_FAILED); 3609*7836SJohn.Forte@Sun.COM } 3610*7836SJohn.Forte@Sun.COM 3611*7836SJohn.Forte@Sun.COM if (lock_register(mpconf, F_SETLKW, F_WRLCK, 0, SEEK_SET, 0) < 0) { 3612*7836SJohn.Forte@Sun.COM close(mpconf); 3613*7836SJohn.Forte@Sun.COM return (MP_STATUS_FAILED); 3614*7836SJohn.Forte@Sun.COM } 3615*7836SJohn.Forte@Sun.COM 3616*7836SJohn.Forte@Sun.COM if (fstat(mpconf, &stbuf) == -1) { 3617*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3618*7836SJohn.Forte@Sun.COM } 3619*7836SJohn.Forte@Sun.COM 3620*7836SJohn.Forte@Sun.COM if (stbuf.st_size == 0) { 3621*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_SUCCESS); 3622*7836SJohn.Forte@Sun.COM } 3623*7836SJohn.Forte@Sun.COM 3624*7836SJohn.Forte@Sun.COM if ((mpconf_buf = (MP_CHAR *)mmap(0, stbuf.st_size, 3625*7836SJohn.Forte@Sun.COM PROT_READ | PROT_WRITE, 3626*7836SJohn.Forte@Sun.COM MAP_SHARED, mpconf, 0)) == MAP_FAILED) { 3627*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3628*7836SJohn.Forte@Sun.COM } 3629*7836SJohn.Forte@Sun.COM 3630*7836SJohn.Forte@Sun.COM if (search_line(mpconf_buf, stbuf.st_size, pluginid, strlen(pluginid), 3631*7836SJohn.Forte@Sun.COM &write_offset, &bytes_left) != 0) { 3632*7836SJohn.Forte@Sun.COM munmap((void *)mpconf_buf, stbuf.st_size); 3633*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_UNKNOWN_FN); 3634*7836SJohn.Forte@Sun.COM } else { 3635*7836SJohn.Forte@Sun.COM /* 3636*7836SJohn.Forte@Sun.COM * found a match. 3637*7836SJohn.Forte@Sun.COM * construct temp file name using pid. 3638*7836SJohn.Forte@Sun.COM */ 3639*7836SJohn.Forte@Sun.COM (void) snprintf(tmp_mpConfFilePath, MAX_NAME_SIZE, 3640*7836SJohn.Forte@Sun.COM "%s%ld", "/etc/mpapi.conf", getpid()); 3641*7836SJohn.Forte@Sun.COM 3642*7836SJohn.Forte@Sun.COM if ((tmp_mpconf = open(tmp_mpConfFilePath, 3643*7836SJohn.Forte@Sun.COM O_RDWR|O_CREAT|O_TRUNC, S_IRUSR | S_IWUSR)) < 0) { 3644*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3645*7836SJohn.Forte@Sun.COM } 3646*7836SJohn.Forte@Sun.COM 3647*7836SJohn.Forte@Sun.COM if (write(tmp_mpconf, mpconf_buf, write_offset) != write_offset) { 3648*7836SJohn.Forte@Sun.COM close(tmp_mpconf); 3649*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3650*7836SJohn.Forte@Sun.COM } 3651*7836SJohn.Forte@Sun.COM 3652*7836SJohn.Forte@Sun.COM if (pwrite(tmp_mpconf, mpconf_buf + (stbuf.st_size - bytes_left), 3653*7836SJohn.Forte@Sun.COM bytes_left, write_offset) != bytes_left) { 3654*7836SJohn.Forte@Sun.COM close(tmp_mpconf); 3655*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3656*7836SJohn.Forte@Sun.COM } 3657*7836SJohn.Forte@Sun.COM 3658*7836SJohn.Forte@Sun.COM close(tmp_mpconf); 3659*7836SJohn.Forte@Sun.COM munmap((void *)mpconf_buf, stbuf.st_size); 3660*7836SJohn.Forte@Sun.COM 3661*7836SJohn.Forte@Sun.COM /* rename temp file to mpConfFile before unlock and close. */ 3662*7836SJohn.Forte@Sun.COM if (rename(tmp_mpConfFilePath, mpConfFilePath) != 0) { 3663*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_FAILED); 3664*7836SJohn.Forte@Sun.COM } else { 3665*7836SJohn.Forte@Sun.COM CLEANUP_N_RET(mpconf, MP_STATUS_SUCCESS); 3666*7836SJohn.Forte@Sun.COM } 3667*7836SJohn.Forte@Sun.COM } 3668*7836SJohn.Forte@Sun.COM } 3669