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 static void init_buffer(NEW_BUFFER *buffer, uint32 size)
43 buffer->ptr = (size!=0)? 1:0;
45 buffer->string_at_end=size;
46 prs_init(&buffer->prs, size, 4, 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);
185 /**********************************************************************
186 Decode a PORT_INFO_2 struct from a NEW_BUFFER
187 **********************************************************************/
188 void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned,
194 inf=(PORT_INFO_2*)malloc(returned*sizeof(PORT_INFO_2));
196 prs_set_offset(&buffer->prs, 0);
198 for (i=0; i<returned; i++) {
199 new_smb_io_port_info_2("", buffer, &(inf[i]), 0);
205 /**********************************************************************
206 Decode a PORT_INFO_1 struct from a NEW_BUFFER
207 **********************************************************************/
208 void decode_port_info_1(NEW_BUFFER *buffer, uint32 returned,
214 inf=(PORT_INFO_1*)malloc(returned*sizeof(PORT_INFO_1));
216 prs_set_offset(&buffer->prs, 0);
218 for (i=0; i<returned; i++) {
219 /* WRITEME!!!! yet to be written --jerry */
220 /* new_smb_io_port_info_1("", buffer, &(inf[i]), 0); */
227 /****************************************************************************
229 ****************************************************************************/
230 BOOL msrpc_spoolss_enum_printers(char* srv_name, uint32 flags,
231 uint32 level, PRINTER_INFO_CTR ctr)
238 init_buffer(&buffer, 0);
240 /* send a NULL buffer first */
241 status=spoolss_enum_printers(flags, srv_name, level, &buffer, 0,
244 if (status==ERROR_INSUFFICIENT_BUFFER) {
245 init_buffer(&buffer, needed);
246 status=spoolss_enum_printers(flags, srv_name, level, &buffer,
247 needed, &needed, &returned);
250 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
252 if (status!=NT_STATUS_NO_PROBLEMO)
255 /* is there anything to process? */
260 decode_printer_info_1(&buffer, returned, &(ctr.printers_1));
263 decode_printer_info_2(&buffer, returned, &(ctr.printers_2));
266 decode_printer_info_3(&buffer, returned, &(ctr.printers_3));
270 display_printer_info_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
271 display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
272 display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
278 /****************************************************************************
280 ****************************************************************************/
281 BOOL msrpc_spoolss_enum_ports(char* srv_name,
282 uint32 level, PORT_INFO_CTR *ctr)
289 init_buffer(&buffer, 0);
291 /* send a NULL buffer first */
292 status=spoolss_enum_ports(srv_name, level, &buffer, 0,
295 if (status==ERROR_INSUFFICIENT_BUFFER) {
296 init_buffer(&buffer, needed);
297 status=spoolss_enum_ports(srv_name, level, &buffer,
298 needed, &needed, &returned);
301 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
303 if (status!=NT_STATUS_NO_PROBLEMO)
306 /* is there anything to process? */
311 decode_port_info_1(&buffer, returned, &ctr->port.info_1);
314 decode_port_info_2(&buffer, returned, &ctr->port.info_2);
317 DEBUG(0,("Unable to decode unknown PORT_INFO_%d\n", level));
321 display_port_info_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
322 display_port_info_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
323 display_port_info_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
329 /****************************************************************************
331 ****************************************************************************/
332 uint32 msrpc_spoolss_getprinterdata( const char* printer_name,
334 const char* user_name,
335 const char* value_name,
345 UNISTR2 uni_val_name;
347 DEBUG(4,("spoolgetdata - printer: %s server: %s user: %s value: %s\n",
348 printer_name, station, user_name, value_name));
350 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name,
353 return NT_STATUS_ACCESS_DENIED;
356 init_unistr2(&uni_val_name, value_name, 0);
358 init_buffer(buffer, size);
360 status = spoolss_getprinterdata(&hnd, &uni_val_name, size, type, &size,
363 if (status == ERROR_INSUFFICIENT_BUFFER)
366 init_buffer(buffer, size);
367 data = prs_data_p(&buffer->prs);
368 status = spoolss_getprinterdata(&hnd, &uni_val_name,
373 if (status != NT_STATUS_NO_PROBLEMO) {
374 if (!spoolss_closeprinter(&hnd))
375 return NT_STATUS_ACCESS_DENIED;
381 fn(printer_name, station, level, returned, *ctr);
387 /****************************************************************************
389 ****************************************************************************/
390 BOOL msrpc_spoolss_enum_jobs( const char* printer_name,
391 const char* station, const char* user_name,
393 void ***ctr, JOB_INFO_FN(fn))
401 uint32 numofjobs=0xffff;
403 DEBUG(4,("spoolopen - printer: %s server: %s user: %s\n",
404 printer_name, station, user_name));
406 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name, &hnd))
409 init_buffer(&buffer, 0);
410 status = spoolss_enum_jobs(&hnd, firstjob, numofjobs, level, &buffer, 0, &needed, &returned);
412 if (status == ERROR_INSUFFICIENT_BUFFER)
414 init_buffer(&buffer, needed);
415 status = spoolss_enum_jobs( &hnd, firstjob, numofjobs, level, &buffer, needed, &needed, &returned);
418 if (status!=NT_STATUS_NO_PROBLEMO) {
419 if (!spoolss_closeprinter(&hnd))
425 fn(printer_name, station, level, returned, *ctr);
431 /****************************************************************************
433 ****************************************************************************/
434 BOOL msrpc_spoolss_enum_printerdata( const char* printer_name,
435 const char* station, const char* user_name )
448 DEBUG(4,("spoolenum_printerdata - printer: %s\n", printer_name));
450 if(!spoolss_open_printer_ex( printer_name, 0, 0, station, user_name, &hnd))
454 something is severly buggy about the use of
455 data, datalen, value, & valuelen */
456 status = spoolss_enum_printerdata(&hnd, 0, &valuelen, value,
457 &rvaluelen, &type, &datalen,
463 value=(uint16 *)malloc(valuelen*sizeof(uint16));
464 data=(uint8 *)malloc(datalen*sizeof(uint8));
466 display_printer_enumdata(out_hnd, ACTION_HEADER, idx, valuelen,
467 value, rvaluelen, type, datalen, data, rdatalen);
471 status = spoolss_enum_printerdata(&hnd, idx, &valuelen,
472 value, &rvaluelen, &type,
473 &datalen, data, &rdatalen);
474 display_printer_enumdata(out_hnd, ACTION_ENUMERATE, idx,
475 valuelen, value, rvaluelen, type,
476 datalen, data, rdatalen);
479 } while (status != 0x0103); /* NO_MORE_ITEMS */
481 display_printer_enumdata(out_hnd, ACTION_FOOTER, idx, valuelen,
482 value, rvaluelen, type, datalen, data, rdatalen);
485 if (status!=NT_STATUS_NO_PROBLEMO) {
487 * the check on this if statement is redundant
488 * since is the status is bad we're going to
489 * return False anyways. The caller will be
490 * unable to determine if there really was a problem
491 * with the spoolss_closeprinter() call --jerry
493 spoolss_closeprinter(&hnd);
500 /****************************************************************************
502 ****************************************************************************/
503 BOOL msrpc_spoolss_getprinter( const char* printer_name, const uint32 level,
504 const char* station, const char* user_name,
505 PRINTER_INFO_CTR ctr)
512 DEBUG(4,("spoolenum_getprinter - printer: %s\n", printer_name));
514 if(!spoolss_open_printer_ex( printer_name, "", PRINTER_ALL_ACCESS, station, user_name, &hnd))
517 init_buffer(&buffer, 0);
519 status = spoolss_getprinter(&hnd, level, &buffer, 0, &needed);
521 if (status==ERROR_INSUFFICIENT_BUFFER) {
522 init_buffer(&buffer, needed);
523 status = spoolss_getprinter(&hnd, level, &buffer, needed, &needed);
526 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
528 if (status!=NT_STATUS_NO_PROBLEMO)
533 decode_printer_info_0(&buffer, 1, &(ctr.printers_0));
536 decode_printer_info_1(&buffer, 1, &(ctr.printers_1));
539 decode_printer_info_2(&buffer, 1, &(ctr.printers_2));
542 decode_printer_info_3(&buffer, 1, &(ctr.printers_3));
546 display_printer_info_ctr(out_hnd, ACTION_HEADER , level, 1, ctr);
547 display_printer_info_ctr(out_hnd, ACTION_ENUMERATE, level, 1, ctr);
548 display_printer_info_ctr(out_hnd, ACTION_FOOTER , level, 1, ctr);
550 if (status!=NT_STATUS_NO_PROBLEMO) {
551 if (!spoolss_closeprinter(&hnd))
559 /****************************************************************************
561 ****************************************************************************/
562 BOOL msrpc_spoolss_getprinterdriver( const char* printer_name,
563 const char *environment, const uint32 level,
564 const char* station, const char* user_name,
565 PRINTER_DRIVER_CTR ctr)
572 DEBUG(4,("spoolenum_getprinterdriver - printer: %s\n", printer_name));
574 if(!spoolss_open_printer_ex( printer_name, "", PRINTER_ALL_ACCESS, station, user_name, &hnd))
577 init_buffer(&buffer, 0);
579 status = spoolss_getprinterdriver(&hnd, environment, level, &buffer, 0, &needed);
581 if (status==ERROR_INSUFFICIENT_BUFFER) {
582 init_buffer(&buffer, needed);
583 status = spoolss_getprinterdriver(&hnd, environment, level, &buffer, needed, &needed);
586 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
588 if (status!=NT_STATUS_NO_PROBLEMO)
593 decode_printer_driver_1(&buffer, 1, &(ctr.info1));
596 decode_printer_driver_2(&buffer, 1, &(ctr.info2));
599 decode_printer_driver_3(&buffer, 1, &(ctr.info3));
603 display_printer_driver_ctr(out_hnd, ACTION_HEADER , level, 1, ctr);
604 display_printer_driver_ctr(out_hnd, ACTION_ENUMERATE, level, 1, ctr);
605 display_printer_driver_ctr(out_hnd, ACTION_FOOTER , level, 1, ctr);
607 if (status!=NT_STATUS_NO_PROBLEMO) {
608 if (!spoolss_closeprinter(&hnd))
616 /****************************************************************************
618 ****************************************************************************/
619 BOOL msrpc_spoolss_enumprinterdrivers( const char* srv_name,
620 const char *environment, const uint32 level,
621 PRINTER_DRIVER_CTR ctr)
628 DEBUG(4,("spoolenum_enumprinterdrivers - server: %s\n", srv_name));
630 init_buffer(&buffer, 0);
632 status = spoolss_enum_printerdrivers(srv_name, environment,
633 level, &buffer, 0, &needed, &returned);
635 if (status == ERROR_INSUFFICIENT_BUFFER)
637 init_buffer(&buffer, needed);
638 status = spoolss_enum_printerdrivers( srv_name, environment,
639 level, &buffer, needed, &needed, &returned);
642 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
644 if (status!=NT_STATUS_NO_PROBLEMO)
651 decode_printer_driver_1(&buffer, returned, &(ctr.info1));
656 decode_printer_driver_2(&buffer, returned, &(ctr.info2));
661 decode_printer_driver_3(&buffer, returned, &(ctr.info3));
666 display_printer_driver_ctr(out_hnd, ACTION_HEADER , level, returned, ctr);
667 display_printer_driver_ctr(out_hnd, ACTION_ENUMERATE, level, returned, ctr);
668 display_printer_driver_ctr(out_hnd, ACTION_FOOTER , level, returned, ctr);
673 /****************************************************************************
675 ****************************************************************************/
676 BOOL msrpc_spoolss_getprinterdriverdir(char* srv_name, char* env_name, uint32 level, DRIVER_DIRECTORY_CTR ctr)
682 init_buffer(&buffer, 0);
685 /* send a NULL buffer first */
686 status=spoolss_getprinterdriverdir(srv_name, env_name, level, &buffer, 0, &needed);
688 if (status==ERROR_INSUFFICIENT_BUFFER) {
690 init_buffer(&buffer, needed);
691 status=spoolss_getprinterdriverdir(srv_name, env_name, level, &buffer, needed, &needed);
696 report(out_hnd, "\tstatus:[%d (%x)]\n", status, status);
698 if (status!=NT_STATUS_NO_PROBLEMO)
703 decode_printerdriverdir_info_1(&buffer, &(ctr.driver.info_1));
707 display_printerdriverdir_info_ctr(out_hnd, ACTION_HEADER , level, ctr);
708 display_printerdriverdir_info_ctr(out_hnd, ACTION_ENUMERATE, level, ctr);
709 display_printerdriverdir_info_ctr(out_hnd, ACTION_FOOTER , level, ctr);