ctdb-scripts: Move connection tracking to 10.interface
[samba4-gss.git] / source4 / libcli / rap / rap.c
blob1b2cadb753d7e260efeab95846f50286aa7202dc
1 /*
2 Unix SMB/CIFS implementation.
3 RAP client
4 Copyright (C) Volker Lendecke 2004
5 Copyright (C) Tim Potter 2005
6 Copyright (C) Jelmer Vernooij 2007
7 Copyright (C) Guenther Deschner 2010-2011
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "includes.h"
24 #include "libcli/libcli.h"
25 #include "../librpc/gen_ndr/ndr_rap.h"
26 #include "libcli/rap/rap.h"
27 #include "librpc/ndr/libndr.h"
29 struct rap_call *new_rap_cli_call(TALLOC_CTX *mem_ctx, uint16_t callno)
31 struct rap_call *call;
33 call = talloc_zero(mem_ctx, struct rap_call);
34 if (call == NULL) {
35 return NULL;
38 call->callno = callno;
39 call->rcv_paramlen = 4;
41 call->ndr_push_param = ndr_push_init_ctx(call);
42 if (call->ndr_push_param == NULL) {
43 talloc_free(call);
44 return NULL;
46 call->ndr_push_param->flags = RAPNDR_FLAGS;
48 call->ndr_push_data = ndr_push_init_ctx(call);
49 if (call->ndr_push_data == NULL) {
50 talloc_free(call);
51 return NULL;
53 call->ndr_push_data->flags = RAPNDR_FLAGS;
55 call->pull_mem_ctx = mem_ctx;
57 return call;
60 static void rap_cli_push_paramdesc(struct rap_call *call, char desc)
62 int len = 0;
64 if (call->paramdesc != NULL)
65 len = strlen(call->paramdesc);
67 call->paramdesc = talloc_realloc(call,
68 call->paramdesc,
69 char,
70 len+2);
72 call->paramdesc[len] = desc;
73 call->paramdesc[len+1] = '\0';
76 static void rap_cli_push_word(struct rap_call *call, uint16_t val)
78 rap_cli_push_paramdesc(call, 'W');
79 ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, val);
82 static void rap_cli_push_dword(struct rap_call *call, uint32_t val)
84 rap_cli_push_paramdesc(call, 'D');
85 ndr_push_uint32(call->ndr_push_param, NDR_SCALARS, val);
88 static void rap_cli_push_rcvbuf(struct rap_call *call, int len)
90 rap_cli_push_paramdesc(call, 'r');
91 rap_cli_push_paramdesc(call, 'L');
92 ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, len);
93 call->rcv_datalen = len;
96 static void rap_cli_push_sendbuf(struct rap_call *call, int len)
98 rap_cli_push_paramdesc(call, 's');
99 rap_cli_push_paramdesc(call, 'T');
100 ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, len);
103 static void rap_cli_push_param(struct rap_call *call, uint16_t val)
105 rap_cli_push_paramdesc(call, 'P');
106 ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, val);
109 static void rap_cli_expect_multiple_entries(struct rap_call *call)
111 rap_cli_push_paramdesc(call, 'e');
112 rap_cli_push_paramdesc(call, 'h');
113 call->rcv_paramlen += 4; /* uint16_t entry count, uint16_t total */
116 static void rap_cli_expect_word(struct rap_call *call)
118 rap_cli_push_paramdesc(call, 'h');
119 call->rcv_paramlen += 2;
122 static void rap_cli_push_string(struct rap_call *call, const char *str)
124 if (str == NULL) {
125 rap_cli_push_paramdesc(call, 'O');
126 return;
128 rap_cli_push_paramdesc(call, 'z');
129 ndr_push_string(call->ndr_push_param, NDR_SCALARS, str);
132 static void rap_cli_expect_format(struct rap_call *call, const char *format)
134 call->datadesc = format;
137 static void rap_cli_expect_extra_format(struct rap_call *call, const char *format)
139 call->auxdatadesc = format;
142 static NTSTATUS rap_pull_string(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr,
143 uint16_t convert, const char **dest)
145 uint16_t string_offset;
146 uint16_t ignore;
147 const char *p;
148 size_t len;
150 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &string_offset));
151 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &ignore));
153 string_offset -= convert;
155 if (string_offset+1 > ndr->data_size)
156 return NT_STATUS_INVALID_PARAMETER;
158 p = (const char *)(ndr->data + string_offset);
159 len = strnlen(p, ndr->data_size-string_offset);
161 if ( string_offset + len + 1 > ndr->data_size )
162 return NT_STATUS_INVALID_PARAMETER;
164 *dest = talloc_zero_array(mem_ctx, char, len+1);
165 pull_string(discard_const_p(char, *dest), p, len+1, len, STR_ASCII);
167 return NT_STATUS_OK;
170 NTSTATUS rap_cli_do_call(struct smbcli_tree *tree,
171 struct rap_call *call)
173 NTSTATUS result;
174 DATA_BLOB param_blob;
175 DATA_BLOB data_blob;
176 struct ndr_push *params;
177 struct ndr_push *data;
178 struct smb_trans2 trans;
180 params = ndr_push_init_ctx(call);
182 if (params == NULL)
183 return NT_STATUS_NO_MEMORY;
185 params->flags = RAPNDR_FLAGS;
187 data = ndr_push_init_ctx(call);
189 if (data == NULL)
190 return NT_STATUS_NO_MEMORY;
192 data->flags = RAPNDR_FLAGS;
194 trans.in.max_param = call->rcv_paramlen;
195 trans.in.max_data = call->rcv_datalen;
196 trans.in.max_setup = 0;
197 trans.in.flags = 0;
198 trans.in.timeout = 0;
199 trans.in.setup_count = 0;
200 trans.in.setup = NULL;
201 trans.in.trans_name = "\\PIPE\\LANMAN";
203 NDR_RETURN(ndr_push_uint16(params, NDR_SCALARS, call->callno));
204 if (call->paramdesc)
205 NDR_RETURN(ndr_push_string(params, NDR_SCALARS, call->paramdesc));
206 if (call->datadesc)
207 NDR_RETURN(ndr_push_string(params, NDR_SCALARS, call->datadesc));
209 param_blob = ndr_push_blob(call->ndr_push_param);
210 NDR_RETURN(ndr_push_bytes(params, param_blob.data,
211 param_blob.length));
213 data_blob = ndr_push_blob(call->ndr_push_data);
214 NDR_RETURN(ndr_push_bytes(data, data_blob.data,
215 data_blob.length));
217 if (call->auxdatadesc)
218 NDR_RETURN(ndr_push_string(params, NDR_SCALARS, call->auxdatadesc));
220 trans.in.params = ndr_push_blob(params);
221 trans.in.data = ndr_push_blob(data);
223 result = smb_raw_trans(tree, call, &trans);
225 if (!NT_STATUS_IS_OK(result))
226 return result;
228 call->ndr_pull_param = ndr_pull_init_blob(&trans.out.params, call);
229 call->ndr_pull_param->flags = RAPNDR_FLAGS;
230 call->ndr_pull_param->current_mem_ctx = call->pull_mem_ctx;
231 call->ndr_pull_data = ndr_pull_init_blob(&trans.out.data, call);
232 call->ndr_pull_data->flags = RAPNDR_FLAGS;
233 call->ndr_pull_data->current_mem_ctx = call->pull_mem_ctx;
235 return result;
239 NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
240 TALLOC_CTX *mem_ctx,
241 struct rap_NetShareEnum *r)
243 struct rap_call *call;
244 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
245 int i;
247 call = new_rap_cli_call(tree, RAP_WshareEnum);
249 if (call == NULL)
250 return NT_STATUS_NO_MEMORY;
252 rap_cli_push_word(call, r->in.level); /* Level */
253 rap_cli_push_rcvbuf(call, r->in.bufsize);
254 rap_cli_expect_multiple_entries(call);
256 switch(r->in.level) {
257 case 0:
258 rap_cli_expect_format(call, "B13");
259 break;
260 case 1:
261 rap_cli_expect_format(call, "B13BWz");
262 break;
265 if (DEBUGLEVEL >= 10) {
266 NDR_PRINT_IN_DEBUG(rap_NetShareEnum, r);
269 result = rap_cli_do_call(tree, call);
271 if (!NT_STATUS_IS_OK(result))
272 goto done;
274 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
275 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
276 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
277 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
279 r->out.info = talloc_array(mem_ctx, union rap_share_info, r->out.count);
281 if (r->out.info == NULL) {
282 result = NT_STATUS_NO_MEMORY;
283 goto done;
286 for (i=0; i<r->out.count; i++) {
287 switch(r->in.level) {
288 case 0:
289 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
290 r->out.info[i].info0.share_name, 13));
291 break;
292 case 1:
293 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
294 r->out.info[i].info1.share_name, 13));
295 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
296 &r->out.info[i].info1.reserved1, 1));
297 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
298 NDR_SCALARS, &r->out.info[i].info1.share_type));
299 RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
300 r->out.convert,
301 &r->out.info[i].info1.comment));
302 break;
306 if (DEBUGLEVEL >= 10) {
307 NDR_PRINT_OUT_DEBUG(rap_NetShareEnum, r);
309 result = NT_STATUS_OK;
311 done:
312 talloc_free(call);
313 return result;
316 NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
317 TALLOC_CTX *mem_ctx,
318 struct rap_NetServerEnum2 *r)
320 struct rap_call *call;
321 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
322 int i;
324 call = new_rap_cli_call(mem_ctx, RAP_NetServerEnum2);
326 if (call == NULL)
327 return NT_STATUS_NO_MEMORY;
329 rap_cli_push_word(call, r->in.level);
330 rap_cli_push_rcvbuf(call, r->in.bufsize);
331 rap_cli_expect_multiple_entries(call);
332 rap_cli_push_dword(call, r->in.servertype);
333 rap_cli_push_string(call, r->in.domain);
335 switch(r->in.level) {
336 case 0:
337 rap_cli_expect_format(call, "B16");
338 break;
339 case 1:
340 rap_cli_expect_format(call, "B16BBDz");
341 break;
344 if (DEBUGLEVEL >= 10) {
345 NDR_PRINT_IN_DEBUG(rap_NetServerEnum2, r);
348 result = rap_cli_do_call(tree, call);
350 if (!NT_STATUS_IS_OK(result))
351 goto done;
353 result = NT_STATUS_INVALID_PARAMETER;
355 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
356 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
357 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
358 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
360 r->out.info = talloc_array(mem_ctx, union rap_server_info, r->out.count);
362 if (r->out.info == NULL) {
363 result = NT_STATUS_NO_MEMORY;
364 goto done;
367 for (i=0; i<r->out.count; i++) {
368 switch(r->in.level) {
369 case 0:
370 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
371 r->out.info[i].info0.name, 16));
372 break;
373 case 1:
374 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
375 r->out.info[i].info1.name, 16));
376 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
377 &r->out.info[i].info1.version_major, 1));
378 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
379 &r->out.info[i].info1.version_minor, 1));
380 NDR_GOTO(ndr_pull_uint32(call->ndr_pull_data,
381 NDR_SCALARS, &r->out.info[i].info1.servertype));
382 RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
383 r->out.convert,
384 &r->out.info[i].info1.comment));
388 if (DEBUGLEVEL >= 10) {
389 NDR_PRINT_OUT_DEBUG(rap_NetServerEnum2, r);
392 result = NT_STATUS_OK;
394 done:
395 talloc_free(call);
396 return result;
399 NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
400 TALLOC_CTX *mem_ctx,
401 struct rap_WserverGetInfo *r)
403 struct rap_call *call;
404 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
406 if (!(call = new_rap_cli_call(mem_ctx, RAP_WserverGetInfo))) {
407 return NT_STATUS_NO_MEMORY;
410 rap_cli_push_word(call, r->in.level);
411 rap_cli_push_rcvbuf(call, r->in.bufsize);
412 rap_cli_expect_word(call);
414 switch(r->in.level) {
415 case 0:
416 rap_cli_expect_format(call, "B16");
417 break;
418 case 1:
419 rap_cli_expect_format(call, "B16BBDz");
420 break;
421 default:
422 result = NT_STATUS_INVALID_PARAMETER;
423 goto done;
426 if (DEBUGLEVEL >= 10) {
427 NDR_PRINT_IN_DEBUG(rap_WserverGetInfo, r);
430 result = rap_cli_do_call(tree, call);
432 if (!NT_STATUS_IS_OK(result))
433 goto done;
435 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
436 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
437 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
439 switch(r->in.level) {
440 case 0:
441 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
442 r->out.info.info0.name, 16));
443 break;
444 case 1:
445 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
446 r->out.info.info1.name, 16));
447 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
448 &r->out.info.info1.version_major, 1));
449 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
450 &r->out.info.info1.version_minor, 1));
451 NDR_GOTO(ndr_pull_uint32(call->ndr_pull_data,
452 NDR_SCALARS, &r->out.info.info1.servertype));
453 RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
454 r->out.convert,
455 &r->out.info.info1.comment));
458 if (DEBUGLEVEL >= 10) {
459 NDR_PRINT_OUT_DEBUG(rap_WserverGetInfo, r);
461 done:
462 talloc_free(call);
463 return result;
466 static enum ndr_err_code ndr_pull_rap_NetPrintQEnum_data(struct ndr_pull *ndr, struct rap_NetPrintQEnum *r)
468 uint32_t cntr_info_0;
469 TALLOC_CTX *_mem_save_info_0;
471 NDR_PULL_ALLOC_N(ndr, r->out.info, r->out.count);
472 _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
473 NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
474 for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
475 NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
476 NDR_CHECK(ndr_pull_rap_printq_info(ndr, NDR_SCALARS, &r->out.info[cntr_info_0]));
478 for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
479 NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
480 NDR_CHECK(ndr_pull_rap_printq_info(ndr, NDR_BUFFERS, &r->out.info[cntr_info_0]));
482 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
484 return NDR_ERR_SUCCESS;
487 NTSTATUS smbcli_rap_netprintqenum(struct smbcli_tree *tree,
488 TALLOC_CTX *mem_ctx,
489 struct rap_NetPrintQEnum *r)
491 struct rap_call *call;
492 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
494 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintQEnum))) {
495 return NT_STATUS_NO_MEMORY;
498 rap_cli_push_word(call, r->in.level);
499 rap_cli_push_rcvbuf(call, r->in.bufsize);
500 rap_cli_expect_multiple_entries(call);
502 switch(r->in.level) {
503 case 0:
504 rap_cli_expect_format(call, "B13");
505 break;
506 case 1:
507 rap_cli_expect_format(call, "B13BWWWzzzzzWW");
508 break;
509 case 2:
510 rap_cli_expect_format(call, "B13BWWWzzzzzWN");
511 rap_cli_expect_extra_format(call, "WB21BB16B10zWWzDDz");
512 break;
513 case 3:
514 rap_cli_expect_format(call, "zWWWWzzzzWWzzl");
515 break;
516 case 4:
517 rap_cli_expect_format(call, "zWWWWzzzzWNzzl");
518 rap_cli_expect_extra_format(call, "WWzWWDDzz");
519 /* no mention of extra format in MS-RAP */
520 break;
521 case 5:
522 rap_cli_expect_format(call, "z");
523 break;
524 default:
525 result = NT_STATUS_INVALID_PARAMETER;
526 goto done;
529 if (DEBUGLEVEL >= 10) {
530 NDR_PRINT_IN_DEBUG(rap_NetPrintQEnum, r);
533 result = rap_cli_do_call(tree, call);
535 if (!NT_STATUS_IS_OK(result))
536 goto done;
538 result = NT_STATUS_INVALID_PARAMETER;
540 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
541 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
542 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
543 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
545 call->ndr_pull_data->relative_rap_convert = r->out.convert;
547 NDR_GOTO(ndr_pull_rap_NetPrintQEnum_data(call->ndr_pull_data, r));
549 r->out.info = talloc_steal(mem_ctx, r->out.info);
551 if (DEBUGLEVEL >= 10) {
552 NDR_PRINT_OUT_DEBUG(rap_NetPrintQEnum, r);
555 result = NT_STATUS_OK;
557 done:
558 talloc_free(call);
559 return result;
562 NTSTATUS smbcli_rap_netprintqgetinfo(struct smbcli_tree *tree,
563 TALLOC_CTX *mem_ctx,
564 struct rap_NetPrintQGetInfo *r)
566 struct rap_call *call;
567 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
569 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintQGetInfo))) {
570 return NT_STATUS_NO_MEMORY;
573 rap_cli_push_string(call, r->in.PrintQueueName);
574 rap_cli_push_word(call, r->in.level);
575 rap_cli_push_rcvbuf(call, r->in.bufsize);
576 rap_cli_expect_word(call);
578 switch(r->in.level) {
579 case 0:
580 rap_cli_expect_format(call, "B13");
581 break;
582 case 1:
583 rap_cli_expect_format(call, "B13BWWWzzzzzWW");
584 break;
585 case 2:
586 rap_cli_expect_format(call, "B13BWWWzzzzzWN");
587 rap_cli_expect_extra_format(call, "WB21BB16B10zWWzDDz");
588 break;
589 case 3:
590 rap_cli_expect_format(call, "zWWWWzzzzWWzzl");
591 break;
592 case 4:
593 rap_cli_expect_format(call, "zWWWWzzzzWNzzl");
594 rap_cli_expect_extra_format(call, "WWzWWDDzz");
595 /* no mention of extra format in MS-RAP */
596 break;
597 case 5:
598 rap_cli_expect_format(call, "z");
599 break;
600 default:
601 result = NT_STATUS_INVALID_PARAMETER;
602 goto done;
605 if (DEBUGLEVEL >= 10) {
606 NDR_PRINT_IN_DEBUG(rap_NetPrintQGetInfo, r);
609 result = rap_cli_do_call(tree, call);
611 if (!NT_STATUS_IS_OK(result))
612 goto done;
614 result = NT_STATUS_INVALID_PARAMETER;
616 ZERO_STRUCT(r->out);
618 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
619 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
620 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
622 if (r->out.status == 0) {
623 call->ndr_pull_data->relative_rap_convert = r->out.convert;
625 NDR_GOTO(ndr_pull_set_switch_value(call->ndr_pull_data, &r->out.info, r->in.level));
626 NDR_GOTO(ndr_pull_rap_printq_info(call->ndr_pull_data, NDR_SCALARS|NDR_BUFFERS, &r->out.info));
629 if (DEBUGLEVEL >= 10) {
630 NDR_PRINT_OUT_DEBUG(rap_NetPrintQGetInfo, r);
633 result = NT_STATUS_OK;
634 done:
635 talloc_free(call);
636 return result;
639 NTSTATUS smbcli_rap_netprintjobpause(struct smbcli_tree *tree,
640 TALLOC_CTX *mem_ctx,
641 struct rap_NetPrintJobPause *r)
643 struct rap_call *call;
644 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
646 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintJobPause))) {
647 return NT_STATUS_NO_MEMORY;
650 rap_cli_push_word(call, r->in.JobID);
652 rap_cli_expect_format(call, "W");
654 if (DEBUGLEVEL >= 10) {
655 NDR_PRINT_IN_DEBUG(rap_NetPrintJobPause, r);
658 result = rap_cli_do_call(tree, call);
660 if (!NT_STATUS_IS_OK(result))
661 goto done;
663 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
664 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
666 if (DEBUGLEVEL >= 10) {
667 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobPause, r);
670 done:
671 talloc_free(call);
672 return result;
675 NTSTATUS smbcli_rap_netprintjobcontinue(struct smbcli_tree *tree,
676 TALLOC_CTX *mem_ctx,
677 struct rap_NetPrintJobContinue *r)
679 struct rap_call *call;
680 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
682 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintJobContinue))) {
683 return NT_STATUS_NO_MEMORY;
686 rap_cli_push_word(call, r->in.JobID);
688 rap_cli_expect_format(call, "W");
690 if (DEBUGLEVEL >= 10) {
691 NDR_PRINT_IN_DEBUG(rap_NetPrintJobContinue, r);
694 result = rap_cli_do_call(tree, call);
696 if (!NT_STATUS_IS_OK(result))
697 goto done;
699 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
700 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
702 if (DEBUGLEVEL >= 10) {
703 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobContinue, r);
706 done:
707 talloc_free(call);
708 return result;
711 NTSTATUS smbcli_rap_netprintjobdelete(struct smbcli_tree *tree,
712 TALLOC_CTX *mem_ctx,
713 struct rap_NetPrintJobDelete *r)
715 struct rap_call *call;
716 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
718 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintJobDel))) {
719 return NT_STATUS_NO_MEMORY;
722 rap_cli_push_word(call, r->in.JobID);
724 rap_cli_expect_format(call, "W");
726 if (DEBUGLEVEL >= 10) {
727 NDR_PRINT_IN_DEBUG(rap_NetPrintJobDelete, r);
730 result = rap_cli_do_call(tree, call);
732 if (!NT_STATUS_IS_OK(result))
733 goto done;
735 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
736 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
738 if (DEBUGLEVEL >= 10) {
739 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobDelete, r);
742 done:
743 talloc_free(call);
744 return result;
747 NTSTATUS smbcli_rap_netprintqueuepause(struct smbcli_tree *tree,
748 TALLOC_CTX *mem_ctx,
749 struct rap_NetPrintQueuePause *r)
751 struct rap_call *call;
752 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
754 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintQPause))) {
755 return NT_STATUS_NO_MEMORY;
758 rap_cli_push_string(call, r->in.PrintQueueName);
760 rap_cli_expect_format(call, "");
762 if (DEBUGLEVEL >= 10) {
763 NDR_PRINT_IN_DEBUG(rap_NetPrintQueuePause, r);
766 result = rap_cli_do_call(tree, call);
768 if (!NT_STATUS_IS_OK(result))
769 goto done;
771 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
772 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
774 if (DEBUGLEVEL >= 10) {
775 NDR_PRINT_OUT_DEBUG(rap_NetPrintQueuePause, r);
778 done:
779 talloc_free(call);
780 return result;
783 NTSTATUS smbcli_rap_netprintqueueresume(struct smbcli_tree *tree,
784 TALLOC_CTX *mem_ctx,
785 struct rap_NetPrintQueueResume *r)
787 struct rap_call *call;
788 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
790 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintQContinue))) {
791 return NT_STATUS_NO_MEMORY;
794 rap_cli_push_string(call, r->in.PrintQueueName);
796 rap_cli_expect_format(call, "");
798 if (DEBUGLEVEL >= 10) {
799 NDR_PRINT_IN_DEBUG(rap_NetPrintQueueResume, r);
802 result = rap_cli_do_call(tree, call);
804 if (!NT_STATUS_IS_OK(result))
805 goto done;
807 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
808 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
810 if (DEBUGLEVEL >= 10) {
811 NDR_PRINT_OUT_DEBUG(rap_NetPrintQueueResume, r);
814 done:
815 talloc_free(call);
816 return result;
819 NTSTATUS smbcli_rap_netprintqueuepurge(struct smbcli_tree *tree,
820 TALLOC_CTX *mem_ctx,
821 struct rap_NetPrintQueuePurge *r)
823 struct rap_call *call;
824 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
826 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintQPurge))) {
827 return NT_STATUS_NO_MEMORY;
830 rap_cli_push_string(call, r->in.PrintQueueName);
832 rap_cli_expect_format(call, "");
834 if (DEBUGLEVEL >= 10) {
835 NDR_PRINT_IN_DEBUG(rap_NetPrintQueuePurge, r);
838 result = rap_cli_do_call(tree, call);
840 if (!NT_STATUS_IS_OK(result))
841 goto done;
843 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
844 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
846 if (DEBUGLEVEL >= 10) {
847 NDR_PRINT_OUT_DEBUG(rap_NetPrintQueuePurge, r);
850 done:
851 talloc_free(call);
852 return result;
855 static enum ndr_err_code ndr_pull_rap_NetPrintJobEnum_data(struct ndr_pull *ndr, struct rap_NetPrintJobEnum *r)
857 uint32_t cntr_info_0;
858 TALLOC_CTX *_mem_save_info_0;
860 NDR_PULL_ALLOC_N(ndr, r->out.info, r->out.count);
861 _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
862 NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
863 for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
864 NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
865 NDR_CHECK(ndr_pull_rap_printj_info(ndr, NDR_SCALARS, &r->out.info[cntr_info_0]));
867 for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
868 NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
869 NDR_CHECK(ndr_pull_rap_printj_info(ndr, NDR_BUFFERS, &r->out.info[cntr_info_0]));
871 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
873 return NDR_ERR_SUCCESS;
876 NTSTATUS smbcli_rap_netprintjobenum(struct smbcli_tree *tree,
877 TALLOC_CTX *mem_ctx,
878 struct rap_NetPrintJobEnum *r)
880 struct rap_call *call;
881 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
883 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintJobEnum))) {
884 return NT_STATUS_NO_MEMORY;
887 rap_cli_push_string(call, r->in.PrintQueueName);
888 rap_cli_push_word(call, r->in.level);
889 rap_cli_push_rcvbuf(call, r->in.bufsize);
890 rap_cli_expect_multiple_entries(call);
892 switch(r->in.level) {
893 case 0:
894 rap_cli_expect_format(call, "W");
895 break;
896 case 1:
897 rap_cli_expect_format(call, "WB21BB16B10zWWzDDz");
898 break;
899 case 2:
900 rap_cli_expect_format(call, "WWzWWDDzz");
901 break;
902 case 3:
903 rap_cli_expect_format(call, "WWzWWDDzzzzzzzzzzlz");
904 break;
905 case 4:
906 rap_cli_expect_format(call, "WWzWWDDzzzzzDDDDDDD");
907 break;
908 default:
909 result = NT_STATUS_INVALID_PARAMETER;
910 goto done;
913 if (DEBUGLEVEL >= 10) {
914 NDR_PRINT_IN_DEBUG(rap_NetPrintJobEnum, r);
917 result = rap_cli_do_call(tree, call);
919 if (!NT_STATUS_IS_OK(result))
920 goto done;
922 result = NT_STATUS_INVALID_PARAMETER;
924 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
925 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
926 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
927 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
929 call->ndr_pull_data->relative_rap_convert = r->out.convert;
931 NDR_GOTO(ndr_pull_rap_NetPrintJobEnum_data(call->ndr_pull_data, r));
933 if (DEBUGLEVEL >= 10) {
934 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobEnum, r);
937 r->out.info = talloc_steal(mem_ctx, r->out.info);
939 result = NT_STATUS_OK;
941 done:
942 talloc_free(call);
943 return result;
946 NTSTATUS smbcli_rap_netprintjobgetinfo(struct smbcli_tree *tree,
947 TALLOC_CTX *mem_ctx,
948 struct rap_NetPrintJobGetInfo *r)
950 struct rap_call *call;
951 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
953 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintJobGetInfo))) {
954 return NT_STATUS_NO_MEMORY;
957 rap_cli_push_word(call, r->in.JobID);
958 rap_cli_push_word(call, r->in.level);
959 rap_cli_push_rcvbuf(call, r->in.bufsize);
960 rap_cli_expect_word(call);
962 switch(r->in.level) {
963 case 0:
964 rap_cli_expect_format(call, "W");
965 break;
966 case 1:
967 rap_cli_expect_format(call, "WB21BB16B10zWWzDDz");
968 break;
969 case 2:
970 rap_cli_expect_format(call, "WWzWWDDzz");
971 break;
972 case 3:
973 rap_cli_expect_format(call, "WWzWWDDzzzzzzzzzzlz");
974 break;
975 case 4:
976 rap_cli_expect_format(call, "WWzWWDDzzzzzDDDDDDD");
977 break;
978 default:
979 result = NT_STATUS_INVALID_PARAMETER;
980 goto done;
983 if (DEBUGLEVEL >= 10) {
984 NDR_PRINT_IN_DEBUG(rap_NetPrintJobGetInfo, r);
987 result = rap_cli_do_call(tree, call);
989 if (!NT_STATUS_IS_OK(result))
990 goto done;
992 result = NT_STATUS_INVALID_PARAMETER;
994 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
995 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
996 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
998 call->ndr_pull_data->relative_rap_convert = r->out.convert;
1000 NDR_GOTO(ndr_pull_set_switch_value(call->ndr_pull_data, &r->out.info, r->in.level));
1001 NDR_GOTO(ndr_pull_rap_printj_info(call->ndr_pull_data, NDR_SCALARS|NDR_BUFFERS, &r->out.info));
1003 if (DEBUGLEVEL >= 10) {
1004 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobGetInfo, r);
1007 result = NT_STATUS_OK;
1009 done:
1010 talloc_free(call);
1011 return result;
1014 NTSTATUS smbcli_rap_netprintjobsetinfo(struct smbcli_tree *tree,
1015 TALLOC_CTX *mem_ctx,
1016 struct rap_NetPrintJobSetInfo *r)
1018 struct rap_call *call;
1019 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1021 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintJobSetInfo))) {
1022 return NT_STATUS_NO_MEMORY;
1025 rap_cli_push_word(call, r->in.JobID);
1026 rap_cli_push_word(call, r->in.level);
1027 rap_cli_push_sendbuf(call, r->in.bufsize);
1028 rap_cli_push_param(call, r->in.ParamNum);
1030 switch (r->in.ParamNum) {
1031 case RAP_PARAM_JOBNUM:
1032 case RAP_PARAM_JOBPOSITION:
1033 case RAP_PARAM_JOBSTATUS:
1034 NDR_GOTO(ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, r->in.Param.value));
1035 break;
1036 case RAP_PARAM_USERNAME:
1037 case RAP_PARAM_NOTIFYNAME:
1038 case RAP_PARAM_DATATYPE:
1039 case RAP_PARAM_PARAMETERS_STRING:
1040 case RAP_PARAM_JOBSTATUSSTR:
1041 case RAP_PARAM_JOBCOMMENT:
1042 NDR_GOTO(ndr_push_string(call->ndr_push_param, NDR_SCALARS, r->in.Param.string));
1043 break;
1044 case RAP_PARAM_TIMESUBMITTED:
1045 case RAP_PARAM_JOBSIZE:
1046 NDR_GOTO(ndr_push_uint32(call->ndr_push_param, NDR_SCALARS, r->in.Param.value4));
1047 break;
1048 default:
1049 result = NT_STATUS_INVALID_PARAMETER;
1050 break;
1053 /* not really sure if this is correct */
1054 rap_cli_expect_format(call, "WB21BB16B10zWWzDDz");
1056 if (DEBUGLEVEL >= 10) {
1057 NDR_PRINT_IN_DEBUG(rap_NetPrintJobSetInfo, r);
1060 result = rap_cli_do_call(tree, call);
1062 if (!NT_STATUS_IS_OK(result))
1063 goto done;
1065 result = NT_STATUS_INVALID_PARAMETER;
1067 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1068 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1070 result = NT_STATUS_OK;
1072 if (!NT_STATUS_IS_OK(result)) {
1073 goto done;
1076 if (DEBUGLEVEL >= 10) {
1077 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobSetInfo, r);
1080 done:
1081 talloc_free(call);
1082 return result;
1085 static enum ndr_err_code ndr_pull_rap_NetPrintDestEnum_data(struct ndr_pull *ndr, struct rap_NetPrintDestEnum *r)
1087 uint32_t cntr_info_0;
1088 TALLOC_CTX *_mem_save_info_0;
1090 NDR_PULL_ALLOC_N(ndr, r->out.info, r->out.count);
1091 _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
1092 NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
1093 for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
1094 NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
1095 NDR_CHECK(ndr_pull_rap_printdest_info(ndr, NDR_SCALARS, &r->out.info[cntr_info_0]));
1097 for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
1098 NDR_CHECK(ndr_pull_rap_printdest_info(ndr, NDR_BUFFERS, &r->out.info[cntr_info_0]));
1100 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
1102 return NDR_ERR_SUCCESS;
1106 NTSTATUS smbcli_rap_netprintdestenum(struct smbcli_tree *tree,
1107 TALLOC_CTX *mem_ctx,
1108 struct rap_NetPrintDestEnum *r)
1110 struct rap_call *call;
1111 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1113 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintDestEnum))) {
1114 return NT_STATUS_NO_MEMORY;
1117 rap_cli_push_word(call, r->in.level);
1118 rap_cli_push_rcvbuf(call, r->in.bufsize);
1119 rap_cli_expect_multiple_entries(call);
1121 switch(r->in.level) {
1122 case 0:
1123 rap_cli_expect_format(call, "B9");
1124 break;
1125 case 1:
1126 rap_cli_expect_format(call, "B9B21WWzW");
1127 break;
1128 case 2:
1129 rap_cli_expect_format(call, "z");
1130 break;
1131 case 3:
1132 rap_cli_expect_format(call, "zzzWWzzzWW");
1133 break;
1134 default:
1135 result = NT_STATUS_INVALID_PARAMETER;
1136 goto done;
1139 if (DEBUGLEVEL >= 10) {
1140 NDR_PRINT_IN_DEBUG(rap_NetPrintDestEnum, r);
1143 result = rap_cli_do_call(tree, call);
1145 if (!NT_STATUS_IS_OK(result))
1146 goto done;
1148 result = NT_STATUS_INVALID_PARAMETER;
1150 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1151 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1152 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
1153 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1155 call->ndr_pull_data->relative_rap_convert = r->out.convert;
1157 NDR_GOTO(ndr_pull_rap_NetPrintDestEnum_data(call->ndr_pull_data, r));
1159 r->out.info = talloc_steal(mem_ctx, r->out.info);
1161 if (DEBUGLEVEL >= 10) {
1162 NDR_PRINT_OUT_DEBUG(rap_NetPrintDestEnum, r);
1165 result = NT_STATUS_OK;
1167 done:
1168 talloc_free(call);
1169 return result;
1172 NTSTATUS smbcli_rap_netprintdestgetinfo(struct smbcli_tree *tree,
1173 TALLOC_CTX *mem_ctx,
1174 struct rap_NetPrintDestGetInfo *r)
1176 struct rap_call *call;
1177 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1179 if (!(call = new_rap_cli_call(mem_ctx, RAP_WPrintDestGetInfo))) {
1180 return NT_STATUS_NO_MEMORY;
1183 rap_cli_push_string(call, r->in.PrintDestName);
1184 rap_cli_push_word(call, r->in.level);
1185 rap_cli_push_rcvbuf(call, r->in.bufsize);
1186 rap_cli_expect_word(call);
1188 switch(r->in.level) {
1189 case 0:
1190 rap_cli_expect_format(call, "B9");
1191 break;
1192 case 1:
1193 rap_cli_expect_format(call, "B9B21WWzW");
1194 break;
1195 case 2:
1196 rap_cli_expect_format(call, "z");
1197 break;
1198 case 3:
1199 rap_cli_expect_format(call, "zzzWWzzzWW");
1200 break;
1201 default:
1202 result = NT_STATUS_INVALID_PARAMETER;
1203 goto done;
1206 if (DEBUGLEVEL >= 10) {
1207 NDR_PRINT_IN_DEBUG(rap_NetPrintDestGetInfo, r);
1210 result = rap_cli_do_call(tree, call);
1212 if (!NT_STATUS_IS_OK(result))
1213 goto done;
1215 result = NT_STATUS_INVALID_PARAMETER;
1217 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1218 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1219 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1221 call->ndr_pull_data->relative_rap_convert = r->out.convert;
1223 NDR_GOTO(ndr_pull_set_switch_value(call->ndr_pull_data, &r->out.info, r->in.level));
1224 NDR_GOTO(ndr_pull_rap_printdest_info(call->ndr_pull_data, NDR_SCALARS|NDR_BUFFERS, &r->out.info));
1226 if (DEBUGLEVEL >= 10) {
1227 NDR_PRINT_OUT_DEBUG(rap_NetPrintDestGetInfo, r);
1230 result = NT_STATUS_OK;
1232 done:
1233 talloc_free(call);
1234 return result;
1237 NTSTATUS smbcli_rap_netuserpasswordset2(struct smbcli_tree *tree,
1238 TALLOC_CTX *mem_ctx,
1239 struct rap_NetUserPasswordSet2 *r)
1241 struct rap_call *call;
1242 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1244 if (!(call = new_rap_cli_call(mem_ctx, RAP_WUserPasswordSet2))) {
1245 return NT_STATUS_NO_MEMORY;
1248 rap_cli_push_string(call, r->in.UserName);
1249 rap_cli_push_paramdesc(call, 'b');
1250 rap_cli_push_paramdesc(call, '1');
1251 rap_cli_push_paramdesc(call, '6');
1252 ndr_push_array_uint8(call->ndr_push_param, NDR_SCALARS, r->in.OldPassword, 16);
1253 rap_cli_push_paramdesc(call, 'b');
1254 rap_cli_push_paramdesc(call, '1');
1255 rap_cli_push_paramdesc(call, '6');
1256 ndr_push_array_uint8(call->ndr_push_param, NDR_SCALARS, r->in.NewPassword, 16);
1257 rap_cli_push_word(call, r->in.EncryptedPassword);
1258 rap_cli_push_word(call, r->in.RealPasswordLength);
1260 rap_cli_expect_format(call, "");
1262 if (DEBUGLEVEL >= 10) {
1263 NDR_PRINT_IN_DEBUG(rap_NetUserPasswordSet2, r);
1266 result = rap_cli_do_call(tree, call);
1268 if (!NT_STATUS_IS_OK(result))
1269 goto done;
1271 result = NT_STATUS_INVALID_PARAMETER;
1273 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1274 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1276 result = NT_STATUS_OK;
1278 if (!NT_STATUS_IS_OK(result)) {
1279 goto done;
1282 if (DEBUGLEVEL >= 10) {
1283 NDR_PRINT_OUT_DEBUG(rap_NetUserPasswordSet2, r);
1286 done:
1287 talloc_free(call);
1288 return result;
1291 NTSTATUS smbcli_rap_netoemchangepassword(struct smbcli_tree *tree,
1292 TALLOC_CTX *mem_ctx,
1293 struct rap_NetOEMChangePassword *r)
1295 struct rap_call *call;
1296 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1298 if (!(call = new_rap_cli_call(mem_ctx, RAP_SamOEMChgPasswordUser2_P))) {
1299 return NT_STATUS_NO_MEMORY;
1302 rap_cli_push_string(call, r->in.UserName);
1303 rap_cli_push_sendbuf(call, 532);
1304 ndr_push_array_uint8(call->ndr_push_data, NDR_SCALARS, r->in.crypt_password, 516);
1305 ndr_push_array_uint8(call->ndr_push_data, NDR_SCALARS, r->in.password_hash, 16);
1307 rap_cli_expect_format(call, "B516B16");
1309 if (DEBUGLEVEL >= 10) {
1310 NDR_PRINT_IN_DEBUG(rap_NetOEMChangePassword, r);
1313 result = rap_cli_do_call(tree, call);
1315 if (!NT_STATUS_IS_OK(result))
1316 goto done;
1318 result = NT_STATUS_INVALID_PARAMETER;
1320 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1321 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1323 result = NT_STATUS_OK;
1325 if (!NT_STATUS_IS_OK(result)) {
1326 goto done;
1329 if (DEBUGLEVEL >= 10) {
1330 NDR_PRINT_OUT_DEBUG(rap_NetOEMChangePassword, r);
1333 done:
1334 talloc_free(call);
1335 return result;
1338 NTSTATUS smbcli_rap_netusergetinfo(struct smbcli_tree *tree,
1339 TALLOC_CTX *mem_ctx,
1340 struct rap_NetUserGetInfo *r)
1342 struct rap_call *call;
1343 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1345 if (!(call = new_rap_cli_call(mem_ctx, RAP_WUserGetInfo))) {
1346 return NT_STATUS_NO_MEMORY;
1349 rap_cli_push_string(call, r->in.UserName);
1350 rap_cli_push_word(call, r->in.level);
1351 rap_cli_push_rcvbuf(call, r->in.bufsize);
1352 rap_cli_expect_word(call);
1354 switch(r->in.level) {
1355 case 0:
1356 rap_cli_expect_format(call, "B21");
1357 break;
1358 case 1:
1359 rap_cli_expect_format(call, "B21BB16DWzzWz");
1360 break;
1361 case 2:
1362 rap_cli_expect_format(call, "B21BB16DWzzWzDzzzzDDDDWb21WWzWW");
1363 break;
1364 case 10:
1365 rap_cli_expect_format(call, "B21Bzzz");
1366 break;
1367 case 11:
1368 rap_cli_expect_format(call, "B21BzzzWDDzzDDWWzWzDWb21W");
1369 break;
1370 default:
1371 result = NT_STATUS_INVALID_PARAMETER;
1372 goto done;
1375 if (DEBUGLEVEL >= 10) {
1376 NDR_PRINT_IN_DEBUG(rap_NetUserGetInfo, r);
1379 result = rap_cli_do_call(tree, call);
1381 if (!NT_STATUS_IS_OK(result))
1382 goto done;
1384 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1385 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1386 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1388 call->ndr_pull_data->relative_rap_convert = r->out.convert;
1390 NDR_GOTO(ndr_pull_set_switch_value(call->ndr_pull_data, &r->out.info, r->in.level));
1391 NDR_GOTO(ndr_pull_rap_netuser_info(call->ndr_pull_data, NDR_SCALARS|NDR_BUFFERS, &r->out.info));
1393 if (DEBUGLEVEL >= 10) {
1394 NDR_PRINT_OUT_DEBUG(rap_NetUserGetInfo, r);
1397 result = NT_STATUS_OK;
1399 done:
1400 talloc_free(call);
1401 return result;
1405 static enum ndr_err_code ndr_pull_rap_NetSessionEnum_data(struct ndr_pull *ndr, struct rap_NetSessionEnum *r)
1407 uint32_t cntr_info_0;
1408 TALLOC_CTX *_mem_save_info_0;
1410 NDR_PULL_ALLOC_N(ndr, r->out.info, r->out.count);
1411 _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
1412 NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
1413 for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
1414 NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
1415 NDR_CHECK(ndr_pull_rap_session_info(ndr, NDR_SCALARS, &r->out.info[cntr_info_0]));
1417 for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
1418 NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
1419 NDR_CHECK(ndr_pull_rap_session_info(ndr, NDR_BUFFERS, &r->out.info[cntr_info_0]));
1421 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
1423 return NDR_ERR_SUCCESS;
1427 NTSTATUS smbcli_rap_netsessionenum(struct smbcli_tree *tree,
1428 TALLOC_CTX *mem_ctx,
1429 struct rap_NetSessionEnum *r)
1431 struct rap_call *call;
1432 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1434 call = new_rap_cli_call(tree, RAP_WsessionEnum);
1436 if (call == NULL)
1437 return NT_STATUS_NO_MEMORY;
1439 rap_cli_push_word(call, r->in.level);
1440 rap_cli_push_rcvbuf(call, r->in.bufsize);
1441 rap_cli_expect_multiple_entries(call);
1443 switch(r->in.level) {
1444 case 2:
1445 rap_cli_expect_format(call, "zzWWWDDDz");
1446 break;
1447 default:
1448 result = NT_STATUS_INVALID_PARAMETER;
1449 goto done;
1452 if (DEBUGLEVEL >= 10) {
1453 NDR_PRINT_IN_DEBUG(rap_NetSessionEnum, r);
1456 result = rap_cli_do_call(tree, call);
1458 if (!NT_STATUS_IS_OK(result))
1459 goto done;
1461 result = NT_STATUS_INVALID_PARAMETER;
1463 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1464 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1465 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
1466 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1468 call->ndr_pull_data->relative_rap_convert = r->out.convert;
1470 NDR_GOTO(ndr_pull_rap_NetSessionEnum_data(call->ndr_pull_data, r));
1472 r->out.info = talloc_steal(mem_ctx, r->out.info);
1474 if (DEBUGLEVEL >= 10) {
1475 NDR_PRINT_OUT_DEBUG(rap_NetSessionEnum, r);
1478 result = NT_STATUS_OK;
1480 done:
1481 talloc_free(call);
1482 return result;
1485 NTSTATUS smbcli_rap_netsessiongetinfo(struct smbcli_tree *tree,
1486 TALLOC_CTX *mem_ctx,
1487 struct rap_NetSessionGetInfo *r)
1489 struct rap_call *call;
1490 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1492 if (!(call = new_rap_cli_call(mem_ctx, RAP_WsessionGetInfo))) {
1493 return NT_STATUS_NO_MEMORY;
1496 rap_cli_push_string(call, r->in.SessionName);
1497 rap_cli_push_word(call, r->in.level);
1498 rap_cli_push_rcvbuf(call, r->in.bufsize);
1499 rap_cli_expect_word(call);
1501 switch(r->in.level) {
1502 case 2:
1503 rap_cli_expect_format(call, "zzWWWDDDz");
1504 break;
1505 default:
1506 result = NT_STATUS_INVALID_PARAMETER;
1507 break;
1510 if (DEBUGLEVEL >= 10) {
1511 NDR_PRINT_IN_DEBUG(rap_NetSessionGetInfo, r);
1514 result = rap_cli_do_call(tree, call);
1516 if (!NT_STATUS_IS_OK(result))
1517 goto done;
1519 result = NT_STATUS_INVALID_PARAMETER;
1521 ZERO_STRUCT(r->out);
1523 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1524 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1525 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1527 if (r->out.status == 0 && r->out.available) {
1528 call->ndr_pull_data->relative_rap_convert = r->out.convert;
1530 NDR_GOTO(ndr_pull_set_switch_value(call->ndr_pull_data, &r->out.info, r->in.level));
1531 NDR_GOTO(ndr_pull_rap_session_info(call->ndr_pull_data, NDR_SCALARS|NDR_BUFFERS, &r->out.info));
1534 if (DEBUGLEVEL >= 10) {
1535 NDR_PRINT_OUT_DEBUG(rap_NetSessionGetInfo, r);
1538 result = NT_STATUS_OK;
1539 done:
1540 talloc_free(call);
1541 return result;
1545 NTSTATUS smbcli_rap_netuseradd(struct smbcli_tree *tree,
1546 TALLOC_CTX *mem_ctx,
1547 struct rap_NetUserAdd *r)
1549 struct rap_call *call;
1550 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1552 if (!(call = new_rap_cli_call(mem_ctx, RAP_WUserAdd2))) {
1553 return NT_STATUS_NO_MEMORY;
1556 rap_cli_push_word(call, r->in.level);
1557 rap_cli_push_sendbuf(call, r->in.bufsize);
1558 rap_cli_push_word(call, r->in.pwdlength);
1559 rap_cli_push_word(call, r->in.unknown);
1561 switch (r->in.level) {
1562 case 1:
1563 rap_cli_expect_format(call, "B21BB16DWzzWz");
1564 break;
1565 default:
1566 result = NT_STATUS_INVALID_PARAMETER;
1567 break;
1570 if (DEBUGLEVEL >= 10) {
1571 NDR_PRINT_IN_DEBUG(rap_NetUserAdd, r);
1574 NDR_GOTO(ndr_push_set_switch_value(call->ndr_push_data, &r->in.info, r->in.level));
1575 NDR_GOTO(ndr_push_rap_netuser_info(call->ndr_push_data, NDR_SCALARS|NDR_BUFFERS, &r->in.info));
1577 result = rap_cli_do_call(tree, call);
1579 if (!NT_STATUS_IS_OK(result))
1580 goto done;
1582 result = NT_STATUS_INVALID_PARAMETER;
1584 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1585 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1587 result = NT_STATUS_OK;
1589 if (!NT_STATUS_IS_OK(result)) {
1590 goto done;
1593 if (DEBUGLEVEL >= 10) {
1594 NDR_PRINT_OUT_DEBUG(rap_NetUserAdd, r);
1597 done:
1598 talloc_free(call);
1599 return result;
1602 NTSTATUS smbcli_rap_netuserdelete(struct smbcli_tree *tree,
1603 TALLOC_CTX *mem_ctx,
1604 struct rap_NetUserDelete *r)
1606 struct rap_call *call;
1607 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1609 if (!(call = new_rap_cli_call(mem_ctx, RAP_WUserDel))) {
1610 return NT_STATUS_NO_MEMORY;
1613 rap_cli_push_string(call, r->in.UserName);
1615 rap_cli_expect_format(call, "");
1616 rap_cli_expect_extra_format(call, "");
1618 if (DEBUGLEVEL >= 10) {
1619 NDR_PRINT_IN_DEBUG(rap_NetUserDelete, r);
1622 result = rap_cli_do_call(tree, call);
1624 if (!NT_STATUS_IS_OK(result))
1625 goto done;
1627 result = NT_STATUS_INVALID_PARAMETER;
1629 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1630 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1632 result = NT_STATUS_OK;
1634 if (!NT_STATUS_IS_OK(result)) {
1635 goto done;
1638 if (DEBUGLEVEL >= 10) {
1639 NDR_PRINT_OUT_DEBUG(rap_NetUserDelete, r);
1642 done:
1643 talloc_free(call);
1644 return result;
1647 NTSTATUS smbcli_rap_netremotetod(struct smbcli_tree *tree,
1648 TALLOC_CTX *mem_ctx,
1649 struct rap_NetRemoteTOD *r)
1651 struct rap_call *call;
1652 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1654 if (!(call = new_rap_cli_call(mem_ctx, RAP_NetRemoteTOD))) {
1655 return NT_STATUS_NO_MEMORY;
1658 rap_cli_push_rcvbuf(call, r->in.bufsize);
1660 rap_cli_expect_format(call, "DDBBBBWWBBWB");
1661 rap_cli_expect_extra_format(call, "");
1663 if (DEBUGLEVEL >= 10) {
1664 NDR_PRINT_IN_DEBUG(rap_NetRemoteTOD, r);
1667 result = rap_cli_do_call(tree, call);
1669 if (!NT_STATUS_IS_OK(result))
1670 goto done;
1672 result = NT_STATUS_INVALID_PARAMETER;
1674 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1675 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1677 NDR_GOTO(ndr_pull_rap_TimeOfDayInfo(call->ndr_pull_data, NDR_SCALARS|NDR_BUFFERS, &r->out.tod));
1679 result = NT_STATUS_OK;
1681 if (!NT_STATUS_IS_OK(result)) {
1682 goto done;
1685 if (DEBUGLEVEL >= 10) {
1686 NDR_PRINT_OUT_DEBUG(rap_NetRemoteTOD, r);
1689 done:
1690 talloc_free(call);
1691 return result;