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