2 Unix SMB/CIFS implementation.
3 NT Domain Authentication SMB / MSRPC client
4 Copyright (C) Andrew Tridgell 1994-2000
5 Copyright (C) Luke Kenneth Casson Leighton 1996-2000
6 Copyright (C) Jean-Francois Micouleau 1999-2000
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 2 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, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "rpc_parse.h"
26 #include "rpcclient.h"
29 #define DBGC_CLASS DBGC_RPC_CLI
35 extern struct user_creds *usr_creds;
37 /********************************************************************
38 initialize a spoolss NEW_BUFFER.
39 ********************************************************************/
40 void init_buffer(NEW_BUFFER *buffer, uint32 size, TALLOC_CTX *ctx)
42 buffer->ptr = (size!=0)? 1:0;
44 buffer->string_at_end=size;
45 prs_init(&buffer->prs, size, ctx, MARSHALL);
46 buffer->struct_start = prs_offset(&buffer->prs);
49 static void decode_printer_info_0(NEW_BUFFER *buffer, uint32 returned,
50 PRINTER_INFO_0 **info)
55 inf=(PRINTER_INFO_0 *)malloc(returned*sizeof(PRINTER_INFO_0));
57 buffer->prs.data_offset=0;
59 for (i=0; i<returned; i++) {
60 new_smb_io_printer_info_0("", buffer, &(inf[i]), 0);
66 static void decode_printer_info_1(NEW_BUFFER *buffer, uint32 returned,
67 PRINTER_INFO_1 **info)
72 inf=(PRINTER_INFO_1 *)malloc(returned*sizeof(PRINTER_INFO_1));
74 buffer->prs.data_offset=0;
76 for (i=0; i<returned; i++) {
77 new_smb_io_printer_info_1("", buffer, &(inf[i]), 0);
83 static void decode_printer_info_2(NEW_BUFFER *buffer, uint32 returned,
84 PRINTER_INFO_2 **info)
89 inf=(PRINTER_INFO_2 *)malloc(returned*sizeof(PRINTER_INFO_2));
91 buffer->prs.data_offset=0;
93 for (i=0; i<returned; i++) {
94 /* a little initialization as we go */
95 inf[i].secdesc = NULL;
96 new_smb_io_printer_info_2("", buffer, &(inf[i]), 0);
102 static void decode_printer_info_3(NEW_BUFFER *buffer, uint32 returned,
103 PRINTER_INFO_3 **info)
108 inf=(PRINTER_INFO_3 *)malloc(returned*sizeof(PRINTER_INFO_3));
110 buffer->prs.data_offset=0;
112 for (i=0; i<returned; i++) {
113 new_smb_io_printer_info_3("", buffer, &(inf[i]), 0);
119 static void decode_printer_driver_1(NEW_BUFFER *buffer, uint32 returned,
120 DRIVER_INFO_1 **info)
125 inf=(DRIVER_INFO_1 *)malloc(returned*sizeof(DRIVER_INFO_1));
127 buffer->prs.data_offset=0;
129 for (i=0; i<returned; i++) {
130 new_smb_io_printer_driver_info_1("", buffer, &(inf[i]), 0);
136 static void decode_printer_driver_2(NEW_BUFFER *buffer, uint32 returned,
137 DRIVER_INFO_2 **info)
142 inf=(DRIVER_INFO_2 *)malloc(returned*sizeof(DRIVER_INFO_2));
144 buffer->prs.data_offset=0;
146 for (i=0; i<returned; i++) {
147 new_smb_io_printer_driver_info_2("", buffer, &(inf[i]), 0);
153 static void decode_printer_driver_3(NEW_BUFFER *buffer, uint32 returned,
154 DRIVER_INFO_3 **info)
159 inf=(DRIVER_INFO_3 *)malloc(returned*sizeof(DRIVER_INFO_3));
161 buffer->prs.data_offset=0;
163 for (i=0; i<returned; i++) {
164 new_smb_io_printer_driver_info_3("", buffer, &(inf[i]), 0);
170 static void decode_printerdriverdir_info_1(NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info)
172 /* DRIVER_DIRECTORY_1 *inf;
174 inf=(DRIVER_DIRECTORY_1 *)malloc(returned*sizeof(DRIVER_DIRECTORY_1));
176 prs_set_offset(&buffer->prs, 0);
178 new_smb_io_driverdir_1("", buffer, info, 0);
183 /**********************************************************************
184 Decode a PORT_INFO_1 struct from a NEW_BUFFER
185 **********************************************************************/
186 void decode_port_info_1(NEW_BUFFER *buffer, uint32 returned,
192 inf=(PORT_INFO_1*)malloc(returned*sizeof(PORT_INFO_1));
194 prs_set_offset(&buffer->prs, 0);
196 for (i=0; i<returned; i++) {
197 new_smb_io_port_info_1("", buffer, &(inf[i]), 0);
203 /**********************************************************************
204 Decode a PORT_INFO_2 struct from a NEW_BUFFER
205 **********************************************************************/
206 void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned,
212 inf=(PORT_INFO_2*)malloc(returned*sizeof(PORT_INFO_2));
214 prs_set_offset(&buffer->prs, 0);
216 for (i=0; i<returned; i++) {
217 new_smb_io_port_info_2("", buffer, &(inf[i]), 0);
224 /****************************************************************************
226 ****************************************************************************/
227 BOOL msrpc_spoolss_enum_printers(char* srv_name, uint32 flags,
228 uint32 level, PRINTER_INFO_CTR ctr)
234 TALLOC_CTX *mem_ctx = NULL;
236 if ((mem_ctx=talloc_init()) == NULL)
238 DEBUG(0,("msrpc_spoolss_enum_printers: talloc_init failed!\n"));
241 init_buffer(&buffer, 0, mem_ctx);
243 /* send a NULL buffer first */
244 status=spoolss_enum_printers(flags, srv_name, level, &buffer, 0,
247 if (status==ERROR_INSUFFICIENT_BUFFER) {
248 init_buffer(&buffer, needed, mem_ctx);
249 status=spoolss_enum_printers(flags, srv_name, level, &buffer,
250 needed, &needed, &returned);
253 if (status!=NT_STATUS_OK)
255 DEBUG(0,("spoolss_enum_printers: %s\n", nt_errstr(status)));
257 talloc_destroy(mem_ctx);
261 /* is there anything to process? */
266 decode_printer_info_1(&buffer, returned, &(ctr.printers_1));
269 decode_printer_info_2(&buffer, returned, &(ctr.printers_2));
272 decode_printer_info_3(&buffer, returned, &(ctr.printers_3));
276 display_printer_info_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
277 display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
278 display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
282 talloc_destroy(mem_ctx);
287 /****************************************************************************
289 ****************************************************************************/
290 BOOL msrpc_spoolss_enum_ports(char* srv_name,
291 uint32 level, PORT_INFO_CTR *ctr)
297 TALLOC_CTX *mem_ctx = NULL;
299 if ((mem_ctx=talloc_init()) == NULL)
301 DEBUG(0,("msrpc_spoolss_enum_ports: talloc_init failed!\n"));
305 init_buffer(&buffer, 0, mem_ctx);
307 /* send a NULL buffer first */
308 status=spoolss_enum_ports(srv_name, level, &buffer, 0,
311 if (status==ERROR_INSUFFICIENT_BUFFER) {
312 init_buffer(&buffer, needed, mem_ctx);
313 status=spoolss_enum_ports(srv_name, level, &buffer,
314 needed, &needed, &returned);
317 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
319 if (status!=NT_STATUS_OK)
322 talloc_destroy(mem_ctx);
326 /* is there anything to process? */
331 decode_port_info_1(&buffer, returned, &ctr->port.info_1);
334 decode_port_info_2(&buffer, returned, &ctr->port.info_2);
337 DEBUG(0,("Unable to decode unknown PORT_INFO_%d\n", level));
341 display_port_info_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
342 display_port_info_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
343 display_port_info_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
346 talloc_destroy(mem_ctx);
353 /****************************************************************************
355 ****************************************************************************/
356 uint32 msrpc_spoolss_getprinterdata( const char* printer_name,
358 const char* user_name,
359 const char* value_name,
369 UNISTR2 uni_val_name;
370 TALLOC_CTX *mem_ctx = NULL;
372 DEBUG(4,("spoolgetdata - printer: %s server: %s user: %s value: %s\n",
373 printer_name, station, user_name, value_name));
375 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name,
378 return NT_STATUS_ACCESS_DENIED;
381 init_unistr2(&uni_val_name, value_name, 0);
385 if ((mem_ctx=talloc_init()) == NULL)
387 DEBUG(0,("msrpc_spoolss_getprinterdata: talloc_init failed!\n"));
390 init_buffer(buffer, size, mem_ctx);
392 status = spoolss_getprinterdata(&hnd, &uni_val_name, size, type, &size,
393 (unsigned char *)data, &needed);
395 if (status == ERROR_INSUFFICIENT_BUFFER)
398 init_buffer(buffer, size, mem_ctx);
399 data = prs_data_p(&buffer->prs);
400 status = spoolss_getprinterdata(&hnd, &uni_val_name,
402 (unsigned char *)data, &needed);
406 talloc_destroy(mem_ctx);
408 if (status != NT_STATUS_OK)
410 if (!spoolss_closeprinter(&hnd))
411 return NT_STATUS_ACCESS_DENIED;
417 fn(printer_name, station, level, returned, *ctr);
423 /****************************************************************************
425 ****************************************************************************/
426 BOOL msrpc_spoolss_enum_jobs( const char* printer_name,
427 const char* station, const char* user_name,
429 void ***ctr, JOB_INFO_FN(fn))
437 uint32 numofjobs=0xffff;
438 TALLOC_CTX *mem_ctx = NULL;
440 DEBUG(4,("spoolopen - printer: %s server: %s user: %s\n",
441 printer_name, station, user_name));
443 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name, &hnd))
446 if ((mem_ctx=talloc_init()) == NULL)
448 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
451 init_buffer(&buffer, 0, mem_ctx);
452 status = spoolss_enum_jobs(&hnd, firstjob, numofjobs, level,
453 &buffer, 0, &needed, &returned);
455 if (status == ERROR_INSUFFICIENT_BUFFER)
457 init_buffer(&buffer, needed, mem_ctx);
458 status = spoolss_enum_jobs( &hnd, firstjob, numofjobs, level,
459 &buffer, needed, &needed, &returned);
463 talloc_destroy(mem_ctx);
465 if (status!=NT_STATUS_OK) {
466 if (!spoolss_closeprinter(&hnd))
472 fn(printer_name, station, level, returned, *ctr);
478 /****************************************************************************
480 ****************************************************************************/
481 BOOL msrpc_spoolss_enum_printerdata( const char* printer_name,
482 const char* station, const char* user_name )
497 DEBUG(4,("msrpc_spoolss_enum_printerdata - printer: %s\n", printer_name));
499 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name, &hnd))
510 status = spoolss_enum_printerdata(&hnd, idx, &valuelen, value,
511 &rvaluelen, &type, &datalen,
514 DEBUG(4,("spoolenum_printerdata - got size: biggest value:[%d], biggest data:[%d]\n", rvaluelen, rdatalen));
516 maxvaluelen=valuelen=rvaluelen;
517 maxdatalen=datalen=rdatalen;
519 value=(uint16 *)malloc(valuelen*sizeof(uint16));
520 data=(uint8 *)malloc(datalen*sizeof(uint8));
522 display_printer_enumdata(out_hnd, ACTION_HEADER, idx, valuelen,
523 value, rvaluelen, type, datalen, data, rdatalen);
526 valuelen=maxvaluelen;
529 status = spoolss_enum_printerdata(&hnd, idx, &valuelen,
530 value, &rvaluelen, &type,
531 &datalen, data, &rdatalen);
532 display_printer_enumdata(out_hnd, ACTION_ENUMERATE, idx,
533 valuelen, value, rvaluelen, type,
534 datalen, data, rdatalen);
537 } while (status != 0x0103); /* NO_MORE_ITEMS */
539 display_printer_enumdata(out_hnd, ACTION_FOOTER, idx, valuelen,
540 value, rvaluelen, type, datalen, data, rdatalen);
543 if (status!=NT_STATUS_OK) {
545 * the check on this if statement is redundant
546 * since is the status is bad we're going to
547 * return False anyways. The caller will be
548 * unable to determine if there really was a problem
549 * with the spoolss_closeprinter() call --jerry
551 spoolss_closeprinter(&hnd);
558 /****************************************************************************
560 ****************************************************************************/
561 BOOL msrpc_spoolss_getprinter( const char* printer_name, const uint32 level,
562 const char* station, const char* user_name,
563 PRINTER_INFO_CTR ctr)
569 TALLOC_CTX *mem_ctx = NULL;
571 DEBUG(4,("spoolenum_getprinter - printer: %s\n", printer_name));
573 if(!spoolss_open_printer_ex( printer_name, "", PRINTER_ALL_ACCESS, station, user_name, &hnd))
576 if ((mem_ctx=talloc_init()) == NULL)
578 DEBUG(0,("msrpc_spoolss_getprinter: talloc_init failed!\n"));
581 init_buffer(&buffer, needed, mem_ctx);
583 status = spoolss_getprinter(&hnd, level, &buffer, needed, &needed);
585 if (status==ERROR_INSUFFICIENT_BUFFER) {
586 init_buffer(&buffer, needed, mem_ctx);
587 status = spoolss_getprinter(&hnd, level, &buffer, needed, &needed);
590 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
592 if (status!=NT_STATUS_OK)
595 talloc_destroy(mem_ctx);
601 decode_printer_info_0(&buffer, 1, &(ctr.printers_0));
604 decode_printer_info_1(&buffer, 1, &(ctr.printers_1));
607 decode_printer_info_2(&buffer, 1, &(ctr.printers_2));
610 decode_printer_info_3(&buffer, 1, &(ctr.printers_3));
614 display_printer_info_ctr(out_hnd, ACTION_HEADER , level, 1, ctr);
615 display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, 1, ctr);
616 display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, 1, ctr);
619 talloc_destroy(mem_ctx);
621 if (status!=NT_STATUS_OK) {
622 if (!spoolss_closeprinter(&hnd))
630 /****************************************************************************
632 ****************************************************************************/
633 BOOL msrpc_spoolss_getprinterdriver( const char* printer_name,
634 const char *environment, const uint32 level,
635 const char* station, const char* user_name,
636 PRINTER_DRIVER_CTR ctr)
642 TALLOC_CTX *mem_ctx = NULL;
644 DEBUG(4,("msrpc_spoolss_enum_getprinterdriver - printer: %s\n", printer_name));
646 if(!spoolss_open_printer_ex( printer_name, "", PRINTER_ALL_ACCESS, station, user_name, &hnd))
649 if ((mem_ctx=talloc_init()) == NULL)
651 DEBUG(0,("msrpc_spoolss_getprinterdriver: talloc_init failed!\n"));
654 init_buffer(&buffer, 0, mem_ctx);
656 status = spoolss_getprinterdriver(&hnd, environment, level, &buffer, 0, &needed);
658 if (status==ERROR_INSUFFICIENT_BUFFER) {
659 init_buffer(&buffer, needed, mem_ctx);
660 status = spoolss_getprinterdriver(&hnd, environment, level, &buffer, needed, &needed);
663 /* report(out_hnd, "\tstatus:[%d (%x)]\n", status, status); */
665 if (status!=NT_STATUS_OK)
668 talloc_destroy(mem_ctx);
674 decode_printer_driver_1(&buffer, 1, &(ctr.info1));
677 decode_printer_driver_2(&buffer, 1, &(ctr.info2));
680 decode_printer_driver_3(&buffer, 1, &(ctr.info3));
684 display_printer_driver_ctr(out_hnd, ACTION_HEADER , level, 1, ctr);
685 display_printer_driver_ctr(out_hnd, ACTION_ENUMERATE, level, 1, ctr);
686 display_printer_driver_ctr(out_hnd, ACTION_FOOTER , level, 1, ctr);
689 talloc_destroy(mem_ctx);
691 if (status!=NT_STATUS_OK) {
692 if (!spoolss_closeprinter(&hnd))
700 /****************************************************************************
702 ****************************************************************************/
703 BOOL msrpc_spoolss_enumprinterdrivers( const char* srv_name,
704 const char *environment, const uint32 level,
705 PRINTER_DRIVER_CTR ctr)
711 TALLOC_CTX *mem_ctx = NULL;
713 DEBUG(4,("msrpc_spoolss_enum_enumprinterdrivers - server: %s\n", srv_name));
715 if ((mem_ctx=talloc_init()) == NULL)
717 DEBUG(0,("msrpc_spoolss_enumprinterdrivers: talloc_init failed!\n"));
720 init_buffer(&buffer, 0, mem_ctx);
722 status = spoolss_enum_printerdrivers(srv_name, environment,
723 level, &buffer, 0, &needed, &returned);
725 if (status == ERROR_INSUFFICIENT_BUFFER)
727 init_buffer(&buffer, needed, mem_ctx);
728 status = spoolss_enum_printerdrivers( srv_name, environment,
729 level, &buffer, needed, &needed, &returned);
732 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
734 if (status!=NT_STATUS_OK)
737 talloc_destroy(mem_ctx);
744 decode_printer_driver_1(&buffer, returned, &(ctr.info1));
747 decode_printer_driver_2(&buffer, returned, &(ctr.info2));
750 decode_printer_driver_3(&buffer, returned, &(ctr.info3));
754 display_printer_driver_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
755 display_printer_driver_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
756 display_printer_driver_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
759 talloc_destroy(mem_ctx);
764 /****************************************************************************
766 ****************************************************************************/
767 BOOL msrpc_spoolss_getprinterdriverdir(char* srv_name, char* env_name, uint32 level, DRIVER_DIRECTORY_CTR ctr)
772 TALLOC_CTX *mem_ctx = NULL;
774 if ((mem_ctx=talloc_init()) == NULL)
776 DEBUG(0,("msrpc_spoolss_getprinterdriverdir: talloc_init failed!\n"));
779 init_buffer(&buffer, 0, mem_ctx);
781 /* send a NULL buffer first */
782 status=spoolss_getprinterdriverdir(srv_name, env_name, level, &buffer, 0, &needed);
784 if (status==ERROR_INSUFFICIENT_BUFFER) {
785 init_buffer(&buffer, needed, mem_ctx);
786 status=spoolss_getprinterdriverdir(srv_name, env_name, level, &buffer, needed, &needed);
789 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
791 if (status!=NT_STATUS_OK)
794 talloc_destroy(mem_ctx);
800 decode_printerdriverdir_info_1(&buffer, &(ctr.driver.info_1));
804 display_printerdriverdir_info_ctr(out_hnd, ACTION_HEADER , level, ctr);
805 display_printerdriverdir_info_ctr(out_hnd, ACTION_ENUMERATE, level, ctr);
806 display_printerdriverdir_info_ctr(out_hnd, ACTION_FOOTER , level, ctr);
809 talloc_destroy(mem_ctx);