2 Unix SMB/Netbios implementation.
4 NT Domain Authentication SMB / MSRPC client
5 Copyright (C) Andrew Tridgell 1994-2000
6 Copyright (C) Luke Kenneth Casson Leighton 1996-2000
7 Copyright (C) Jean-Francois Micouleau 1999-2000
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 2 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, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include "rpc_parse.h"
27 #include "rpcclient.h"
33 extern struct user_creds
*usr_creds
;
35 /********************************************************************
36 initialize a spoolss NEW_BUFFER.
37 ********************************************************************/
38 void init_buffer(NEW_BUFFER
*buffer
, uint32 size
, TALLOC_CTX
*ctx
)
40 buffer
->ptr
= (size
!=0)? 1:0;
42 buffer
->string_at_end
=size
;
43 prs_init(&buffer
->prs
, size
, ctx
, MARSHALL
);
44 buffer
->struct_start
= prs_offset(&buffer
->prs
);
47 static void decode_printer_info_0(NEW_BUFFER
*buffer
, uint32 returned
,
48 PRINTER_INFO_0
**info
)
53 inf
=(PRINTER_INFO_0
*)malloc(returned
*sizeof(PRINTER_INFO_0
));
55 buffer
->prs
.data_offset
=0;
57 for (i
=0; i
<returned
; i
++) {
58 new_smb_io_printer_info_0("", buffer
, &(inf
[i
]), 0);
64 static void decode_printer_info_1(NEW_BUFFER
*buffer
, uint32 returned
,
65 PRINTER_INFO_1
**info
)
70 inf
=(PRINTER_INFO_1
*)malloc(returned
*sizeof(PRINTER_INFO_1
));
72 buffer
->prs
.data_offset
=0;
74 for (i
=0; i
<returned
; i
++) {
75 new_smb_io_printer_info_1("", buffer
, &(inf
[i
]), 0);
81 static void decode_printer_info_2(NEW_BUFFER
*buffer
, uint32 returned
,
82 PRINTER_INFO_2
**info
)
87 inf
=(PRINTER_INFO_2
*)malloc(returned
*sizeof(PRINTER_INFO_2
));
89 buffer
->prs
.data_offset
=0;
91 for (i
=0; i
<returned
; i
++) {
92 /* a little initialization as we go */
93 inf
[i
].secdesc
= NULL
;
94 new_smb_io_printer_info_2("", buffer
, &(inf
[i
]), 0);
100 static void decode_printer_info_3(NEW_BUFFER
*buffer
, uint32 returned
,
101 PRINTER_INFO_3
**info
)
106 inf
=(PRINTER_INFO_3
*)malloc(returned
*sizeof(PRINTER_INFO_3
));
108 buffer
->prs
.data_offset
=0;
110 for (i
=0; i
<returned
; i
++) {
111 new_smb_io_printer_info_3("", buffer
, &(inf
[i
]), 0);
117 static void decode_printer_driver_1(NEW_BUFFER
*buffer
, uint32 returned
,
118 DRIVER_INFO_1
**info
)
123 inf
=(DRIVER_INFO_1
*)malloc(returned
*sizeof(DRIVER_INFO_1
));
125 buffer
->prs
.data_offset
=0;
127 for (i
=0; i
<returned
; i
++) {
128 new_smb_io_printer_driver_info_1("", buffer
, &(inf
[i
]), 0);
134 static void decode_printer_driver_2(NEW_BUFFER
*buffer
, uint32 returned
,
135 DRIVER_INFO_2
**info
)
140 inf
=(DRIVER_INFO_2
*)malloc(returned
*sizeof(DRIVER_INFO_2
));
142 buffer
->prs
.data_offset
=0;
144 for (i
=0; i
<returned
; i
++) {
145 new_smb_io_printer_driver_info_2("", buffer
, &(inf
[i
]), 0);
151 static void decode_printer_driver_3(NEW_BUFFER
*buffer
, uint32 returned
,
152 DRIVER_INFO_3
**info
)
157 inf
=(DRIVER_INFO_3
*)malloc(returned
*sizeof(DRIVER_INFO_3
));
159 buffer
->prs
.data_offset
=0;
161 for (i
=0; i
<returned
; i
++) {
162 new_smb_io_printer_driver_info_3("", buffer
, &(inf
[i
]), 0);
168 static void decode_printerdriverdir_info_1(NEW_BUFFER
*buffer
, DRIVER_DIRECTORY_1
*info
)
170 /* DRIVER_DIRECTORY_1 *inf;
172 inf=(DRIVER_DIRECTORY_1 *)malloc(returned*sizeof(DRIVER_DIRECTORY_1));
174 prs_set_offset(&buffer
->prs
, 0);
176 new_smb_io_driverdir_1("", buffer
, info
, 0);
181 /**********************************************************************
182 Decode a PORT_INFO_1 struct from a NEW_BUFFER
183 **********************************************************************/
184 void decode_port_info_1(NEW_BUFFER
*buffer
, uint32 returned
,
190 inf
=(PORT_INFO_1
*)malloc(returned
*sizeof(PORT_INFO_1
));
192 prs_set_offset(&buffer
->prs
, 0);
194 for (i
=0; i
<returned
; i
++) {
195 new_smb_io_port_info_1("", buffer
, &(inf
[i
]), 0);
201 /**********************************************************************
202 Decode a PORT_INFO_2 struct from a NEW_BUFFER
203 **********************************************************************/
204 void decode_port_info_2(NEW_BUFFER
*buffer
, uint32 returned
,
210 inf
=(PORT_INFO_2
*)malloc(returned
*sizeof(PORT_INFO_2
));
212 prs_set_offset(&buffer
->prs
, 0);
214 for (i
=0; i
<returned
; i
++) {
215 new_smb_io_port_info_2("", buffer
, &(inf
[i
]), 0);
222 /****************************************************************************
224 ****************************************************************************/
225 BOOL
msrpc_spoolss_enum_printers(char* srv_name
, uint32 flags
,
226 uint32 level
, PRINTER_INFO_CTR ctr
)
232 TALLOC_CTX
*mem_ctx
= NULL
;
234 if ((mem_ctx
=talloc_init()) == NULL
)
236 DEBUG(0,("msrpc_spoolss_enum_printers: talloc_init failed!\n"));
239 init_buffer(&buffer
, 0, mem_ctx
);
241 /* send a NULL buffer first */
242 status
=spoolss_enum_printers(flags
, srv_name
, level
, &buffer
, 0,
245 if (status
==ERROR_INSUFFICIENT_BUFFER
) {
246 init_buffer(&buffer
, needed
, mem_ctx
);
247 status
=spoolss_enum_printers(flags
, srv_name
, level
, &buffer
,
248 needed
, &needed
, &returned
);
251 if (status
!=NT_STATUS_OK
)
253 DEBUG(0,("spoolss_enum_printers: %s\n", get_nt_error_msg(status
)));
255 talloc_destroy(mem_ctx
);
259 /* is there anything to process? */
264 decode_printer_info_1(&buffer
, returned
, &(ctr
.printers_1
));
267 decode_printer_info_2(&buffer
, returned
, &(ctr
.printers_2
));
270 decode_printer_info_3(&buffer
, returned
, &(ctr
.printers_3
));
274 display_printer_info_ctr(out_hnd
, ACTION_HEADER
, level
, returned
, ctr
);
275 display_printer_info_ctr(out_hnd
, ACTION_ENUMERATE
, level
, returned
, ctr
);
276 display_printer_info_ctr(out_hnd
, ACTION_FOOTER
, level
, returned
, ctr
);
280 talloc_destroy(mem_ctx
);
285 /****************************************************************************
287 ****************************************************************************/
288 BOOL
msrpc_spoolss_enum_ports(char* srv_name
,
289 uint32 level
, PORT_INFO_CTR
*ctr
)
295 TALLOC_CTX
*mem_ctx
= NULL
;
297 if ((mem_ctx
=talloc_init()) == NULL
)
299 DEBUG(0,("msrpc_spoolss_enum_ports: talloc_init failed!\n"));
303 init_buffer(&buffer
, 0, mem_ctx
);
305 /* send a NULL buffer first */
306 status
=spoolss_enum_ports(srv_name
, level
, &buffer
, 0,
309 if (status
==ERROR_INSUFFICIENT_BUFFER
) {
310 init_buffer(&buffer
, needed
, mem_ctx
);
311 status
=spoolss_enum_ports(srv_name
, level
, &buffer
,
312 needed
, &needed
, &returned
);
315 report(out_hnd
, "\tstatus:[%d (%x)]\n", status
, status
);
317 if (status
!=NT_STATUS_OK
)
320 talloc_destroy(mem_ctx
);
324 /* is there anything to process? */
329 decode_port_info_1(&buffer
, returned
, &ctr
->port
.info_1
);
332 decode_port_info_2(&buffer
, returned
, &ctr
->port
.info_2
);
335 DEBUG(0,("Unable to decode unknown PORT_INFO_%d\n", level
));
339 display_port_info_ctr(out_hnd
, ACTION_HEADER
, level
, returned
, ctr
);
340 display_port_info_ctr(out_hnd
, ACTION_ENUMERATE
, level
, returned
, ctr
);
341 display_port_info_ctr(out_hnd
, ACTION_FOOTER
, level
, returned
, ctr
);
344 talloc_destroy(mem_ctx
);
351 /****************************************************************************
353 ****************************************************************************/
354 uint32
msrpc_spoolss_getprinterdata( const char* printer_name
,
356 const char* user_name
,
357 const char* value_name
,
367 UNISTR2 uni_val_name
;
368 TALLOC_CTX
*mem_ctx
= NULL
;
370 DEBUG(4,("spoolgetdata - printer: %s server: %s user: %s value: %s\n",
371 printer_name
, station
, user_name
, value_name
));
373 if(!spoolss_open_printer_ex( printer_name
, 0, 0, station
, user_name
,
376 return NT_STATUS_ACCESS_DENIED
;
379 init_unistr2(&uni_val_name
, value_name
, 0);
383 if ((mem_ctx
=talloc_init()) == NULL
)
385 DEBUG(0,("msrpc_spoolss_getprinterdata: talloc_init failed!\n"));
388 init_buffer(buffer
, size
, mem_ctx
);
390 status
= spoolss_getprinterdata(&hnd
, &uni_val_name
, size
, type
, &size
,
391 (unsigned char *)data
, &needed
);
393 if (status
== ERROR_INSUFFICIENT_BUFFER
)
396 init_buffer(buffer
, size
, mem_ctx
);
397 data
= prs_data_p(&buffer
->prs
);
398 status
= spoolss_getprinterdata(&hnd
, &uni_val_name
,
400 (unsigned char *)data
, &needed
);
404 talloc_destroy(mem_ctx
);
406 if (status
!= NT_STATUS_OK
)
408 if (!spoolss_closeprinter(&hnd
))
409 return NT_STATUS_ACCESS_DENIED
;
415 fn(printer_name
, station
, level
, returned
, *ctr
);
421 /****************************************************************************
423 ****************************************************************************/
424 BOOL
msrpc_spoolss_enum_jobs( const char* printer_name
,
425 const char* station
, const char* user_name
,
427 void ***ctr
, JOB_INFO_FN(fn
))
435 uint32 numofjobs
=0xffff;
436 TALLOC_CTX
*mem_ctx
= NULL
;
438 DEBUG(4,("spoolopen - printer: %s server: %s user: %s\n",
439 printer_name
, station
, user_name
));
441 if(!spoolss_open_printer_ex( printer_name
, 0, 0, station
, user_name
, &hnd
))
444 if ((mem_ctx
=talloc_init()) == NULL
)
446 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
449 init_buffer(&buffer
, 0, mem_ctx
);
450 status
= spoolss_enum_jobs(&hnd
, firstjob
, numofjobs
, level
,
451 &buffer
, 0, &needed
, &returned
);
453 if (status
== ERROR_INSUFFICIENT_BUFFER
)
455 init_buffer(&buffer
, needed
, mem_ctx
);
456 status
= spoolss_enum_jobs( &hnd
, firstjob
, numofjobs
, level
,
457 &buffer
, needed
, &needed
, &returned
);
461 talloc_destroy(mem_ctx
);
463 if (status
!=NT_STATUS_OK
) {
464 if (!spoolss_closeprinter(&hnd
))
470 fn(printer_name
, station
, level
, returned
, *ctr
);
476 /****************************************************************************
478 ****************************************************************************/
479 BOOL
msrpc_spoolss_enum_printerdata( const char* printer_name
,
480 const char* station
, const char* user_name
)
495 DEBUG(4,("msrpc_spoolss_enum_printerdata - printer: %s\n", printer_name
));
497 if(!spoolss_open_printer_ex( printer_name
, 0, 0, station
, user_name
, &hnd
))
508 status
= spoolss_enum_printerdata(&hnd
, idx
, &valuelen
, value
,
509 &rvaluelen
, &type
, &datalen
,
512 DEBUG(4,("spoolenum_printerdata - got size: biggest value:[%d], biggest data:[%d]\n", rvaluelen
, rdatalen
));
514 maxvaluelen
=valuelen
=rvaluelen
;
515 maxdatalen
=datalen
=rdatalen
;
517 value
=(uint16
*)malloc(valuelen
*sizeof(uint16
));
518 data
=(uint8
*)malloc(datalen
*sizeof(uint8
));
520 display_printer_enumdata(out_hnd
, ACTION_HEADER
, idx
, valuelen
,
521 value
, rvaluelen
, type
, datalen
, data
, rdatalen
);
524 valuelen
=maxvaluelen
;
527 status
= spoolss_enum_printerdata(&hnd
, idx
, &valuelen
,
528 value
, &rvaluelen
, &type
,
529 &datalen
, data
, &rdatalen
);
530 display_printer_enumdata(out_hnd
, ACTION_ENUMERATE
, idx
,
531 valuelen
, value
, rvaluelen
, type
,
532 datalen
, data
, rdatalen
);
535 } while (status
!= 0x0103); /* NO_MORE_ITEMS */
537 display_printer_enumdata(out_hnd
, ACTION_FOOTER
, idx
, valuelen
,
538 value
, rvaluelen
, type
, datalen
, data
, rdatalen
);
541 if (status
!=NT_STATUS_OK
) {
543 * the check on this if statement is redundant
544 * since is the status is bad we're going to
545 * return False anyways. The caller will be
546 * unable to determine if there really was a problem
547 * with the spoolss_closeprinter() call --jerry
549 spoolss_closeprinter(&hnd
);
556 /****************************************************************************
558 ****************************************************************************/
559 BOOL
msrpc_spoolss_getprinter( const char* printer_name
, const uint32 level
,
560 const char* station
, const char* user_name
,
561 PRINTER_INFO_CTR ctr
)
567 TALLOC_CTX
*mem_ctx
= NULL
;
569 DEBUG(4,("spoolenum_getprinter - printer: %s\n", printer_name
));
571 if(!spoolss_open_printer_ex( printer_name
, "", PRINTER_ALL_ACCESS
, station
, user_name
, &hnd
))
574 if ((mem_ctx
=talloc_init()) == NULL
)
576 DEBUG(0,("msrpc_spoolss_getprinter: talloc_init failed!\n"));
579 init_buffer(&buffer
, needed
, mem_ctx
);
581 status
= spoolss_getprinter(&hnd
, level
, &buffer
, needed
, &needed
);
583 if (status
==ERROR_INSUFFICIENT_BUFFER
) {
584 init_buffer(&buffer
, needed
, mem_ctx
);
585 status
= spoolss_getprinter(&hnd
, level
, &buffer
, needed
, &needed
);
588 report(out_hnd
, "\tstatus:[%d (%x)]\n", status
, status
);
590 if (status
!=NT_STATUS_OK
)
593 talloc_destroy(mem_ctx
);
599 decode_printer_info_0(&buffer
, 1, &(ctr
.printers_0
));
602 decode_printer_info_1(&buffer
, 1, &(ctr
.printers_1
));
605 decode_printer_info_2(&buffer
, 1, &(ctr
.printers_2
));
608 decode_printer_info_3(&buffer
, 1, &(ctr
.printers_3
));
612 display_printer_info_ctr(out_hnd
, ACTION_HEADER
, level
, 1, ctr
);
613 display_printer_info_ctr(out_hnd
, ACTION_ENUMERATE
, level
, 1, ctr
);
614 display_printer_info_ctr(out_hnd
, ACTION_FOOTER
, level
, 1, ctr
);
617 talloc_destroy(mem_ctx
);
619 if (status
!=NT_STATUS_OK
) {
620 if (!spoolss_closeprinter(&hnd
))
628 /****************************************************************************
630 ****************************************************************************/
631 BOOL
msrpc_spoolss_getprinterdriver( const char* printer_name
,
632 const char *environment
, const uint32 level
,
633 const char* station
, const char* user_name
,
634 PRINTER_DRIVER_CTR ctr
)
640 TALLOC_CTX
*mem_ctx
= NULL
;
642 DEBUG(4,("msrpc_spoolss_enum_getprinterdriver - printer: %s\n", printer_name
));
644 if(!spoolss_open_printer_ex( printer_name
, "", PRINTER_ALL_ACCESS
, station
, user_name
, &hnd
))
647 if ((mem_ctx
=talloc_init()) == NULL
)
649 DEBUG(0,("msrpc_spoolss_getprinterdriver: talloc_init failed!\n"));
652 init_buffer(&buffer
, 0, mem_ctx
);
654 status
= spoolss_getprinterdriver(&hnd
, environment
, level
, &buffer
, 0, &needed
);
656 if (status
==ERROR_INSUFFICIENT_BUFFER
) {
657 init_buffer(&buffer
, needed
, mem_ctx
);
658 status
= spoolss_getprinterdriver(&hnd
, environment
, level
, &buffer
, needed
, &needed
);
661 /* report(out_hnd, "\tstatus:[%d (%x)]\n", status, status); */
663 if (status
!=NT_STATUS_OK
)
666 talloc_destroy(mem_ctx
);
672 decode_printer_driver_1(&buffer
, 1, &(ctr
.info1
));
675 decode_printer_driver_2(&buffer
, 1, &(ctr
.info2
));
678 decode_printer_driver_3(&buffer
, 1, &(ctr
.info3
));
682 display_printer_driver_ctr(out_hnd
, ACTION_HEADER
, level
, 1, ctr
);
683 display_printer_driver_ctr(out_hnd
, ACTION_ENUMERATE
, level
, 1, ctr
);
684 display_printer_driver_ctr(out_hnd
, ACTION_FOOTER
, level
, 1, ctr
);
687 talloc_destroy(mem_ctx
);
689 if (status
!=NT_STATUS_OK
) {
690 if (!spoolss_closeprinter(&hnd
))
698 /****************************************************************************
700 ****************************************************************************/
701 BOOL
msrpc_spoolss_enumprinterdrivers( const char* srv_name
,
702 const char *environment
, const uint32 level
,
703 PRINTER_DRIVER_CTR ctr
)
709 TALLOC_CTX
*mem_ctx
= NULL
;
711 DEBUG(4,("msrpc_spoolss_enum_enumprinterdrivers - server: %s\n", srv_name
));
713 if ((mem_ctx
=talloc_init()) == NULL
)
715 DEBUG(0,("msrpc_spoolss_enumprinterdrivers: talloc_init failed!\n"));
718 init_buffer(&buffer
, 0, mem_ctx
);
720 status
= spoolss_enum_printerdrivers(srv_name
, environment
,
721 level
, &buffer
, 0, &needed
, &returned
);
723 if (status
== ERROR_INSUFFICIENT_BUFFER
)
725 init_buffer(&buffer
, needed
, mem_ctx
);
726 status
= spoolss_enum_printerdrivers( srv_name
, environment
,
727 level
, &buffer
, needed
, &needed
, &returned
);
730 report(out_hnd
, "\tstatus:[%d (%x)]\n", status
, status
);
732 if (status
!=NT_STATUS_OK
)
735 talloc_destroy(mem_ctx
);
742 decode_printer_driver_1(&buffer
, returned
, &(ctr
.info1
));
745 decode_printer_driver_2(&buffer
, returned
, &(ctr
.info2
));
748 decode_printer_driver_3(&buffer
, returned
, &(ctr
.info3
));
752 display_printer_driver_ctr(out_hnd
, ACTION_HEADER
, level
, returned
, ctr
);
753 display_printer_driver_ctr(out_hnd
, ACTION_ENUMERATE
, level
, returned
, ctr
);
754 display_printer_driver_ctr(out_hnd
, ACTION_FOOTER
, level
, returned
, ctr
);
757 talloc_destroy(mem_ctx
);
762 /****************************************************************************
764 ****************************************************************************/
765 BOOL
msrpc_spoolss_getprinterdriverdir(char* srv_name
, char* env_name
, uint32 level
, DRIVER_DIRECTORY_CTR ctr
)
770 TALLOC_CTX
*mem_ctx
= NULL
;
772 if ((mem_ctx
=talloc_init()) == NULL
)
774 DEBUG(0,("msrpc_spoolss_getprinterdriverdir: talloc_init failed!\n"));
777 init_buffer(&buffer
, 0, mem_ctx
);
779 /* send a NULL buffer first */
780 status
=spoolss_getprinterdriverdir(srv_name
, env_name
, level
, &buffer
, 0, &needed
);
782 if (status
==ERROR_INSUFFICIENT_BUFFER
) {
783 init_buffer(&buffer
, needed
, mem_ctx
);
784 status
=spoolss_getprinterdriverdir(srv_name
, env_name
, level
, &buffer
, needed
, &needed
);
787 report(out_hnd
, "\tstatus:[%d (%x)]\n", status
, status
);
789 if (status
!=NT_STATUS_OK
)
792 talloc_destroy(mem_ctx
);
798 decode_printerdriverdir_info_1(&buffer
, &(ctr
.driver
.info_1
));
802 display_printerdriverdir_info_ctr(out_hnd
, ACTION_HEADER
, level
, ctr
);
803 display_printerdriverdir_info_ctr(out_hnd
, ACTION_ENUMERATE
, level
, ctr
);
804 display_printerdriverdir_info_ctr(out_hnd
, ACTION_FOOTER
, level
, ctr
);
807 talloc_destroy(mem_ctx
);