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"
29 #include "auth/gensec/gensec.h"
30 #include "auth/credentials/credentials.h"
31 #include "rpc_client/init_spoolss.h"
33 /**********************************************************************
34 convencience wrapper around rpccli_spoolss_OpenPrinterEx
35 **********************************************************************/
37 WERROR
rpccli_spoolss_openprinter_ex(struct rpc_pipe_client
*cli
,
39 const char *printername
,
40 uint32_t access_desired
,
41 struct policy_handle
*handle
)
45 struct spoolss_DevmodeContainer devmode_ctr
;
46 struct spoolss_UserLevelCtr userlevel_ctr
;
47 struct spoolss_UserLevel1 level1
;
48 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
49 struct cli_credentials
*creds
= gensec_get_credentials(cli
->auth
->auth_ctx
);
51 ZERO_STRUCT(devmode_ctr
);
53 werror
= spoolss_init_spoolss_UserLevel1(mem_ctx
,
54 cli_credentials_get_username(creds
),
56 if (!W_ERROR_IS_OK(werror
)) {
60 userlevel_ctr
.level
= 1;
61 userlevel_ctr
.user_info
.level1
= &level1
;
63 status
= dcerpc_spoolss_OpenPrinterEx(b
, mem_ctx
,
72 if (!NT_STATUS_IS_OK(status
)) {
73 return ntstatus_to_werror(status
);
76 if (!W_ERROR_IS_OK(werror
)) {
83 /**********************************************************************
84 convencience wrapper around rpccli_spoolss_GetPrinterDriver
85 **********************************************************************/
87 WERROR
rpccli_spoolss_getprinterdriver(struct rpc_pipe_client
*cli
,
89 struct policy_handle
*handle
,
90 const char *architecture
,
93 union spoolss_DriverInfo
*info
)
99 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
102 buffer
= data_blob_talloc_zero(mem_ctx
, offered
);
103 W_ERROR_HAVE_NO_MEMORY(buffer
.data
);
106 status
= dcerpc_spoolss_GetPrinterDriver(b
, mem_ctx
,
110 (offered
> 0) ? &buffer
: NULL
,
115 if (!NT_STATUS_IS_OK(status
)) {
116 return ntstatus_to_werror(status
);
118 if (W_ERROR_EQUAL(werror
, WERR_INSUFFICIENT_BUFFER
)) {
120 buffer
= data_blob_talloc_zero(mem_ctx
, needed
);
121 W_ERROR_HAVE_NO_MEMORY(buffer
.data
);
123 status
= dcerpc_spoolss_GetPrinterDriver(b
, mem_ctx
,
133 if (!NT_STATUS_IS_OK(status
)) {
134 return ntstatus_to_werror(status
);
140 /**********************************************************************
141 convencience wrapper around rpccli_spoolss_GetPrinterDriver2
142 **********************************************************************/
144 WERROR
rpccli_spoolss_getprinterdriver2(struct rpc_pipe_client
*cli
,
146 struct policy_handle
*handle
,
147 const char *architecture
,
150 uint32_t client_major_version
,
151 uint32_t client_minor_version
,
152 union spoolss_DriverInfo
*info
,
153 uint32_t *server_major_version
,
154 uint32_t *server_minor_version
)
160 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
163 buffer
= data_blob_talloc_zero(mem_ctx
, offered
);
164 W_ERROR_HAVE_NO_MEMORY(buffer
.data
);
167 status
= dcerpc_spoolss_GetPrinterDriver2(b
, mem_ctx
,
171 (offered
> 0) ? &buffer
: NULL
,
173 client_major_version
,
174 client_minor_version
,
177 server_major_version
,
178 server_minor_version
,
180 if (!NT_STATUS_IS_OK(status
)) {
181 return ntstatus_to_werror(status
);
184 if (W_ERROR_EQUAL(werror
, WERR_INSUFFICIENT_BUFFER
)) {
186 buffer
= data_blob_talloc_zero(mem_ctx
, needed
);
187 W_ERROR_HAVE_NO_MEMORY(buffer
.data
);
189 status
= dcerpc_spoolss_GetPrinterDriver2(b
, mem_ctx
,
195 client_major_version
,
196 client_minor_version
,
199 server_major_version
,
200 server_minor_version
,
203 if (!NT_STATUS_IS_OK(status
)) {
204 return ntstatus_to_werror(status
);
210 /**********************************************************************
211 convencience wrapper around rpccli_spoolss_AddPrinterEx
212 **********************************************************************/
214 WERROR
rpccli_spoolss_addprinterex(struct rpc_pipe_client
*cli
,
216 struct spoolss_SetPrinterInfoCtr
*info_ctr
)
220 struct spoolss_DevmodeContainer devmode_ctr
;
221 struct sec_desc_buf secdesc_ctr
;
222 struct spoolss_UserLevelCtr userlevel_ctr
;
223 struct spoolss_UserLevel1 level1
;
224 struct policy_handle handle
;
225 struct dcerpc_binding_handle
*b
= cli
->binding_handle
;
226 struct cli_credentials
*creds
= gensec_get_credentials(cli
->auth
->auth_ctx
);
228 ZERO_STRUCT(devmode_ctr
);
229 ZERO_STRUCT(secdesc_ctr
);
231 result
= spoolss_init_spoolss_UserLevel1(mem_ctx
,
232 cli_credentials_get_username(creds
),
234 if (!W_ERROR_IS_OK(result
)) {
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_EnumPrintProcessorDataTypes
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_EnumPrintProcessorDataTypes(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_EnumPrintProcessorDataTypes(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
);