1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21da6c28aaSamw /*
229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23da6c28aaSamw  * Use is subject to license terms.
24b819cea2SGordon Ross  *
25b819cea2SGordon Ross  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
26da6c28aaSamw  */
27da6c28aaSamw 
28da6c28aaSamw /*
299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Legacy encode/decode routines for door clients and servers.
30da6c28aaSamw  */
31da6c28aaSamw 
32b819cea2SGordon Ross #if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <errno.h>
349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <string.h>
359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <strings.h>
369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #else
37da6c28aaSamw #include <sys/types.h>
38da6c28aaSamw #include <sys/sunddi.h>
39da6c28aaSamw #include <sys/errno.h>
40da6c28aaSamw #endif
41da6c28aaSamw 
42*3299f39fSGordon Ross #include <smb/wintypes.h>
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_share.h>
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_door.h>
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/alloc.h>
469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smbinfo.h>
47da6c28aaSamw 
48da6c28aaSamw smb_dr_ctx_t *
smb_dr_decode_start(char * ptr,int size)49da6c28aaSamw smb_dr_decode_start(char *ptr, int size)
50da6c28aaSamw {
51da6c28aaSamw 	smb_dr_ctx_t *ctx = MEM_MALLOC("CommonDoor", sizeof (smb_dr_ctx_t));
52da6c28aaSamw 	if (ctx) {
53da6c28aaSamw 		ctx->start_ptr = ctx->ptr = ptr;
54da6c28aaSamw 		ctx->end_ptr = ptr + size;
55da6c28aaSamw 		ctx->status = 0;
56da6c28aaSamw 	}
57da6c28aaSamw 	return (ctx);
58da6c28aaSamw }
59da6c28aaSamw 
60da6c28aaSamw int
smb_dr_decode_finish(smb_dr_ctx_t * ctx)61da6c28aaSamw smb_dr_decode_finish(smb_dr_ctx_t *ctx)
62da6c28aaSamw {
63da6c28aaSamw 	int status = ctx->status;
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (status == 0 && ctx->ptr != ctx->end_ptr)
65da6c28aaSamw 		status = ENOTEMPTY;
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
67da6c28aaSamw 	MEM_FREE("CommonDoor", ctx);
68da6c28aaSamw 	return (status);
69da6c28aaSamw }
70da6c28aaSamw 
71da6c28aaSamw smb_dr_ctx_t *
smb_dr_encode_start(char * ptr,int size)72da6c28aaSamw smb_dr_encode_start(char *ptr, int size)
73da6c28aaSamw {
74da6c28aaSamw 	smb_dr_ctx_t *ctx = MEM_MALLOC("CommonDoor",  sizeof (smb_dr_ctx_t));
75da6c28aaSamw 	if (ctx) {
76da6c28aaSamw 		ctx->start_ptr = ctx->ptr = ptr;
77da6c28aaSamw 		ctx->end_ptr = ptr + size;
78da6c28aaSamw 		ctx->status = 0;
79da6c28aaSamw 	}
80da6c28aaSamw 	return (ctx);
81da6c28aaSamw }
82da6c28aaSamw 
83da6c28aaSamw int
smb_dr_encode_finish(smb_dr_ctx_t * ctx,unsigned int * used)84da6c28aaSamw smb_dr_encode_finish(smb_dr_ctx_t *ctx, unsigned int *used)
85da6c28aaSamw {
86da6c28aaSamw 	int status = ctx->status;
87da6c28aaSamw 	if (status == 0) {
88da6c28aaSamw 		if (ctx->ptr < ctx->end_ptr) {
89da6c28aaSamw 			/*LINTED E_PTRDIFF_OVERFLOW*/
90da6c28aaSamw 			*used = ctx->ptr - ctx->start_ptr;
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
92da6c28aaSamw 			status = ENOSPC;
939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
94da6c28aaSamw 	}
95da6c28aaSamw 
96da6c28aaSamw 	MEM_FREE("CommonDoor", ctx);
97da6c28aaSamw 	return (status);
98da6c28aaSamw }
99da6c28aaSamw 
100da6c28aaSamw DWORD
smb_dr_get_dword(smb_dr_ctx_t * ctx)101da6c28aaSamw smb_dr_get_dword(smb_dr_ctx_t *ctx)
102da6c28aaSamw {
103da6c28aaSamw 	DWORD num = 0;
104da6c28aaSamw 	if (ctx->status == 0) {
105da6c28aaSamw 		if (ctx->ptr + sizeof (DWORD) <= ctx->end_ptr) {
106da6c28aaSamw 			(void) memcpy(&num, ctx->ptr, sizeof (DWORD));
107da6c28aaSamw 			ctx->ptr += sizeof (DWORD);
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
109da6c28aaSamw 			ctx->status = ENOSPC;
1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
111da6c28aaSamw 	}
112da6c28aaSamw 	return (num);
113da6c28aaSamw }
114da6c28aaSamw 
115da6c28aaSamw int32_t
smb_dr_get_int32(smb_dr_ctx_t * ctx)116da6c28aaSamw smb_dr_get_int32(smb_dr_ctx_t *ctx)
117da6c28aaSamw {
118da6c28aaSamw 	int32_t num = 0;
119da6c28aaSamw 	if (ctx->status == 0) {
120da6c28aaSamw 		if (ctx->ptr + sizeof (int32_t) <= ctx->end_ptr) {
121da6c28aaSamw 			(void) memcpy(&num, ctx->ptr, sizeof (int32_t));
122da6c28aaSamw 			ctx->ptr += sizeof (int32_t);
1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
124da6c28aaSamw 			ctx->status = ENOSPC;
1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
126da6c28aaSamw 	}
127da6c28aaSamw 	return (num);
128da6c28aaSamw }
129da6c28aaSamw 
130da6c28aaSamw uint32_t
smb_dr_get_uint32(smb_dr_ctx_t * ctx)131da6c28aaSamw smb_dr_get_uint32(smb_dr_ctx_t *ctx)
132da6c28aaSamw {
133da6c28aaSamw 	return ((uint32_t)smb_dr_get_int32(ctx));
134da6c28aaSamw }
135da6c28aaSamw 
136da6c28aaSamw char *
smb_dr_get_string(smb_dr_ctx_t * ctx)137da6c28aaSamw smb_dr_get_string(smb_dr_ctx_t *ctx)
138da6c28aaSamw {
139da6c28aaSamw 	char *buf = NULL;
140da6c28aaSamw 	int len = smb_dr_get_int32(ctx);
141da6c28aaSamw 
142da6c28aaSamw 	if (ctx->status == 0) {
143da6c28aaSamw 		if (len == -1)
144da6c28aaSamw 			return (buf);
145da6c28aaSamw 
146da6c28aaSamw 		if (ctx->ptr + len <= ctx->end_ptr) {
147da6c28aaSamw 			buf = MEM_MALLOC("CommonDoor", len +1);
148da6c28aaSamw 			if (buf) {
1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				if (len == 0) {
150da6c28aaSamw 					(void) strcpy(buf, "");
1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				} else {
152da6c28aaSamw 					(void) memcpy(buf, ctx->ptr, len);
153da6c28aaSamw 					ctx->ptr += len;
154da6c28aaSamw 					*(buf + len) = '\0';
155da6c28aaSamw 				}
1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			} else {
157b819cea2SGordon Ross #if !defined(_KERNEL) && !defined(_FAKE_KERNEL)
158da6c28aaSamw 				ctx->status = errno;
159da6c28aaSamw #else
160da6c28aaSamw 				ctx->status = ENOMEM;
161da6c28aaSamw #endif
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
164da6c28aaSamw 			ctx->status = ENOSPC;
1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
166da6c28aaSamw 	}
167da6c28aaSamw 	return (buf);
168da6c28aaSamw }
169da6c28aaSamw 
170da6c28aaSamw void
smb_dr_put_dword(smb_dr_ctx_t * ctx,DWORD num)171da6c28aaSamw smb_dr_put_dword(smb_dr_ctx_t *ctx, DWORD num)
172da6c28aaSamw {
173da6c28aaSamw 	if (ctx->status == 0) {
174da6c28aaSamw 		if (ctx->ptr + sizeof (DWORD) <= ctx->end_ptr) {
175da6c28aaSamw 			(void) memcpy(ctx->ptr, &num, sizeof (DWORD));
176da6c28aaSamw 			ctx->ptr += sizeof (DWORD);
1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
178da6c28aaSamw 			ctx->status = ENOSPC;
1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
180da6c28aaSamw 	}
181da6c28aaSamw }
182da6c28aaSamw 
183da6c28aaSamw void
smb_dr_put_int32(smb_dr_ctx_t * ctx,int32_t num)184da6c28aaSamw smb_dr_put_int32(smb_dr_ctx_t *ctx, int32_t num)
185da6c28aaSamw {
186da6c28aaSamw 	if (ctx->status == 0) {
187da6c28aaSamw 		if (ctx->ptr + sizeof (int32_t) <= ctx->end_ptr) {
188da6c28aaSamw 			(void) memcpy(ctx->ptr, &num, sizeof (int32_t));
189da6c28aaSamw 			ctx->ptr += sizeof (int32_t);
1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
191da6c28aaSamw 			ctx->status = ENOSPC;
1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
193da6c28aaSamw 	}
194da6c28aaSamw }
195da6c28aaSamw 
196da6c28aaSamw void
smb_dr_put_uint32(smb_dr_ctx_t * ctx,uint32_t num)197da6c28aaSamw smb_dr_put_uint32(smb_dr_ctx_t *ctx, uint32_t num)
198da6c28aaSamw {
199da6c28aaSamw 	smb_dr_put_int32(ctx, (int32_t)num);
200da6c28aaSamw }
201da6c28aaSamw 
202da6c28aaSamw void
smb_dr_put_string(smb_dr_ctx_t * ctx,const char * buf)203c8ec8eeaSjose borrego smb_dr_put_string(smb_dr_ctx_t *ctx, const char *buf)
204da6c28aaSamw {
205da6c28aaSamw 	int len;
206da6c28aaSamw 
207da6c28aaSamw 	if (!buf)
208da6c28aaSamw 		len = -1;
209da6c28aaSamw 	else
210da6c28aaSamw 		len = strlen(buf);
211da6c28aaSamw 
212da6c28aaSamw 	if (ctx->status == 0) {
213da6c28aaSamw 		smb_dr_put_int32(ctx, len);
214da6c28aaSamw 		if (len <= 0)
215da6c28aaSamw 			return;
216da6c28aaSamw 
217da6c28aaSamw 		if (ctx->ptr + len <= ctx->end_ptr) {
218da6c28aaSamw 			(void) memcpy(ctx->ptr, buf, len);
219da6c28aaSamw 			ctx->ptr += len;
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
221da6c28aaSamw 			ctx->status = ENOSPC;
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
223da6c28aaSamw 	}
224da6c28aaSamw }
225da6c28aaSamw 
226da6c28aaSamw void
smb_dr_free_string(char * buf)227da6c28aaSamw smb_dr_free_string(char *buf)
228da6c28aaSamw {
229da6c28aaSamw 	if (buf)
230da6c28aaSamw 		MEM_FREE("CommonDoor", buf);
231da6c28aaSamw }
232da6c28aaSamw 
233da6c28aaSamw int64_t
smb_dr_get_int64(smb_dr_ctx_t * ctx)234da6c28aaSamw smb_dr_get_int64(smb_dr_ctx_t *ctx)
235da6c28aaSamw {
236da6c28aaSamw 	int64_t num = 0;
237da6c28aaSamw 	if (ctx->status == 0) {
238da6c28aaSamw 		if (ctx->ptr + sizeof (int64_t) <= ctx->end_ptr) {
239da6c28aaSamw 			(void) memcpy(&num, ctx->ptr, sizeof (int64_t));
240da6c28aaSamw 			ctx->ptr += sizeof (int64_t);
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
242da6c28aaSamw 			ctx->status = ENOSPC;
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
244da6c28aaSamw 	}
245da6c28aaSamw 	return (num);
246da6c28aaSamw }
247da6c28aaSamw 
248da6c28aaSamw uint64_t
smb_dr_get_uint64(smb_dr_ctx_t * ctx)249da6c28aaSamw smb_dr_get_uint64(smb_dr_ctx_t *ctx)
250da6c28aaSamw {
251da6c28aaSamw 	return ((uint64_t)smb_dr_get_int64(ctx));
252da6c28aaSamw }
253da6c28aaSamw 
254da6c28aaSamw 
255da6c28aaSamw void
smb_dr_put_int64(smb_dr_ctx_t * ctx,int64_t num)256da6c28aaSamw smb_dr_put_int64(smb_dr_ctx_t *ctx, int64_t num)
257da6c28aaSamw {
258da6c28aaSamw 	if (ctx->status == 0) {
259da6c28aaSamw 		if (ctx->ptr + sizeof (int64_t) <= ctx->end_ptr) {
260da6c28aaSamw 			(void) memcpy(ctx->ptr, &num, sizeof (int64_t));
261da6c28aaSamw 			ctx->ptr += sizeof (int64_t);
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
263da6c28aaSamw 			ctx->status = ENOSPC;
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
265da6c28aaSamw 	}
266da6c28aaSamw }
267da6c28aaSamw 
268da6c28aaSamw void
smb_dr_put_uint64(smb_dr_ctx_t * ctx,uint64_t num)269da6c28aaSamw smb_dr_put_uint64(smb_dr_ctx_t *ctx, uint64_t num)
270da6c28aaSamw {
271da6c28aaSamw 	smb_dr_put_int64(ctx, (int64_t)num);
272da6c28aaSamw }
273da6c28aaSamw 
274da6c28aaSamw void
smb_dr_put_short(smb_dr_ctx_t * ctx,short num)275da6c28aaSamw smb_dr_put_short(smb_dr_ctx_t *ctx, short num)
276da6c28aaSamw {
277da6c28aaSamw 	if (ctx->status == 0) {
278da6c28aaSamw 		if (ctx->ptr + sizeof (short) <= ctx->end_ptr) {
279da6c28aaSamw 			(void) memcpy(ctx->ptr, &num, sizeof (short));
280da6c28aaSamw 			ctx->ptr += sizeof (short);
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
282da6c28aaSamw 			ctx->status = ENOSPC;
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
284da6c28aaSamw 	}
285da6c28aaSamw }
286da6c28aaSamw 
287da6c28aaSamw short
smb_dr_get_short(smb_dr_ctx_t * ctx)288da6c28aaSamw smb_dr_get_short(smb_dr_ctx_t *ctx)
289da6c28aaSamw {
290da6c28aaSamw 	short num = 0;
291da6c28aaSamw 	if (ctx->status == 0) {
292da6c28aaSamw 		if (ctx->ptr + sizeof (short) <= ctx->end_ptr) {
293da6c28aaSamw 			(void) memcpy(&num, ctx->ptr, sizeof (short));
294da6c28aaSamw 			ctx->ptr += sizeof (short);
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
296da6c28aaSamw 			ctx->status = ENOSPC;
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
298da6c28aaSamw 	}
299da6c28aaSamw 	return (num);
300da6c28aaSamw }
301da6c28aaSamw 
302da6c28aaSamw void
smb_dr_put_ushort(smb_dr_ctx_t * ctx,unsigned short num)303da6c28aaSamw smb_dr_put_ushort(smb_dr_ctx_t *ctx, unsigned short num)
304da6c28aaSamw {
305da6c28aaSamw 	smb_dr_put_short(ctx, (short)num);
306da6c28aaSamw }
307da6c28aaSamw 
308da6c28aaSamw unsigned short
smb_dr_get_ushort(smb_dr_ctx_t * ctx)309da6c28aaSamw smb_dr_get_ushort(smb_dr_ctx_t *ctx)
310da6c28aaSamw {
311da6c28aaSamw 	return ((unsigned short)smb_dr_get_short(ctx));
312da6c28aaSamw }
313da6c28aaSamw 
314da6c28aaSamw void
smb_dr_put_word(smb_dr_ctx_t * ctx,WORD num)315da6c28aaSamw smb_dr_put_word(smb_dr_ctx_t *ctx, WORD num)
316da6c28aaSamw {
317da6c28aaSamw 	smb_dr_put_ushort(ctx, num);
318da6c28aaSamw }
319da6c28aaSamw 
320da6c28aaSamw WORD
smb_dr_get_word(smb_dr_ctx_t * ctx)321da6c28aaSamw smb_dr_get_word(smb_dr_ctx_t *ctx)
322da6c28aaSamw {
323da6c28aaSamw 	return (smb_dr_get_ushort(ctx));
324da6c28aaSamw }
325da6c28aaSamw 
326da6c28aaSamw void
smb_dr_put_BYTE(smb_dr_ctx_t * ctx,BYTE byte)327da6c28aaSamw smb_dr_put_BYTE(smb_dr_ctx_t *ctx, BYTE byte)
328da6c28aaSamw {
329da6c28aaSamw 	if (ctx->status == 0) {
330da6c28aaSamw 		if (ctx->ptr + sizeof (BYTE) <= ctx->end_ptr) {
331da6c28aaSamw 			(void) memcpy(ctx->ptr, &byte, sizeof (BYTE));
332da6c28aaSamw 			ctx->ptr += sizeof (BYTE);
3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
334da6c28aaSamw 			ctx->status = ENOSPC;
3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
336da6c28aaSamw 	}
337da6c28aaSamw }
338da6c28aaSamw 
339da6c28aaSamw BYTE
smb_dr_get_BYTE(smb_dr_ctx_t * ctx)340da6c28aaSamw smb_dr_get_BYTE(smb_dr_ctx_t *ctx)
341da6c28aaSamw {
342da6c28aaSamw 	BYTE byte = 0;
343da6c28aaSamw 	if (ctx->status == 0) {
344da6c28aaSamw 		if (ctx->ptr + sizeof (BYTE) <= ctx->end_ptr) {
345da6c28aaSamw 			(void) memcpy(&byte, ctx->ptr, sizeof (BYTE));
346da6c28aaSamw 			ctx->ptr += sizeof (BYTE);
3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
348da6c28aaSamw 			ctx->status = ENOSPC;
3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
350da6c28aaSamw 	}
351da6c28aaSamw 	return (byte);
352da6c28aaSamw }
353da6c28aaSamw 
354da6c28aaSamw void
smb_dr_put_buf(smb_dr_ctx_t * ctx,unsigned char * start,int len)355da6c28aaSamw smb_dr_put_buf(smb_dr_ctx_t *ctx, unsigned char *start, int len)
356da6c28aaSamw {
357da6c28aaSamw 	smb_dr_put_int32(ctx, len);
358da6c28aaSamw 	if (ctx->status == 0) {
359da6c28aaSamw 		if (ctx->ptr + len <= ctx->end_ptr) {
360da6c28aaSamw 			(void) memcpy(ctx->ptr, start, len);
361da6c28aaSamw 			ctx->ptr += len;
3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
363da6c28aaSamw 			ctx->status = ENOSPC;
3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
365da6c28aaSamw 	}
366da6c28aaSamw }
367da6c28aaSamw 
368da6c28aaSamw int
smb_dr_get_buf(smb_dr_ctx_t * ctx,unsigned char * buf,int bufsize)369da6c28aaSamw smb_dr_get_buf(smb_dr_ctx_t *ctx, unsigned char *buf, int bufsize)
370da6c28aaSamw {
371da6c28aaSamw 	int len = -1;
372da6c28aaSamw 
373da6c28aaSamw 	if (!buf)
374da6c28aaSamw 		return (-1);
375da6c28aaSamw 
376da6c28aaSamw 	len = smb_dr_get_int32(ctx);
377da6c28aaSamw 	if (ctx->status == 0) {
378da6c28aaSamw 		if (bufsize < len) {
379da6c28aaSamw 			ctx->status = ENOSPC;
380da6c28aaSamw 			return (-2);
381da6c28aaSamw 		}
382da6c28aaSamw 
383da6c28aaSamw 		if (ctx->ptr + len <= ctx->end_ptr) {
384da6c28aaSamw 			(void) memcpy(buf, ctx->ptr, len);
385da6c28aaSamw 			ctx->ptr += len;
386da6c28aaSamw 		} else {
387da6c28aaSamw 			ctx->status = ENOSPC;
388da6c28aaSamw 			return (-3);
389da6c28aaSamw 		}
390da6c28aaSamw 	}
391da6c28aaSamw 
392da6c28aaSamw 	return (len);
393da6c28aaSamw }
3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_dr_get_share(smb_dr_ctx_t * ctx,smb_share_t * si)3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_dr_get_share(smb_dr_ctx_t *ctx, smb_share_t *si)
3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ctx->status == 0) {
3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_dr_get_int32(ctx)) {
4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) memcpy(si, ctx->ptr, sizeof (smb_share_t));
4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			ctx->ptr += sizeof (smb_share_t);
4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			bzero(si, sizeof (smb_share_t));
4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero(si, sizeof (smb_share_t));
4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
smb_dr_put_share(smb_dr_ctx_t * ctx,smb_share_t * si)4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_dr_put_share(smb_dr_ctx_t *ctx, smb_share_t *si)
4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (si) {
4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_dr_put_int32(ctx, 1);
4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (ctx->ptr + sizeof (smb_share_t) <= ctx->end_ptr) {
4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) memcpy(ctx->ptr, si, sizeof (smb_share_t));
4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			ctx->ptr += sizeof (smb_share_t);
4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			ctx->status = ENOSPC;
4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_dr_put_int32(ctx, 0);
4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
425