xref: /onnv-gate/usr/src/lib/libilb/common/ilb_hc.c (revision 10946:324bab2b3370)
1*10946SSangeeta.Misra@Sun.COM /*
2*10946SSangeeta.Misra@Sun.COM  * CDDL HEADER START
3*10946SSangeeta.Misra@Sun.COM  *
4*10946SSangeeta.Misra@Sun.COM  * The contents of this file are subject to the terms of the
5*10946SSangeeta.Misra@Sun.COM  * Common Development and Distribution License (the "License").
6*10946SSangeeta.Misra@Sun.COM  * You may not use this file except in compliance with the License.
7*10946SSangeeta.Misra@Sun.COM  *
8*10946SSangeeta.Misra@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10946SSangeeta.Misra@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*10946SSangeeta.Misra@Sun.COM  * See the License for the specific language governing permissions
11*10946SSangeeta.Misra@Sun.COM  * and limitations under the License.
12*10946SSangeeta.Misra@Sun.COM  *
13*10946SSangeeta.Misra@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*10946SSangeeta.Misra@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10946SSangeeta.Misra@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*10946SSangeeta.Misra@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*10946SSangeeta.Misra@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10946SSangeeta.Misra@Sun.COM  *
19*10946SSangeeta.Misra@Sun.COM  * CDDL HEADER END
20*10946SSangeeta.Misra@Sun.COM  */
21*10946SSangeeta.Misra@Sun.COM 
22*10946SSangeeta.Misra@Sun.COM /*
23*10946SSangeeta.Misra@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*10946SSangeeta.Misra@Sun.COM  * Use is subject to license terms.
25*10946SSangeeta.Misra@Sun.COM  */
26*10946SSangeeta.Misra@Sun.COM 
27*10946SSangeeta.Misra@Sun.COM #include <stdlib.h>
28*10946SSangeeta.Misra@Sun.COM #include <strings.h>
29*10946SSangeeta.Misra@Sun.COM #include <sys/types.h>
30*10946SSangeeta.Misra@Sun.COM #include <sys/socket.h>
31*10946SSangeeta.Misra@Sun.COM #include <netinet/in.h>
32*10946SSangeeta.Misra@Sun.COM #include <stddef.h>
33*10946SSangeeta.Misra@Sun.COM #include <libilb_impl.h>
34*10946SSangeeta.Misra@Sun.COM #include <libilb.h>
35*10946SSangeeta.Misra@Sun.COM 
36*10946SSangeeta.Misra@Sun.COM /*
37*10946SSangeeta.Misra@Sun.COM  * Create a health check, returning a health check handle upon success.
38*10946SSangeeta.Misra@Sun.COM  * Health check created will be recorded in persistent datastore.
39*10946SSangeeta.Misra@Sun.COM  */
40*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_create_hc(ilb_handle_t h,const ilb_hc_info_t * hc)41*10946SSangeeta.Misra@Sun.COM ilb_create_hc(ilb_handle_t h, const ilb_hc_info_t *hc)
42*10946SSangeeta.Misra@Sun.COM {
43*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rc;
44*10946SSangeeta.Misra@Sun.COM 	ilb_comm_t	*ic;
45*10946SSangeeta.Misra@Sun.COM 	size_t		ic_sz;
46*10946SSangeeta.Misra@Sun.COM 
47*10946SSangeeta.Misra@Sun.COM 	if (h == ILB_INVALID_HANDLE || hc == NULL || *hc->hci_name == '\0' ||
48*10946SSangeeta.Misra@Sun.COM 	    hc->hci_timeout < 0 || hc->hci_count < 0 ||
49*10946SSangeeta.Misra@Sun.COM 	    hc->hci_interval <= hc->hci_timeout * hc->hci_count)
50*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_EINVAL);
51*10946SSangeeta.Misra@Sun.COM 
52*10946SSangeeta.Misra@Sun.COM 	if ((ic = i_ilb_alloc_req(ILBD_CREATE_HC, &ic_sz)) == NULL)
53*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_ENOMEM);
54*10946SSangeeta.Misra@Sun.COM 
55*10946SSangeeta.Misra@Sun.COM 	(void) memcpy(&ic->ic_data, hc, sizeof (ilb_hc_info_t));
56*10946SSangeeta.Misra@Sun.COM 
57*10946SSangeeta.Misra@Sun.COM 	rc = i_ilb_do_comm(h, ic, ic_sz, ic, &ic_sz);
58*10946SSangeeta.Misra@Sun.COM 	if (rc != ILB_STATUS_OK)
59*10946SSangeeta.Misra@Sun.COM 		goto out;
60*10946SSangeeta.Misra@Sun.COM 
61*10946SSangeeta.Misra@Sun.COM 	if (ic->ic_cmd != ILBD_CMD_OK)
62*10946SSangeeta.Misra@Sun.COM 		rc = *(ilb_status_t *)&ic->ic_data;
63*10946SSangeeta.Misra@Sun.COM 
64*10946SSangeeta.Misra@Sun.COM out:
65*10946SSangeeta.Misra@Sun.COM 	free(ic);
66*10946SSangeeta.Misra@Sun.COM 	return (rc);
67*10946SSangeeta.Misra@Sun.COM }
68*10946SSangeeta.Misra@Sun.COM 
69*10946SSangeeta.Misra@Sun.COM /*
70*10946SSangeeta.Misra@Sun.COM  * Given a health check handle, destroy the corresponding health check.
71*10946SSangeeta.Misra@Sun.COM  * Persistent datastore will be updated as well.
72*10946SSangeeta.Misra@Sun.COM  */
73*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_destroy_hc(ilb_handle_t h,const char * hcname)74*10946SSangeeta.Misra@Sun.COM ilb_destroy_hc(ilb_handle_t h, const char *hcname)
75*10946SSangeeta.Misra@Sun.COM {
76*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rc;
77*10946SSangeeta.Misra@Sun.COM 	ilb_comm_t	*ic;
78*10946SSangeeta.Misra@Sun.COM 	size_t		ic_sz;
79*10946SSangeeta.Misra@Sun.COM 
80*10946SSangeeta.Misra@Sun.COM 	if (h == ILB_INVALID_HANDLE || hcname == NULL || *hcname == '\0')
81*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_EINVAL);
82*10946SSangeeta.Misra@Sun.COM 
83*10946SSangeeta.Misra@Sun.COM 	if ((ic = i_ilb_alloc_req(ILBD_DESTROY_HC, &ic_sz)) == NULL)
84*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_ENOMEM);
85*10946SSangeeta.Misra@Sun.COM 
86*10946SSangeeta.Misra@Sun.COM 	(void) strlcpy((char *)&ic->ic_data, hcname, sizeof (ilbd_name_t));
87*10946SSangeeta.Misra@Sun.COM 
88*10946SSangeeta.Misra@Sun.COM 	rc = i_ilb_do_comm(h, ic, ic_sz, ic, &ic_sz);
89*10946SSangeeta.Misra@Sun.COM 	if (rc != ILB_STATUS_OK)
90*10946SSangeeta.Misra@Sun.COM 		goto out;
91*10946SSangeeta.Misra@Sun.COM 
92*10946SSangeeta.Misra@Sun.COM 	if (ic->ic_cmd != ILBD_CMD_OK)
93*10946SSangeeta.Misra@Sun.COM 		rc = *(ilb_status_t *)&ic->ic_data;
94*10946SSangeeta.Misra@Sun.COM 
95*10946SSangeeta.Misra@Sun.COM out:
96*10946SSangeeta.Misra@Sun.COM 	free(ic);
97*10946SSangeeta.Misra@Sun.COM 	return (rc);
98*10946SSangeeta.Misra@Sun.COM }
99*10946SSangeeta.Misra@Sun.COM 
100*10946SSangeeta.Misra@Sun.COM /*
101*10946SSangeeta.Misra@Sun.COM  * Given a health check name, get hc info associated with this handle
102*10946SSangeeta.Misra@Sun.COM  */
103*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_get_hc_info(ilb_handle_t h,const char * name,ilb_hc_info_t * hcp)104*10946SSangeeta.Misra@Sun.COM ilb_get_hc_info(ilb_handle_t h, const char *name, ilb_hc_info_t *hcp)
105*10946SSangeeta.Misra@Sun.COM {
106*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rc;
107*10946SSangeeta.Misra@Sun.COM 	ilb_comm_t	*ic, *rbuf;
108*10946SSangeeta.Misra@Sun.COM 	size_t		ic_sz, rbufsz;
109*10946SSangeeta.Misra@Sun.COM 
110*10946SSangeeta.Misra@Sun.COM 	if (h == ILB_INVALID_HANDLE || name == NULL || hcp == NULL)
111*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_EINVAL);
112*10946SSangeeta.Misra@Sun.COM 
113*10946SSangeeta.Misra@Sun.COM 	if ((ic = i_ilb_alloc_req(ILBD_GET_HC_INFO, &ic_sz)) == NULL)
114*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_ENOMEM);
115*10946SSangeeta.Misra@Sun.COM 	rbufsz = sizeof (ilb_comm_t) + sizeof (ilb_hc_info_t);
116*10946SSangeeta.Misra@Sun.COM 	if ((rbuf = malloc(rbufsz)) == NULL) {
117*10946SSangeeta.Misra@Sun.COM 		free(ic);
118*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_ENOMEM);
119*10946SSangeeta.Misra@Sun.COM 	}
120*10946SSangeeta.Misra@Sun.COM 
121*10946SSangeeta.Misra@Sun.COM 	(void) strlcpy((char *)&ic->ic_data, name, sizeof (ilbd_name_t));
122*10946SSangeeta.Misra@Sun.COM 
123*10946SSangeeta.Misra@Sun.COM 	rc = i_ilb_do_comm(h, ic, ic_sz, rbuf, &rbufsz);
124*10946SSangeeta.Misra@Sun.COM 	if (rc != ILB_STATUS_OK)
125*10946SSangeeta.Misra@Sun.COM 		goto out;
126*10946SSangeeta.Misra@Sun.COM 
127*10946SSangeeta.Misra@Sun.COM 	if (rbuf->ic_cmd != ILBD_CMD_OK) {
128*10946SSangeeta.Misra@Sun.COM 		rc = *(ilb_status_t *)&rbuf->ic_data;
129*10946SSangeeta.Misra@Sun.COM 		goto out;
130*10946SSangeeta.Misra@Sun.COM 	}
131*10946SSangeeta.Misra@Sun.COM 	(void) memcpy(hcp, &rbuf->ic_data, sizeof (*hcp));
132*10946SSangeeta.Misra@Sun.COM 
133*10946SSangeeta.Misra@Sun.COM out:
134*10946SSangeeta.Misra@Sun.COM 	free(ic);
135*10946SSangeeta.Misra@Sun.COM 	free(rbuf);
136*10946SSangeeta.Misra@Sun.COM 	return (rc);
137*10946SSangeeta.Misra@Sun.COM }
138*10946SSangeeta.Misra@Sun.COM 
139*10946SSangeeta.Misra@Sun.COM /*
140*10946SSangeeta.Misra@Sun.COM  * Walk through all health checks, will need if we implement list-hc
141*10946SSangeeta.Misra@Sun.COM  */
142*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_walk_hc(ilb_handle_t h,hc_walkerfunc_t func,void * arg)143*10946SSangeeta.Misra@Sun.COM ilb_walk_hc(ilb_handle_t h, hc_walkerfunc_t func, void *arg)
144*10946SSangeeta.Misra@Sun.COM {
145*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rc;
146*10946SSangeeta.Misra@Sun.COM 	ilb_hc_info_t	hc_info;
147*10946SSangeeta.Misra@Sun.COM 	ilbd_namelist_t	*hc_names;
148*10946SSangeeta.Misra@Sun.COM 	ilb_comm_t	ic, *rbuf;
149*10946SSangeeta.Misra@Sun.COM 	size_t		rbufsz;
150*10946SSangeeta.Misra@Sun.COM 	int		i;
151*10946SSangeeta.Misra@Sun.COM 
152*10946SSangeeta.Misra@Sun.COM 	rbufsz = ILBD_MSG_SIZE;
153*10946SSangeeta.Misra@Sun.COM 	if ((rbuf = malloc(rbufsz)) == NULL)
154*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_ENOMEM);
155*10946SSangeeta.Misra@Sun.COM 	ic.ic_cmd = ILBD_RETRIEVE_HC_NAMES;
156*10946SSangeeta.Misra@Sun.COM 
157*10946SSangeeta.Misra@Sun.COM 	rc = i_ilb_do_comm(h, &ic, sizeof (ic), rbuf, &rbufsz);
158*10946SSangeeta.Misra@Sun.COM 	if (rc != ILB_STATUS_OK)
159*10946SSangeeta.Misra@Sun.COM 		goto out;
160*10946SSangeeta.Misra@Sun.COM 	if (rbuf->ic_cmd != ILBD_CMD_OK) {
161*10946SSangeeta.Misra@Sun.COM 		rc = *(ilb_status_t *)&rbuf->ic_data;
162*10946SSangeeta.Misra@Sun.COM 		goto out;
163*10946SSangeeta.Misra@Sun.COM 	}
164*10946SSangeeta.Misra@Sun.COM 
165*10946SSangeeta.Misra@Sun.COM 	hc_names = (ilbd_namelist_t *)&rbuf->ic_data;
166*10946SSangeeta.Misra@Sun.COM 	for (i = 0; i < hc_names->ilbl_count; i++) {
167*10946SSangeeta.Misra@Sun.COM 		rc = ilb_get_hc_info(h, hc_names->ilbl_name[i], &hc_info);
168*10946SSangeeta.Misra@Sun.COM 		/*
169*10946SSangeeta.Misra@Sun.COM 		 * Since getting the list of hc names and getting the info
170*10946SSangeeta.Misra@Sun.COM 		 * of each of them are not atomic, some hc objects may have
171*10946SSangeeta.Misra@Sun.COM 		 * been deleted.  If this is the case, just skip them.
172*10946SSangeeta.Misra@Sun.COM 		 */
173*10946SSangeeta.Misra@Sun.COM 		if (rc == ILB_STATUS_ENOENT) {
174*10946SSangeeta.Misra@Sun.COM 			rc = ILB_STATUS_OK;
175*10946SSangeeta.Misra@Sun.COM 			continue;
176*10946SSangeeta.Misra@Sun.COM 		} else if (rc != ILB_STATUS_OK) {
177*10946SSangeeta.Misra@Sun.COM 			break;
178*10946SSangeeta.Misra@Sun.COM 		}
179*10946SSangeeta.Misra@Sun.COM 		rc = func(h, &hc_info, arg);
180*10946SSangeeta.Misra@Sun.COM 	}
181*10946SSangeeta.Misra@Sun.COM 
182*10946SSangeeta.Misra@Sun.COM out:
183*10946SSangeeta.Misra@Sun.COM 	free(rbuf);
184*10946SSangeeta.Misra@Sun.COM 	return (rc);
185*10946SSangeeta.Misra@Sun.COM }
186*10946SSangeeta.Misra@Sun.COM 
187*10946SSangeeta.Misra@Sun.COM static ilb_status_t
ilb_get_hc_srvs(ilb_handle_t h,const char * rulename,ilb_comm_t ** rbuf,size_t * rbufsz)188*10946SSangeeta.Misra@Sun.COM ilb_get_hc_srvs(ilb_handle_t h, const char *rulename, ilb_comm_t **rbuf,
189*10946SSangeeta.Misra@Sun.COM     size_t *rbufsz)
190*10946SSangeeta.Misra@Sun.COM {
191*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rc;
192*10946SSangeeta.Misra@Sun.COM 	ilb_comm_t	*ic, *tmp_rbuf;
193*10946SSangeeta.Misra@Sun.COM 	size_t		ic_sz;
194*10946SSangeeta.Misra@Sun.COM 
195*10946SSangeeta.Misra@Sun.COM 	if ((ic = i_ilb_alloc_req(ILBD_GET_HC_SRVS, &ic_sz)) == NULL)
196*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_ENOMEM);
197*10946SSangeeta.Misra@Sun.COM 	*rbufsz = ILBD_MSG_SIZE;
198*10946SSangeeta.Misra@Sun.COM 	if ((tmp_rbuf = malloc(*rbufsz)) == NULL) {
199*10946SSangeeta.Misra@Sun.COM 		free(ic);
200*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_ENOMEM);
201*10946SSangeeta.Misra@Sun.COM 	}
202*10946SSangeeta.Misra@Sun.COM 
203*10946SSangeeta.Misra@Sun.COM 	(void) strlcpy((char *)&ic->ic_data, rulename,
204*10946SSangeeta.Misra@Sun.COM 	    sizeof (ilbd_name_t));
205*10946SSangeeta.Misra@Sun.COM 
206*10946SSangeeta.Misra@Sun.COM 	rc = i_ilb_do_comm(h, ic, ic_sz, tmp_rbuf, rbufsz);
207*10946SSangeeta.Misra@Sun.COM 	if (rc != ILB_STATUS_OK)
208*10946SSangeeta.Misra@Sun.COM 		goto out;
209*10946SSangeeta.Misra@Sun.COM 
210*10946SSangeeta.Misra@Sun.COM 	if (tmp_rbuf->ic_cmd == ILBD_CMD_OK) {
211*10946SSangeeta.Misra@Sun.COM 		*rbuf = tmp_rbuf;
212*10946SSangeeta.Misra@Sun.COM 		return (rc);
213*10946SSangeeta.Misra@Sun.COM 	}
214*10946SSangeeta.Misra@Sun.COM 	rc = *(ilb_status_t *)&tmp_rbuf->ic_data;
215*10946SSangeeta.Misra@Sun.COM out:
216*10946SSangeeta.Misra@Sun.COM 	free(ic);
217*10946SSangeeta.Misra@Sun.COM 	free(tmp_rbuf);
218*10946SSangeeta.Misra@Sun.COM 	*rbuf = NULL;
219*10946SSangeeta.Misra@Sun.COM 	return (rc);
220*10946SSangeeta.Misra@Sun.COM }
221*10946SSangeeta.Misra@Sun.COM 
222*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_walk_hc_srvs(ilb_handle_t h,hc_srvwalkerfunc_t fn,const char * rulename,void * arg)223*10946SSangeeta.Misra@Sun.COM ilb_walk_hc_srvs(ilb_handle_t h, hc_srvwalkerfunc_t fn, const char *rulename,
224*10946SSangeeta.Misra@Sun.COM     void *arg)
225*10946SSangeeta.Misra@Sun.COM {
226*10946SSangeeta.Misra@Sun.COM 	ilb_status_t		rc;
227*10946SSangeeta.Misra@Sun.COM 	ilb_hc_rule_srv_t	*srvs;
228*10946SSangeeta.Misra@Sun.COM 	int			i, j;
229*10946SSangeeta.Misra@Sun.COM 	ilb_comm_t		*rbuf;
230*10946SSangeeta.Misra@Sun.COM 	size_t			rbufsz;
231*10946SSangeeta.Misra@Sun.COM 
232*10946SSangeeta.Misra@Sun.COM 	if (rulename != NULL) {
233*10946SSangeeta.Misra@Sun.COM 		rc = ilb_get_hc_srvs(h, rulename, &rbuf, &rbufsz);
234*10946SSangeeta.Misra@Sun.COM 		if (rc != ILB_STATUS_OK)
235*10946SSangeeta.Misra@Sun.COM 			return (rc);
236*10946SSangeeta.Misra@Sun.COM 		srvs = (ilb_hc_rule_srv_t *)&rbuf->ic_data;
237*10946SSangeeta.Misra@Sun.COM 		for (i = 0; i < srvs->rs_num_srvs; i++) {
238*10946SSangeeta.Misra@Sun.COM 			rc = fn(h, &srvs->rs_srvs[i], arg);
239*10946SSangeeta.Misra@Sun.COM 			if (rc != ILB_STATUS_OK)
240*10946SSangeeta.Misra@Sun.COM 				break;
241*10946SSangeeta.Misra@Sun.COM 		}
242*10946SSangeeta.Misra@Sun.COM 		free(rbuf);
243*10946SSangeeta.Misra@Sun.COM 	} else {
244*10946SSangeeta.Misra@Sun.COM 		ilbd_namelist_t *names;
245*10946SSangeeta.Misra@Sun.COM 		ilb_comm_t	*srv_rbuf;
246*10946SSangeeta.Misra@Sun.COM 		size_t		srv_rbufsz;
247*10946SSangeeta.Misra@Sun.COM 
248*10946SSangeeta.Misra@Sun.COM 		rc = i_ilb_retrieve_rule_names(h, &rbuf, &rbufsz);
249*10946SSangeeta.Misra@Sun.COM 		if (rc != ILB_STATUS_OK)
250*10946SSangeeta.Misra@Sun.COM 			return (rc);
251*10946SSangeeta.Misra@Sun.COM 		names = (ilbd_namelist_t *)&rbuf->ic_data;
252*10946SSangeeta.Misra@Sun.COM 
253*10946SSangeeta.Misra@Sun.COM 		for (i = 0; i < names->ilbl_count; i++) {
254*10946SSangeeta.Misra@Sun.COM 			rc = ilb_get_hc_srvs(h, names->ilbl_name[i],
255*10946SSangeeta.Misra@Sun.COM 			    &srv_rbuf, &srv_rbufsz);
256*10946SSangeeta.Misra@Sun.COM 
257*10946SSangeeta.Misra@Sun.COM 			/* Not all rules have HC, so reset the error to OK. */
258*10946SSangeeta.Misra@Sun.COM 			if (rc == ILB_STATUS_RULE_NO_HC) {
259*10946SSangeeta.Misra@Sun.COM 				rc = ILB_STATUS_OK;
260*10946SSangeeta.Misra@Sun.COM 				continue;
261*10946SSangeeta.Misra@Sun.COM 			} else if (rc != ILB_STATUS_OK) {
262*10946SSangeeta.Misra@Sun.COM 				break;
263*10946SSangeeta.Misra@Sun.COM 			}
264*10946SSangeeta.Misra@Sun.COM 
265*10946SSangeeta.Misra@Sun.COM 			srvs = (ilb_hc_rule_srv_t *)&srv_rbuf->ic_data;
266*10946SSangeeta.Misra@Sun.COM 			for (j = 0; j < srvs->rs_num_srvs; j++) {
267*10946SSangeeta.Misra@Sun.COM 				rc = fn(h, &srvs->rs_srvs[j], arg);
268*10946SSangeeta.Misra@Sun.COM 				if (rc != ILB_STATUS_OK)
269*10946SSangeeta.Misra@Sun.COM 					break;
270*10946SSangeeta.Misra@Sun.COM 			}
271*10946SSangeeta.Misra@Sun.COM 			free(srv_rbuf);
272*10946SSangeeta.Misra@Sun.COM 		}
273*10946SSangeeta.Misra@Sun.COM 		free(rbuf);
274*10946SSangeeta.Misra@Sun.COM 	}
275*10946SSangeeta.Misra@Sun.COM 	return (rc);
276*10946SSangeeta.Misra@Sun.COM }
277