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