xref: /onnv-gate/usr/src/lib/libndmp/common/libndmp_door_data.c (revision 7917:5c4442486198)
1*7917SReza.Sabdar@Sun.COM /*
2*7917SReza.Sabdar@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3*7917SReza.Sabdar@Sun.COM  * Use is subject to license terms.
4*7917SReza.Sabdar@Sun.COM  */
5*7917SReza.Sabdar@Sun.COM 
6*7917SReza.Sabdar@Sun.COM /*
7*7917SReza.Sabdar@Sun.COM  * BSD 3 Clause License
8*7917SReza.Sabdar@Sun.COM  *
9*7917SReza.Sabdar@Sun.COM  * Copyright (c) 2007, The Storage Networking Industry Association.
10*7917SReza.Sabdar@Sun.COM  *
11*7917SReza.Sabdar@Sun.COM  * Redistribution and use in source and binary forms, with or without
12*7917SReza.Sabdar@Sun.COM  * modification, are permitted provided that the following conditions
13*7917SReza.Sabdar@Sun.COM  * are met:
14*7917SReza.Sabdar@Sun.COM  * 	- Redistributions of source code must retain the above copyright
15*7917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer.
16*7917SReza.Sabdar@Sun.COM  *
17*7917SReza.Sabdar@Sun.COM  * 	- Redistributions in binary form must reproduce the above copyright
18*7917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer in
19*7917SReza.Sabdar@Sun.COM  *	  the documentation and/or other materials provided with the
20*7917SReza.Sabdar@Sun.COM  *	  distribution.
21*7917SReza.Sabdar@Sun.COM  *
22*7917SReza.Sabdar@Sun.COM  *	- Neither the name of The Storage Networking Industry Association (SNIA)
23*7917SReza.Sabdar@Sun.COM  *	  nor the names of its contributors may be used to endorse or promote
24*7917SReza.Sabdar@Sun.COM  *	  products derived from this software without specific prior written
25*7917SReza.Sabdar@Sun.COM  *	  permission.
26*7917SReza.Sabdar@Sun.COM  *
27*7917SReza.Sabdar@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28*7917SReza.Sabdar@Sun.COM  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29*7917SReza.Sabdar@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30*7917SReza.Sabdar@Sun.COM  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31*7917SReza.Sabdar@Sun.COM  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32*7917SReza.Sabdar@Sun.COM  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33*7917SReza.Sabdar@Sun.COM  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34*7917SReza.Sabdar@Sun.COM  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35*7917SReza.Sabdar@Sun.COM  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36*7917SReza.Sabdar@Sun.COM  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37*7917SReza.Sabdar@Sun.COM  * POSSIBILITY OF SUCH DAMAGE.
38*7917SReza.Sabdar@Sun.COM  */
39*7917SReza.Sabdar@Sun.COM 
40*7917SReza.Sabdar@Sun.COM /*
41*7917SReza.Sabdar@Sun.COM  * Provides encode/decode routines for all door servers/clients.
42*7917SReza.Sabdar@Sun.COM  */
43*7917SReza.Sabdar@Sun.COM 
44*7917SReza.Sabdar@Sun.COM #include <string.h>
45*7917SReza.Sabdar@Sun.COM #include <errno.h>
46*7917SReza.Sabdar@Sun.COM #include <stdlib.h>
47*7917SReza.Sabdar@Sun.COM #include <libndmp.h>
48*7917SReza.Sabdar@Sun.COM 
49*7917SReza.Sabdar@Sun.COM ndmp_door_ctx_t *
ndmp_door_decode_start(char * ptr,int size)50*7917SReza.Sabdar@Sun.COM ndmp_door_decode_start(char *ptr, int size)
51*7917SReza.Sabdar@Sun.COM {
52*7917SReza.Sabdar@Sun.COM 	ndmp_door_ctx_t *ctx = malloc(sizeof (ndmp_door_ctx_t));
53*7917SReza.Sabdar@Sun.COM 	if (ctx) {
54*7917SReza.Sabdar@Sun.COM 		ctx->start_ptr = ctx->ptr = ptr;
55*7917SReza.Sabdar@Sun.COM 		ctx->end_ptr = ptr + size;
56*7917SReza.Sabdar@Sun.COM 		ctx->status = 0;
57*7917SReza.Sabdar@Sun.COM 	}
58*7917SReza.Sabdar@Sun.COM 	return (ctx);
59*7917SReza.Sabdar@Sun.COM }
60*7917SReza.Sabdar@Sun.COM 
61*7917SReza.Sabdar@Sun.COM int
ndmp_door_decode_finish(ndmp_door_ctx_t * ctx)62*7917SReza.Sabdar@Sun.COM ndmp_door_decode_finish(ndmp_door_ctx_t *ctx)
63*7917SReza.Sabdar@Sun.COM {
64*7917SReza.Sabdar@Sun.COM 	int status = ctx->status;
65*7917SReza.Sabdar@Sun.COM 	if ((status == 0) && (ctx->ptr != ctx->end_ptr)) {
66*7917SReza.Sabdar@Sun.COM 		status = ENOTEMPTY;
67*7917SReza.Sabdar@Sun.COM 	}
68*7917SReza.Sabdar@Sun.COM 	free(ctx);
69*7917SReza.Sabdar@Sun.COM 	return (status);
70*7917SReza.Sabdar@Sun.COM }
71*7917SReza.Sabdar@Sun.COM 
72*7917SReza.Sabdar@Sun.COM ndmp_door_ctx_t *
ndmp_door_encode_start(char * ptr,int size)73*7917SReza.Sabdar@Sun.COM ndmp_door_encode_start(char *ptr, int size)
74*7917SReza.Sabdar@Sun.COM {
75*7917SReza.Sabdar@Sun.COM 	ndmp_door_ctx_t *ctx = malloc(sizeof (ndmp_door_ctx_t));
76*7917SReza.Sabdar@Sun.COM 	if (ctx) {
77*7917SReza.Sabdar@Sun.COM 		ctx->start_ptr = ctx->ptr = ptr;
78*7917SReza.Sabdar@Sun.COM 		ctx->end_ptr = ptr + size;
79*7917SReza.Sabdar@Sun.COM 		ctx->status = 0;
80*7917SReza.Sabdar@Sun.COM 	}
81*7917SReza.Sabdar@Sun.COM 	return (ctx);
82*7917SReza.Sabdar@Sun.COM }
83*7917SReza.Sabdar@Sun.COM 
84*7917SReza.Sabdar@Sun.COM int
ndmp_door_encode_finish(ndmp_door_ctx_t * ctx,unsigned int * used)85*7917SReza.Sabdar@Sun.COM ndmp_door_encode_finish(ndmp_door_ctx_t *ctx, unsigned int *used)
86*7917SReza.Sabdar@Sun.COM {
87*7917SReza.Sabdar@Sun.COM 	int status = ctx->status;
88*7917SReza.Sabdar@Sun.COM 	if (status == 0) {
89*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr < ctx->end_ptr) {
90*7917SReza.Sabdar@Sun.COM 			/*LINTED E_PTRDIFF_OVERFLOW*/
91*7917SReza.Sabdar@Sun.COM 			*used = ctx->ptr - ctx->start_ptr;
92*7917SReza.Sabdar@Sun.COM 		} else {
93*7917SReza.Sabdar@Sun.COM 			status = ENOSPC;
94*7917SReza.Sabdar@Sun.COM 		}
95*7917SReza.Sabdar@Sun.COM 	}
96*7917SReza.Sabdar@Sun.COM 	free(ctx);
97*7917SReza.Sabdar@Sun.COM 	return (status);
98*7917SReza.Sabdar@Sun.COM }
99*7917SReza.Sabdar@Sun.COM 
100*7917SReza.Sabdar@Sun.COM int32_t
ndmp_door_get_int32(ndmp_door_ctx_t * ctx)101*7917SReza.Sabdar@Sun.COM ndmp_door_get_int32(ndmp_door_ctx_t *ctx)
102*7917SReza.Sabdar@Sun.COM {
103*7917SReza.Sabdar@Sun.COM 	int32_t num = 0;
104*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
105*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + sizeof (int32_t) <= ctx->end_ptr) {
106*7917SReza.Sabdar@Sun.COM 			(void) memcpy(&num, ctx->ptr, sizeof (int32_t));
107*7917SReza.Sabdar@Sun.COM 			ctx->ptr += sizeof (int32_t);
108*7917SReza.Sabdar@Sun.COM 		} else {
109*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
110*7917SReza.Sabdar@Sun.COM 		}
111*7917SReza.Sabdar@Sun.COM 	}
112*7917SReza.Sabdar@Sun.COM 	return (num);
113*7917SReza.Sabdar@Sun.COM }
114*7917SReza.Sabdar@Sun.COM 
115*7917SReza.Sabdar@Sun.COM uint32_t
ndmp_door_get_uint32(ndmp_door_ctx_t * ctx)116*7917SReza.Sabdar@Sun.COM ndmp_door_get_uint32(ndmp_door_ctx_t *ctx)
117*7917SReza.Sabdar@Sun.COM {
118*7917SReza.Sabdar@Sun.COM 	return ((uint32_t)ndmp_door_get_int32(ctx));
119*7917SReza.Sabdar@Sun.COM }
120*7917SReza.Sabdar@Sun.COM 
121*7917SReza.Sabdar@Sun.COM char *
ndmp_door_get_string(ndmp_door_ctx_t * ctx)122*7917SReza.Sabdar@Sun.COM ndmp_door_get_string(ndmp_door_ctx_t *ctx)
123*7917SReza.Sabdar@Sun.COM {
124*7917SReza.Sabdar@Sun.COM 	char *buf = NULL;
125*7917SReza.Sabdar@Sun.COM 	int len = ndmp_door_get_int32(ctx);
126*7917SReza.Sabdar@Sun.COM 
127*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
128*7917SReza.Sabdar@Sun.COM 		if (len == -1)
129*7917SReza.Sabdar@Sun.COM 			return (buf);
130*7917SReza.Sabdar@Sun.COM 
131*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + len <= ctx->end_ptr) {
132*7917SReza.Sabdar@Sun.COM 			buf = malloc(len +1);
133*7917SReza.Sabdar@Sun.COM 			if (buf) {
134*7917SReza.Sabdar@Sun.COM 				if (len == 0) {
135*7917SReza.Sabdar@Sun.COM 					(void) strcpy(buf, "");
136*7917SReza.Sabdar@Sun.COM 				} else {
137*7917SReza.Sabdar@Sun.COM 					(void) memcpy(buf, ctx->ptr, len);
138*7917SReza.Sabdar@Sun.COM 					ctx->ptr += len;
139*7917SReza.Sabdar@Sun.COM 					*(buf + len) = '\0';
140*7917SReza.Sabdar@Sun.COM 				}
141*7917SReza.Sabdar@Sun.COM 			} else {
142*7917SReza.Sabdar@Sun.COM 				ctx->status = errno;
143*7917SReza.Sabdar@Sun.COM 			}
144*7917SReza.Sabdar@Sun.COM 		} else {
145*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
146*7917SReza.Sabdar@Sun.COM 		}
147*7917SReza.Sabdar@Sun.COM 	}
148*7917SReza.Sabdar@Sun.COM 	return (buf);
149*7917SReza.Sabdar@Sun.COM }
150*7917SReza.Sabdar@Sun.COM 
151*7917SReza.Sabdar@Sun.COM void
ndmp_door_put_int32(ndmp_door_ctx_t * ctx,int32_t num)152*7917SReza.Sabdar@Sun.COM ndmp_door_put_int32(ndmp_door_ctx_t *ctx, int32_t num)
153*7917SReza.Sabdar@Sun.COM {
154*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
155*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + sizeof (int32_t) <= ctx->end_ptr) {
156*7917SReza.Sabdar@Sun.COM 			(void) memcpy(ctx->ptr, &num, sizeof (int32_t));
157*7917SReza.Sabdar@Sun.COM 			ctx->ptr += sizeof (int32_t);
158*7917SReza.Sabdar@Sun.COM 		} else {
159*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
160*7917SReza.Sabdar@Sun.COM 		}
161*7917SReza.Sabdar@Sun.COM 	}
162*7917SReza.Sabdar@Sun.COM }
163*7917SReza.Sabdar@Sun.COM 
164*7917SReza.Sabdar@Sun.COM void
ndmp_door_put_uint32(ndmp_door_ctx_t * ctx,uint32_t num)165*7917SReza.Sabdar@Sun.COM ndmp_door_put_uint32(ndmp_door_ctx_t *ctx, uint32_t num)
166*7917SReza.Sabdar@Sun.COM {
167*7917SReza.Sabdar@Sun.COM 	ndmp_door_put_int32(ctx, (int32_t)num);
168*7917SReza.Sabdar@Sun.COM }
169*7917SReza.Sabdar@Sun.COM 
170*7917SReza.Sabdar@Sun.COM void
ndmp_door_put_string(ndmp_door_ctx_t * ctx,char * buf)171*7917SReza.Sabdar@Sun.COM ndmp_door_put_string(ndmp_door_ctx_t *ctx, char *buf)
172*7917SReza.Sabdar@Sun.COM {
173*7917SReza.Sabdar@Sun.COM 	int len;
174*7917SReza.Sabdar@Sun.COM 
175*7917SReza.Sabdar@Sun.COM 	if (!buf)
176*7917SReza.Sabdar@Sun.COM 		len = -1;
177*7917SReza.Sabdar@Sun.COM 	else
178*7917SReza.Sabdar@Sun.COM 		len = strlen(buf);
179*7917SReza.Sabdar@Sun.COM 
180*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
181*7917SReza.Sabdar@Sun.COM 		ndmp_door_put_int32(ctx, len);
182*7917SReza.Sabdar@Sun.COM 		if (len <= 0)
183*7917SReza.Sabdar@Sun.COM 			return;
184*7917SReza.Sabdar@Sun.COM 
185*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + len <= ctx->end_ptr) {
186*7917SReza.Sabdar@Sun.COM 			(void) memcpy(ctx->ptr, buf, len);
187*7917SReza.Sabdar@Sun.COM 			ctx->ptr += len;
188*7917SReza.Sabdar@Sun.COM 		} else {
189*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
190*7917SReza.Sabdar@Sun.COM 		}
191*7917SReza.Sabdar@Sun.COM 	}
192*7917SReza.Sabdar@Sun.COM }
193*7917SReza.Sabdar@Sun.COM 
194*7917SReza.Sabdar@Sun.COM void
ndmp_door_free_string(char * buf)195*7917SReza.Sabdar@Sun.COM ndmp_door_free_string(char *buf)
196*7917SReza.Sabdar@Sun.COM {
197*7917SReza.Sabdar@Sun.COM 	free(buf);
198*7917SReza.Sabdar@Sun.COM }
199*7917SReza.Sabdar@Sun.COM 
200*7917SReza.Sabdar@Sun.COM int64_t
ndmp_door_get_int64(ndmp_door_ctx_t * ctx)201*7917SReza.Sabdar@Sun.COM ndmp_door_get_int64(ndmp_door_ctx_t *ctx)
202*7917SReza.Sabdar@Sun.COM {
203*7917SReza.Sabdar@Sun.COM 	int64_t num = 0;
204*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
205*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + sizeof (int64_t) <= ctx->end_ptr) {
206*7917SReza.Sabdar@Sun.COM 			(void) memcpy(&num, ctx->ptr, sizeof (int64_t));
207*7917SReza.Sabdar@Sun.COM 			ctx->ptr += sizeof (int64_t);
208*7917SReza.Sabdar@Sun.COM 		} else {
209*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
210*7917SReza.Sabdar@Sun.COM 		}
211*7917SReza.Sabdar@Sun.COM 	}
212*7917SReza.Sabdar@Sun.COM 	return (num);
213*7917SReza.Sabdar@Sun.COM }
214*7917SReza.Sabdar@Sun.COM 
215*7917SReza.Sabdar@Sun.COM uint64_t
ndmp_door_get_uint64(ndmp_door_ctx_t * ctx)216*7917SReza.Sabdar@Sun.COM ndmp_door_get_uint64(ndmp_door_ctx_t *ctx)
217*7917SReza.Sabdar@Sun.COM {
218*7917SReza.Sabdar@Sun.COM 	return ((uint64_t)ndmp_door_get_int64(ctx));
219*7917SReza.Sabdar@Sun.COM }
220*7917SReza.Sabdar@Sun.COM 
221*7917SReza.Sabdar@Sun.COM 
222*7917SReza.Sabdar@Sun.COM void
ndmp_door_put_int64(ndmp_door_ctx_t * ctx,int64_t num)223*7917SReza.Sabdar@Sun.COM ndmp_door_put_int64(ndmp_door_ctx_t *ctx, int64_t num)
224*7917SReza.Sabdar@Sun.COM {
225*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
226*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + sizeof (int64_t) <= ctx->end_ptr) {
227*7917SReza.Sabdar@Sun.COM 			(void) memcpy(ctx->ptr, &num, sizeof (int64_t));
228*7917SReza.Sabdar@Sun.COM 			ctx->ptr += sizeof (int64_t);
229*7917SReza.Sabdar@Sun.COM 		} else {
230*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
231*7917SReza.Sabdar@Sun.COM 		}
232*7917SReza.Sabdar@Sun.COM 	}
233*7917SReza.Sabdar@Sun.COM }
234*7917SReza.Sabdar@Sun.COM 
235*7917SReza.Sabdar@Sun.COM void
ndmp_door_put_uint64(ndmp_door_ctx_t * ctx,uint64_t num)236*7917SReza.Sabdar@Sun.COM ndmp_door_put_uint64(ndmp_door_ctx_t *ctx, uint64_t num)
237*7917SReza.Sabdar@Sun.COM {
238*7917SReza.Sabdar@Sun.COM 	ndmp_door_put_int64(ctx, (int64_t)num);
239*7917SReza.Sabdar@Sun.COM }
240*7917SReza.Sabdar@Sun.COM 
241*7917SReza.Sabdar@Sun.COM void
ndmp_door_put_short(ndmp_door_ctx_t * ctx,short num)242*7917SReza.Sabdar@Sun.COM ndmp_door_put_short(ndmp_door_ctx_t *ctx, short num)
243*7917SReza.Sabdar@Sun.COM {
244*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
245*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + sizeof (short) <= ctx->end_ptr) {
246*7917SReza.Sabdar@Sun.COM 			(void) memcpy(ctx->ptr, &num, sizeof (short));
247*7917SReza.Sabdar@Sun.COM 			ctx->ptr += sizeof (short);
248*7917SReza.Sabdar@Sun.COM 		} else {
249*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
250*7917SReza.Sabdar@Sun.COM 		}
251*7917SReza.Sabdar@Sun.COM 	}
252*7917SReza.Sabdar@Sun.COM }
253*7917SReza.Sabdar@Sun.COM 
254*7917SReza.Sabdar@Sun.COM short
ndmp_door_get_short(ndmp_door_ctx_t * ctx)255*7917SReza.Sabdar@Sun.COM ndmp_door_get_short(ndmp_door_ctx_t *ctx)
256*7917SReza.Sabdar@Sun.COM {
257*7917SReza.Sabdar@Sun.COM 	short num = 0;
258*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
259*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + sizeof (short) <= ctx->end_ptr) {
260*7917SReza.Sabdar@Sun.COM 			(void) memcpy(&num, ctx->ptr, sizeof (short));
261*7917SReza.Sabdar@Sun.COM 			ctx->ptr += sizeof (short);
262*7917SReza.Sabdar@Sun.COM 		} else {
263*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
264*7917SReza.Sabdar@Sun.COM 		}
265*7917SReza.Sabdar@Sun.COM 	}
266*7917SReza.Sabdar@Sun.COM 	return (num);
267*7917SReza.Sabdar@Sun.COM }
268*7917SReza.Sabdar@Sun.COM 
269*7917SReza.Sabdar@Sun.COM void
ndmp_door_put_ushort(ndmp_door_ctx_t * ctx,unsigned short num)270*7917SReza.Sabdar@Sun.COM ndmp_door_put_ushort(ndmp_door_ctx_t *ctx, unsigned short num)
271*7917SReza.Sabdar@Sun.COM {
272*7917SReza.Sabdar@Sun.COM 	ndmp_door_put_short(ctx, (short)num);
273*7917SReza.Sabdar@Sun.COM }
274*7917SReza.Sabdar@Sun.COM 
275*7917SReza.Sabdar@Sun.COM unsigned short
ndmp_door_get_ushort(ndmp_door_ctx_t * ctx)276*7917SReza.Sabdar@Sun.COM ndmp_door_get_ushort(ndmp_door_ctx_t *ctx)
277*7917SReza.Sabdar@Sun.COM {
278*7917SReza.Sabdar@Sun.COM 	return ((unsigned short)ndmp_door_get_short(ctx));
279*7917SReza.Sabdar@Sun.COM }
280*7917SReza.Sabdar@Sun.COM 
281*7917SReza.Sabdar@Sun.COM void
ndmp_door_put_buf(ndmp_door_ctx_t * ctx,unsigned char * start,int len)282*7917SReza.Sabdar@Sun.COM ndmp_door_put_buf(ndmp_door_ctx_t *ctx, unsigned char *start, int len)
283*7917SReza.Sabdar@Sun.COM {
284*7917SReza.Sabdar@Sun.COM 	ndmp_door_put_int32(ctx, len);
285*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
286*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + len <= ctx->end_ptr) {
287*7917SReza.Sabdar@Sun.COM 			(void) memcpy(ctx->ptr, start, len);
288*7917SReza.Sabdar@Sun.COM 			ctx->ptr += len;
289*7917SReza.Sabdar@Sun.COM 		} else {
290*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
291*7917SReza.Sabdar@Sun.COM 		}
292*7917SReza.Sabdar@Sun.COM 	}
293*7917SReza.Sabdar@Sun.COM }
294*7917SReza.Sabdar@Sun.COM 
295*7917SReza.Sabdar@Sun.COM int
ndmp_door_get_buf(ndmp_door_ctx_t * ctx,unsigned char * buf,int bufsize)296*7917SReza.Sabdar@Sun.COM ndmp_door_get_buf(ndmp_door_ctx_t *ctx, unsigned char *buf, int bufsize)
297*7917SReza.Sabdar@Sun.COM {
298*7917SReza.Sabdar@Sun.COM 	int len = -1;
299*7917SReza.Sabdar@Sun.COM 
300*7917SReza.Sabdar@Sun.COM 	if (!buf)
301*7917SReza.Sabdar@Sun.COM 		return (-1);
302*7917SReza.Sabdar@Sun.COM 
303*7917SReza.Sabdar@Sun.COM 	len = ndmp_door_get_int32(ctx);
304*7917SReza.Sabdar@Sun.COM 	if (ctx->status == 0) {
305*7917SReza.Sabdar@Sun.COM 		if (bufsize < len) {
306*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
307*7917SReza.Sabdar@Sun.COM 			return (-2);
308*7917SReza.Sabdar@Sun.COM 		}
309*7917SReza.Sabdar@Sun.COM 
310*7917SReza.Sabdar@Sun.COM 		if (ctx->ptr + len <= ctx->end_ptr) {
311*7917SReza.Sabdar@Sun.COM 			(void) memcpy(buf, ctx->ptr, len);
312*7917SReza.Sabdar@Sun.COM 			ctx->ptr += len;
313*7917SReza.Sabdar@Sun.COM 		} else {
314*7917SReza.Sabdar@Sun.COM 			ctx->status = ENOSPC;
315*7917SReza.Sabdar@Sun.COM 			return (-3);
316*7917SReza.Sabdar@Sun.COM 		}
317*7917SReza.Sabdar@Sun.COM 	}
318*7917SReza.Sabdar@Sun.COM 
319*7917SReza.Sabdar@Sun.COM 	return (len);
320*7917SReza.Sabdar@Sun.COM }
321