1aff4bce5Syi zhang - Sun Microsystems - Beijing China /*
2aff4bce5Syi zhang - Sun Microsystems - Beijing China  * CDDL HEADER START
3aff4bce5Syi zhang - Sun Microsystems - Beijing China  *
4aff4bce5Syi zhang - Sun Microsystems - Beijing China  * The contents of this file are subject to the terms of the
5aff4bce5Syi zhang - Sun Microsystems - Beijing China  * Common Development and Distribution License (the "License").
6aff4bce5Syi zhang - Sun Microsystems - Beijing China  * You may not use this file except in compliance with the License.
7aff4bce5Syi zhang - Sun Microsystems - Beijing China  *
8aff4bce5Syi zhang - Sun Microsystems - Beijing China  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9aff4bce5Syi zhang - Sun Microsystems - Beijing China  * or http://www.opensolaris.org/os/licensing.
10aff4bce5Syi zhang - Sun Microsystems - Beijing China  * See the License for the specific language governing permissions
11aff4bce5Syi zhang - Sun Microsystems - Beijing China  * and limitations under the License.
12aff4bce5Syi zhang - Sun Microsystems - Beijing China  *
13aff4bce5Syi zhang - Sun Microsystems - Beijing China  * When distributing Covered Code, include this CDDL HEADER in each
14aff4bce5Syi zhang - Sun Microsystems - Beijing China  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15aff4bce5Syi zhang - Sun Microsystems - Beijing China  * If applicable, add the following below this CDDL HEADER, with the
16aff4bce5Syi zhang - Sun Microsystems - Beijing China  * fields enclosed by brackets "[]" replaced with your own identifying
17aff4bce5Syi zhang - Sun Microsystems - Beijing China  * information: Portions Copyright [yyyy] [name of copyright owner]
18aff4bce5Syi zhang - Sun Microsystems - Beijing China  *
19aff4bce5Syi zhang - Sun Microsystems - Beijing China  * CDDL HEADER END
20aff4bce5Syi zhang - Sun Microsystems - Beijing China  */
21aff4bce5Syi zhang - Sun Microsystems - Beijing China /*
22aff4bce5Syi zhang - Sun Microsystems - Beijing China  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23aff4bce5Syi zhang - Sun Microsystems - Beijing China  * Use is subject to license terms.
24aff4bce5Syi zhang - Sun Microsystems - Beijing China  */
25aff4bce5Syi zhang - Sun Microsystems - Beijing China 
26aff4bce5Syi zhang - Sun Microsystems - Beijing China #include <dlfcn.h>
27aff4bce5Syi zhang - Sun Microsystems - Beijing China #include <pthread.h>
28aff4bce5Syi zhang - Sun Microsystems - Beijing China #include <string.h>
29aff4bce5Syi zhang - Sun Microsystems - Beijing China #include <sys/sem.h>
30aff4bce5Syi zhang - Sun Microsystems - Beijing China 
31aff4bce5Syi zhang - Sun Microsystems - Beijing China #include "libsun_ima.h"
32aff4bce5Syi zhang - Sun Microsystems - Beijing China #include "ima.h"
33aff4bce5Syi zhang - Sun Microsystems - Beijing China #include "ima-plugin.h"
34aff4bce5Syi zhang - Sun Microsystems - Beijing China 
35aff4bce5Syi zhang - Sun Microsystems - Beijing China extern int number_of_plugins;
36aff4bce5Syi zhang - Sun Microsystems - Beijing China extern int libMutex;
37aff4bce5Syi zhang - Sun Microsystems - Beijing China extern IMA_PLUGIN_INFO	 plugintable[IMA_MAX_NUM_PLUGINS];
38aff4bce5Syi zhang - Sun Microsystems - Beijing China extern void InitLibrary();
39aff4bce5Syi zhang - Sun Microsystems - Beijing China 
40aff4bce5Syi zhang - Sun Microsystems - Beijing China static void os_obtainmutex(int semid);
41aff4bce5Syi zhang - Sun Microsystems - Beijing China static void os_releasemutex(int semid);
42aff4bce5Syi zhang - Sun Microsystems - Beijing China 
SUN_IMA_SetTunableProperties(IMA_OID oid,ISCSI_TUNABLE_PARAM * param)43aff4bce5Syi zhang - Sun Microsystems - Beijing China IMA_API IMA_STATUS SUN_IMA_SetTunableProperties(
44aff4bce5Syi zhang - Sun Microsystems - Beijing China 		IMA_OID oid,
45aff4bce5Syi zhang - Sun Microsystems - Beijing China 		ISCSI_TUNABLE_PARAM *param) {
46aff4bce5Syi zhang - Sun Microsystems - Beijing China 	SUN_IMA_SetTunablePropertiesFn PassFunc;
47aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_UINT i;
48aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_STATUS status;
49aff4bce5Syi zhang - Sun Microsystems - Beijing China 
50aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (number_of_plugins == -1) {
51aff4bce5Syi zhang - Sun Microsystems - Beijing China 		InitLibrary();
52aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
53aff4bce5Syi zhang - Sun Microsystems - Beijing China 
54aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (param == NULL) {
55aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (IMA_ERROR_INVALID_PARAMETER);
56aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
57aff4bce5Syi zhang - Sun Microsystems - Beijing China 
58aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if ((oid.objectType != IMA_OBJECT_TYPE_LHBA) &&
59aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    (oid.objectType != IMA_OBJECT_TYPE_TARGET)) {
60aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (IMA_ERROR_INCORRECT_OBJECT_TYPE);
61aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
62aff4bce5Syi zhang - Sun Microsystems - Beijing China 
63aff4bce5Syi zhang - Sun Microsystems - Beijing China 	os_obtainmutex(libMutex);
64aff4bce5Syi zhang - Sun Microsystems - Beijing China 	status = IMA_ERROR_OBJECT_NOT_FOUND;
65aff4bce5Syi zhang - Sun Microsystems - Beijing China 
66aff4bce5Syi zhang - Sun Microsystems - Beijing China 	for (i = 0; i < number_of_plugins; i++) {
67aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (plugintable[i].ownerId == oid.ownerId) {
68aff4bce5Syi zhang - Sun Microsystems - Beijing China 			status = IMA_ERROR_UNEXPECTED_OS_ERROR;
69aff4bce5Syi zhang - Sun Microsystems - Beijing China 			os_obtainmutex(plugintable[i].pluginMutex);
70aff4bce5Syi zhang - Sun Microsystems - Beijing China #ifdef SOLARIS
71aff4bce5Syi zhang - Sun Microsystems - Beijing China 			PassFunc = (SUN_IMA_SetTunablePropertiesFn)
72aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    dlsym(plugintable[i].hPlugin,
73aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    "SUN_IMA_SetTunableProperties");
74aff4bce5Syi zhang - Sun Microsystems - Beijing China #endif
75aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (PassFunc != NULL) {
76aff4bce5Syi zhang - Sun Microsystems - Beijing China 				status = PassFunc(oid, param);
77aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
78aff4bce5Syi zhang - Sun Microsystems - Beijing China 			os_releasemutex(plugintable[i].pluginMutex);
79aff4bce5Syi zhang - Sun Microsystems - Beijing China 			break;
80aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
81aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
82aff4bce5Syi zhang - Sun Microsystems - Beijing China 	os_releasemutex(libMutex);
83aff4bce5Syi zhang - Sun Microsystems - Beijing China 	return (status);
84aff4bce5Syi zhang - Sun Microsystems - Beijing China }
85aff4bce5Syi zhang - Sun Microsystems - Beijing China 
SUN_IMA_GetTunableProperties(IMA_OID oid,ISCSI_TUNABLE_PARAM * param)86aff4bce5Syi zhang - Sun Microsystems - Beijing China IMA_API IMA_STATUS SUN_IMA_GetTunableProperties(
87aff4bce5Syi zhang - Sun Microsystems - Beijing China 		IMA_OID oid,
88aff4bce5Syi zhang - Sun Microsystems - Beijing China 		ISCSI_TUNABLE_PARAM *param) {
89aff4bce5Syi zhang - Sun Microsystems - Beijing China 	SUN_IMA_GetTunablePropertiesFn PassFunc = NULL;
90aff4bce5Syi zhang - Sun Microsystems - Beijing China 	int i;
91aff4bce5Syi zhang - Sun Microsystems - Beijing China 	IMA_STATUS status;
92aff4bce5Syi zhang - Sun Microsystems - Beijing China 
93aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (number_of_plugins == -1) {
94aff4bce5Syi zhang - Sun Microsystems - Beijing China 		InitLibrary();
95aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
96aff4bce5Syi zhang - Sun Microsystems - Beijing China 
97aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if (param == NULL) {
98aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (IMA_ERROR_INVALID_PARAMETER);
99aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
100aff4bce5Syi zhang - Sun Microsystems - Beijing China 
101aff4bce5Syi zhang - Sun Microsystems - Beijing China 	if ((oid.objectType != IMA_OBJECT_TYPE_LHBA) &&
102aff4bce5Syi zhang - Sun Microsystems - Beijing China 	    (oid.objectType != IMA_OBJECT_TYPE_TARGET)) {
103aff4bce5Syi zhang - Sun Microsystems - Beijing China 		return (IMA_ERROR_INCORRECT_OBJECT_TYPE);
104aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
105aff4bce5Syi zhang - Sun Microsystems - Beijing China 
106aff4bce5Syi zhang - Sun Microsystems - Beijing China 	os_obtainmutex(libMutex);
107aff4bce5Syi zhang - Sun Microsystems - Beijing China 	status = IMA_ERROR_OBJECT_NOT_FOUND;
108aff4bce5Syi zhang - Sun Microsystems - Beijing China 	for (i = 0; i < number_of_plugins; i++) {
109aff4bce5Syi zhang - Sun Microsystems - Beijing China 		status = IMA_ERROR_UNEXPECTED_OS_ERROR;
110aff4bce5Syi zhang - Sun Microsystems - Beijing China 		if (plugintable[i].ownerId == oid.ownerId) {
111aff4bce5Syi zhang - Sun Microsystems - Beijing China 			os_obtainmutex(plugintable[i].pluginMutex);
112aff4bce5Syi zhang - Sun Microsystems - Beijing China #ifdef SOLARIS
113aff4bce5Syi zhang - Sun Microsystems - Beijing China 			PassFunc = (SUN_IMA_GetTunablePropertiesFn)
114aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    dlsym(plugintable[i].hPlugin,
115aff4bce5Syi zhang - Sun Microsystems - Beijing China 			    "SUN_IMA_GetTunableProperties");
116aff4bce5Syi zhang - Sun Microsystems - Beijing China #endif
117aff4bce5Syi zhang - Sun Microsystems - Beijing China 			if (PassFunc != NULL) {
118aff4bce5Syi zhang - Sun Microsystems - Beijing China 				status = PassFunc(oid, param);
119aff4bce5Syi zhang - Sun Microsystems - Beijing China 			}
120aff4bce5Syi zhang - Sun Microsystems - Beijing China 			os_releasemutex(plugintable[i].pluginMutex);
121aff4bce5Syi zhang - Sun Microsystems - Beijing China 			break;
122aff4bce5Syi zhang - Sun Microsystems - Beijing China 		}
123aff4bce5Syi zhang - Sun Microsystems - Beijing China 	}
124aff4bce5Syi zhang - Sun Microsystems - Beijing China 	os_releasemutex(libMutex);
125aff4bce5Syi zhang - Sun Microsystems - Beijing China 	return (status);
126aff4bce5Syi zhang - Sun Microsystems - Beijing China }
127aff4bce5Syi zhang - Sun Microsystems - Beijing China 
128*df9cdf10SToomas Soome static void
os_obtainmutex(int semid)129*df9cdf10SToomas Soome os_obtainmutex(int semid)
130*df9cdf10SToomas Soome {
131aff4bce5Syi zhang - Sun Microsystems - Beijing China 	struct sembuf sem_b;
132aff4bce5Syi zhang - Sun Microsystems - Beijing China 
133aff4bce5Syi zhang - Sun Microsystems - Beijing China 	sem_b.sem_num = 0;
134aff4bce5Syi zhang - Sun Microsystems - Beijing China 	sem_b.sem_op = -1;
135aff4bce5Syi zhang - Sun Microsystems - Beijing China 	sem_b.sem_flg = SEM_UNDO;
136*df9cdf10SToomas Soome 	(void) semop(semid, &sem_b, 1);
137aff4bce5Syi zhang - Sun Microsystems - Beijing China }
138aff4bce5Syi zhang - Sun Microsystems - Beijing China 
139*df9cdf10SToomas Soome static void
os_releasemutex(int semid)140*df9cdf10SToomas Soome os_releasemutex(int semid)
141*df9cdf10SToomas Soome {
142aff4bce5Syi zhang - Sun Microsystems - Beijing China 	struct sembuf sem_b;
143aff4bce5Syi zhang - Sun Microsystems - Beijing China 
144aff4bce5Syi zhang - Sun Microsystems - Beijing China 	sem_b.sem_num = 0;
145aff4bce5Syi zhang - Sun Microsystems - Beijing China 	sem_b.sem_op = 1;
146aff4bce5Syi zhang - Sun Microsystems - Beijing China 	sem_b.sem_flg = SEM_UNDO;
147*df9cdf10SToomas Soome 	(void) semop(semid, &sem_b, 1);
148aff4bce5Syi zhang - Sun Microsystems - Beijing China }
149