2 Unix SMB/CIFS implementation.
5 Copyright (C) Gerald Carter 2001-2005,
6 Copyright (C) Tim Potter 2000-2002,
7 Copyright (C) Andrew Tridgell 1994-2000,
8 Copyright (C) Jean-Francois Micouleau 1999-2000.
9 Copyright (C) Jeremy Allison 2005.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include "rpc_client/rpc_client.h"
27 #include "../librpc/gen_ndr/ndr_spoolss_c.h"
28 #include "rpc_client/cli_spoolss.h"
31 /**********************************************************************
32 convencience wrapper around rpccli_spoolss_OpenPrinterEx
33 **********************************************************************/
35 WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client *cli,
37 const char *printername,
38 uint32_t access_desired,
39 struct policy_handle *handle)
43 struct spoolss_DevmodeContainer devmode_ctr;
44 union spoolss_UserLevel userlevel;
45 struct spoolss_UserLevel1 level1;
46 struct dcerpc_binding_handle *b = cli->binding_handle;
48 ZERO_STRUCT(devmode_ctr);
51 level1.client = talloc_asprintf(mem_ctx, "\\\\%s", global_myname());
52 W_ERROR_HAVE_NO_MEMORY(level1.client);
53 level1.user = cli->auth->user_name;
59 userlevel.level1 = &level1;
61 status = dcerpc_spoolss_OpenPrinterEx(b, mem_ctx,
71 if (!NT_STATUS_IS_OK(status)) {
72 return ntstatus_to_werror(status);
75 if (!W_ERROR_IS_OK(werror)) {
82 /**********************************************************************
83 convencience wrapper around rpccli_spoolss_GetPrinterDriver
84 **********************************************************************/
86 WERROR rpccli_spoolss_getprinterdriver(struct rpc_pipe_client *cli,
88 struct policy_handle *handle,
89 const char *architecture,
92 union spoolss_DriverInfo *info)
98 struct dcerpc_binding_handle *b = cli->binding_handle;
101 buffer = data_blob_talloc_zero(mem_ctx, offered);
102 W_ERROR_HAVE_NO_MEMORY(buffer.data);
105 status = dcerpc_spoolss_GetPrinterDriver(b, mem_ctx,
109 (offered > 0) ? &buffer : NULL,
114 if (!NT_STATUS_IS_OK(status)) {
115 return ntstatus_to_werror(status);
117 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
119 buffer = data_blob_talloc_zero(mem_ctx, needed);
120 W_ERROR_HAVE_NO_MEMORY(buffer.data);
122 status = dcerpc_spoolss_GetPrinterDriver(b, mem_ctx,
132 if (!NT_STATUS_IS_OK(status)) {
133 return ntstatus_to_werror(status);
139 /**********************************************************************
140 convencience wrapper around rpccli_spoolss_GetPrinterDriver2
141 **********************************************************************/
143 WERROR rpccli_spoolss_getprinterdriver2(struct rpc_pipe_client *cli,
145 struct policy_handle *handle,
146 const char *architecture,
149 uint32_t client_major_version,
150 uint32_t client_minor_version,
151 union spoolss_DriverInfo *info,
152 uint32_t *server_major_version,
153 uint32_t *server_minor_version)
159 struct dcerpc_binding_handle *b = cli->binding_handle;
162 buffer = data_blob_talloc_zero(mem_ctx, offered);
163 W_ERROR_HAVE_NO_MEMORY(buffer.data);
166 status = dcerpc_spoolss_GetPrinterDriver2(b, mem_ctx,
170 (offered > 0) ? &buffer : NULL,
172 client_major_version,
173 client_minor_version,
176 server_major_version,
177 server_minor_version,
179 if (!NT_STATUS_IS_OK(status)) {
180 return ntstatus_to_werror(status);
183 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
185 buffer = data_blob_talloc_zero(mem_ctx, needed);
186 W_ERROR_HAVE_NO_MEMORY(buffer.data);
188 status = dcerpc_spoolss_GetPrinterDriver2(b, mem_ctx,
194 client_major_version,
195 client_minor_version,
198 server_major_version,
199 server_minor_version,
202 if (!NT_STATUS_IS_OK(status)) {
203 return ntstatus_to_werror(status);
209 /**********************************************************************
210 convencience wrapper around rpccli_spoolss_AddPrinterEx
211 **********************************************************************/
213 WERROR rpccli_spoolss_addprinterex(struct rpc_pipe_client *cli,
215 struct spoolss_SetPrinterInfoCtr *info_ctr)
219 struct spoolss_DevmodeContainer devmode_ctr;
220 struct sec_desc_buf secdesc_ctr;
221 struct spoolss_UserLevelCtr userlevel_ctr;
222 struct spoolss_UserLevel1 level1;
223 struct policy_handle handle;
224 struct dcerpc_binding_handle *b = cli->binding_handle;
226 ZERO_STRUCT(devmode_ctr);
227 ZERO_STRUCT(secdesc_ctr);
233 level1.processor = 0;
234 level1.client = talloc_asprintf(mem_ctx, "\\\\%s", global_myname());
235 W_ERROR_HAVE_NO_MEMORY(level1.client);
236 level1.user = cli->auth->user_name;
238 userlevel_ctr.level = 1;
239 userlevel_ctr.user_info.level1 = &level1;
241 status = dcerpc_spoolss_AddPrinterEx(b, mem_ctx,
249 if (!NT_STATUS_IS_OK(status)) {
250 return ntstatus_to_werror(status);
256 /**********************************************************************
257 convencience wrapper around rpccli_spoolss_GetPrinter
258 **********************************************************************/
260 WERROR rpccli_spoolss_getprinter(struct rpc_pipe_client *cli,
262 struct policy_handle *handle,
265 union spoolss_PrinterInfo *info)
271 struct dcerpc_binding_handle *b = cli->binding_handle;
274 buffer = data_blob_talloc_zero(mem_ctx, offered);
275 W_ERROR_HAVE_NO_MEMORY(buffer.data);
278 status = dcerpc_spoolss_GetPrinter(b, mem_ctx,
281 (offered > 0) ? &buffer : NULL,
286 if (!NT_STATUS_IS_OK(status)) {
287 return ntstatus_to_werror(status);
290 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
293 buffer = data_blob_talloc_zero(mem_ctx, offered);
294 W_ERROR_HAVE_NO_MEMORY(buffer.data);
296 status = dcerpc_spoolss_GetPrinter(b, mem_ctx,
305 if (!NT_STATUS_IS_OK(status)) {
306 return ntstatus_to_werror(status);
312 /**********************************************************************
313 convencience wrapper around rpccli_spoolss_GetJob
314 **********************************************************************/
316 WERROR rpccli_spoolss_getjob(struct rpc_pipe_client *cli,
318 struct policy_handle *handle,
322 union spoolss_JobInfo *info)
328 struct dcerpc_binding_handle *b = cli->binding_handle;
331 buffer = data_blob_talloc_zero(mem_ctx, offered);
332 W_ERROR_HAVE_NO_MEMORY(buffer.data);
335 status = dcerpc_spoolss_GetJob(b, mem_ctx,
339 (offered > 0) ? &buffer : NULL,
344 if (!NT_STATUS_IS_OK(status)) {
345 return ntstatus_to_werror(status);
348 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
350 buffer = data_blob_talloc_zero(mem_ctx, needed);
351 W_ERROR_HAVE_NO_MEMORY(buffer.data);
353 status = dcerpc_spoolss_GetJob(b, mem_ctx,
363 if (!NT_STATUS_IS_OK(status)) {
364 return ntstatus_to_werror(status);
370 /**********************************************************************
371 convencience wrapper around rpccli_spoolss_EnumForms
372 **********************************************************************/
374 WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli,
376 struct policy_handle *handle,
380 union spoolss_FormInfo **info)
386 struct dcerpc_binding_handle *b = cli->binding_handle;
389 buffer = data_blob_talloc_zero(mem_ctx, offered);
390 W_ERROR_HAVE_NO_MEMORY(buffer.data);
393 status = dcerpc_spoolss_EnumForms(b, mem_ctx,
396 (offered > 0) ? &buffer : NULL,
402 if (!NT_STATUS_IS_OK(status)) {
403 return ntstatus_to_werror(status);
406 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
408 buffer = data_blob_talloc_zero(mem_ctx, needed);
409 W_ERROR_HAVE_NO_MEMORY(buffer.data);
411 status = dcerpc_spoolss_EnumForms(b, mem_ctx,
414 (offered > 0) ? &buffer : NULL,
421 if (!NT_STATUS_IS_OK(status)) {
422 return ntstatus_to_werror(status);
428 /**********************************************************************
429 convencience wrapper around rpccli_spoolss_EnumPrintProcessors
430 **********************************************************************/
432 WERROR rpccli_spoolss_enumprintprocessors(struct rpc_pipe_client *cli,
434 const char *servername,
435 const char *environment,
439 union spoolss_PrintProcessorInfo **info)
445 struct dcerpc_binding_handle *b = cli->binding_handle;
448 buffer = data_blob_talloc_zero(mem_ctx, offered);
449 W_ERROR_HAVE_NO_MEMORY(buffer.data);
452 status = dcerpc_spoolss_EnumPrintProcessors(b, mem_ctx,
456 (offered > 0) ? &buffer : NULL,
462 if (!NT_STATUS_IS_OK(status)) {
463 return ntstatus_to_werror(status);
466 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
468 buffer = data_blob_talloc_zero(mem_ctx, needed);
469 W_ERROR_HAVE_NO_MEMORY(buffer.data);
471 status = dcerpc_spoolss_EnumPrintProcessors(b, mem_ctx,
475 (offered > 0) ? &buffer : NULL,
482 if (!NT_STATUS_IS_OK(status)) {
483 return ntstatus_to_werror(status);
489 /**********************************************************************
490 convencience wrapper around rpccli_spoolss_EnumPrintProcDataTypes
491 **********************************************************************/
493 WERROR rpccli_spoolss_enumprintprocessordatatypes(struct rpc_pipe_client *cli,
495 const char *servername,
496 const char *print_processor_name,
500 union spoolss_PrintProcDataTypesInfo **info)
506 struct dcerpc_binding_handle *b = cli->binding_handle;
509 buffer = data_blob_talloc_zero(mem_ctx, offered);
510 W_ERROR_HAVE_NO_MEMORY(buffer.data);
513 status = dcerpc_spoolss_EnumPrintProcDataTypes(b, mem_ctx,
515 print_processor_name,
517 (offered > 0) ? &buffer : NULL,
523 if (!NT_STATUS_IS_OK(status)) {
524 return ntstatus_to_werror(status);
527 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
529 buffer = data_blob_talloc_zero(mem_ctx, needed);
530 W_ERROR_HAVE_NO_MEMORY(buffer.data);
532 status = dcerpc_spoolss_EnumPrintProcDataTypes(b, mem_ctx,
534 print_processor_name,
536 (offered > 0) ? &buffer : NULL,
543 if (!NT_STATUS_IS_OK(status)) {
544 return ntstatus_to_werror(status);
550 /**********************************************************************
551 convencience wrapper around rpccli_spoolss_EnumPorts
552 **********************************************************************/
554 WERROR rpccli_spoolss_enumports(struct rpc_pipe_client *cli,
556 const char *servername,
560 union spoolss_PortInfo **info)
566 struct dcerpc_binding_handle *b = cli->binding_handle;
569 buffer = data_blob_talloc_zero(mem_ctx, offered);
570 W_ERROR_HAVE_NO_MEMORY(buffer.data);
573 status = dcerpc_spoolss_EnumPorts(b, mem_ctx,
576 (offered > 0) ? &buffer : NULL,
582 if (!NT_STATUS_IS_OK(status)) {
583 return ntstatus_to_werror(status);
586 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
588 buffer = data_blob_talloc_zero(mem_ctx, needed);
589 W_ERROR_HAVE_NO_MEMORY(buffer.data);
591 status = dcerpc_spoolss_EnumPorts(b, mem_ctx,
594 (offered > 0) ? &buffer : NULL,
601 if (!NT_STATUS_IS_OK(status)) {
602 return ntstatus_to_werror(status);
608 /**********************************************************************
609 convencience wrapper around rpccli_spoolss_EnumMonitors
610 **********************************************************************/
612 WERROR rpccli_spoolss_enummonitors(struct rpc_pipe_client *cli,
614 const char *servername,
618 union spoolss_MonitorInfo **info)
624 struct dcerpc_binding_handle *b = cli->binding_handle;
627 buffer = data_blob_talloc_zero(mem_ctx, offered);
628 W_ERROR_HAVE_NO_MEMORY(buffer.data);
631 status = dcerpc_spoolss_EnumMonitors(b, mem_ctx,
634 (offered > 0) ? &buffer : NULL,
640 if (!NT_STATUS_IS_OK(status)) {
641 return ntstatus_to_werror(status);
644 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
646 buffer = data_blob_talloc_zero(mem_ctx, needed);
647 W_ERROR_HAVE_NO_MEMORY(buffer.data);
649 status = dcerpc_spoolss_EnumMonitors(b, mem_ctx,
652 (offered > 0) ? &buffer : NULL,
659 if (!NT_STATUS_IS_OK(status)) {
660 return ntstatus_to_werror(status);
666 /**********************************************************************
667 convencience wrapper around rpccli_spoolss_EnumJobs
668 **********************************************************************/
670 WERROR rpccli_spoolss_enumjobs(struct rpc_pipe_client *cli,
672 struct policy_handle *handle,
678 union spoolss_JobInfo **info)
684 struct dcerpc_binding_handle *b = cli->binding_handle;
687 buffer = data_blob_talloc_zero(mem_ctx, offered);
688 W_ERROR_HAVE_NO_MEMORY(buffer.data);
691 status = dcerpc_spoolss_EnumJobs(b, mem_ctx,
696 (offered > 0) ? &buffer : NULL,
702 if (!NT_STATUS_IS_OK(status)) {
703 return ntstatus_to_werror(status);
706 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
708 buffer = data_blob_talloc_zero(mem_ctx, needed);
709 W_ERROR_HAVE_NO_MEMORY(buffer.data);
711 status = dcerpc_spoolss_EnumJobs(b, mem_ctx,
716 (offered > 0) ? &buffer : NULL,
723 if (!NT_STATUS_IS_OK(status)) {
724 return ntstatus_to_werror(status);
730 /**********************************************************************
731 convencience wrapper around rpccli_spoolss_EnumPrinterDrivers
732 **********************************************************************/
734 WERROR rpccli_spoolss_enumprinterdrivers(struct rpc_pipe_client *cli,
737 const char *environment,
741 union spoolss_DriverInfo **info)
747 struct dcerpc_binding_handle *b = cli->binding_handle;
750 buffer = data_blob_talloc_zero(mem_ctx, offered);
751 W_ERROR_HAVE_NO_MEMORY(buffer.data);
754 status = dcerpc_spoolss_EnumPrinterDrivers(b, mem_ctx,
758 (offered > 0) ? &buffer : NULL,
764 if (!NT_STATUS_IS_OK(status)) {
765 return ntstatus_to_werror(status);
768 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
770 buffer = data_blob_talloc_zero(mem_ctx, needed);
771 W_ERROR_HAVE_NO_MEMORY(buffer.data);
773 status = dcerpc_spoolss_EnumPrinterDrivers(b, mem_ctx,
777 (offered > 0) ? &buffer : NULL,
784 if (!NT_STATUS_IS_OK(status)) {
785 return ntstatus_to_werror(status);
791 /**********************************************************************
792 convencience wrapper around rpccli_spoolss_EnumPrinters
793 **********************************************************************/
795 WERROR rpccli_spoolss_enumprinters(struct rpc_pipe_client *cli,
802 union spoolss_PrinterInfo **info)
808 struct dcerpc_binding_handle *b = cli->binding_handle;
811 buffer = data_blob_talloc_zero(mem_ctx, offered);
812 W_ERROR_HAVE_NO_MEMORY(buffer.data);
815 status = dcerpc_spoolss_EnumPrinters(b, mem_ctx,
819 (offered > 0) ? &buffer : NULL,
825 if (!NT_STATUS_IS_OK(status)) {
826 return ntstatus_to_werror(status);
829 if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
831 buffer = data_blob_talloc_zero(mem_ctx, needed);
832 W_ERROR_HAVE_NO_MEMORY(buffer.data);
834 status = dcerpc_spoolss_EnumPrinters(b, mem_ctx,
838 (offered > 0) ? &buffer : NULL,
845 if (!NT_STATUS_IS_OK(status)) {
846 return ntstatus_to_werror(status);
852 /**********************************************************************
853 convencience wrapper around rpccli_spoolss_GetPrinterData
854 **********************************************************************/
856 WERROR rpccli_spoolss_getprinterdata(struct rpc_pipe_client *cli,
858 struct policy_handle *handle,
859 const char *value_name,
861 enum winreg_Type *type,
869 struct dcerpc_binding_handle *b = cli->binding_handle;
871 data = talloc_zero_array(mem_ctx, uint8_t, offered);
872 W_ERROR_HAVE_NO_MEMORY(data);
874 status = dcerpc_spoolss_GetPrinterData(b, mem_ctx,
882 if (!NT_STATUS_IS_OK(status)) {
883 return ntstatus_to_werror(status);
886 if (W_ERROR_EQUAL(werror, WERR_MORE_DATA)) {
888 data = talloc_zero_array(mem_ctx, uint8_t, offered);
889 W_ERROR_HAVE_NO_MEMORY(data);
891 status = dcerpc_spoolss_GetPrinterData(b, mem_ctx,
900 if (!NT_STATUS_IS_OK(status)) {
901 return ntstatus_to_werror(status);
910 /**********************************************************************
911 convencience wrapper around rpccli_spoolss_EnumPrinterKey
912 **********************************************************************/
914 WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli,
916 struct policy_handle *handle,
917 const char *key_name,
918 const char ***key_buffer,
924 union spoolss_KeyNames _key_buffer;
926 struct dcerpc_binding_handle *b = cli->binding_handle;
928 status = dcerpc_spoolss_EnumPrinterKey(b, mem_ctx,
936 if (!NT_STATUS_IS_OK(status)) {
937 return ntstatus_to_werror(status);
940 if (W_ERROR_EQUAL(werror, WERR_MORE_DATA)) {
942 status = dcerpc_spoolss_EnumPrinterKey(b, mem_ctx,
951 if (!NT_STATUS_IS_OK(status)) {
952 return ntstatus_to_werror(status);
955 *key_buffer = _key_buffer.string_array;
960 /**********************************************************************
961 convencience wrapper around rpccli_spoolss_EnumPrinterDataEx
962 **********************************************************************/
964 WERROR rpccli_spoolss_enumprinterdataex(struct rpc_pipe_client *cli,
966 struct policy_handle *handle,
967 const char *key_name,
970 struct spoolss_PrinterEnumValues **info)
975 struct dcerpc_binding_handle *b = cli->binding_handle;
977 status = dcerpc_spoolss_EnumPrinterDataEx(b, mem_ctx,
985 if (!NT_STATUS_IS_OK(status)) {
986 return ntstatus_to_werror(status);
989 if (W_ERROR_EQUAL(werror, WERR_MORE_DATA)) {
992 status = dcerpc_spoolss_EnumPrinterDataEx(b, mem_ctx,
1001 if (!NT_STATUS_IS_OK(status)) {
1002 return ntstatus_to_werror(status);