2 Unix SMB/CIFS implementation.
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/>.
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
);
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
) {
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
) {
53 call
->ndr_push_data
->flags
= RAPNDR_FLAGS
;
55 call
->pull_mem_ctx
= mem_ctx
;
60 static void rap_cli_push_paramdesc(struct rap_call
*call
, char desc
)
64 if (call
->paramdesc
!= NULL
)
65 len
= strlen(call
->paramdesc
);
67 call
->paramdesc
= talloc_realloc(call
,
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
)
125 rap_cli_push_paramdesc(call
, 'O');
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
;
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
);
170 NTSTATUS
rap_cli_do_call(struct smbcli_tree
*tree
,
171 struct rap_call
*call
)
174 DATA_BLOB param_blob
;
176 struct ndr_push
*params
;
177 struct ndr_push
*data
;
178 struct smb_trans2 trans
;
180 params
= ndr_push_init_ctx(call
);
183 return NT_STATUS_NO_MEMORY
;
185 params
->flags
= RAPNDR_FLAGS
;
187 data
= ndr_push_init_ctx(call
);
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;
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
));
205 NDR_RETURN(ndr_push_string(params
, NDR_SCALARS
, call
->paramdesc
));
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
,
213 data_blob
= ndr_push_blob(call
->ndr_push_data
);
214 NDR_RETURN(ndr_push_bytes(data
, data_blob
.data
,
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
))
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
;
239 NTSTATUS
smbcli_rap_netshareenum(struct smbcli_tree
*tree
,
241 struct rap_NetShareEnum
*r
)
243 struct rap_call
*call
;
244 NTSTATUS result
= NT_STATUS_UNSUCCESSFUL
;
247 call
= new_rap_cli_call(tree
, RAP_WshareEnum
);
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
) {
258 rap_cli_expect_format(call
, "B13");
261 rap_cli_expect_format(call
, "B13BWz");
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
))
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
;
286 for (i
=0; i
<r
->out
.count
; i
++) {
287 switch(r
->in
.level
) {
289 NDR_GOTO(ndr_pull_bytes(call
->ndr_pull_data
,
290 r
->out
.info
[i
].info0
.share_name
, 13));
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
,
301 &r
->out
.info
[i
].info1
.comment
));
306 if (DEBUGLEVEL
>= 10) {
307 NDR_PRINT_OUT_DEBUG(rap_NetShareEnum
, r
);
309 result
= NT_STATUS_OK
;
316 NTSTATUS
smbcli_rap_netserverenum2(struct smbcli_tree
*tree
,
318 struct rap_NetServerEnum2
*r
)
320 struct rap_call
*call
;
321 NTSTATUS result
= NT_STATUS_UNSUCCESSFUL
;
324 call
= new_rap_cli_call(mem_ctx
, RAP_NetServerEnum2
);
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
) {
337 rap_cli_expect_format(call
, "B16");
340 rap_cli_expect_format(call
, "B16BBDz");
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
))
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
;
367 for (i
=0; i
<r
->out
.count
; i
++) {
368 switch(r
->in
.level
) {
370 NDR_GOTO(ndr_pull_bytes(call
->ndr_pull_data
,
371 r
->out
.info
[i
].info0
.name
, 16));
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
,
384 &r
->out
.info
[i
].info1
.comment
));
388 if (DEBUGLEVEL
>= 10) {
389 NDR_PRINT_OUT_DEBUG(rap_NetServerEnum2
, r
);
392 result
= NT_STATUS_OK
;
399 NTSTATUS
smbcli_rap_netservergetinfo(struct smbcli_tree
*tree
,
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
) {
416 rap_cli_expect_format(call
, "B16");
419 rap_cli_expect_format(call
, "B16BBDz");
422 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
) {
441 NDR_GOTO(ndr_pull_bytes(call
->ndr_pull_data
,
442 r
->out
.info
.info0
.name
, 16));
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
,
455 &r
->out
.info
.info1
.comment
));
458 if (DEBUGLEVEL
>= 10) {
459 NDR_PRINT_OUT_DEBUG(rap_WserverGetInfo
, r
);
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
,
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
) {
504 rap_cli_expect_format(call
, "B13");
507 rap_cli_expect_format(call
, "B13BWWWzzzzzWW");
510 rap_cli_expect_format(call
, "B13BWWWzzzzzWN");
511 rap_cli_expect_extra_format(call
, "WB21BB16B10zWWzDDz");
514 rap_cli_expect_format(call
, "zWWWWzzzzWWzzl");
517 rap_cli_expect_format(call
, "zWWWWzzzzWNzzl");
518 rap_cli_expect_extra_format(call
, "WWzWWDDzz");
519 /* no mention of extra format in MS-RAP */
522 rap_cli_expect_format(call
, "z");
525 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
;
562 NTSTATUS
smbcli_rap_netprintqgetinfo(struct smbcli_tree
*tree
,
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
) {
580 rap_cli_expect_format(call
, "B13");
583 rap_cli_expect_format(call
, "B13BWWWzzzzzWW");
586 rap_cli_expect_format(call
, "B13BWWWzzzzzWN");
587 rap_cli_expect_extra_format(call
, "WB21BB16B10zWWzDDz");
590 rap_cli_expect_format(call
, "zWWWWzzzzWWzzl");
593 rap_cli_expect_format(call
, "zWWWWzzzzWNzzl");
594 rap_cli_expect_extra_format(call
, "WWzWWDDzz");
595 /* no mention of extra format in MS-RAP */
598 rap_cli_expect_format(call
, "z");
601 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
614 result
= NT_STATUS_INVALID_PARAMETER
;
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
;
639 NTSTATUS
smbcli_rap_netprintjobpause(struct smbcli_tree
*tree
,
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
))
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
);
675 NTSTATUS
smbcli_rap_netprintjobcontinue(struct smbcli_tree
*tree
,
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
))
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
);
711 NTSTATUS
smbcli_rap_netprintjobdelete(struct smbcli_tree
*tree
,
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
))
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
);
747 NTSTATUS
smbcli_rap_netprintqueuepause(struct smbcli_tree
*tree
,
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
))
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
);
783 NTSTATUS
smbcli_rap_netprintqueueresume(struct smbcli_tree
*tree
,
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
))
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
);
819 NTSTATUS
smbcli_rap_netprintqueuepurge(struct smbcli_tree
*tree
,
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
))
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
);
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
,
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
) {
894 rap_cli_expect_format(call
, "W");
897 rap_cli_expect_format(call
, "WB21BB16B10zWWzDDz");
900 rap_cli_expect_format(call
, "WWzWWDDzz");
903 rap_cli_expect_format(call
, "WWzWWDDzzzzzzzzzzlz");
906 rap_cli_expect_format(call
, "WWzWWDDzzzzzDDDDDDD");
909 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
;
946 NTSTATUS
smbcli_rap_netprintjobgetinfo(struct smbcli_tree
*tree
,
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
) {
964 rap_cli_expect_format(call
, "W");
967 rap_cli_expect_format(call
, "WB21BB16B10zWWzDDz");
970 rap_cli_expect_format(call
, "WWzWWDDzz");
973 rap_cli_expect_format(call
, "WWzWWDDzzzzzzzzzzlz");
976 rap_cli_expect_format(call
, "WWzWWDDzzzzzDDDDDDD");
979 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
;
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
));
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
));
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
));
1049 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
)) {
1076 if (DEBUGLEVEL
>= 10) {
1077 NDR_PRINT_OUT_DEBUG(rap_NetPrintJobSetInfo
, r
);
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
) {
1123 rap_cli_expect_format(call
, "B9");
1126 rap_cli_expect_format(call
, "B9B21WWzW");
1129 rap_cli_expect_format(call
, "z");
1132 rap_cli_expect_format(call
, "zzzWWzzzWW");
1135 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
;
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
) {
1190 rap_cli_expect_format(call
, "B9");
1193 rap_cli_expect_format(call
, "B9B21WWzW");
1196 rap_cli_expect_format(call
, "z");
1199 rap_cli_expect_format(call
, "zzzWWzzzWW");
1202 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
;
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
))
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
)) {
1282 if (DEBUGLEVEL
>= 10) {
1283 NDR_PRINT_OUT_DEBUG(rap_NetUserPasswordSet2
, r
);
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
))
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
)) {
1329 if (DEBUGLEVEL
>= 10) {
1330 NDR_PRINT_OUT_DEBUG(rap_NetOEMChangePassword
, r
);
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
) {
1356 rap_cli_expect_format(call
, "B21");
1359 rap_cli_expect_format(call
, "B21BB16DWzzWz");
1362 rap_cli_expect_format(call
, "B21BB16DWzzWzDzzzzDDDDWb21WWzWW");
1365 rap_cli_expect_format(call
, "B21Bzzz");
1368 rap_cli_expect_format(call
, "B21BzzzWDDzzDDWWzWzDWb21W");
1371 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
;
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
);
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
) {
1445 rap_cli_expect_format(call
, "zzWWWDDDz");
1448 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
;
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
) {
1503 rap_cli_expect_format(call
, "zzWWWDDDz");
1506 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
;
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
) {
1563 rap_cli_expect_format(call
, "B21BB16DWzzWz");
1566 result
= NT_STATUS_INVALID_PARAMETER
;
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
))
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
)) {
1593 if (DEBUGLEVEL
>= 10) {
1594 NDR_PRINT_OUT_DEBUG(rap_NetUserAdd
, r
);
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
))
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
)) {
1638 if (DEBUGLEVEL
>= 10) {
1639 NDR_PRINT_OUT_DEBUG(rap_NetUserDelete
, r
);
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
))
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
)) {
1685 if (DEBUGLEVEL
>= 10) {
1686 NDR_PRINT_OUT_DEBUG(rap_NetRemoteTOD
, r
);