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 "rpc_client.h"
28 #include "rpcclient.h"
30 extern int DEBUGLEVEL;
36 extern struct user_creds *usr_creds;
38 /********************************************************************
39 initialize a spoolss NEW_BUFFER.
40 ********************************************************************/
41 void init_buffer(NEW_BUFFER *buffer, uint32 size, TALLOC_CTX *ctx)
43 buffer->ptr = (size!=0)? 1:0;
45 buffer->string_at_end=size;
46 prs_init(&buffer->prs, size, 4, ctx, MARSHALL);
47 buffer->struct_start = prs_offset(&buffer->prs);
50 static void decode_printer_info_0(NEW_BUFFER *buffer, uint32 returned,
51 PRINTER_INFO_0 **info)
56 inf=(PRINTER_INFO_0 *)malloc(returned*sizeof(PRINTER_INFO_0));
58 buffer->prs.data_offset=0;
60 for (i=0; i<returned; i++) {
61 new_smb_io_printer_info_0("", buffer, &(inf[i]), 0);
67 static void decode_printer_info_1(NEW_BUFFER *buffer, uint32 returned,
68 PRINTER_INFO_1 **info)
73 inf=(PRINTER_INFO_1 *)malloc(returned*sizeof(PRINTER_INFO_1));
75 buffer->prs.data_offset=0;
77 for (i=0; i<returned; i++) {
78 new_smb_io_printer_info_1("", buffer, &(inf[i]), 0);
84 static void decode_printer_info_2(NEW_BUFFER *buffer, uint32 returned,
85 PRINTER_INFO_2 **info)
90 inf=(PRINTER_INFO_2 *)malloc(returned*sizeof(PRINTER_INFO_2));
92 buffer->prs.data_offset=0;
94 for (i=0; i<returned; i++) {
95 /* a little initialization as we go */
96 inf[i].secdesc = NULL;
97 new_smb_io_printer_info_2("", buffer, &(inf[i]), 0);
103 static void decode_printer_info_3(NEW_BUFFER *buffer, uint32 returned,
104 PRINTER_INFO_3 **info)
109 inf=(PRINTER_INFO_3 *)malloc(returned*sizeof(PRINTER_INFO_3));
111 buffer->prs.data_offset=0;
113 for (i=0; i<returned; i++) {
114 new_smb_io_printer_info_3("", buffer, &(inf[i]), 0);
120 static void decode_printer_driver_1(NEW_BUFFER *buffer, uint32 returned,
121 DRIVER_INFO_1 **info)
126 inf=(DRIVER_INFO_1 *)malloc(returned*sizeof(DRIVER_INFO_1));
128 buffer->prs.data_offset=0;
130 for (i=0; i<returned; i++) {
131 new_smb_io_printer_driver_info_1("", buffer, &(inf[i]), 0);
137 static void decode_printer_driver_2(NEW_BUFFER *buffer, uint32 returned,
138 DRIVER_INFO_2 **info)
143 inf=(DRIVER_INFO_2 *)malloc(returned*sizeof(DRIVER_INFO_2));
145 buffer->prs.data_offset=0;
147 for (i=0; i<returned; i++) {
148 new_smb_io_printer_driver_info_2("", buffer, &(inf[i]), 0);
154 static void decode_printer_driver_3(NEW_BUFFER *buffer, uint32 returned,
155 DRIVER_INFO_3 **info)
160 inf=(DRIVER_INFO_3 *)malloc(returned*sizeof(DRIVER_INFO_3));
162 buffer->prs.data_offset=0;
164 for (i=0; i<returned; i++) {
165 new_smb_io_printer_driver_info_3("", buffer, &(inf[i]), 0);
171 static void decode_printerdriverdir_info_1(NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info)
173 /* DRIVER_DIRECTORY_1 *inf;
175 inf=(DRIVER_DIRECTORY_1 *)malloc(returned*sizeof(DRIVER_DIRECTORY_1));
177 prs_set_offset(&buffer->prs, 0);
179 new_smb_io_driverdir_1("", buffer, info, 0);
184 /**********************************************************************
185 Decode a PORT_INFO_1 struct from a NEW_BUFFER
186 **********************************************************************/
187 void decode_port_info_1(NEW_BUFFER *buffer, uint32 returned,
193 inf=(PORT_INFO_1*)malloc(returned*sizeof(PORT_INFO_1));
195 prs_set_offset(&buffer->prs, 0);
197 for (i=0; i<returned; i++) {
198 new_smb_io_port_info_1("", buffer, &(inf[i]), 0);
204 /**********************************************************************
205 Decode a PORT_INFO_2 struct from a NEW_BUFFER
206 **********************************************************************/
207 void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned,
213 inf=(PORT_INFO_2*)malloc(returned*sizeof(PORT_INFO_2));
215 prs_set_offset(&buffer->prs, 0);
217 for (i=0; i<returned; i++) {
218 new_smb_io_port_info_2("", buffer, &(inf[i]), 0);
225 /****************************************************************************
227 ****************************************************************************/
228 BOOL msrpc_spoolss_enum_printers(char* srv_name, uint32 flags,
229 uint32 level, PRINTER_INFO_CTR ctr)
235 TALLOC_CTX *mem_ctx = NULL;
237 if ((mem_ctx=talloc_init()) == NULL)
239 DEBUG(0,("msrpc_spoolss_enum_printers: talloc_init failed!\n"));
242 init_buffer(&buffer, 0, mem_ctx);
244 /* send a NULL buffer first */
245 status=spoolss_enum_printers(flags, srv_name, level, &buffer, 0,
248 if (status==ERROR_INSUFFICIENT_BUFFER) {
249 init_buffer(&buffer, needed, mem_ctx);
250 status=spoolss_enum_printers(flags, srv_name, level, &buffer,
251 needed, &needed, &returned);
254 if (status!=NT_STATUS_NO_PROBLEMO)
256 DEBUG(0,("spoolss_enum_printers: %s\n", get_nt_error_msg(status)));
258 talloc_destroy(mem_ctx);
262 /* is there anything to process? */
267 decode_printer_info_1(&buffer, returned, &(ctr.printers_1));
270 decode_printer_info_2(&buffer, returned, &(ctr.printers_2));
273 decode_printer_info_3(&buffer, returned, &(ctr.printers_3));
277 display_printer_info_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
278 display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
279 display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
283 talloc_destroy(mem_ctx);
288 /****************************************************************************
290 ****************************************************************************/
291 BOOL msrpc_spoolss_enum_ports(char* srv_name,
292 uint32 level, PORT_INFO_CTR *ctr)
298 TALLOC_CTX *mem_ctx = NULL;
300 if ((mem_ctx=talloc_init()) == NULL)
302 DEBUG(0,("msrpc_spoolss_enum_ports: talloc_init failed!\n"));
306 init_buffer(&buffer, 0, mem_ctx);
308 /* send a NULL buffer first */
309 status=spoolss_enum_ports(srv_name, level, &buffer, 0,
312 if (status==ERROR_INSUFFICIENT_BUFFER) {
313 init_buffer(&buffer, needed, mem_ctx);
314 status=spoolss_enum_ports(srv_name, level, &buffer,
315 needed, &needed, &returned);
318 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
320 if (status!=NT_STATUS_NO_PROBLEMO)
323 talloc_destroy(mem_ctx);
327 /* is there anything to process? */
332 decode_port_info_1(&buffer, returned, &ctr->port.info_1);
335 decode_port_info_2(&buffer, returned, &ctr->port.info_2);
338 DEBUG(0,("Unable to decode unknown PORT_INFO_%d\n", level));
342 display_port_info_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
343 display_port_info_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
344 display_port_info_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
347 talloc_destroy(mem_ctx);
354 /****************************************************************************
356 ****************************************************************************/
357 uint32 msrpc_spoolss_getprinterdata( const char* printer_name,
359 const char* user_name,
360 const char* value_name,
370 UNISTR2 uni_val_name;
371 TALLOC_CTX *mem_ctx = NULL;
373 DEBUG(4,("spoolgetdata - printer: %s server: %s user: %s value: %s\n",
374 printer_name, station, user_name, value_name));
376 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name,
379 return NT_STATUS_ACCESS_DENIED;
382 init_unistr2(&uni_val_name, value_name, 0);
386 if ((mem_ctx=talloc_init()) == NULL)
388 DEBUG(0,("msrpc_spoolss_getprinterdata: talloc_init failed!\n"));
391 init_buffer(buffer, size, mem_ctx);
393 status = spoolss_getprinterdata(&hnd, &uni_val_name, size, type, &size,
396 if (status == ERROR_INSUFFICIENT_BUFFER)
399 init_buffer(buffer, size, mem_ctx);
400 data = prs_data_p(&buffer->prs);
401 status = spoolss_getprinterdata(&hnd, &uni_val_name,
407 talloc_destroy(mem_ctx);
409 if (status != NT_STATUS_NO_PROBLEMO)
411 if (!spoolss_closeprinter(&hnd))
412 return NT_STATUS_ACCESS_DENIED;
418 fn(printer_name, station, level, returned, *ctr);
424 /****************************************************************************
426 ****************************************************************************/
427 BOOL msrpc_spoolss_enum_jobs( const char* printer_name,
428 const char* station, const char* user_name,
430 void ***ctr, JOB_INFO_FN(fn))
438 uint32 numofjobs=0xffff;
439 TALLOC_CTX *mem_ctx = NULL;
441 DEBUG(4,("spoolopen - printer: %s server: %s user: %s\n",
442 printer_name, station, user_name));
444 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name, &hnd))
447 if ((mem_ctx=talloc_init()) == NULL)
449 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
452 init_buffer(&buffer, 0, mem_ctx);
453 status = spoolss_enum_jobs(&hnd, firstjob, numofjobs, level,
454 &buffer, 0, &needed, &returned);
456 if (status == ERROR_INSUFFICIENT_BUFFER)
458 init_buffer(&buffer, needed, mem_ctx);
459 status = spoolss_enum_jobs( &hnd, firstjob, numofjobs, level,
460 &buffer, needed, &needed, &returned);
464 talloc_destroy(mem_ctx);
466 if (status!=NT_STATUS_NO_PROBLEMO) {
467 if (!spoolss_closeprinter(&hnd))
473 fn(printer_name, station, level, returned, *ctr);
479 /****************************************************************************
481 ****************************************************************************/
482 BOOL msrpc_spoolss_enum_printerdata( const char* printer_name,
483 const char* station, const char* user_name )
498 DEBUG(4,("msrpc_spoolss_enum_printerdata - printer: %s\n", printer_name));
500 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name, &hnd))
511 status = spoolss_enum_printerdata(&hnd, idx, &valuelen, value,
512 &rvaluelen, &type, &datalen,
515 DEBUG(4,("spoolenum_printerdata - got size: biggest value:[%d], biggest data:[%d]\n", rvaluelen, rdatalen));
517 maxvaluelen=valuelen=rvaluelen;
518 maxdatalen=datalen=rdatalen;
520 value=(uint16 *)malloc(valuelen*sizeof(uint16));
521 data=(uint8 *)malloc(datalen*sizeof(uint8));
523 display_printer_enumdata(out_hnd, ACTION_HEADER, idx, valuelen,
524 value, rvaluelen, type, datalen, data, rdatalen);
527 valuelen=maxvaluelen;
530 status = spoolss_enum_printerdata(&hnd, idx, &valuelen,
531 value, &rvaluelen, &type,
532 &datalen, data, &rdatalen);
533 display_printer_enumdata(out_hnd, ACTION_ENUMERATE, idx,
534 valuelen, value, rvaluelen, type,
535 datalen, data, rdatalen);
538 } while (status != 0x0103); /* NO_MORE_ITEMS */
540 display_printer_enumdata(out_hnd, ACTION_FOOTER, idx, valuelen,
541 value, rvaluelen, type, datalen, data, rdatalen);
544 if (status!=NT_STATUS_NO_PROBLEMO) {
546 * the check on this if statement is redundant
547 * since is the status is bad we're going to
548 * return False anyways. The caller will be
549 * unable to determine if there really was a problem
550 * with the spoolss_closeprinter() call --jerry
552 spoolss_closeprinter(&hnd);
559 /****************************************************************************
561 ****************************************************************************/
562 BOOL msrpc_spoolss_getprinter( const char* printer_name, const uint32 level,
563 const char* station, const char* user_name,
564 PRINTER_INFO_CTR ctr)
570 TALLOC_CTX *mem_ctx = NULL;
572 DEBUG(4,("spoolenum_getprinter - printer: %s\n", printer_name));
574 if(!spoolss_open_printer_ex( printer_name, "", PRINTER_ALL_ACCESS, station, user_name, &hnd))
577 if ((mem_ctx=talloc_init()) == NULL)
579 DEBUG(0,("msrpc_spoolss_getprinter: talloc_init failed!\n"));
582 init_buffer(&buffer, needed, mem_ctx);
584 status = spoolss_getprinter(&hnd, level, &buffer, needed, &needed);
586 if (status==ERROR_INSUFFICIENT_BUFFER) {
587 init_buffer(&buffer, needed, mem_ctx);
588 status = spoolss_getprinter(&hnd, level, &buffer, needed, &needed);
591 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
593 if (status!=NT_STATUS_NO_PROBLEMO)
596 talloc_destroy(mem_ctx);
602 decode_printer_info_0(&buffer, 1, &(ctr.printers_0));
605 decode_printer_info_1(&buffer, 1, &(ctr.printers_1));
608 decode_printer_info_2(&buffer, 1, &(ctr.printers_2));
611 decode_printer_info_3(&buffer, 1, &(ctr.printers_3));
615 display_printer_info_ctr(out_hnd, ACTION_HEADER , level, 1, ctr);
616 display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, 1, ctr);
617 display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, 1, ctr);
620 talloc_destroy(mem_ctx);
622 if (status!=NT_STATUS_NO_PROBLEMO) {
623 if (!spoolss_closeprinter(&hnd))
631 /****************************************************************************
633 ****************************************************************************/
634 BOOL msrpc_spoolss_getprinterdriver( const char* printer_name,
635 const char *environment, const uint32 level,
636 const char* station, const char* user_name,
637 PRINTER_DRIVER_CTR ctr)
643 TALLOC_CTX *mem_ctx = NULL;
645 DEBUG(4,("msrpc_spoolss_enum_getprinterdriver - printer: %s\n", printer_name));
647 if(!spoolss_open_printer_ex( printer_name, "", PRINTER_ALL_ACCESS, station, user_name, &hnd))
650 if ((mem_ctx=talloc_init()) == NULL)
652 DEBUG(0,("msrpc_spoolss_getprinterdriver: talloc_init failed!\n"));
655 init_buffer(&buffer, 0, mem_ctx);
657 status = spoolss_getprinterdriver(&hnd, environment, level, &buffer, 0, &needed);
659 if (status==ERROR_INSUFFICIENT_BUFFER) {
660 init_buffer(&buffer, needed, mem_ctx);
661 status = spoolss_getprinterdriver(&hnd, environment, level, &buffer, needed, &needed);
664 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
666 if (status!=NT_STATUS_NO_PROBLEMO)
669 talloc_destroy(mem_ctx);
675 decode_printer_driver_1(&buffer, 1, &(ctr.info1));
678 decode_printer_driver_2(&buffer, 1, &(ctr.info2));
681 decode_printer_driver_3(&buffer, 1, &(ctr.info3));
685 display_printer_driver_ctr(out_hnd, ACTION_HEADER , level, 1, ctr);
686 display_printer_driver_ctr(out_hnd, ACTION_ENUMERATE, level, 1, ctr);
687 display_printer_driver_ctr(out_hnd, ACTION_FOOTER , level, 1, ctr);
690 talloc_destroy(mem_ctx);
692 if (status!=NT_STATUS_NO_PROBLEMO) {
693 if (!spoolss_closeprinter(&hnd))
701 /****************************************************************************
703 ****************************************************************************/
704 BOOL msrpc_spoolss_enumprinterdrivers( const char* srv_name,
705 const char *environment, const uint32 level,
706 PRINTER_DRIVER_CTR ctr)
712 TALLOC_CTX *mem_ctx = NULL;
714 DEBUG(4,("msrpc_spoolss_enum_enumprinterdrivers - server: %s\n", srv_name));
716 if ((mem_ctx=talloc_init()) == NULL)
718 DEBUG(0,("msrpc_spoolss_enumprinterdrivers: talloc_init failed!\n"));
721 init_buffer(&buffer, 0, mem_ctx);
723 status = spoolss_enum_printerdrivers(srv_name, environment,
724 level, &buffer, 0, &needed, &returned);
726 if (status == ERROR_INSUFFICIENT_BUFFER)
728 init_buffer(&buffer, needed, mem_ctx);
729 status = spoolss_enum_printerdrivers( srv_name, environment,
730 level, &buffer, needed, &needed, &returned);
733 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
735 if (status!=NT_STATUS_NO_PROBLEMO)
738 talloc_destroy(mem_ctx);
745 decode_printer_driver_1(&buffer, returned, &(ctr.info1));
748 decode_printer_driver_2(&buffer, returned, &(ctr.info2));
751 decode_printer_driver_3(&buffer, returned, &(ctr.info3));
755 display_printer_driver_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
756 display_printer_driver_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
757 display_printer_driver_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
760 talloc_destroy(mem_ctx);
765 /****************************************************************************
767 ****************************************************************************/
768 BOOL msrpc_spoolss_getprinterdriverdir(char* srv_name, char* env_name, uint32 level, DRIVER_DIRECTORY_CTR ctr)
773 TALLOC_CTX *mem_ctx = NULL;
775 if ((mem_ctx=talloc_init()) == NULL)
777 DEBUG(0,("msrpc_spoolss_getprinterdriverdir: talloc_init failed!\n"));
780 init_buffer(&buffer, 0, mem_ctx);
782 /* send a NULL buffer first */
783 status=spoolss_getprinterdriverdir(srv_name, env_name, level, &buffer, 0, &needed);
785 if (status==ERROR_INSUFFICIENT_BUFFER) {
786 init_buffer(&buffer, needed, mem_ctx);
787 status=spoolss_getprinterdriverdir(srv_name, env_name, level, &buffer, needed, &needed);
790 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
792 if (status!=NT_STATUS_NO_PROBLEMO)
795 talloc_destroy(mem_ctx);
801 decode_printerdriverdir_info_1(&buffer, &(ctr.driver.info_1));
805 display_printerdriverdir_info_ctr(out_hnd, ACTION_HEADER , level, ctr);
806 display_printerdriverdir_info_ctr(out_hnd, ACTION_ENUMERATE, level, ctr);
807 display_printerdriverdir_info_ctr(out_hnd, ACTION_FOOTER , level, ctr);
810 talloc_destroy(mem_ctx);