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