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 /*
22*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23da6c28aaSamw  * Use is subject to license terms.
24da6c28aaSamw  */
25da6c28aaSamw 
26da6c28aaSamw /*
27*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Legacy encode/decode routines for door clients and servers.
28da6c28aaSamw  */
29da6c28aaSamw 
30*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #ifndef _KERNEL
31*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <errno.h>
32*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <string.h>
33*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <strings.h>
34*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #else
35da6c28aaSamw #include <sys/types.h>
36da6c28aaSamw #include <sys/sunddi.h>
37da6c28aaSamw #include <sys/errno.h>
38da6c28aaSamw #endif
39da6c28aaSamw 
40da6c28aaSamw #include <smbsrv/wintypes.h>
41*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_share.h>
42*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_door.h>
43*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/alloc.h>
44*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smbinfo.h>
45da6c28aaSamw 
46da6c28aaSamw smb_dr_ctx_t *
47da6c28aaSamw smb_dr_decode_start(char *ptr, int size)
48da6c28aaSamw {
49da6c28aaSamw 	smb_dr_ctx_t *ctx = MEM_MALLOC("CommonDoor", sizeof (smb_dr_ctx_t));
50da6c28aaSamw 	if (ctx) {
51da6c28aaSamw 		ctx->start_ptr = ctx->ptr = ptr;
52da6c28aaSamw 		ctx->end_ptr = ptr + size;
53da6c28aaSamw 		ctx->status = 0;
54da6c28aaSamw 	}
55da6c28aaSamw 	return (ctx);
56da6c28aaSamw }
57da6c28aaSamw 
58da6c28aaSamw int
59da6c28aaSamw smb_dr_decode_finish(smb_dr_ctx_t *ctx)
60da6c28aaSamw {
61da6c28aaSamw 	int status = ctx->status;
62*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (status == 0 && ctx->ptr != ctx->end_ptr)
63da6c28aaSamw 		status = ENOTEMPTY;
64*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
65da6c28aaSamw 	MEM_FREE("CommonDoor", ctx);
66da6c28aaSamw 	return (status);
67da6c28aaSamw }
68da6c28aaSamw 
69da6c28aaSamw smb_dr_ctx_t *
70da6c28aaSamw smb_dr_encode_start(char *ptr, int size)
71da6c28aaSamw {
72da6c28aaSamw 	smb_dr_ctx_t *ctx = MEM_MALLOC("CommonDoor",  sizeof (smb_dr_ctx_t));
73da6c28aaSamw 	if (ctx) {
74da6c28aaSamw 		ctx->start_ptr = ctx->ptr = ptr;
75da6c28aaSamw 		ctx->end_ptr = ptr + size;
76da6c28aaSamw 		ctx->status = 0;
77da6c28aaSamw 	}
78da6c28aaSamw 	return (ctx);
79da6c28aaSamw }
80da6c28aaSamw 
81da6c28aaSamw int
82da6c28aaSamw smb_dr_encode_finish(smb_dr_ctx_t *ctx, unsigned int *used)
83da6c28aaSamw {
84da6c28aaSamw 	int status = ctx->status;
85da6c28aaSamw 	if (status == 0) {
86da6c28aaSamw 		if (ctx->ptr < ctx->end_ptr) {
87da6c28aaSamw 			/*LINTED E_PTRDIFF_OVERFLOW*/
88da6c28aaSamw 			*used = ctx->ptr - ctx->start_ptr;
89*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
90da6c28aaSamw 			status = ENOSPC;
91*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
92da6c28aaSamw 	}
93da6c28aaSamw 
94da6c28aaSamw 	MEM_FREE("CommonDoor", ctx);
95da6c28aaSamw 	return (status);
96da6c28aaSamw }
97da6c28aaSamw 
98da6c28aaSamw DWORD
99da6c28aaSamw smb_dr_get_dword(smb_dr_ctx_t *ctx)
100da6c28aaSamw {
101da6c28aaSamw 	DWORD num = 0;
102da6c28aaSamw 	if (ctx->status == 0) {
103da6c28aaSamw 		if (ctx->ptr + sizeof (DWORD) <= ctx->end_ptr) {
104da6c28aaSamw 			(void) memcpy(&num, ctx->ptr, sizeof (DWORD));
105da6c28aaSamw 			ctx->ptr += sizeof (DWORD);
106*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
107da6c28aaSamw 			ctx->status = ENOSPC;
108*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
109da6c28aaSamw 	}
110da6c28aaSamw 	return (num);
111da6c28aaSamw }
112da6c28aaSamw 
113da6c28aaSamw int32_t
114da6c28aaSamw smb_dr_get_int32(smb_dr_ctx_t *ctx)
115da6c28aaSamw {
116da6c28aaSamw 	int32_t num = 0;
117da6c28aaSamw 	if (ctx->status == 0) {
118da6c28aaSamw 		if (ctx->ptr + sizeof (int32_t) <= ctx->end_ptr) {
119da6c28aaSamw 			(void) memcpy(&num, ctx->ptr, sizeof (int32_t));
120da6c28aaSamw 			ctx->ptr += sizeof (int32_t);
121*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
122da6c28aaSamw 			ctx->status = ENOSPC;
123*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
124da6c28aaSamw 	}
125da6c28aaSamw 	return (num);
126da6c28aaSamw }
127da6c28aaSamw 
128da6c28aaSamw uint32_t
129da6c28aaSamw smb_dr_get_uint32(smb_dr_ctx_t *ctx)
130da6c28aaSamw {
131da6c28aaSamw 	return ((uint32_t)smb_dr_get_int32(ctx));
132da6c28aaSamw }
133da6c28aaSamw 
134da6c28aaSamw char *
135da6c28aaSamw smb_dr_get_string(smb_dr_ctx_t *ctx)
136da6c28aaSamw {
137da6c28aaSamw 	char *buf = NULL;
138da6c28aaSamw 	int len = smb_dr_get_int32(ctx);
139da6c28aaSamw 
140da6c28aaSamw 	if (ctx->status == 0) {
141da6c28aaSamw 		if (len == -1)
142da6c28aaSamw 			return (buf);
143da6c28aaSamw 
144da6c28aaSamw 		if (ctx->ptr + len <= ctx->end_ptr) {
145da6c28aaSamw 			buf = MEM_MALLOC("CommonDoor", len +1);
146da6c28aaSamw 			if (buf) {
147*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				if (len == 0) {
148da6c28aaSamw 					(void) strcpy(buf, "");
149*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				} else {
150da6c28aaSamw 					(void) memcpy(buf, ctx->ptr, len);
151da6c28aaSamw 					ctx->ptr += len;
152da6c28aaSamw 					*(buf + len) = '\0';
153da6c28aaSamw 				}
154*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			} else {
155da6c28aaSamw #ifndef _KERNEL
156da6c28aaSamw 				ctx->status = errno;
157da6c28aaSamw #else
158da6c28aaSamw 				ctx->status = ENOMEM;
159da6c28aaSamw #endif
160*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
161*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
162da6c28aaSamw 			ctx->status = ENOSPC;
163*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
164da6c28aaSamw 	}
165da6c28aaSamw 	return (buf);
166da6c28aaSamw }
167da6c28aaSamw 
168da6c28aaSamw void
169da6c28aaSamw smb_dr_put_dword(smb_dr_ctx_t *ctx, DWORD num)
170da6c28aaSamw {
171da6c28aaSamw 	if (ctx->status == 0) {
172da6c28aaSamw 		if (ctx->ptr + sizeof (DWORD) <= ctx->end_ptr) {
173da6c28aaSamw 			(void) memcpy(ctx->ptr, &num, sizeof (DWORD));
174da6c28aaSamw 			ctx->ptr += sizeof (DWORD);
175*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
176da6c28aaSamw 			ctx->status = ENOSPC;
177*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
178da6c28aaSamw 	}
179da6c28aaSamw }
180da6c28aaSamw 
181da6c28aaSamw void
182da6c28aaSamw smb_dr_put_int32(smb_dr_ctx_t *ctx, int32_t num)
183da6c28aaSamw {
184da6c28aaSamw 	if (ctx->status == 0) {
185da6c28aaSamw 		if (ctx->ptr + sizeof (int32_t) <= ctx->end_ptr) {
186da6c28aaSamw 			(void) memcpy(ctx->ptr, &num, sizeof (int32_t));
187da6c28aaSamw 			ctx->ptr += sizeof (int32_t);
188*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
189da6c28aaSamw 			ctx->status = ENOSPC;
190*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
191da6c28aaSamw 	}
192da6c28aaSamw }
193da6c28aaSamw 
194da6c28aaSamw void
195da6c28aaSamw smb_dr_put_uint32(smb_dr_ctx_t *ctx, uint32_t num)
196da6c28aaSamw {
197da6c28aaSamw 	smb_dr_put_int32(ctx, (int32_t)num);
198da6c28aaSamw }
199da6c28aaSamw 
200da6c28aaSamw void
201c8ec8eeaSjose borrego smb_dr_put_string(smb_dr_ctx_t *ctx, const char *buf)
202da6c28aaSamw {
203da6c28aaSamw 	int len;
204da6c28aaSamw 
205da6c28aaSamw 	if (!buf)
206da6c28aaSamw 		len = -1;
207da6c28aaSamw 	else
208da6c28aaSamw 		len = strlen(buf);
209da6c28aaSamw 
210da6c28aaSamw 	if (ctx->status == 0) {
211da6c28aaSamw 		smb_dr_put_int32(ctx, len);
212da6c28aaSamw 		if (len <= 0)
213da6c28aaSamw 			return;
214da6c28aaSamw 
215da6c28aaSamw 		if (ctx->ptr + len <= ctx->end_ptr) {
216da6c28aaSamw 			(void) memcpy(ctx->ptr, buf, len);
217da6c28aaSamw 			ctx->ptr += len;
218*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
219da6c28aaSamw 			ctx->status = ENOSPC;
220*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
221da6c28aaSamw 	}
222da6c28aaSamw }
223da6c28aaSamw 
224da6c28aaSamw void
225da6c28aaSamw smb_dr_free_string(char *buf)
226da6c28aaSamw {
227da6c28aaSamw 	if (buf)
228da6c28aaSamw 		MEM_FREE("CommonDoor", buf);
229da6c28aaSamw }
230da6c28aaSamw 
231da6c28aaSamw int64_t
232da6c28aaSamw smb_dr_get_int64(smb_dr_ctx_t *ctx)
233da6c28aaSamw {
234da6c28aaSamw 	int64_t num = 0;
235da6c28aaSamw 	if (ctx->status == 0) {
236da6c28aaSamw 		if (ctx->ptr + sizeof (int64_t) <= ctx->end_ptr) {
237da6c28aaSamw 			(void) memcpy(&num, ctx->ptr, sizeof (int64_t));
238da6c28aaSamw 			ctx->ptr += sizeof (int64_t);
239*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
240da6c28aaSamw 			ctx->status = ENOSPC;
241*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
242da6c28aaSamw 	}
243da6c28aaSamw 	return (num);
244da6c28aaSamw }
245da6c28aaSamw 
246da6c28aaSamw uint64_t
247da6c28aaSamw smb_dr_get_uint64(smb_dr_ctx_t *ctx)
248da6c28aaSamw {
249da6c28aaSamw 	return ((uint64_t)smb_dr_get_int64(ctx));
250da6c28aaSamw }
251da6c28aaSamw 
252da6c28aaSamw 
253da6c28aaSamw void
254da6c28aaSamw smb_dr_put_int64(smb_dr_ctx_t *ctx, int64_t num)
255da6c28aaSamw {
256da6c28aaSamw 	if (ctx->status == 0) {
257da6c28aaSamw 		if (ctx->ptr + sizeof (int64_t) <= ctx->end_ptr) {
258da6c28aaSamw 			(void) memcpy(ctx->ptr, &num, sizeof (int64_t));
259da6c28aaSamw 			ctx->ptr += sizeof (int64_t);
260*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
261da6c28aaSamw 			ctx->status = ENOSPC;
262*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
263da6c28aaSamw 	}
264da6c28aaSamw }
265da6c28aaSamw 
266da6c28aaSamw void
267da6c28aaSamw smb_dr_put_uint64(smb_dr_ctx_t *ctx, uint64_t num)
268da6c28aaSamw {
269da6c28aaSamw 	smb_dr_put_int64(ctx, (int64_t)num);
270da6c28aaSamw }
271da6c28aaSamw 
272da6c28aaSamw void
273da6c28aaSamw smb_dr_put_short(smb_dr_ctx_t *ctx, short num)
274da6c28aaSamw {
275da6c28aaSamw 	if (ctx->status == 0) {
276da6c28aaSamw 		if (ctx->ptr + sizeof (short) <= ctx->end_ptr) {
277da6c28aaSamw 			(void) memcpy(ctx->ptr, &num, sizeof (short));
278da6c28aaSamw 			ctx->ptr += sizeof (short);
279*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
280da6c28aaSamw 			ctx->status = ENOSPC;
281*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
282da6c28aaSamw 	}
283da6c28aaSamw }
284da6c28aaSamw 
285da6c28aaSamw short
286da6c28aaSamw smb_dr_get_short(smb_dr_ctx_t *ctx)
287da6c28aaSamw {
288da6c28aaSamw 	short num = 0;
289da6c28aaSamw 	if (ctx->status == 0) {
290da6c28aaSamw 		if (ctx->ptr + sizeof (short) <= ctx->end_ptr) {
291da6c28aaSamw 			(void) memcpy(&num, ctx->ptr, sizeof (short));
292da6c28aaSamw 			ctx->ptr += sizeof (short);
293*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
294da6c28aaSamw 			ctx->status = ENOSPC;
295*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
296da6c28aaSamw 	}
297da6c28aaSamw 	return (num);
298da6c28aaSamw }
299da6c28aaSamw 
300da6c28aaSamw void
301da6c28aaSamw smb_dr_put_ushort(smb_dr_ctx_t *ctx, unsigned short num)
302da6c28aaSamw {
303da6c28aaSamw 	smb_dr_put_short(ctx, (short)num);
304da6c28aaSamw }
305da6c28aaSamw 
306da6c28aaSamw unsigned short
307da6c28aaSamw smb_dr_get_ushort(smb_dr_ctx_t *ctx)
308da6c28aaSamw {
309da6c28aaSamw 	return ((unsigned short)smb_dr_get_short(ctx));
310da6c28aaSamw }
311da6c28aaSamw 
312da6c28aaSamw void
313da6c28aaSamw smb_dr_put_word(smb_dr_ctx_t *ctx, WORD num)
314da6c28aaSamw {
315da6c28aaSamw 	smb_dr_put_ushort(ctx, num);
316da6c28aaSamw }
317da6c28aaSamw 
318da6c28aaSamw WORD
319da6c28aaSamw smb_dr_get_word(smb_dr_ctx_t *ctx)
320da6c28aaSamw {
321da6c28aaSamw 	return (smb_dr_get_ushort(ctx));
322da6c28aaSamw }
323da6c28aaSamw 
324da6c28aaSamw void
325da6c28aaSamw smb_dr_put_BYTE(smb_dr_ctx_t *ctx, BYTE byte)
326da6c28aaSamw {
327da6c28aaSamw 	if (ctx->status == 0) {
328da6c28aaSamw 		if (ctx->ptr + sizeof (BYTE) <= ctx->end_ptr) {
329da6c28aaSamw 			(void) memcpy(ctx->ptr, &byte, sizeof (BYTE));
330da6c28aaSamw 			ctx->ptr += sizeof (BYTE);
331*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
332da6c28aaSamw 			ctx->status = ENOSPC;
333*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
334da6c28aaSamw 	}
335da6c28aaSamw }
336da6c28aaSamw 
337da6c28aaSamw BYTE
338da6c28aaSamw smb_dr_get_BYTE(smb_dr_ctx_t *ctx)
339da6c28aaSamw {
340da6c28aaSamw 	BYTE byte = 0;
341da6c28aaSamw 	if (ctx->status == 0) {
342da6c28aaSamw 		if (ctx->ptr + sizeof (BYTE) <= ctx->end_ptr) {
343da6c28aaSamw 			(void) memcpy(&byte, ctx->ptr, sizeof (BYTE));
344da6c28aaSamw 			ctx->ptr += sizeof (BYTE);
345*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
346da6c28aaSamw 			ctx->status = ENOSPC;
347*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
348da6c28aaSamw 	}
349da6c28aaSamw 	return (byte);
350da6c28aaSamw }
351da6c28aaSamw 
352da6c28aaSamw void
353da6c28aaSamw smb_dr_put_buf(smb_dr_ctx_t *ctx, unsigned char *start, int len)
354da6c28aaSamw {
355da6c28aaSamw 	smb_dr_put_int32(ctx, len);
356da6c28aaSamw 	if (ctx->status == 0) {
357da6c28aaSamw 		if (ctx->ptr + len <= ctx->end_ptr) {
358da6c28aaSamw 			(void) memcpy(ctx->ptr, start, len);
359da6c28aaSamw 			ctx->ptr += len;
360*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
361da6c28aaSamw 			ctx->status = ENOSPC;
362*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
363da6c28aaSamw 	}
364da6c28aaSamw }
365da6c28aaSamw 
366da6c28aaSamw int
367da6c28aaSamw smb_dr_get_buf(smb_dr_ctx_t *ctx, unsigned char *buf, int bufsize)
368da6c28aaSamw {
369da6c28aaSamw 	int len = -1;
370da6c28aaSamw 
371da6c28aaSamw 	if (!buf)
372da6c28aaSamw 		return (-1);
373da6c28aaSamw 
374da6c28aaSamw 	len = smb_dr_get_int32(ctx);
375da6c28aaSamw 	if (ctx->status == 0) {
376da6c28aaSamw 		if (bufsize < len) {
377da6c28aaSamw 			ctx->status = ENOSPC;
378da6c28aaSamw 			return (-2);
379da6c28aaSamw 		}
380da6c28aaSamw 
381da6c28aaSamw 		if (ctx->ptr + len <= ctx->end_ptr) {
382da6c28aaSamw 			(void) memcpy(buf, ctx->ptr, len);
383da6c28aaSamw 			ctx->ptr += len;
384da6c28aaSamw 		} else {
385da6c28aaSamw 			ctx->status = ENOSPC;
386da6c28aaSamw 			return (-3);
387da6c28aaSamw 		}
388da6c28aaSamw 	}
389da6c28aaSamw 
390da6c28aaSamw 	return (len);
391da6c28aaSamw }
392*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
393*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
394*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_dr_get_share(smb_dr_ctx_t *ctx, smb_share_t *si)
395*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
396*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ctx->status == 0) {
397*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_dr_get_int32(ctx)) {
398*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) memcpy(si, ctx->ptr, sizeof (smb_share_t));
399*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			ctx->ptr += sizeof (smb_share_t);
400*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
401*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			bzero(si, sizeof (smb_share_t));
402*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
403*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
404*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero(si, sizeof (smb_share_t));
405*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
406*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
407*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
408*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
409*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_dr_put_share(smb_dr_ctx_t *ctx, smb_share_t *si)
410*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
411*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (si) {
412*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_dr_put_int32(ctx, 1);
413*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (ctx->ptr + sizeof (smb_share_t) <= ctx->end_ptr) {
414*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			(void) memcpy(ctx->ptr, si, sizeof (smb_share_t));
415*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			ctx->ptr += sizeof (smb_share_t);
416*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
417*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			ctx->status = ENOSPC;
418*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
419*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
420*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_dr_put_int32(ctx, 0);
421*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
422*9fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
423