xref: /onnv-gate/usr/src/cmd/cmd-inet/usr.lib/ilbd/ilbd_support.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 <stdio.h>
28*10946SSangeeta.Misra@Sun.COM #include <stdlib.h>
29*10946SSangeeta.Misra@Sun.COM #include <strings.h>
30*10946SSangeeta.Misra@Sun.COM #include <unistd.h>
31*10946SSangeeta.Misra@Sun.COM #include <stropts.h>
32*10946SSangeeta.Misra@Sun.COM #include <sys/types.h>
33*10946SSangeeta.Misra@Sun.COM #include <sys/socket.h>
34*10946SSangeeta.Misra@Sun.COM #include <sys/stropts.h>
35*10946SSangeeta.Misra@Sun.COM #include <sys/sockio.h>
36*10946SSangeeta.Misra@Sun.COM #include <errno.h>
37*10946SSangeeta.Misra@Sun.COM #include <sys/list.h>
38*10946SSangeeta.Misra@Sun.COM #include <auth_attr.h>
39*10946SSangeeta.Misra@Sun.COM #include <auth_list.h>
40*10946SSangeeta.Misra@Sun.COM #include <secdb.h>
41*10946SSangeeta.Misra@Sun.COM #include <libilb.h>
42*10946SSangeeta.Misra@Sun.COM #include "libilb_impl.h"
43*10946SSangeeta.Misra@Sun.COM #include "ilbd.h"
44*10946SSangeeta.Misra@Sun.COM 
45*10946SSangeeta.Misra@Sun.COM /*
46*10946SSangeeta.Misra@Sun.COM  * logs error messages, either to stderr or syslog, depending on
47*10946SSangeeta.Misra@Sun.COM  * the -d option
48*10946SSangeeta.Misra@Sun.COM  */
49*10946SSangeeta.Misra@Sun.COM static boolean_t	ilbd_debugging = B_FALSE;
50*10946SSangeeta.Misra@Sun.COM 
51*10946SSangeeta.Misra@Sun.COM /* Socket to issue ioctl() to the kernel */
52*10946SSangeeta.Misra@Sun.COM static	int	ksock = -1;
53*10946SSangeeta.Misra@Sun.COM 
54*10946SSangeeta.Misra@Sun.COM void
ilbd_enable_debug(void)55*10946SSangeeta.Misra@Sun.COM ilbd_enable_debug(void)
56*10946SSangeeta.Misra@Sun.COM {
57*10946SSangeeta.Misra@Sun.COM 	ilbd_debugging = B_TRUE;
58*10946SSangeeta.Misra@Sun.COM }
59*10946SSangeeta.Misra@Sun.COM 
60*10946SSangeeta.Misra@Sun.COM boolean_t
is_debugging_on(void)61*10946SSangeeta.Misra@Sun.COM is_debugging_on(void)
62*10946SSangeeta.Misra@Sun.COM {
63*10946SSangeeta.Misra@Sun.COM 	return (ilbd_debugging);
64*10946SSangeeta.Misra@Sun.COM }
65*10946SSangeeta.Misra@Sun.COM 
66*10946SSangeeta.Misra@Sun.COM /*
67*10946SSangeeta.Misra@Sun.COM  * All routines log to syslog, unless the daemon is running in
68*10946SSangeeta.Misra@Sun.COM  * the foreground, in which case the logging goes to stderr.
69*10946SSangeeta.Misra@Sun.COM  * The following logging functions are available:
70*10946SSangeeta.Misra@Sun.COM  *
71*10946SSangeeta.Misra@Sun.COM  *
72*10946SSangeeta.Misra@Sun.COM  *      logdebug(): A printf-like function for outputting debug messages
73*10946SSangeeta.Misra@Sun.COM  *      (messages at LOG_DEBUG) that are only of use to developers.
74*10946SSangeeta.Misra@Sun.COM  *
75*10946SSangeeta.Misra@Sun.COM  *      logerr(): A printf-like function for outputting error messages
76*10946SSangeeta.Misra@Sun.COM  *      (messages at LOG_ERR) from the daemon.
77*10946SSangeeta.Misra@Sun.COM  *
78*10946SSangeeta.Misra@Sun.COM  *      logperror*(): A set of functions used to output error messages
79*10946SSangeeta.Misra@Sun.COM  *      (messages at LOG_ERR); these automatically append strerror(errno)
80*10946SSangeeta.Misra@Sun.COM  *      and a newline to the message passed to them.
81*10946SSangeeta.Misra@Sun.COM  *
82*10946SSangeeta.Misra@Sun.COM  * NOTE: since the logging functions write to syslog, the messages passed
83*10946SSangeeta.Misra@Sun.COM  *      to them are not eligible for localization.  Thus, gettext() must
84*10946SSangeeta.Misra@Sun.COM  *      *not* be used.
85*10946SSangeeta.Misra@Sun.COM  *
86*10946SSangeeta.Misra@Sun.COM  */
87*10946SSangeeta.Misra@Sun.COM /* PRINTFLIKE2 */
88*10946SSangeeta.Misra@Sun.COM void
ilbd_log(int pri,const char * fmt,...)89*10946SSangeeta.Misra@Sun.COM ilbd_log(int pri, const char *fmt, ...)
90*10946SSangeeta.Misra@Sun.COM {
91*10946SSangeeta.Misra@Sun.COM 	va_list ap;
92*10946SSangeeta.Misra@Sun.COM 	va_start(ap, fmt);
93*10946SSangeeta.Misra@Sun.COM 
94*10946SSangeeta.Misra@Sun.COM 	if (ilbd_debugging == B_TRUE) {
95*10946SSangeeta.Misra@Sun.COM 		(void) vfprintf(stderr, fmt, ap);
96*10946SSangeeta.Misra@Sun.COM 		(void) fprintf(stderr, "\n");
97*10946SSangeeta.Misra@Sun.COM 	} else {
98*10946SSangeeta.Misra@Sun.COM 		vsyslog(pri, fmt, ap);
99*10946SSangeeta.Misra@Sun.COM 	}
100*10946SSangeeta.Misra@Sun.COM 	va_end(ap);
101*10946SSangeeta.Misra@Sun.COM 
102*10946SSangeeta.Misra@Sun.COM }
103*10946SSangeeta.Misra@Sun.COM 
104*10946SSangeeta.Misra@Sun.COM /* PRINTFLIKE1 */
105*10946SSangeeta.Misra@Sun.COM void
logperror(const char * str)106*10946SSangeeta.Misra@Sun.COM logperror(const char *str)
107*10946SSangeeta.Misra@Sun.COM {
108*10946SSangeeta.Misra@Sun.COM 	if (ilbd_debugging == B_TRUE)
109*10946SSangeeta.Misra@Sun.COM 		(void) fprintf(stderr, "%s: %s\n", str, strerror(errno));
110*10946SSangeeta.Misra@Sun.COM 	else
111*10946SSangeeta.Misra@Sun.COM 		syslog(LOG_ERR, "%s: %m", str);
112*10946SSangeeta.Misra@Sun.COM }
113*10946SSangeeta.Misra@Sun.COM 
114*10946SSangeeta.Misra@Sun.COM 
115*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilbd_check_client_config_auth(const struct passwd * pwd)116*10946SSangeeta.Misra@Sun.COM ilbd_check_client_config_auth(const struct passwd *pwd)
117*10946SSangeeta.Misra@Sun.COM {
118*10946SSangeeta.Misra@Sun.COM 	if (chkauthattr(NET_ILB_CONFIG_AUTH, pwd->pw_name) == 0) {
119*10946SSangeeta.Misra@Sun.COM 		logdebug("user %s is not authorized for"
120*10946SSangeeta.Misra@Sun.COM 		    " configuration operation", pwd->pw_name);
121*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_CFGAUTH);
122*10946SSangeeta.Misra@Sun.COM 	}
123*10946SSangeeta.Misra@Sun.COM 	return (ILB_STATUS_OK);
124*10946SSangeeta.Misra@Sun.COM 
125*10946SSangeeta.Misra@Sun.COM }
126*10946SSangeeta.Misra@Sun.COM 
127*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilbd_check_client_enable_auth(const struct passwd * pwd)128*10946SSangeeta.Misra@Sun.COM ilbd_check_client_enable_auth(const struct passwd *pwd)
129*10946SSangeeta.Misra@Sun.COM {
130*10946SSangeeta.Misra@Sun.COM 	if (chkauthattr(NET_ILB_ENABLE_AUTH, pwd->pw_name) == 0) {
131*10946SSangeeta.Misra@Sun.COM 		logdebug("user %s is not authorized for"
132*10946SSangeeta.Misra@Sun.COM 		    " enable/disable operation", pwd->pw_name);
133*10946SSangeeta.Misra@Sun.COM 		return (ILB_STATUS_CFGAUTH);
134*10946SSangeeta.Misra@Sun.COM 	}
135*10946SSangeeta.Misra@Sun.COM 	return (ILB_STATUS_OK);
136*10946SSangeeta.Misra@Sun.COM 
137*10946SSangeeta.Misra@Sun.COM }
138*10946SSangeeta.Misra@Sun.COM 
139*10946SSangeeta.Misra@Sun.COM /*
140*10946SSangeeta.Misra@Sun.COM  * input param. "err" should be one of the errnos defined in
141*10946SSangeeta.Misra@Sun.COM  * /usr/include/sys/errno.h
142*10946SSangeeta.Misra@Sun.COM  * this list is NOT complete.
143*10946SSangeeta.Misra@Sun.COM  */
144*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_map_errno2ilbstat(int err)145*10946SSangeeta.Misra@Sun.COM ilb_map_errno2ilbstat(int err)
146*10946SSangeeta.Misra@Sun.COM {
147*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	rc = ILB_STATUS_INTERNAL;
148*10946SSangeeta.Misra@Sun.COM 
149*10946SSangeeta.Misra@Sun.COM 	switch (err) {
150*10946SSangeeta.Misra@Sun.COM 	case 0:
151*10946SSangeeta.Misra@Sun.COM 		rc = ILB_STATUS_OK; /* for completeness' sake */
152*10946SSangeeta.Misra@Sun.COM 		break;
153*10946SSangeeta.Misra@Sun.COM 	case EINVAL:
154*10946SSangeeta.Misra@Sun.COM 		rc = ILB_STATUS_EINVAL;
155*10946SSangeeta.Misra@Sun.COM 		break;
156*10946SSangeeta.Misra@Sun.COM 	case ENOENT:
157*10946SSangeeta.Misra@Sun.COM 		rc = ILB_STATUS_ENOENT;
158*10946SSangeeta.Misra@Sun.COM 		break;
159*10946SSangeeta.Misra@Sun.COM 	case ENOMEM:
160*10946SSangeeta.Misra@Sun.COM 		rc = ILB_STATUS_ENOMEM;
161*10946SSangeeta.Misra@Sun.COM 		break;
162*10946SSangeeta.Misra@Sun.COM 	case EINPROGRESS:
163*10946SSangeeta.Misra@Sun.COM 		rc = ILB_STATUS_INPROGRESS;
164*10946SSangeeta.Misra@Sun.COM 		break;
165*10946SSangeeta.Misra@Sun.COM 	case EEXIST:
166*10946SSangeeta.Misra@Sun.COM 		rc = ILB_STATUS_EEXIST;
167*10946SSangeeta.Misra@Sun.COM 		break;
168*10946SSangeeta.Misra@Sun.COM 	}
169*10946SSangeeta.Misra@Sun.COM 	return (rc);
170*10946SSangeeta.Misra@Sun.COM }
171*10946SSangeeta.Misra@Sun.COM 
172*10946SSangeeta.Misra@Sun.COM static int
i_get_kcmd_sz(void * cmdp)173*10946SSangeeta.Misra@Sun.COM i_get_kcmd_sz(void *cmdp)
174*10946SSangeeta.Misra@Sun.COM {
175*10946SSangeeta.Misra@Sun.COM 	int		sz;
176*10946SSangeeta.Misra@Sun.COM 
177*10946SSangeeta.Misra@Sun.COM 	switch (((ilb_rule_cmd_t *)cmdp)->cmd) {
178*10946SSangeeta.Misra@Sun.COM 	case ILB_DESTROY_RULE:
179*10946SSangeeta.Misra@Sun.COM 	case ILB_ENABLE_RULE:
180*10946SSangeeta.Misra@Sun.COM 	case ILB_DISABLE_RULE:
181*10946SSangeeta.Misra@Sun.COM 		sz = sizeof (ilb_name_cmd_t);
182*10946SSangeeta.Misra@Sun.COM 		break;
183*10946SSangeeta.Misra@Sun.COM 	case ILB_CREATE_RULE:
184*10946SSangeeta.Misra@Sun.COM 	case ILB_LIST_RULE:
185*10946SSangeeta.Misra@Sun.COM 		sz = sizeof (ilb_rule_cmd_t);
186*10946SSangeeta.Misra@Sun.COM 		break;
187*10946SSangeeta.Misra@Sun.COM 	case ILB_NUM_RULES:
188*10946SSangeeta.Misra@Sun.COM 		sz = sizeof (ilb_num_rules_cmd_t);
189*10946SSangeeta.Misra@Sun.COM 		break;
190*10946SSangeeta.Misra@Sun.COM 	case ILB_NUM_SERVERS:
191*10946SSangeeta.Misra@Sun.COM 		sz = sizeof (ilb_num_servers_cmd_t);
192*10946SSangeeta.Misra@Sun.COM 		break;
193*10946SSangeeta.Misra@Sun.COM 	case ILB_ADD_SERVERS: {
194*10946SSangeeta.Misra@Sun.COM 		ilb_servers_info_cmd_t *kcmd = (ilb_servers_info_cmd_t *)cmdp;
195*10946SSangeeta.Misra@Sun.COM 
196*10946SSangeeta.Misra@Sun.COM 		sz = sizeof (*kcmd) + ((kcmd->num_servers - 1) *
197*10946SSangeeta.Misra@Sun.COM 		    sizeof (kcmd->servers));
198*10946SSangeeta.Misra@Sun.COM 		break;
199*10946SSangeeta.Misra@Sun.COM 	}
200*10946SSangeeta.Misra@Sun.COM 	case ILB_RULE_NAMES: {
201*10946SSangeeta.Misra@Sun.COM 		ilb_rule_names_cmd_t *kcmd = (ilb_rule_names_cmd_t *)cmdp;
202*10946SSangeeta.Misra@Sun.COM 
203*10946SSangeeta.Misra@Sun.COM 		sz = sizeof (*kcmd) +
204*10946SSangeeta.Misra@Sun.COM 		    ((kcmd->num_names - 1) * sizeof (kcmd->buf));
205*10946SSangeeta.Misra@Sun.COM 		break;
206*10946SSangeeta.Misra@Sun.COM 	}
207*10946SSangeeta.Misra@Sun.COM 	case ILB_DEL_SERVERS:
208*10946SSangeeta.Misra@Sun.COM 	case ILB_ENABLE_SERVERS:
209*10946SSangeeta.Misra@Sun.COM 	case ILB_DISABLE_SERVERS: {
210*10946SSangeeta.Misra@Sun.COM 		ilb_servers_cmd_t *kcmd = (ilb_servers_cmd_t *)cmdp;
211*10946SSangeeta.Misra@Sun.COM 
212*10946SSangeeta.Misra@Sun.COM 		sz = sizeof (*kcmd) +
213*10946SSangeeta.Misra@Sun.COM 		    ((kcmd->num_servers - 1) * sizeof (kcmd->servers));
214*10946SSangeeta.Misra@Sun.COM 		break;
215*10946SSangeeta.Misra@Sun.COM 	}
216*10946SSangeeta.Misra@Sun.COM 	default: sz = -1;
217*10946SSangeeta.Misra@Sun.COM 		break;
218*10946SSangeeta.Misra@Sun.COM 	}
219*10946SSangeeta.Misra@Sun.COM 	return (sz);
220*10946SSangeeta.Misra@Sun.COM }
221*10946SSangeeta.Misra@Sun.COM 
222*10946SSangeeta.Misra@Sun.COM /*
223*10946SSangeeta.Misra@Sun.COM  * parameter 'sz' is optional (indicated by == 0); if it's not set
224*10946SSangeeta.Misra@Sun.COM  * we try to derive it from cmdp->cmd
225*10946SSangeeta.Misra@Sun.COM  */
226*10946SSangeeta.Misra@Sun.COM ilb_status_t
do_ioctl(void * cmdp,ssize_t sz)227*10946SSangeeta.Misra@Sun.COM do_ioctl(void *cmdp, ssize_t sz)
228*10946SSangeeta.Misra@Sun.COM {
229*10946SSangeeta.Misra@Sun.COM 	struct strioctl	ioc;
230*10946SSangeeta.Misra@Sun.COM 	int		i_rc;
231*10946SSangeeta.Misra@Sun.COM 
232*10946SSangeeta.Misra@Sun.COM 	if (ksock == -1) {
233*10946SSangeeta.Misra@Sun.COM 		ksock = socket(AF_INET, SOCK_DGRAM, 0);
234*10946SSangeeta.Misra@Sun.COM 		if (ksock == -1) {
235*10946SSangeeta.Misra@Sun.COM 			logperror("do_ioctl: AF_INET socket call"
236*10946SSangeeta.Misra@Sun.COM 			    "  failed");
237*10946SSangeeta.Misra@Sun.COM 			return (ILB_STATUS_INTERNAL);
238*10946SSangeeta.Misra@Sun.COM 		}
239*10946SSangeeta.Misra@Sun.COM 	}
240*10946SSangeeta.Misra@Sun.COM 
241*10946SSangeeta.Misra@Sun.COM 	(void) memset(&ioc, 0, sizeof (ioc));
242*10946SSangeeta.Misra@Sun.COM 	ioc.ic_cmd = SIOCILB;
243*10946SSangeeta.Misra@Sun.COM 	ioc.ic_timout = 0;
244*10946SSangeeta.Misra@Sun.COM 	ioc.ic_dp = cmdp;
245*10946SSangeeta.Misra@Sun.COM 
246*10946SSangeeta.Misra@Sun.COM 	if (sz == 0) {
247*10946SSangeeta.Misra@Sun.COM 		sz = i_get_kcmd_sz(cmdp);
248*10946SSangeeta.Misra@Sun.COM 
249*10946SSangeeta.Misra@Sun.COM 		if (sz == -1) {
250*10946SSangeeta.Misra@Sun.COM 			logdebug("do_ioctl: unknown command");
251*10946SSangeeta.Misra@Sun.COM 			return (ILB_STATUS_INVAL_CMD);
252*10946SSangeeta.Misra@Sun.COM 		}
253*10946SSangeeta.Misra@Sun.COM 	}
254*10946SSangeeta.Misra@Sun.COM 
255*10946SSangeeta.Misra@Sun.COM 	ioc.ic_len = sz;
256*10946SSangeeta.Misra@Sun.COM 
257*10946SSangeeta.Misra@Sun.COM 	i_rc = ioctl(ksock, I_STR, (caddr_t)&ioc);
258*10946SSangeeta.Misra@Sun.COM 	if (i_rc == -1) {
259*10946SSangeeta.Misra@Sun.COM 		logdebug("do_ioctl: SIOCILB ioctl (%d) failed: %s",
260*10946SSangeeta.Misra@Sun.COM 		    *(ilb_cmd_t *)cmdp, strerror(errno));
261*10946SSangeeta.Misra@Sun.COM 		return (ilb_map_errno2ilbstat(errno));
262*10946SSangeeta.Misra@Sun.COM 	}
263*10946SSangeeta.Misra@Sun.COM 
264*10946SSangeeta.Misra@Sun.COM 	return (ILB_STATUS_OK);
265*10946SSangeeta.Misra@Sun.COM }
266*10946SSangeeta.Misra@Sun.COM 
267*10946SSangeeta.Misra@Sun.COM /*
268*10946SSangeeta.Misra@Sun.COM  * Create an OK reply to a client request.  It is assumed that the passed
269*10946SSangeeta.Misra@Sun.COM  * in buffer is large enough to hold the reply.
270*10946SSangeeta.Misra@Sun.COM  */
271*10946SSangeeta.Misra@Sun.COM void
ilbd_reply_ok(uint32_t * rbuf,size_t * rbufsz)272*10946SSangeeta.Misra@Sun.COM ilbd_reply_ok(uint32_t *rbuf, size_t *rbufsz)
273*10946SSangeeta.Misra@Sun.COM {
274*10946SSangeeta.Misra@Sun.COM 	ilb_comm_t *ic = (ilb_comm_t *)rbuf;
275*10946SSangeeta.Misra@Sun.COM 
276*10946SSangeeta.Misra@Sun.COM 	ic->ic_cmd = ILBD_CMD_OK;
277*10946SSangeeta.Misra@Sun.COM 	/* Default is one exchange of request/response. */
278*10946SSangeeta.Misra@Sun.COM 	ic->ic_flags = ILB_COMM_END;
279*10946SSangeeta.Misra@Sun.COM 	*rbufsz = sizeof (ilb_comm_t);
280*10946SSangeeta.Misra@Sun.COM }
281*10946SSangeeta.Misra@Sun.COM 
282*10946SSangeeta.Misra@Sun.COM /*
283*10946SSangeeta.Misra@Sun.COM  * Create an error reply to a client request.  It is assumed that the passed
284*10946SSangeeta.Misra@Sun.COM  * in buffer is large enough to hold the reply.
285*10946SSangeeta.Misra@Sun.COM  */
286*10946SSangeeta.Misra@Sun.COM void
ilbd_reply_err(uint32_t * rbuf,size_t * rbufsz,ilb_status_t status)287*10946SSangeeta.Misra@Sun.COM ilbd_reply_err(uint32_t *rbuf, size_t *rbufsz, ilb_status_t status)
288*10946SSangeeta.Misra@Sun.COM {
289*10946SSangeeta.Misra@Sun.COM 	ilb_comm_t *ic = (ilb_comm_t *)rbuf;
290*10946SSangeeta.Misra@Sun.COM 
291*10946SSangeeta.Misra@Sun.COM 	ic->ic_cmd = ILBD_CMD_ERROR;
292*10946SSangeeta.Misra@Sun.COM 	/* Default is one exchange of request/response. */
293*10946SSangeeta.Misra@Sun.COM 	ic->ic_flags = ILB_COMM_END;
294*10946SSangeeta.Misra@Sun.COM 	*(ilb_status_t *)&ic->ic_data = status;
295*10946SSangeeta.Misra@Sun.COM 	*rbufsz = sizeof (ilb_comm_t) + sizeof (ilb_status_t);
296*10946SSangeeta.Misra@Sun.COM }
297