1f1b9d127SSheldon Hearn /*
2f1b9d127SSheldon Hearn * Copyright (c) 2000, Boris Popov
3f1b9d127SSheldon Hearn * All rights reserved.
4f1b9d127SSheldon Hearn *
5f1b9d127SSheldon Hearn * Redistribution and use in source and binary forms, with or without
6f1b9d127SSheldon Hearn * modification, are permitted provided that the following conditions
7f1b9d127SSheldon Hearn * are met:
8f1b9d127SSheldon Hearn * 1. Redistributions of source code must retain the above copyright
9f1b9d127SSheldon Hearn * notice, this list of conditions and the following disclaimer.
10f1b9d127SSheldon Hearn * 2. Redistributions in binary form must reproduce the above copyright
11f1b9d127SSheldon Hearn * notice, this list of conditions and the following disclaimer in the
12f1b9d127SSheldon Hearn * documentation and/or other materials provided with the distribution.
13f1b9d127SSheldon Hearn * 3. All advertising materials mentioning features or use of this software
14f1b9d127SSheldon Hearn * must display the following acknowledgement:
15f1b9d127SSheldon Hearn * This product includes software developed by Boris Popov.
16f1b9d127SSheldon Hearn * 4. Neither the name of the author nor the names of any co-contributors
17f1b9d127SSheldon Hearn * may be used to endorse or promote products derived from this software
18f1b9d127SSheldon Hearn * without specific prior written permission.
19f1b9d127SSheldon Hearn *
20f1b9d127SSheldon Hearn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21f1b9d127SSheldon Hearn * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22f1b9d127SSheldon Hearn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23f1b9d127SSheldon Hearn * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24f1b9d127SSheldon Hearn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25f1b9d127SSheldon Hearn * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26f1b9d127SSheldon Hearn * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27f1b9d127SSheldon Hearn * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28f1b9d127SSheldon Hearn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29f1b9d127SSheldon Hearn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30f1b9d127SSheldon Hearn * SUCH DAMAGE.
31f1b9d127SSheldon Hearn *
32f1b9d127SSheldon Hearn * $Id: rap.c,v 1.8 2001/02/24 15:56:05 bp Exp $
3326c4b7deSPeter Wemm * $FreeBSD$
34f1b9d127SSheldon Hearn *
35f1b9d127SSheldon Hearn * This is very simple implementation of RAP protocol.
36f1b9d127SSheldon Hearn */
37f1b9d127SSheldon Hearn #include <sys/param.h>
384d79445aSR. Imura #include <sys/endian.h>
39f1b9d127SSheldon Hearn #include <sys/errno.h>
40f1b9d127SSheldon Hearn #include <sys/stat.h>
41f1b9d127SSheldon Hearn #include <ctype.h>
42f1b9d127SSheldon Hearn #include <err.h>
43f1b9d127SSheldon Hearn #include <stdio.h>
44f1b9d127SSheldon Hearn #include <unistd.h>
4526c4b7deSPeter Wemm #include <string.h>
46f1b9d127SSheldon Hearn #include <stdlib.h>
47f1b9d127SSheldon Hearn #include <sysexits.h>
48f1b9d127SSheldon Hearn
49f1b9d127SSheldon Hearn #include <netsmb/smb_lib.h>
50f1b9d127SSheldon Hearn #include <netsmb/smb_conn.h>
51f1b9d127SSheldon Hearn #include <netsmb/smb_rap.h>
52f1b9d127SSheldon Hearn
53f1b9d127SSheldon Hearn /*#include <sys/ioctl.h>*/
54f1b9d127SSheldon Hearn
55f1b9d127SSheldon Hearn static int
smb_rap_parserqparam(const char * s,char ** next,int * rlen)56f1b9d127SSheldon Hearn smb_rap_parserqparam(const char *s, char **next, int *rlen)
57f1b9d127SSheldon Hearn {
58f1b9d127SSheldon Hearn char *np;
59f1b9d127SSheldon Hearn int len, m;
60f1b9d127SSheldon Hearn
61f1b9d127SSheldon Hearn m = 1;
62f1b9d127SSheldon Hearn switch (*s++) {
63f1b9d127SSheldon Hearn case 'L':
64f1b9d127SSheldon Hearn case 'T':
65f1b9d127SSheldon Hearn case 'W':
66f1b9d127SSheldon Hearn len = 2;
67f1b9d127SSheldon Hearn break;
68f1b9d127SSheldon Hearn case 'D':
69f1b9d127SSheldon Hearn case 'O':
70f1b9d127SSheldon Hearn len = 4;
71f1b9d127SSheldon Hearn break;
72f1b9d127SSheldon Hearn case 'b':
73f1b9d127SSheldon Hearn case 'F':
74f1b9d127SSheldon Hearn len = 1;
75f1b9d127SSheldon Hearn break;
76f1b9d127SSheldon Hearn case 'r':
77f1b9d127SSheldon Hearn case 's':
78f1b9d127SSheldon Hearn len = 0;
79f1b9d127SSheldon Hearn break;
80f1b9d127SSheldon Hearn default:
81f1b9d127SSheldon Hearn return EINVAL;
82f1b9d127SSheldon Hearn }
83f1b9d127SSheldon Hearn if (isdigit(*s)) {
84f1b9d127SSheldon Hearn len *= strtoul(s, &np, 10);
85f1b9d127SSheldon Hearn s = np;
86f1b9d127SSheldon Hearn }
87f1b9d127SSheldon Hearn *rlen = len;
88f1b9d127SSheldon Hearn *(const char**)next = s;
89f1b9d127SSheldon Hearn return 0;
90f1b9d127SSheldon Hearn }
91f1b9d127SSheldon Hearn
92f1b9d127SSheldon Hearn static int
smb_rap_parserpparam(const char * s,char ** next,int * rlen)93f1b9d127SSheldon Hearn smb_rap_parserpparam(const char *s, char **next, int *rlen)
94f1b9d127SSheldon Hearn {
95f1b9d127SSheldon Hearn char *np;
96f1b9d127SSheldon Hearn int len, m;
97f1b9d127SSheldon Hearn
98f1b9d127SSheldon Hearn m = 1;
99f1b9d127SSheldon Hearn switch (*s++) {
100f1b9d127SSheldon Hearn case 'e':
101f1b9d127SSheldon Hearn case 'h':
102f1b9d127SSheldon Hearn len = 2;
103f1b9d127SSheldon Hearn break;
104f1b9d127SSheldon Hearn case 'i':
105f1b9d127SSheldon Hearn len = 4;
106f1b9d127SSheldon Hearn break;
107f1b9d127SSheldon Hearn case 'g':
108f1b9d127SSheldon Hearn len = 1;
109f1b9d127SSheldon Hearn break;
110f1b9d127SSheldon Hearn default:
111f1b9d127SSheldon Hearn return EINVAL;
112f1b9d127SSheldon Hearn }
113f1b9d127SSheldon Hearn if (isdigit(*s)) {
114f1b9d127SSheldon Hearn len *= strtoul(s, &np, 10);
115f1b9d127SSheldon Hearn s = np;
116f1b9d127SSheldon Hearn }
117f1b9d127SSheldon Hearn *rlen = len;
118f1b9d127SSheldon Hearn *(const char**)next = s;
119f1b9d127SSheldon Hearn return 0;
120f1b9d127SSheldon Hearn }
121f1b9d127SSheldon Hearn
122f1b9d127SSheldon Hearn static int
smb_rap_parserpdata(const char * s,char ** next,int * rlen)123f1b9d127SSheldon Hearn smb_rap_parserpdata(const char *s, char **next, int *rlen)
124f1b9d127SSheldon Hearn {
125f1b9d127SSheldon Hearn char *np;
126f1b9d127SSheldon Hearn int len, m;
127f1b9d127SSheldon Hearn
128f1b9d127SSheldon Hearn m = 1;
129f1b9d127SSheldon Hearn switch (*s++) {
130f1b9d127SSheldon Hearn case 'B':
131f1b9d127SSheldon Hearn len = 1;
132f1b9d127SSheldon Hearn break;
133f1b9d127SSheldon Hearn case 'W':
134f1b9d127SSheldon Hearn len = 2;
135f1b9d127SSheldon Hearn break;
136f1b9d127SSheldon Hearn case 'D':
137f1b9d127SSheldon Hearn case 'O':
138f1b9d127SSheldon Hearn case 'z':
139f1b9d127SSheldon Hearn len = 4;
140f1b9d127SSheldon Hearn break;
141f1b9d127SSheldon Hearn default:
142f1b9d127SSheldon Hearn return EINVAL;
143f1b9d127SSheldon Hearn }
144f1b9d127SSheldon Hearn if (isdigit(*s)) {
145f1b9d127SSheldon Hearn len *= strtoul(s, &np, 10);
146f1b9d127SSheldon Hearn s = np;
147f1b9d127SSheldon Hearn }
148f1b9d127SSheldon Hearn *rlen = len;
149f1b9d127SSheldon Hearn *(const char**)next = s;
150f1b9d127SSheldon Hearn return 0;
151f1b9d127SSheldon Hearn }
152f1b9d127SSheldon Hearn
153f1b9d127SSheldon Hearn static int
smb_rap_rqparam_z(struct smb_rap * rap,const char * value)154f1b9d127SSheldon Hearn smb_rap_rqparam_z(struct smb_rap *rap, const char *value)
155f1b9d127SSheldon Hearn {
156f1b9d127SSheldon Hearn int len = strlen(value) + 1;
157f1b9d127SSheldon Hearn
158f1b9d127SSheldon Hearn bcopy(value, rap->r_npbuf, len);
159f1b9d127SSheldon Hearn rap->r_npbuf += len;
160f1b9d127SSheldon Hearn rap->r_plen += len;
161f1b9d127SSheldon Hearn return 0;
162f1b9d127SSheldon Hearn }
163f1b9d127SSheldon Hearn
164f1b9d127SSheldon Hearn static int
smb_rap_rqparam(struct smb_rap * rap,char ptype,char plen,long value)165f1b9d127SSheldon Hearn smb_rap_rqparam(struct smb_rap *rap, char ptype, char plen, long value)
166f1b9d127SSheldon Hearn {
167f1b9d127SSheldon Hearn char *p = rap->r_npbuf;
168f1b9d127SSheldon Hearn int len;
169f1b9d127SSheldon Hearn
170f1b9d127SSheldon Hearn switch (ptype) {
171f1b9d127SSheldon Hearn case 'L':
172f1b9d127SSheldon Hearn case 'W':
173f1b9d127SSheldon Hearn setwle(p, 0, value);
174f1b9d127SSheldon Hearn len = 2;
175f1b9d127SSheldon Hearn break;
176f1b9d127SSheldon Hearn case 'D':
177f1b9d127SSheldon Hearn setdle(p, 0, value);
178f1b9d127SSheldon Hearn len = 4;
179f1b9d127SSheldon Hearn break;
180f1b9d127SSheldon Hearn case 'b':
181f1b9d127SSheldon Hearn memset(p, value, plen);
182f1b9d127SSheldon Hearn len = plen;
183f1b9d127SSheldon Hearn default:
184f1b9d127SSheldon Hearn return EINVAL;
185f1b9d127SSheldon Hearn }
186f1b9d127SSheldon Hearn rap->r_npbuf += len;
187f1b9d127SSheldon Hearn rap->r_plen += len;
188f1b9d127SSheldon Hearn return 0;
189f1b9d127SSheldon Hearn }
190f1b9d127SSheldon Hearn
191f1b9d127SSheldon Hearn int
smb_rap_create(int fn,const char * param,const char * data,struct smb_rap ** rapp)192f1b9d127SSheldon Hearn smb_rap_create(int fn, const char *param, const char *data,
193f1b9d127SSheldon Hearn struct smb_rap **rapp)
194f1b9d127SSheldon Hearn {
195f1b9d127SSheldon Hearn struct smb_rap *rap;
196f1b9d127SSheldon Hearn char *p;
197f1b9d127SSheldon Hearn int plen, len;
198f1b9d127SSheldon Hearn
199f1b9d127SSheldon Hearn rap = malloc(sizeof(*rap));
200f1b9d127SSheldon Hearn if (rap == NULL)
2017d475e35SLukas Ertl return ENOMEM;
202f1b9d127SSheldon Hearn bzero(rap, sizeof(*rap));
203f1b9d127SSheldon Hearn p = rap->r_sparam = rap->r_nparam = strdup(param);
204f1b9d127SSheldon Hearn rap->r_sdata = rap->r_ndata = strdup(data);
205f1b9d127SSheldon Hearn /*
206f1b9d127SSheldon Hearn * Calculate length of request parameter block
207f1b9d127SSheldon Hearn */
208f1b9d127SSheldon Hearn len = 2 + strlen(param) + 1 + strlen(data) + 1;
209f1b9d127SSheldon Hearn
210f1b9d127SSheldon Hearn while (*p) {
211f1b9d127SSheldon Hearn if (smb_rap_parserqparam(p, &p, &plen) != 0)
212f1b9d127SSheldon Hearn break;
213f1b9d127SSheldon Hearn len += plen;
214f1b9d127SSheldon Hearn }
215f1b9d127SSheldon Hearn rap->r_pbuf = rap->r_npbuf = malloc(len);
216f1b9d127SSheldon Hearn smb_rap_rqparam(rap, 'W', 1, fn);
217f1b9d127SSheldon Hearn smb_rap_rqparam_z(rap, rap->r_sparam);
218f1b9d127SSheldon Hearn smb_rap_rqparam_z(rap, rap->r_sdata);
219f1b9d127SSheldon Hearn *rapp = rap;
220f1b9d127SSheldon Hearn return 0;
221f1b9d127SSheldon Hearn }
222f1b9d127SSheldon Hearn
223f1b9d127SSheldon Hearn void
smb_rap_done(struct smb_rap * rap)224f1b9d127SSheldon Hearn smb_rap_done(struct smb_rap *rap)
225f1b9d127SSheldon Hearn {
226f1b9d127SSheldon Hearn if (rap->r_sparam)
227f1b9d127SSheldon Hearn free(rap->r_sparam);
228f1b9d127SSheldon Hearn if (rap->r_sdata)
229f1b9d127SSheldon Hearn free(rap->r_sdata);
230f1b9d127SSheldon Hearn free(rap);
231f1b9d127SSheldon Hearn }
232f1b9d127SSheldon Hearn
233f1b9d127SSheldon Hearn int
smb_rap_setNparam(struct smb_rap * rap,long value)234f1b9d127SSheldon Hearn smb_rap_setNparam(struct smb_rap *rap, long value)
235f1b9d127SSheldon Hearn {
236f1b9d127SSheldon Hearn char *p = rap->r_nparam;
237f1b9d127SSheldon Hearn char ptype = *p;
238f1b9d127SSheldon Hearn int error, plen;
239f1b9d127SSheldon Hearn
240f1b9d127SSheldon Hearn error = smb_rap_parserqparam(p, &p, &plen);
241f1b9d127SSheldon Hearn if (error)
242f1b9d127SSheldon Hearn return error;
243f1b9d127SSheldon Hearn switch (ptype) {
244f1b9d127SSheldon Hearn case 'L':
245f1b9d127SSheldon Hearn rap->r_rcvbuflen = value;
246f1b9d127SSheldon Hearn /* FALLTHROUGH */
247f1b9d127SSheldon Hearn case 'W':
248f1b9d127SSheldon Hearn case 'D':
249f1b9d127SSheldon Hearn case 'b':
250f1b9d127SSheldon Hearn error = smb_rap_rqparam(rap, ptype, plen, value);
251f1b9d127SSheldon Hearn break;
252f1b9d127SSheldon Hearn default:
253f1b9d127SSheldon Hearn return EINVAL;
254f1b9d127SSheldon Hearn }
255f1b9d127SSheldon Hearn rap->r_nparam = p;
256f1b9d127SSheldon Hearn return 0;
257f1b9d127SSheldon Hearn }
258f1b9d127SSheldon Hearn
259f1b9d127SSheldon Hearn int
smb_rap_setPparam(struct smb_rap * rap,void * value)260f1b9d127SSheldon Hearn smb_rap_setPparam(struct smb_rap *rap, void *value)
261f1b9d127SSheldon Hearn {
262f1b9d127SSheldon Hearn char *p = rap->r_nparam;
263f1b9d127SSheldon Hearn char ptype = *p;
264f1b9d127SSheldon Hearn int error, plen;
265f1b9d127SSheldon Hearn
266f1b9d127SSheldon Hearn error = smb_rap_parserqparam(p, &p, &plen);
267f1b9d127SSheldon Hearn if (error)
268f1b9d127SSheldon Hearn return error;
269f1b9d127SSheldon Hearn switch (ptype) {
270f1b9d127SSheldon Hearn case 'r':
271f1b9d127SSheldon Hearn rap->r_rcvbuf = value;
272f1b9d127SSheldon Hearn break;
273f1b9d127SSheldon Hearn default:
274f1b9d127SSheldon Hearn return EINVAL;
275f1b9d127SSheldon Hearn }
276f1b9d127SSheldon Hearn rap->r_nparam = p;
277f1b9d127SSheldon Hearn return 0;
278f1b9d127SSheldon Hearn }
279f1b9d127SSheldon Hearn
280f1b9d127SSheldon Hearn static int
smb_rap_getNparam(struct smb_rap * rap,long * value)281f1b9d127SSheldon Hearn smb_rap_getNparam(struct smb_rap *rap, long *value)
282f1b9d127SSheldon Hearn {
283f1b9d127SSheldon Hearn char *p = rap->r_nparam;
284f1b9d127SSheldon Hearn char ptype = *p;
285f1b9d127SSheldon Hearn int error, plen;
286f1b9d127SSheldon Hearn
287f1b9d127SSheldon Hearn error = smb_rap_parserpparam(p, &p, &plen);
288f1b9d127SSheldon Hearn if (error)
289f1b9d127SSheldon Hearn return error;
290f1b9d127SSheldon Hearn switch (ptype) {
291f1b9d127SSheldon Hearn case 'h':
2924d79445aSR. Imura *value = le16toh(*(u_int16_t*)rap->r_npbuf);
293f1b9d127SSheldon Hearn break;
294f1b9d127SSheldon Hearn default:
295f1b9d127SSheldon Hearn return EINVAL;
296f1b9d127SSheldon Hearn }
297f1b9d127SSheldon Hearn rap->r_npbuf += plen;
298f1b9d127SSheldon Hearn rap->r_nparam = p;
299f1b9d127SSheldon Hearn return 0;
300f1b9d127SSheldon Hearn }
301f1b9d127SSheldon Hearn
302f1b9d127SSheldon Hearn int
smb_rap_request(struct smb_rap * rap,struct smb_ctx * ctx)303f1b9d127SSheldon Hearn smb_rap_request(struct smb_rap *rap, struct smb_ctx *ctx)
304f1b9d127SSheldon Hearn {
305f1b9d127SSheldon Hearn u_int16_t *rp, conv;
306f1b9d127SSheldon Hearn u_int32_t *p32;
307f1b9d127SSheldon Hearn char *dp, *p = rap->r_nparam;
308f1b9d127SSheldon Hearn char ptype;
309f1b9d127SSheldon Hearn int error, rdatacnt, rparamcnt, entries, done, dlen;
310f1b9d127SSheldon Hearn
311f1b9d127SSheldon Hearn rdatacnt = rap->r_rcvbuflen;
312f1b9d127SSheldon Hearn rparamcnt = rap->r_plen;
313f1b9d127SSheldon Hearn error = smb_t2_request(ctx, 0, 0, "\\PIPE\\LANMAN",
314f1b9d127SSheldon Hearn rap->r_plen, rap->r_pbuf, /* int tparamcnt, void *tparam */
315f1b9d127SSheldon Hearn 0, NULL, /* int tdatacnt, void *tdata */
316f1b9d127SSheldon Hearn &rparamcnt, rap->r_pbuf, /* rparamcnt, void *rparam */
317f1b9d127SSheldon Hearn &rdatacnt, rap->r_rcvbuf /* int *rdatacnt, void *rdata */
318f1b9d127SSheldon Hearn );
319f1b9d127SSheldon Hearn if (error)
320f1b9d127SSheldon Hearn return error;
321f1b9d127SSheldon Hearn rp = (u_int16_t*)rap->r_pbuf;
3224d79445aSR. Imura rap->r_result = le16toh(*rp++);
3234d79445aSR. Imura conv = le16toh(*rp++);
324f1b9d127SSheldon Hearn rap->r_npbuf = (char*)rp;
325f1b9d127SSheldon Hearn rap->r_entries = entries = 0;
326f1b9d127SSheldon Hearn done = 0;
327f1b9d127SSheldon Hearn while (!done && *p) {
328f1b9d127SSheldon Hearn ptype = *p;
329f1b9d127SSheldon Hearn switch (ptype) {
330f1b9d127SSheldon Hearn case 'e':
3314d79445aSR. Imura rap->r_entries = entries = le16toh(*(u_int16_t*)rap->r_npbuf);
332f1b9d127SSheldon Hearn rap->r_npbuf += 2;
333f1b9d127SSheldon Hearn p++;
334f1b9d127SSheldon Hearn break;
335f1b9d127SSheldon Hearn default:
336f1b9d127SSheldon Hearn done = 1;
337f1b9d127SSheldon Hearn }
338f1b9d127SSheldon Hearn /* error = smb_rap_parserpparam(p, &p, &plen);
339f1b9d127SSheldon Hearn if (error) {
340f1b9d127SSheldon Hearn smb_error("reply parameter mismath %s", 0, p);
341f1b9d127SSheldon Hearn return EBADRPC;
342f1b9d127SSheldon Hearn }*/
343f1b9d127SSheldon Hearn }
344f1b9d127SSheldon Hearn rap->r_nparam = p;
345f1b9d127SSheldon Hearn /*
346f1b9d127SSheldon Hearn * In general, unpacking entries we may need to relocate
347f1b9d127SSheldon Hearn * entries for proper alingning. For now use them as is.
348f1b9d127SSheldon Hearn */
349f1b9d127SSheldon Hearn dp = rap->r_rcvbuf;
350f1b9d127SSheldon Hearn while (entries--) {
351f1b9d127SSheldon Hearn p = rap->r_sdata;
352f1b9d127SSheldon Hearn while (*p) {
353f1b9d127SSheldon Hearn ptype = *p;
354f1b9d127SSheldon Hearn error = smb_rap_parserpdata(p, &p, &dlen);
355f1b9d127SSheldon Hearn if (error) {
356f1b9d127SSheldon Hearn smb_error("reply data mismath %s", 0, p);
357f1b9d127SSheldon Hearn return EBADRPC;
358f1b9d127SSheldon Hearn }
359f1b9d127SSheldon Hearn switch (ptype) {
360f1b9d127SSheldon Hearn case 'z':
361f1b9d127SSheldon Hearn p32 = (u_int32_t*)dp;
362f1b9d127SSheldon Hearn *p32 = (*p32 & 0xffff) - conv;
363f1b9d127SSheldon Hearn break;
364f1b9d127SSheldon Hearn }
365f1b9d127SSheldon Hearn dp += dlen;
366f1b9d127SSheldon Hearn }
367f1b9d127SSheldon Hearn }
368f1b9d127SSheldon Hearn return error;
369f1b9d127SSheldon Hearn }
370f1b9d127SSheldon Hearn
371f1b9d127SSheldon Hearn int
smb_rap_error(struct smb_rap * rap,int error)372f1b9d127SSheldon Hearn smb_rap_error(struct smb_rap *rap, int error)
373f1b9d127SSheldon Hearn {
374f1b9d127SSheldon Hearn if (error)
375f1b9d127SSheldon Hearn return error;
376f1b9d127SSheldon Hearn if (rap->r_result == 0)
377f1b9d127SSheldon Hearn return 0;
378f1b9d127SSheldon Hearn return rap->r_result | SMB_RAP_ERROR;
379f1b9d127SSheldon Hearn }
380f1b9d127SSheldon Hearn
381f1b9d127SSheldon Hearn int
smb_rap_NetShareEnum(struct smb_ctx * ctx,int sLevel,void * pbBuffer,int cbBuffer,int * pcEntriesRead,int * pcTotalAvail)382f1b9d127SSheldon Hearn smb_rap_NetShareEnum(struct smb_ctx *ctx, int sLevel, void *pbBuffer,
383f1b9d127SSheldon Hearn int cbBuffer, int *pcEntriesRead, int *pcTotalAvail)
384f1b9d127SSheldon Hearn {
385f1b9d127SSheldon Hearn struct smb_rap *rap;
386f1b9d127SSheldon Hearn long lval;
387f1b9d127SSheldon Hearn int error;
388f1b9d127SSheldon Hearn
389f1b9d127SSheldon Hearn error = smb_rap_create(0, "WrLeh", "B13BWz", &rap);
390f1b9d127SSheldon Hearn if (error)
391f1b9d127SSheldon Hearn return error;
392f1b9d127SSheldon Hearn smb_rap_setNparam(rap, sLevel); /* W - sLevel */
393f1b9d127SSheldon Hearn smb_rap_setPparam(rap, pbBuffer); /* r - pbBuffer */
394f1b9d127SSheldon Hearn smb_rap_setNparam(rap, cbBuffer); /* L - cbBuffer */
395f1b9d127SSheldon Hearn error = smb_rap_request(rap, ctx);
396f1b9d127SSheldon Hearn if (error == 0) {
397f1b9d127SSheldon Hearn *pcEntriesRead = rap->r_entries;
398f1b9d127SSheldon Hearn error = smb_rap_getNparam(rap, &lval);
399f1b9d127SSheldon Hearn *pcTotalAvail = lval;
400f1b9d127SSheldon Hearn }
401f1b9d127SSheldon Hearn error = smb_rap_error(rap, error);
402f1b9d127SSheldon Hearn smb_rap_done(rap);
403f1b9d127SSheldon Hearn return error;
404f1b9d127SSheldon Hearn }
405