2 Unix SMB/CIFS implementation.
3 test suite for various RAP operations
4 Copyright (C) Volker Lendecke 2004
5 Copyright (C) Tim Potter 2005
6 Copyright (C) Jelmer Vernooij 2007
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "libcli/libcli.h"
24 #include "torture/smbtorture.h"
25 #include "torture/util.h"
26 #include "../librpc/gen_ndr/ndr_rap.h"
27 #include "librpc/ndr/libndr.h"
28 #include "param/param.h"
29 #include "torture/rap/proto.h"
31 #define RAP_GOTO(call) do { \
34 if (!NT_STATUS_IS_OK(_status)) { \
40 #define RAP_RETURN(call) do { \
43 if (!NT_STATUS_IS_OK(_status)) { \
49 #define NDR_GOTO(call) do { \
50 enum ndr_err_code _ndr_err; \
52 if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
53 result = ndr_map_error2ntstatus(_ndr_err); \
58 #define NDR_RETURN(call) do { \
59 enum ndr_err_code _ndr_err; \
61 if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \
62 return ndr_map_error2ntstatus(_ndr_err); \
70 const char *auxdatadesc;
75 uint16_t rcv_paramlen, rcv_datalen;
77 struct ndr_push *ndr_push_param;
78 struct ndr_push *ndr_push_data;
79 struct ndr_pull *ndr_pull_param;
80 struct ndr_pull *ndr_pull_data;
83 #define RAPNDR_FLAGS (LIBNDR_FLAG_NOALIGN|LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM);
85 static struct rap_call *new_rap_cli_call(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience, uint16_t callno)
87 struct rap_call *call;
89 call = talloc(mem_ctx, struct rap_call);
94 call->callno = callno;
95 call->rcv_paramlen = 4;
97 call->paramdesc = NULL;
98 call->datadesc = NULL;
99 call->auxdatadesc = NULL;
101 call->ndr_push_param = ndr_push_init_ctx(mem_ctx, iconv_convenience);
102 call->ndr_push_param->flags = RAPNDR_FLAGS;
104 call->ndr_push_data = ndr_push_init_ctx(mem_ctx, iconv_convenience);
105 call->ndr_push_data->flags = RAPNDR_FLAGS;
110 static void rap_cli_push_paramdesc(struct rap_call *call, char desc)
114 if (call->paramdesc != NULL)
115 len = strlen(call->paramdesc);
117 call->paramdesc = talloc_realloc(call,
122 call->paramdesc[len] = desc;
123 call->paramdesc[len+1] = '\0';
126 static void rap_cli_push_word(struct rap_call *call, uint16_t val)
128 rap_cli_push_paramdesc(call, 'W');
129 ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, val);
132 static void rap_cli_push_dword(struct rap_call *call, uint32_t val)
134 rap_cli_push_paramdesc(call, 'D');
135 ndr_push_uint32(call->ndr_push_param, NDR_SCALARS, val);
138 static void rap_cli_push_rcvbuf(struct rap_call *call, int len)
140 rap_cli_push_paramdesc(call, 'r');
141 rap_cli_push_paramdesc(call, 'L');
142 ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, len);
143 call->rcv_datalen = len;
146 static void rap_cli_push_sendbuf(struct rap_call *call, int len)
148 rap_cli_push_paramdesc(call, 's');
149 rap_cli_push_paramdesc(call, 'T');
150 ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, len);
153 static void rap_cli_push_param(struct rap_call *call, uint16_t val)
155 rap_cli_push_paramdesc(call, 'P');
156 ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, val);
159 static void rap_cli_expect_multiple_entries(struct rap_call *call)
161 rap_cli_push_paramdesc(call, 'e');
162 rap_cli_push_paramdesc(call, 'h');
163 call->rcv_paramlen += 4; /* uint16_t entry count, uint16_t total */
166 static void rap_cli_expect_word(struct rap_call *call)
168 rap_cli_push_paramdesc(call, 'h');
169 call->rcv_paramlen += 2;
172 static void rap_cli_push_string(struct rap_call *call, const char *str)
175 rap_cli_push_paramdesc(call, 'O');
178 rap_cli_push_paramdesc(call, 'z');
179 ndr_push_string(call->ndr_push_param, NDR_SCALARS, str);
182 static void rap_cli_expect_format(struct rap_call *call, const char *format)
184 call->datadesc = format;
187 static void rap_cli_expect_extra_format(struct rap_call *call, const char *format)
189 call->auxdatadesc = format;
192 static NTSTATUS rap_pull_string(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr,
193 uint16_t convert, const char **dest)
195 uint16_t string_offset;
200 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &string_offset));
201 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &ignore));
203 string_offset -= convert;
205 if (string_offset+1 > ndr->data_size)
206 return NT_STATUS_INVALID_PARAMETER;
208 p = (const char *)(ndr->data + string_offset);
209 len = strnlen(p, ndr->data_size-string_offset);
211 if ( string_offset + len + 1 > ndr->data_size )
212 return NT_STATUS_INVALID_PARAMETER;
214 *dest = talloc_zero_array(mem_ctx, char, len+1);
215 pull_string((char *)*dest, p, len+1, len, STR_ASCII);
220 static NTSTATUS rap_cli_do_call(struct smbcli_tree *tree,
221 struct smb_iconv_convenience *iconv_convenience,
222 struct rap_call *call)
225 DATA_BLOB param_blob;
227 struct ndr_push *params;
228 struct ndr_push *data;
229 struct smb_trans2 trans;
231 params = ndr_push_init_ctx(call, iconv_convenience);
234 return NT_STATUS_NO_MEMORY;
236 params->flags = RAPNDR_FLAGS;
238 data = ndr_push_init_ctx(call, iconv_convenience);
241 return NT_STATUS_NO_MEMORY;
243 data->flags = RAPNDR_FLAGS;
245 trans.in.max_param = call->rcv_paramlen;
246 trans.in.max_data = call->rcv_datalen;
247 trans.in.max_setup = 0;
249 trans.in.timeout = 0;
250 trans.in.setup_count = 0;
251 trans.in.setup = NULL;
252 trans.in.trans_name = "\\PIPE\\LANMAN";
254 NDR_RETURN(ndr_push_uint16(params, NDR_SCALARS, call->callno));
256 NDR_RETURN(ndr_push_string(params, NDR_SCALARS, call->paramdesc));
258 NDR_RETURN(ndr_push_string(params, NDR_SCALARS, call->datadesc));
260 param_blob = ndr_push_blob(call->ndr_push_param);
261 NDR_RETURN(ndr_push_bytes(params, param_blob.data,
264 data_blob = ndr_push_blob(call->ndr_push_data);
265 NDR_RETURN(ndr_push_bytes(data, data_blob.data,
268 if (call->auxdatadesc)
269 NDR_RETURN(ndr_push_string(params, NDR_SCALARS, call->auxdatadesc));
271 trans.in.params = ndr_push_blob(params);
272 trans.in.data = ndr_push_blob(data);
274 result = smb_raw_trans(tree, call, &trans);
276 if (!NT_STATUS_IS_OK(result))
279 call->ndr_pull_param = ndr_pull_init_blob(&trans.out.params, call,
281 call->ndr_pull_param->flags = RAPNDR_FLAGS;
283 call->ndr_pull_data = ndr_pull_init_blob(&trans.out.data, call,
285 call->ndr_pull_data->flags = RAPNDR_FLAGS;
291 static NTSTATUS smbcli_rap_netshareenum(struct smbcli_tree *tree,
292 struct smb_iconv_convenience *iconv_convenience,
294 struct rap_NetShareEnum *r)
296 struct rap_call *call;
297 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
300 call = new_rap_cli_call(tree, iconv_convenience, RAP_WshareEnum);
303 return NT_STATUS_NO_MEMORY;
305 rap_cli_push_word(call, r->in.level); /* Level */
306 rap_cli_push_rcvbuf(call, r->in.bufsize);
307 rap_cli_expect_multiple_entries(call);
309 switch(r->in.level) {
311 rap_cli_expect_format(call, "B13");
314 rap_cli_expect_format(call, "B13BWz");
318 if (DEBUGLEVEL >= 10) {
319 NDR_PRINT_IN_DEBUG(rap_NetShareEnum, r);
322 result = rap_cli_do_call(tree, iconv_convenience, call);
324 if (!NT_STATUS_IS_OK(result))
327 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
328 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
329 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
330 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
332 r->out.info = talloc_array(mem_ctx, union rap_share_info, r->out.count);
334 if (r->out.info == NULL) {
335 result = NT_STATUS_NO_MEMORY;
339 for (i=0; i<r->out.count; i++) {
340 switch(r->in.level) {
342 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
343 r->out.info[i].info0.share_name, 13));
346 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
347 r->out.info[i].info1.share_name, 13));
348 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
349 &r->out.info[i].info1.reserved1, 1));
350 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
351 NDR_SCALARS, &r->out.info[i].info1.share_type));
352 RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
354 &r->out.info[i].info1.comment));
359 if (DEBUGLEVEL >= 10) {
360 NDR_PRINT_OUT_DEBUG(rap_NetShareEnum, r);
362 result = NT_STATUS_OK;
369 static bool test_netshareenum(struct torture_context *tctx,
370 struct smbcli_state *cli)
372 struct rap_NetShareEnum r;
378 torture_assert_ntstatus_ok(tctx,
379 smbcli_rap_netshareenum(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), "");
381 for (i=0; i<r.out.count; i++) {
382 printf("%s %d %s\n", r.out.info[i].info1.share_name,
383 r.out.info[i].info1.share_type,
384 r.out.info[i].info1.comment);
390 static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_tree *tree,
391 struct smb_iconv_convenience *iconv_convenience,
393 struct rap_NetServerEnum2 *r)
395 struct rap_call *call;
396 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
399 call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_NetServerEnum2);
402 return NT_STATUS_NO_MEMORY;
404 rap_cli_push_word(call, r->in.level);
405 rap_cli_push_rcvbuf(call, r->in.bufsize);
406 rap_cli_expect_multiple_entries(call);
407 rap_cli_push_dword(call, r->in.servertype);
408 rap_cli_push_string(call, r->in.domain);
410 switch(r->in.level) {
412 rap_cli_expect_format(call, "B16");
415 rap_cli_expect_format(call, "B16BBDz");
419 if (DEBUGLEVEL >= 10) {
420 NDR_PRINT_IN_DEBUG(rap_NetServerEnum2, r);
423 result = rap_cli_do_call(tree, iconv_convenience, call);
425 if (!NT_STATUS_IS_OK(result))
428 result = NT_STATUS_INVALID_PARAMETER;
430 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
431 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
432 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
433 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
435 r->out.info = talloc_array(mem_ctx, union rap_server_info, r->out.count);
437 if (r->out.info == NULL) {
438 result = NT_STATUS_NO_MEMORY;
442 for (i=0; i<r->out.count; i++) {
443 switch(r->in.level) {
445 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
446 r->out.info[i].info0.name, 16));
449 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
450 r->out.info[i].info1.name, 16));
451 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
452 &r->out.info[i].info1.version_major, 1));
453 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
454 &r->out.info[i].info1.version_minor, 1));
455 NDR_GOTO(ndr_pull_uint32(call->ndr_pull_data,
456 NDR_SCALARS, &r->out.info[i].info1.servertype));
457 RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
459 &r->out.info[i].info1.comment));
463 if (DEBUGLEVEL >= 10) {
464 NDR_PRINT_OUT_DEBUG(rap_NetServerEnum2, r);
467 result = NT_STATUS_OK;
474 static bool test_netserverenum(struct torture_context *tctx,
475 struct smbcli_state *cli)
477 struct rap_NetServerEnum2 r;
482 r.in.servertype = 0xffffffff;
483 r.in.servertype = 0x80000000;
486 torture_assert_ntstatus_ok(tctx,
487 smbcli_rap_netserverenum2(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r), "");
489 for (i=0; i<r.out.count; i++) {
490 switch (r.in.level) {
492 printf("%s\n", r.out.info[i].info0.name);
495 printf("%s %x %s\n", r.out.info[i].info1.name,
496 r.out.info[i].info1.servertype,
497 r.out.info[i].info1.comment);
505 NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
506 struct smb_iconv_convenience *iconv_convenience,
508 struct rap_WserverGetInfo *r)
510 struct rap_call *call;
511 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
513 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WserverGetInfo))) {
514 return NT_STATUS_NO_MEMORY;
517 rap_cli_push_word(call, r->in.level);
518 rap_cli_push_rcvbuf(call, r->in.bufsize);
519 rap_cli_expect_word(call);
521 switch(r->in.level) {
523 rap_cli_expect_format(call, "B16");
526 rap_cli_expect_format(call, "B16BBDz");
529 result = NT_STATUS_INVALID_PARAMETER;
533 if (DEBUGLEVEL >= 10) {
534 NDR_PRINT_IN_DEBUG(rap_WserverGetInfo, r);
537 result = rap_cli_do_call(tree, iconv_convenience, call);
539 if (!NT_STATUS_IS_OK(result))
542 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
543 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
544 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
546 switch(r->in.level) {
548 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
549 r->out.info.info0.name, 16));
552 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
553 r->out.info.info1.name, 16));
554 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
555 &r->out.info.info1.version_major, 1));
556 NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
557 &r->out.info.info1.version_minor, 1));
558 NDR_GOTO(ndr_pull_uint32(call->ndr_pull_data,
559 NDR_SCALARS, &r->out.info.info1.servertype));
560 RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
562 &r->out.info.info1.comment));
565 if (DEBUGLEVEL >= 10) {
566 NDR_PRINT_OUT_DEBUG(rap_WserverGetInfo, r);
573 static NTSTATUS rap_pull_rap_JobInfo0(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintJobInfo0 *r)
575 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobID));
580 static NTSTATUS rap_pull_rap_JobInfo1(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintJobInfo1 *r)
582 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobID));
583 NDR_RETURN(ndr_pull_charset(ndr, NDR_SCALARS, &r->UserName, 21, sizeof(uint8_t), CH_DOS));
584 NDR_RETURN(ndr_pull_uint8(ndr, NDR_SCALARS, &r->Pad));
585 NDR_RETURN(ndr_pull_charset(ndr, NDR_SCALARS, &r->NotifyName, 16, sizeof(uint8_t), CH_DOS));
586 NDR_RETURN(ndr_pull_charset(ndr, NDR_SCALARS, &r->DataType, 10, sizeof(uint8_t), CH_DOS));
587 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintParameterString));
588 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobPosition));
589 NDR_RETURN(ndr_pull_rap_PrintJStatusCode(ndr, NDR_SCALARS, &r->JobStatus));
590 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->JobStatusString));
591 NDR_RETURN(ndr_pull_time_t(ndr, NDR_SCALARS, &r->TimeSubmitted));
592 NDR_RETURN(ndr_pull_uint32(ndr, NDR_SCALARS, &r->JobSize));
593 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->JobCommentString));
598 static NTSTATUS rap_pull_rap_JobInfo2(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintJobInfo2 *r)
600 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobID));
601 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Priority));
602 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->UserName));
603 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobPosition));
604 NDR_RETURN(ndr_pull_rap_PrintJStatusCode(ndr, NDR_SCALARS, &r->JobStatus));
605 NDR_RETURN(ndr_pull_time_t(ndr, NDR_SCALARS, &r->TimeSubmitted));
606 NDR_RETURN(ndr_pull_uint32(ndr, NDR_SCALARS, &r->JobSize));
607 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->JobCommentString));
608 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->DocumentName));
613 static NTSTATUS rap_pull_rap_JobInfo3(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintJobInfo3 *r)
615 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobID));
616 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Priority));
617 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->UserName));
618 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobPosition));
619 NDR_RETURN(ndr_pull_rap_PrintJStatusCode(ndr, NDR_SCALARS, &r->JobStatus));
620 NDR_RETURN(ndr_pull_time_t(ndr, NDR_SCALARS, &r->TimeSubmitted));
621 NDR_RETURN(ndr_pull_uint32(ndr, NDR_SCALARS, &r->JobSize));
622 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->JobCommentString));
623 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->DocumentName));
624 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->NotifyName));
625 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->DataType));
626 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintParameterString));
627 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->StatusString));
628 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->QueueName));
629 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintProcessorName));
630 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintProcessorParams));
631 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->DriverName));
632 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->DriverDataOffset));
633 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrinterNameOffset));
638 static NTSTATUS rap_pull_rap_PrintQueue0(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue0 *r)
640 NDR_RETURN(ndr_pull_charset(ndr, NDR_SCALARS, &r->PrintQName, 13, sizeof(uint8_t), CH_DOS));
645 static NTSTATUS rap_pull_rap_PrintQueue1(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue1 *r)
647 NDR_RETURN(ndr_pull_charset(ndr, NDR_SCALARS, &r->PrintQName, 13, sizeof(uint8_t), CH_DOS));
648 NDR_RETURN(ndr_pull_uint8(ndr, NDR_SCALARS, &r->Pad1));
649 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Priority));
650 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->StartTime));
651 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->UntilTime));
652 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->SeparatorPageFilename));
653 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintProcessorDllName));
654 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintDestinationsName));
655 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintParameterString));
656 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->CommentString));
657 NDR_RETURN(ndr_pull_rap_PrintQStatusCode(ndr, NDR_SCALARS, &r->PrintQStatus));
658 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->PrintJobCount));
663 static NTSTATUS rap_pull_rap_PrintQueue2(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue2 *r)
666 RAP_RETURN(rap_pull_rap_PrintQueue1(mem_ctx, ndr, convert, &r->queue));
667 r->job = talloc_zero_array(mem_ctx, struct rap_PrintJobInfo1, r->queue.PrintJobCount);
668 if (r->job == NULL) {
669 return NT_STATUS_NO_MEMORY;
671 for (i=0; i < r->queue.PrintJobCount; i++) {
672 RAP_RETURN(rap_pull_rap_JobInfo1(mem_ctx, ndr, convert, &r->job[i]));
678 static NTSTATUS rap_pull_rap_PrintQueue3(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue3 *r)
680 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintQueueName));
681 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Priority));
682 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->StartTime));
683 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->UntilTime));
684 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Pad));
685 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->SeparatorPageFilename));
686 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintProcessorDllName));
687 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintParameterString));
688 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->CommentString));
689 NDR_RETURN(ndr_pull_rap_PrintQStatusCode(ndr, NDR_SCALARS, &r->PrintQStatus));
690 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->PrintJobCount));
691 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->Printers));
692 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->DriverName));
693 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintDriverData));
698 static NTSTATUS rap_pull_rap_PrintQueue4(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue4 *r)
701 RAP_RETURN(rap_pull_rap_PrintQueue3(mem_ctx, ndr, convert, &r->queue));
702 r->job = talloc_zero_array(mem_ctx, struct rap_PrintJobInfo2, r->queue.PrintJobCount);
703 if (r->job == NULL) {
704 return NT_STATUS_NO_MEMORY;
706 for (i=0; i < r->queue.PrintJobCount; i++) {
707 RAP_RETURN(rap_pull_rap_JobInfo2(mem_ctx, ndr, convert, &r->job[i]));
713 static NTSTATUS rap_pull_rap_PrintQueue5(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue5 *r)
715 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintQueueName));
720 NTSTATUS smbcli_rap_netprintqenum(struct smbcli_tree *tree,
721 struct smb_iconv_convenience *iconv_convenience,
723 struct rap_NetPrintQEnum *r)
725 struct rap_call *call;
726 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
729 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintQEnum))) {
730 return NT_STATUS_NO_MEMORY;
733 rap_cli_push_word(call, r->in.level);
734 rap_cli_push_rcvbuf(call, r->in.bufsize);
735 rap_cli_expect_multiple_entries(call);
737 switch(r->in.level) {
739 rap_cli_expect_format(call, "B13");
742 rap_cli_expect_format(call, "B13BWWWzzzzzWW");
745 rap_cli_expect_format(call, "B13BWWWzzzzzWN");
746 rap_cli_expect_extra_format(call, "WB21BB16B10zWWzDDz");
749 rap_cli_expect_format(call, "zWWWWzzzzWWzzl");
752 rap_cli_expect_format(call, "zWWWWzzzzWNzzl");
753 rap_cli_expect_extra_format(call, "WWzWWDDzz");
754 /* no mention of extra format in MS-RAP */
757 rap_cli_expect_format(call, "z");
760 result = NT_STATUS_INVALID_PARAMETER;
764 if (DEBUGLEVEL >= 10) {
765 NDR_PRINT_IN_DEBUG(rap_NetPrintQEnum, r);
768 result = rap_cli_do_call(tree, iconv_convenience, call);
770 if (!NT_STATUS_IS_OK(result))
773 result = NT_STATUS_INVALID_PARAMETER;
775 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
776 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
777 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
778 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
780 r->out.info = talloc_zero_array(mem_ctx, union rap_printq_info, r->out.count);
782 if (r->out.info == NULL) {
783 result = NT_STATUS_NO_MEMORY;
787 for (i=0; i<r->out.count; i++) {
788 switch(r->in.level) {
790 result = rap_pull_rap_PrintQueue0(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info0);
793 result = rap_pull_rap_PrintQueue1(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info1);
796 result = rap_pull_rap_PrintQueue2(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info2);
799 result = rap_pull_rap_PrintQueue3(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info3);
802 result = rap_pull_rap_PrintQueue4(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info4);
805 result = rap_pull_rap_PrintQueue5(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info5);
810 if (!NT_STATUS_IS_OK(result)) {
814 if (DEBUGLEVEL >= 10) {
815 NDR_PRINT_OUT_DEBUG(rap_NetPrintQEnum, r);
818 result = NT_STATUS_OK;
825 NTSTATUS smbcli_rap_netprintqgetinfo(struct smbcli_tree *tree,
826 struct smb_iconv_convenience *iconv_convenience,
828 struct rap_NetPrintQGetInfo *r)
830 struct rap_call *call;
831 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
833 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintQGetInfo))) {
834 return NT_STATUS_NO_MEMORY;
837 rap_cli_push_string(call, r->in.PrintQueueName);
838 rap_cli_push_word(call, r->in.level);
839 rap_cli_push_rcvbuf(call, r->in.bufsize);
840 rap_cli_expect_word(call);
842 switch(r->in.level) {
844 rap_cli_expect_format(call, "B13");
847 rap_cli_expect_format(call, "B13BWWWzzzzzWW");
850 rap_cli_expect_format(call, "B13BWWWzzzzzWN");
851 rap_cli_expect_extra_format(call, "WB21BB16B10zWWzDDz");
854 rap_cli_expect_format(call, "zWWWWzzzzWWzzl");
857 rap_cli_expect_format(call, "zWWWWzzzzWNzzl");
858 rap_cli_expect_extra_format(call, "WWzWWDDzz");
859 /* no mention of extra format in MS-RAP */
862 rap_cli_expect_format(call, "z");
865 result = NT_STATUS_INVALID_PARAMETER;
869 if (DEBUGLEVEL >= 10) {
870 NDR_PRINT_IN_DEBUG(rap_NetPrintQGetInfo, r);
873 result = rap_cli_do_call(tree, iconv_convenience, call);
875 if (!NT_STATUS_IS_OK(result))
878 result = NT_STATUS_INVALID_PARAMETER;
880 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
881 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
882 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
884 switch(r->in.level) {
886 result = rap_pull_rap_PrintQueue0(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info0);
889 result = rap_pull_rap_PrintQueue1(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info1);
892 result = rap_pull_rap_PrintQueue2(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info2);
895 result = rap_pull_rap_PrintQueue3(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info3);
898 result = rap_pull_rap_PrintQueue4(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info4);
901 result = rap_pull_rap_PrintQueue5(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info5);
905 if (!NT_STATUS_IS_OK(result)) {
909 if (DEBUGLEVEL >= 10) {
910 NDR_PRINT_OUT_DEBUG(rap_NetPrintQGetInfo, r);
918 NTSTATUS smbcli_rap_netprintjobpause(struct smbcli_tree *tree,
919 struct smb_iconv_convenience *iconv_convenience,
921 struct rap_NetPrintJobPause *r)
923 struct rap_call *call;
924 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
926 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintJobPause))) {
927 return NT_STATUS_NO_MEMORY;
930 rap_cli_push_word(call, r->in.JobID);
932 rap_cli_expect_format(call, "W");
934 if (DEBUGLEVEL >= 10) {
935 NDR_PRINT_IN_DEBUG(rap_NetPrintJobPause, r);
938 result = rap_cli_do_call(tree, iconv_convenience, call);
940 if (!NT_STATUS_IS_OK(result))
943 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
944 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
946 if (DEBUGLEVEL >= 10) {
947 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobPause, r);
955 NTSTATUS smbcli_rap_netprintjobcontinue(struct smbcli_tree *tree,
956 struct smb_iconv_convenience *iconv_convenience,
958 struct rap_NetPrintJobContinue *r)
960 struct rap_call *call;
961 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
963 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintJobContinue))) {
964 return NT_STATUS_NO_MEMORY;
967 rap_cli_push_word(call, r->in.JobID);
969 rap_cli_expect_format(call, "W");
971 if (DEBUGLEVEL >= 10) {
972 NDR_PRINT_IN_DEBUG(rap_NetPrintJobContinue, r);
975 result = rap_cli_do_call(tree, iconv_convenience, call);
977 if (!NT_STATUS_IS_OK(result))
980 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
981 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
983 if (DEBUGLEVEL >= 10) {
984 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobContinue, r);
992 NTSTATUS smbcli_rap_netprintjobdelete(struct smbcli_tree *tree,
993 struct smb_iconv_convenience *iconv_convenience,
995 struct rap_NetPrintJobDelete *r)
997 struct rap_call *call;
998 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1000 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintJobDel))) {
1001 return NT_STATUS_NO_MEMORY;
1004 rap_cli_push_word(call, r->in.JobID);
1006 rap_cli_expect_format(call, "W");
1008 if (DEBUGLEVEL >= 10) {
1009 NDR_PRINT_IN_DEBUG(rap_NetPrintJobDelete, r);
1012 result = rap_cli_do_call(tree, iconv_convenience, call);
1014 if (!NT_STATUS_IS_OK(result))
1017 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1018 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1020 if (DEBUGLEVEL >= 10) {
1021 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobDelete, r);
1029 NTSTATUS smbcli_rap_netprintqueuepause(struct smbcli_tree *tree,
1030 struct smb_iconv_convenience *iconv_convenience,
1031 TALLOC_CTX *mem_ctx,
1032 struct rap_NetPrintQueuePause *r)
1034 struct rap_call *call;
1035 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1037 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintQPause))) {
1038 return NT_STATUS_NO_MEMORY;
1041 rap_cli_push_string(call, r->in.PrintQueueName);
1043 rap_cli_expect_format(call, "");
1045 if (DEBUGLEVEL >= 10) {
1046 NDR_PRINT_IN_DEBUG(rap_NetPrintQueuePause, r);
1049 result = rap_cli_do_call(tree, iconv_convenience, call);
1051 if (!NT_STATUS_IS_OK(result))
1054 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1055 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1057 if (DEBUGLEVEL >= 10) {
1058 NDR_PRINT_OUT_DEBUG(rap_NetPrintQueuePause, r);
1066 NTSTATUS smbcli_rap_netprintqueueresume(struct smbcli_tree *tree,
1067 struct smb_iconv_convenience *iconv_convenience,
1068 TALLOC_CTX *mem_ctx,
1069 struct rap_NetPrintQueueResume *r)
1071 struct rap_call *call;
1072 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1074 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintQContinue))) {
1075 return NT_STATUS_NO_MEMORY;
1078 rap_cli_push_string(call, r->in.PrintQueueName);
1080 rap_cli_expect_format(call, "");
1082 if (DEBUGLEVEL >= 10) {
1083 NDR_PRINT_IN_DEBUG(rap_NetPrintQueueResume, r);
1086 result = rap_cli_do_call(tree, iconv_convenience, call);
1088 if (!NT_STATUS_IS_OK(result))
1091 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1092 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1094 if (DEBUGLEVEL >= 10) {
1095 NDR_PRINT_OUT_DEBUG(rap_NetPrintQueueResume, r);
1103 NTSTATUS smbcli_rap_netprintqueuepurge(struct smbcli_tree *tree,
1104 struct smb_iconv_convenience *iconv_convenience,
1105 TALLOC_CTX *mem_ctx,
1106 struct rap_NetPrintQueuePurge *r)
1108 struct rap_call *call;
1109 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1111 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintQPurge))) {
1112 return NT_STATUS_NO_MEMORY;
1115 rap_cli_push_string(call, r->in.PrintQueueName);
1117 rap_cli_expect_format(call, "");
1119 if (DEBUGLEVEL >= 10) {
1120 NDR_PRINT_IN_DEBUG(rap_NetPrintQueuePurge, r);
1123 result = rap_cli_do_call(tree, iconv_convenience, call);
1125 if (!NT_STATUS_IS_OK(result))
1128 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1129 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1131 if (DEBUGLEVEL >= 10) {
1132 NDR_PRINT_OUT_DEBUG(rap_NetPrintQueuePurge, r);
1140 NTSTATUS smbcli_rap_netprintjobenum(struct smbcli_tree *tree,
1141 struct smb_iconv_convenience *iconv_convenience,
1142 TALLOC_CTX *mem_ctx,
1143 struct rap_NetPrintJobEnum *r)
1145 struct rap_call *call;
1146 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1149 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintJobEnum))) {
1150 return NT_STATUS_NO_MEMORY;
1153 rap_cli_push_string(call, r->in.PrintQueueName);
1154 rap_cli_push_word(call, r->in.level);
1155 rap_cli_push_rcvbuf(call, r->in.bufsize);
1156 rap_cli_expect_multiple_entries(call);
1158 switch(r->in.level) {
1160 rap_cli_expect_format(call, "W");
1163 rap_cli_expect_format(call, "WB21BB16B10zWWzDDz");
1166 rap_cli_expect_format(call, "WWzWWDDzz");
1169 rap_cli_expect_format(call, "WWzWWDDzzzzzzzzzzlz");
1172 rap_cli_expect_format(call, "WWzWWDDzzzzzDDDDDDD");
1175 result = NT_STATUS_INVALID_PARAMETER;
1179 if (DEBUGLEVEL >= 10) {
1180 NDR_PRINT_IN_DEBUG(rap_NetPrintJobEnum, r);
1183 result = rap_cli_do_call(tree, iconv_convenience, call);
1185 if (!NT_STATUS_IS_OK(result))
1188 result = NT_STATUS_INVALID_PARAMETER;
1190 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1191 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1192 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
1193 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1195 r->out.info = talloc_zero_array(mem_ctx, union rap_printj_info, r->out.count);
1197 if (r->out.info == NULL) {
1198 result = NT_STATUS_NO_MEMORY;
1202 result = NT_STATUS_OK;
1204 for (i=0; i<r->out.count; i++) {
1205 switch(r->in.level) {
1207 result = rap_pull_rap_JobInfo0(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info0);
1210 result = rap_pull_rap_JobInfo1(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info1);
1213 result = rap_pull_rap_JobInfo2(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info2);
1216 result = rap_pull_rap_JobInfo3(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info3);
1221 if (!NT_STATUS_IS_OK(result)) {
1225 if (DEBUGLEVEL >= 10) {
1226 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobEnum, r);
1229 result = NT_STATUS_OK;
1236 NTSTATUS smbcli_rap_netprintjobgetinfo(struct smbcli_tree *tree,
1237 struct smb_iconv_convenience *iconv_convenience,
1238 TALLOC_CTX *mem_ctx,
1239 struct rap_NetPrintJobGetInfo *r)
1241 struct rap_call *call;
1242 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1244 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintJobGetInfo))) {
1245 return NT_STATUS_NO_MEMORY;
1248 rap_cli_push_word(call, r->in.JobID);
1249 rap_cli_push_word(call, r->in.level);
1250 rap_cli_push_rcvbuf(call, r->in.bufsize);
1251 rap_cli_expect_word(call);
1253 switch(r->in.level) {
1255 rap_cli_expect_format(call, "W");
1258 rap_cli_expect_format(call, "WB21BB16B10zWWzDDz");
1261 rap_cli_expect_format(call, "WWzWWDDzz");
1264 rap_cli_expect_format(call, "WWzWWDDzzzzzzzzzzlz");
1267 rap_cli_expect_format(call, "WWzWWDDzzzzzDDDDDDD");
1270 result = NT_STATUS_INVALID_PARAMETER;
1274 if (DEBUGLEVEL >= 10) {
1275 NDR_PRINT_IN_DEBUG(rap_NetPrintJobGetInfo, r);
1278 result = rap_cli_do_call(tree, iconv_convenience, call);
1280 if (!NT_STATUS_IS_OK(result))
1283 result = NT_STATUS_INVALID_PARAMETER;
1285 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1286 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1287 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1289 switch(r->in.level) {
1291 result = rap_pull_rap_JobInfo0(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info0);
1294 result = rap_pull_rap_JobInfo1(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info1);
1297 result = rap_pull_rap_JobInfo2(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info2);
1300 result = rap_pull_rap_JobInfo3(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info3);
1303 result = NT_STATUS_NOT_IMPLEMENTED;
1308 if (!NT_STATUS_IS_OK(result)) {
1312 if (DEBUGLEVEL >= 10) {
1313 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobGetInfo, r);
1321 NTSTATUS smbcli_rap_netprintjobsetinfo(struct smbcli_tree *tree,
1322 struct smb_iconv_convenience *iconv_convenience,
1323 TALLOC_CTX *mem_ctx,
1324 struct rap_NetPrintJobSetInfo *r)
1326 struct rap_call *call;
1327 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1329 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintJobSetInfo))) {
1330 return NT_STATUS_NO_MEMORY;
1333 rap_cli_push_word(call, r->in.JobID);
1334 rap_cli_push_word(call, r->in.level);
1335 rap_cli_push_sendbuf(call, r->in.bufsize);
1336 rap_cli_push_param(call, r->in.ParamNum);
1338 switch (r->in.ParamNum) {
1339 case RAP_PARAM_JOBNUM:
1340 case RAP_PARAM_JOBPOSITION:
1341 case RAP_PARAM_JOBSTATUS:
1342 NDR_GOTO(ndr_push_uint16(call->ndr_push_param, NDR_SCALARS, r->in.Param.value));
1344 case RAP_PARAM_USERNAME:
1345 case RAP_PARAM_NOTIFYNAME:
1346 case RAP_PARAM_DATATYPE:
1347 case RAP_PARAM_PARAMETERS_STRING:
1348 case RAP_PARAM_JOBSTATUSSTR:
1349 case RAP_PARAM_JOBCOMMENT:
1350 NDR_GOTO(ndr_push_string(call->ndr_push_param, NDR_SCALARS, r->in.Param.string));
1352 case RAP_PARAM_TIMESUBMITTED:
1353 case RAP_PARAM_JOBSIZE:
1354 NDR_GOTO(ndr_push_uint32(call->ndr_push_param, NDR_SCALARS, r->in.Param.value4));
1357 result = NT_STATUS_INVALID_PARAMETER;
1361 /* not really sure if this is correct */
1362 rap_cli_expect_format(call, "WB21BB16B10zWWzDDz");
1364 if (DEBUGLEVEL >= 10) {
1365 NDR_PRINT_IN_DEBUG(rap_NetPrintJobSetInfo, r);
1368 result = rap_cli_do_call(tree, iconv_convenience, call);
1370 if (!NT_STATUS_IS_OK(result))
1373 result = NT_STATUS_INVALID_PARAMETER;
1375 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1376 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1378 result = NT_STATUS_OK;
1380 if (!NT_STATUS_IS_OK(result)) {
1384 if (DEBUGLEVEL >= 10) {
1385 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobSetInfo, r);
1393 static NTSTATUS rap_pull_rap_PrintDest0(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintDest0 *r)
1395 NDR_RETURN(ndr_pull_charset(ndr, NDR_SCALARS, &r->PrintDestName, 9, sizeof(uint8_t), CH_DOS));
1397 return NT_STATUS_OK;
1400 static NTSTATUS rap_pull_rap_PrintDest1(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintDest1 *r)
1402 NDR_RETURN(ndr_pull_charset(ndr, NDR_SCALARS, &r->PrintDestName, 9, sizeof(uint8_t), CH_DOS));
1403 NDR_RETURN(ndr_pull_charset(ndr, NDR_SCALARS, &r->UserName, 21, sizeof(uint8_t), CH_DOS));
1404 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobId));
1405 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Status));
1406 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->StatusStringName));
1407 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Time));
1409 return NT_STATUS_OK;
1412 static NTSTATUS rap_pull_rap_PrintDest2(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintDest2 *r)
1414 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrinterName));
1416 return NT_STATUS_OK;
1419 static NTSTATUS rap_pull_rap_PrintDest3(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintDest3 *r)
1421 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrinterName));
1422 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->UserName));
1423 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->LogAddr));
1424 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->JobId));
1425 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Status));
1426 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->StatusStringName));
1427 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->Comment));
1428 RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->Drivers));
1429 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Time));
1430 NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Pad1));
1432 return NT_STATUS_OK;
1436 NTSTATUS smbcli_rap_netprintdestenum(struct smbcli_tree *tree,
1437 struct smb_iconv_convenience *iconv_convenience,
1438 TALLOC_CTX *mem_ctx,
1439 struct rap_NetPrintDestEnum *r)
1441 struct rap_call *call;
1442 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1445 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintDestEnum))) {
1446 return NT_STATUS_NO_MEMORY;
1449 rap_cli_push_word(call, r->in.level);
1450 rap_cli_push_rcvbuf(call, r->in.bufsize);
1451 rap_cli_expect_multiple_entries(call);
1453 switch(r->in.level) {
1455 rap_cli_expect_format(call, "B9");
1458 rap_cli_expect_format(call, "B9B21WWzW");
1461 rap_cli_expect_format(call, "z");
1464 rap_cli_expect_format(call, "zzzWWzzzWW");
1467 result = NT_STATUS_INVALID_PARAMETER;
1471 if (DEBUGLEVEL >= 10) {
1472 NDR_PRINT_IN_DEBUG(rap_NetPrintDestEnum, r);
1475 result = rap_cli_do_call(tree, iconv_convenience, call);
1477 if (!NT_STATUS_IS_OK(result))
1480 result = NT_STATUS_INVALID_PARAMETER;
1482 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1483 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1484 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
1485 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1487 r->out.info = talloc_zero_array(mem_ctx, union rap_printdest_info, r->out.count);
1489 if (r->out.info == NULL) {
1490 result = NT_STATUS_NO_MEMORY;
1494 result = NT_STATUS_OK;
1496 for (i=0; i<r->out.count; i++) {
1497 switch(r->in.level) {
1499 result = rap_pull_rap_PrintDest0(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info0);
1502 result = rap_pull_rap_PrintDest1(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info1);
1505 result = rap_pull_rap_PrintDest2(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info2);
1508 result = rap_pull_rap_PrintDest3(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info3);
1513 if (!NT_STATUS_IS_OK(result)) {
1517 if (DEBUGLEVEL >= 10) {
1518 NDR_PRINT_OUT_DEBUG(rap_NetPrintDestEnum, r);
1521 result = NT_STATUS_OK;
1528 NTSTATUS smbcli_rap_netprintdestgetinfo(struct smbcli_tree *tree,
1529 struct smb_iconv_convenience *iconv_convenience,
1530 TALLOC_CTX *mem_ctx,
1531 struct rap_NetPrintDestGetInfo *r)
1533 struct rap_call *call;
1534 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1536 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintDestGetInfo))) {
1537 return NT_STATUS_NO_MEMORY;
1540 rap_cli_push_string(call, r->in.PrintDestName);
1541 rap_cli_push_word(call, r->in.level);
1542 rap_cli_push_rcvbuf(call, r->in.bufsize);
1543 rap_cli_expect_word(call);
1545 switch(r->in.level) {
1547 rap_cli_expect_format(call, "B9");
1550 rap_cli_expect_format(call, "B9B21WWzW");
1553 rap_cli_expect_format(call, "z");
1556 rap_cli_expect_format(call, "zzzWWzzzWW");
1559 result = NT_STATUS_INVALID_PARAMETER;
1563 if (DEBUGLEVEL >= 10) {
1564 NDR_PRINT_IN_DEBUG(rap_NetPrintDestGetInfo, r);
1567 result = rap_cli_do_call(tree, iconv_convenience, call);
1569 if (!NT_STATUS_IS_OK(result))
1572 result = NT_STATUS_INVALID_PARAMETER;
1574 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1575 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1576 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
1578 switch(r->in.level) {
1580 result = rap_pull_rap_PrintDest0(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info0);
1583 result = rap_pull_rap_PrintDest1(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info1);
1586 result = rap_pull_rap_PrintDest2(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info2);
1589 result = rap_pull_rap_PrintDest3(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info.info3);
1593 if (!NT_STATUS_IS_OK(result)) {
1597 if (DEBUGLEVEL >= 10) {
1598 NDR_PRINT_OUT_DEBUG(rap_NetPrintDestGetInfo, r);
1601 result = NT_STATUS_OK;
1608 NTSTATUS smbcli_rap_netuserpasswordset2(struct smbcli_tree *tree,
1609 struct smb_iconv_convenience *iconv_convenience,
1610 TALLOC_CTX *mem_ctx,
1611 struct rap_NetUserPasswordSet2 *r)
1613 struct rap_call *call;
1614 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1616 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WUserPasswordSet2))) {
1617 return NT_STATUS_NO_MEMORY;
1620 rap_cli_push_string(call, r->in.UserName);
1621 rap_cli_push_paramdesc(call, 'b');
1622 rap_cli_push_paramdesc(call, '1');
1623 rap_cli_push_paramdesc(call, '6');
1624 ndr_push_charset(call->ndr_push_param, NDR_SCALARS, r->in.OldPassword, 16, sizeof(uint8_t), CH_DOS);
1625 rap_cli_push_paramdesc(call, 'b');
1626 rap_cli_push_paramdesc(call, '1');
1627 rap_cli_push_paramdesc(call, '6');
1628 ndr_push_charset(call->ndr_push_param, NDR_SCALARS, r->in.NewPassword, 16, sizeof(uint8_t), CH_DOS);
1629 rap_cli_push_word(call, r->in.EncryptedPassword);
1630 rap_cli_push_word(call, r->in.RealPasswordLength);
1632 rap_cli_expect_format(call, "");
1634 if (DEBUGLEVEL >= 10) {
1635 NDR_PRINT_IN_DEBUG(rap_NetUserPasswordSet2, r);
1638 result = rap_cli_do_call(tree, iconv_convenience, call);
1640 if (!NT_STATUS_IS_OK(result))
1643 result = NT_STATUS_INVALID_PARAMETER;
1645 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1646 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1648 result = NT_STATUS_OK;
1650 if (!NT_STATUS_IS_OK(result)) {
1654 if (DEBUGLEVEL >= 10) {
1655 NDR_PRINT_OUT_DEBUG(rap_NetUserPasswordSet2, r);
1663 NTSTATUS smbcli_rap_netoemchangepassword(struct smbcli_tree *tree,
1664 struct smb_iconv_convenience *iconv_convenience,
1665 TALLOC_CTX *mem_ctx,
1666 struct rap_NetOEMChangePassword *r)
1668 struct rap_call *call;
1669 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
1671 if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_SamOEMChgPasswordUser2_P))) {
1672 return NT_STATUS_NO_MEMORY;
1675 rap_cli_push_string(call, r->in.UserName);
1676 rap_cli_push_sendbuf(call, 532);
1677 ndr_push_array_uint8(call->ndr_push_data, NDR_SCALARS, r->in.crypt_password, 516);
1678 ndr_push_array_uint8(call->ndr_push_data, NDR_SCALARS, r->in.password_hash, 16);
1680 rap_cli_expect_format(call, "B516B16");
1682 if (DEBUGLEVEL >= 10) {
1683 NDR_PRINT_IN_DEBUG(rap_NetOEMChangePassword, r);
1686 result = rap_cli_do_call(tree, iconv_convenience, call);
1688 if (!NT_STATUS_IS_OK(result))
1691 result = NT_STATUS_INVALID_PARAMETER;
1693 NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
1694 NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
1696 result = NT_STATUS_OK;
1698 if (!NT_STATUS_IS_OK(result)) {
1702 if (DEBUGLEVEL >= 10) {
1703 NDR_PRINT_OUT_DEBUG(rap_NetOEMChangePassword, r);
1711 static bool test_netservergetinfo(struct torture_context *tctx,
1712 struct smbcli_state *cli)
1714 struct rap_WserverGetInfo r;
1717 r.in.bufsize = 0xffff;
1720 torture_assert_ntstatus_ok(tctx,
1721 smbcli_rap_netservergetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r),
1722 "rap_netservergetinfo level 0 failed");
1723 torture_assert_werr_ok(tctx, W_ERROR(r.out.status),
1724 "rap_netservergetinfo level 0 failed");
1727 torture_assert_ntstatus_ok(tctx,
1728 smbcli_rap_netservergetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r),
1729 "rap_netservergetinfo level 1 failed");
1730 torture_assert_werr_ok(tctx, W_ERROR(r.out.status),
1731 "rap_netservergetinfo level 1 failed");
1736 bool torture_rap_scan(struct torture_context *torture, struct smbcli_state *cli)
1740 for (callno = 0; callno < 0xffff; callno++) {
1741 struct rap_call *call = new_rap_cli_call(torture, lp_iconv_convenience(torture->lp_ctx), callno);
1744 result = rap_cli_do_call(cli->tree, lp_iconv_convenience(torture->lp_ctx), call);
1746 if (!NT_STATUS_EQUAL(result, NT_STATUS_INVALID_PARAMETER))
1749 printf("callno %d is RAP call\n", callno);
1755 NTSTATUS torture_rap_init(void)
1757 struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "RAP");
1758 struct torture_suite *suite_basic = torture_suite_create(suite, "BASIC");
1760 torture_suite_add_suite(suite, suite_basic);
1761 torture_suite_add_suite(suite, torture_rap_rpc(suite));
1762 torture_suite_add_suite(suite, torture_rap_printing(suite));
1764 torture_suite_add_1smb_test(suite_basic, "netserverenum",
1765 test_netserverenum);
1766 torture_suite_add_1smb_test(suite_basic, "netshareenum",
1768 torture_suite_add_1smb_test(suite_basic, "netservergetinfo",
1769 test_netservergetinfo);
1771 torture_suite_add_1smb_test(suite, "SCAN", torture_rap_scan);
1773 suite->description = talloc_strdup(suite,
1774 "Remote Administration Protocol tests");
1776 torture_register_suite(suite);
1778 return NT_STATUS_OK;