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.h"
28 /**********************************************************************
29 convencience wrapper around rpccli_spoolss_OpenPrinterEx
30 **********************************************************************/
32 WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client *cli,
34 const char *printername,
35 uint32_t access_desired,
36 struct policy_handle *handle)
40 struct spoolss_DevmodeContainer devmode_ctr;
41 union spoolss_UserLevel userlevel;
42 struct spoolss_UserLevel1 level1;
44 ZERO_STRUCT(devmode_ctr);
47 level1.client = talloc_asprintf(mem_ctx, "\\\\%s", global_myname());
48 W_ERROR_HAVE_NO_MEMORY(level1.client);
49 level1.user = cli->auth->user_name;
55 userlevel.level1 = &level1;
57 status = rpccli_spoolss_OpenPrinterEx(cli, mem_ctx,
67 if (!W_ERROR_IS_OK(werror)) {
71 if (!NT_STATUS_IS_OK(status)) {
72 return ntstatus_to_werror(status);
78 /**********************************************************************
79 convencience wrapper around rpccli_spoolss_GetPrinterDriver2
80 **********************************************************************/
82 WERROR rpccli_spoolss_getprinterdriver2(struct rpc_pipe_client *cli,
84 struct policy_handle *handle,
85 const char *architecture,
88 uint32_t client_major_version,
89 uint32_t client_minor_version,
90 union spoolss_DriverInfo *info,
91 uint32_t *server_major_version,
92 uint32_t *server_minor_version)
100 buffer = data_blob_talloc_zero(mem_ctx, offered);
101 W_ERROR_HAVE_NO_MEMORY(buffer.data);
104 status = rpccli_spoolss_GetPrinterDriver2(cli, mem_ctx,
108 (offered > 0) ? &buffer : NULL,
110 client_major_version,
111 client_minor_version,
114 server_major_version,
115 server_minor_version,
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 = rpccli_spoolss_GetPrinterDriver2(cli, mem_ctx,
128 client_major_version,
129 client_minor_version,
132 server_major_version,
133 server_minor_version,
140 /**********************************************************************
141 convencience wrapper around rpccli_spoolss_AddPrinterEx
142 **********************************************************************/
144 WERROR rpccli_spoolss_addprinterex(struct rpc_pipe_client *cli,
146 struct spoolss_SetPrinterInfoCtr *info_ctr)
150 struct spoolss_DevmodeContainer devmode_ctr;
151 struct sec_desc_buf secdesc_ctr;
152 struct spoolss_UserLevelCtr userlevel_ctr;
153 struct spoolss_UserLevel1 level1;
154 struct policy_handle handle;
156 ZERO_STRUCT(devmode_ctr);
157 ZERO_STRUCT(secdesc_ctr);
163 level1.processor = 0;
164 level1.client = talloc_asprintf(mem_ctx, "\\\\%s", global_myname());
165 W_ERROR_HAVE_NO_MEMORY(level1.client);
166 level1.user = cli->auth->user_name;
168 userlevel_ctr.level = 1;
169 userlevel_ctr.user_info.level1 = &level1;
171 status = rpccli_spoolss_AddPrinterEx(cli, mem_ctx,
182 /*********************************************************************
183 Decode various spoolss rpc's and info levels
184 ********************************************************************/
186 /**********************************************************************
187 **********************************************************************/
189 static bool decode_printer_info_0(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
190 uint32 returned, PRINTER_INFO_0 **info)
196 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_0, returned);
200 memset(inf, 0, returned*sizeof(PRINTER_INFO_0));
205 prs_set_offset(&buffer->prs,0);
207 for (i=0; i<returned; i++) {
208 if (!smb_io_printer_info_0("", buffer, &inf[i], 0)) {
217 /**********************************************************************
218 **********************************************************************/
220 static bool decode_printer_info_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
221 uint32 returned, PRINTER_INFO_1 **info)
227 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_1, returned);
231 memset(inf, 0, returned*sizeof(PRINTER_INFO_1));
236 prs_set_offset(&buffer->prs,0);
238 for (i=0; i<returned; i++) {
239 if (!smb_io_printer_info_1("", buffer, &inf[i], 0)) {
248 /**********************************************************************
249 **********************************************************************/
251 static bool decode_printer_info_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
252 uint32 returned, PRINTER_INFO_2 **info)
258 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_2, returned);
262 memset(inf, 0, returned*sizeof(PRINTER_INFO_2));
267 prs_set_offset(&buffer->prs,0);
269 for (i=0; i<returned; i++) {
270 /* a little initialization as we go */
271 inf[i].secdesc = NULL;
272 if (!smb_io_printer_info_2("", buffer, &inf[i], 0)) {
281 /**********************************************************************
282 **********************************************************************/
284 static bool decode_printer_info_3(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
285 uint32 returned, PRINTER_INFO_3 **info)
291 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_3, returned);
295 memset(inf, 0, returned*sizeof(PRINTER_INFO_3));
300 prs_set_offset(&buffer->prs,0);
302 for (i=0; i<returned; i++) {
303 inf[i].secdesc = NULL;
304 if (!smb_io_printer_info_3("", buffer, &inf[i], 0)) {
313 /**********************************************************************
314 **********************************************************************/
316 static bool decode_printer_info_7(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
317 uint32 returned, PRINTER_INFO_7 **info)
323 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_7, returned);
327 memset(inf, 0, returned*sizeof(PRINTER_INFO_7));
332 prs_set_offset(&buffer->prs,0);
334 for (i=0; i<returned; i++) {
335 if (!smb_io_printer_info_7("", buffer, &inf[i], 0)) {
345 /**********************************************************************
346 **********************************************************************/
348 static bool decode_port_info_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
349 uint32 returned, PORT_INFO_1 **info)
355 inf=TALLOC_ARRAY(mem_ctx, PORT_INFO_1, returned);
359 memset(inf, 0, returned*sizeof(PORT_INFO_1));
364 prs_set_offset(&buffer->prs, 0);
366 for (i=0; i<returned; i++) {
367 if (!smb_io_port_info_1("", buffer, &(inf[i]), 0)) {
376 /**********************************************************************
377 **********************************************************************/
379 static bool decode_port_info_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
380 uint32 returned, PORT_INFO_2 **info)
386 inf=TALLOC_ARRAY(mem_ctx, PORT_INFO_2, returned);
390 memset(inf, 0, returned*sizeof(PORT_INFO_2));
395 prs_set_offset(&buffer->prs, 0);
397 for (i=0; i<returned; i++) {
398 if (!smb_io_port_info_2("", buffer, &(inf[i]), 0)) {
407 /**********************************************************************
408 **********************************************************************/
410 static bool decode_printer_driver_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
411 uint32 returned, DRIVER_INFO_1 **info)
417 inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_1, returned);
421 memset(inf, 0, returned*sizeof(DRIVER_INFO_1));
426 prs_set_offset(&buffer->prs,0);
428 for (i=0; i<returned; i++) {
429 if (!smb_io_printer_driver_info_1("", buffer, &(inf[i]), 0)) {
438 /**********************************************************************
439 **********************************************************************/
441 static bool decode_printer_driver_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
442 uint32 returned, DRIVER_INFO_2 **info)
448 inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_2, returned);
452 memset(inf, 0, returned*sizeof(DRIVER_INFO_2));
457 prs_set_offset(&buffer->prs,0);
459 for (i=0; i<returned; i++) {
460 if (!smb_io_printer_driver_info_2("", buffer, &(inf[i]), 0)) {
469 /**********************************************************************
470 **********************************************************************/
472 static bool decode_printer_driver_3(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
473 uint32 returned, DRIVER_INFO_3 **info)
479 inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_3, returned);
483 memset(inf, 0, returned*sizeof(DRIVER_INFO_3));
488 prs_set_offset(&buffer->prs,0);
490 for (i=0; i<returned; i++) {
491 if (!smb_io_printer_driver_info_3("", buffer, &(inf[i]), 0)) {
500 /**********************************************************************
501 **********************************************************************/
503 static bool decode_jobs_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
504 uint32 num_jobs, JOB_INFO_1 **jobs)
509 *jobs = TALLOC_ARRAY(mem_ctx, JOB_INFO_1, num_jobs);
516 prs_set_offset(&buffer->prs,0);
518 for (i = 0; i < num_jobs; i++) {
519 if (!smb_io_job_info_1("", buffer, &((*jobs)[i]), 0)) {
527 /**********************************************************************
528 **********************************************************************/
530 static bool decode_jobs_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
531 uint32 num_jobs, JOB_INFO_2 **jobs)
536 *jobs = TALLOC_ARRAY(mem_ctx, JOB_INFO_2, num_jobs);
543 prs_set_offset(&buffer->prs,0);
545 for (i = 0; i < num_jobs; i++) {
546 if (!smb_io_job_info_2("", buffer, &((*jobs)[i]), 0)) {
554 /**********************************************************************
555 **********************************************************************/
557 static bool decode_forms_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
558 uint32 num_forms, FORM_1 **forms)
563 *forms = TALLOC_ARRAY(mem_ctx, FORM_1, num_forms);
564 if (*forms == NULL) {
571 prs_set_offset(&buffer->prs,0);
573 for (i = 0; i < num_forms; i++) {
574 if (!smb_io_form_1("", buffer, &((*forms)[i]), 0)) {
582 /**********************************************************************
583 **********************************************************************/
585 WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
586 char *name, uint32 flags, uint32 level,
587 uint32 *num_printers, PRINTER_INFO_CTR *ctr)
589 prs_struct qbuf, rbuf;
590 SPOOL_Q_ENUMPRINTERS in;
591 SPOOL_R_ENUMPRINTERS out;
599 if (!rpcbuf_init(&buffer, offered, mem_ctx))
601 make_spoolss_q_enumprinters( &in, flags, name, level, &buffer, offered );
603 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERS,
606 spoolss_io_q_enumprinters,
607 spoolss_io_r_enumprinters,
608 WERR_GENERAL_FAILURE );
610 if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
611 offered = out.needed;
616 if (!rpcbuf_init(&buffer, offered, mem_ctx))
618 make_spoolss_q_enumprinters( &in, flags, name, level, &buffer, offered );
620 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERS,
623 spoolss_io_q_enumprinters,
624 spoolss_io_r_enumprinters,
625 WERR_GENERAL_FAILURE );
628 if ( !W_ERROR_IS_OK(out.status) )
633 if (!decode_printer_info_0(mem_ctx, out.buffer, out.returned, &ctr->printers_0)) {
634 return WERR_GENERAL_FAILURE;
638 if (!decode_printer_info_1(mem_ctx, out.buffer, out.returned, &ctr->printers_1)) {
639 return WERR_GENERAL_FAILURE;
643 if (!decode_printer_info_2(mem_ctx, out.buffer, out.returned, &ctr->printers_2)) {
644 return WERR_GENERAL_FAILURE;
648 if (!decode_printer_info_3(mem_ctx, out.buffer, out.returned, &ctr->printers_3)) {
649 return WERR_GENERAL_FAILURE;
653 return WERR_UNKNOWN_LEVEL;
656 *num_printers = out.returned;
661 /**********************************************************************
662 **********************************************************************/
664 WERROR rpccli_spoolss_enum_ports(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
665 uint32 level, uint32 *num_ports, PORT_INFO_CTR *ctr)
667 prs_struct qbuf, rbuf;
668 SPOOL_Q_ENUMPORTS in;
669 SPOOL_R_ENUMPORTS out;
677 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->desthost);
681 if (!rpcbuf_init(&buffer, offered, mem_ctx))
683 make_spoolss_q_enumports( &in, server, level, &buffer, offered );
685 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPORTS,
688 spoolss_io_q_enumports,
689 spoolss_io_r_enumports,
690 WERR_GENERAL_FAILURE );
692 if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
693 offered = out.needed;
698 if (!rpcbuf_init(&buffer, offered, mem_ctx))
700 make_spoolss_q_enumports( &in, server, level, &buffer, offered );
702 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPORTS,
705 spoolss_io_q_enumports,
706 spoolss_io_r_enumports,
707 WERR_GENERAL_FAILURE );
710 if ( !W_ERROR_IS_OK(out.status) )
715 if (!decode_port_info_1(mem_ctx, out.buffer, out.returned, &ctr->port.info_1)) {
716 return WERR_GENERAL_FAILURE;
720 if (!decode_port_info_2(mem_ctx, out.buffer, out.returned, &ctr->port.info_2)) {
721 return WERR_GENERAL_FAILURE;
725 return WERR_UNKNOWN_LEVEL;
728 *num_ports = out.returned;
733 /**********************************************************************
734 **********************************************************************/
736 WERROR rpccli_spoolss_getprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
737 POLICY_HND *pol, uint32 level,
738 PRINTER_INFO_CTR *ctr)
740 prs_struct qbuf, rbuf;
741 SPOOL_Q_GETPRINTER in;
742 SPOOL_R_GETPRINTER out;
749 /* Initialise input parameters */
752 if (!rpcbuf_init(&buffer, offered, mem_ctx))
754 make_spoolss_q_getprinter( mem_ctx, &in, pol, level, &buffer, offered );
756 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_GETPRINTER,
759 spoolss_io_q_getprinter,
760 spoolss_io_r_getprinter,
761 WERR_GENERAL_FAILURE );
763 if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
764 offered = out.needed;
769 if (!rpcbuf_init(&buffer, offered, mem_ctx))
771 make_spoolss_q_getprinter( mem_ctx, &in, pol, level, &buffer, offered );
773 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_GETPRINTER,
776 spoolss_io_q_getprinter,
777 spoolss_io_r_getprinter,
778 WERR_GENERAL_FAILURE );
781 if ( !W_ERROR_IS_OK(out.status) )
786 if (!decode_printer_info_0(mem_ctx, out.buffer, 1, &ctr->printers_0)) {
787 return WERR_GENERAL_FAILURE;
791 if (!decode_printer_info_1(mem_ctx, out.buffer, 1, &ctr->printers_1)) {
792 return WERR_GENERAL_FAILURE;
796 if (!decode_printer_info_2(mem_ctx, out.buffer, 1, &ctr->printers_2)) {
797 return WERR_GENERAL_FAILURE;
801 if (!decode_printer_info_3(mem_ctx, out.buffer, 1, &ctr->printers_3)) {
802 return WERR_GENERAL_FAILURE;
806 if (!decode_printer_info_7(mem_ctx, out.buffer, 1, &ctr->printers_7)) {
807 return WERR_GENERAL_FAILURE;
811 return WERR_UNKNOWN_LEVEL;
817 /**********************************************************************
818 **********************************************************************/
820 WERROR rpccli_spoolss_setprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
821 POLICY_HND *pol, uint32 level,
822 PRINTER_INFO_CTR *ctr, uint32 command)
824 prs_struct qbuf, rbuf;
825 SPOOL_Q_SETPRINTER in;
826 SPOOL_R_SETPRINTER out;
831 make_spoolss_q_setprinter( mem_ctx, &in, pol, level, ctr, command );
833 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_SETPRINTER,
836 spoolss_io_q_setprinter,
837 spoolss_io_r_setprinter,
838 WERR_GENERAL_FAILURE );
843 /**********************************************************************
844 **********************************************************************/
846 WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli,
848 uint32 level, const char *env,
850 PRINTER_DRIVER_CTR *ctr)
852 prs_struct qbuf, rbuf;
853 SPOOL_Q_ENUMPRINTERDRIVERS in;
854 SPOOL_R_ENUMPRINTERDRIVERS out;
862 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->desthost);
866 if (!rpcbuf_init(&buffer, offered, mem_ctx))
868 make_spoolss_q_enumprinterdrivers( &in, server, env, level,
871 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERDRIVERS,
874 spoolss_io_q_enumprinterdrivers,
875 spoolss_io_r_enumprinterdrivers,
876 WERR_GENERAL_FAILURE );
878 if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
879 offered = out.needed;
884 if (!rpcbuf_init(&buffer, offered, mem_ctx))
886 make_spoolss_q_enumprinterdrivers( &in, server, env, level,
889 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERDRIVERS,
892 spoolss_io_q_enumprinterdrivers,
893 spoolss_io_r_enumprinterdrivers,
894 WERR_GENERAL_FAILURE );
897 *num_drivers = out.returned;
899 if ( !W_ERROR_IS_OK(out.status) )
902 if ( out.returned ) {
906 if (!decode_printer_driver_1(mem_ctx, out.buffer, out.returned, &ctr->info1)) {
907 return WERR_GENERAL_FAILURE;
911 if (!decode_printer_driver_2(mem_ctx, out.buffer, out.returned, &ctr->info2)) {
912 return WERR_GENERAL_FAILURE;
916 if (!decode_printer_driver_3(mem_ctx, out.buffer, out.returned, &ctr->info3)) {
917 return WERR_GENERAL_FAILURE;
921 return WERR_UNKNOWN_LEVEL;
928 /**********************************************************************
929 **********************************************************************/
931 WERROR rpccli_spoolss_addprinterex (struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
932 uint32 level, PRINTER_INFO_CTR*ctr)
934 prs_struct qbuf, rbuf;
935 SPOOL_Q_ADDPRINTEREX in;
936 SPOOL_R_ADDPRINTEREX out;
937 fstring server, client, user;
942 slprintf(client, sizeof(fstring)-1, "\\\\%s", global_myname());
943 slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->desthost);
948 fstrcpy (user, cli->auth->user_name);
950 make_spoolss_q_addprinterex( mem_ctx, &in, server, client,
953 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ADDPRINTEREX,
956 spoolss_io_q_addprinterex,
957 spoolss_io_r_addprinterex,
958 WERR_GENERAL_FAILURE );
963 /**********************************************************************
964 **********************************************************************/
966 WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
967 POLICY_HND *handle, int level, uint32 *num_forms,
970 prs_struct qbuf, rbuf;
971 SPOOL_Q_ENUMFORMS in;
972 SPOOL_R_ENUMFORMS out;
980 if (!rpcbuf_init(&buffer, offered, mem_ctx))
982 make_spoolss_q_enumforms( &in, handle, level, &buffer, offered );
984 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMFORMS,
987 spoolss_io_q_enumforms,
988 spoolss_io_r_enumforms,
989 WERR_GENERAL_FAILURE );
991 if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
992 offered = out.needed;
997 if (!rpcbuf_init(&buffer, offered, mem_ctx))
999 make_spoolss_q_enumforms( &in, handle, level, &buffer, offered );
1001 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMFORMS,
1004 spoolss_io_q_enumforms,
1005 spoolss_io_r_enumforms,
1006 WERR_GENERAL_FAILURE );
1009 if (!W_ERROR_IS_OK(out.status))
1012 *num_forms = out.numofforms;
1014 if (!decode_forms_1(mem_ctx, out.buffer, *num_forms, forms)) {
1015 return WERR_GENERAL_FAILURE;
1021 /**********************************************************************
1022 **********************************************************************/
1024 WERROR rpccli_spoolss_enumjobs(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
1025 POLICY_HND *hnd, uint32 level, uint32 firstjob,
1026 uint32 num_jobs, uint32 *returned, JOB_INFO_CTR *ctr)
1028 prs_struct qbuf, rbuf;
1029 SPOOL_Q_ENUMJOBS in;
1030 SPOOL_R_ENUMJOBS out;
1038 if (!rpcbuf_init(&buffer, offered, mem_ctx))
1040 make_spoolss_q_enumjobs( &in, hnd, firstjob, num_jobs, level,
1043 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMJOBS,
1046 spoolss_io_q_enumjobs,
1047 spoolss_io_r_enumjobs,
1048 WERR_GENERAL_FAILURE );
1050 if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
1051 offered = out.needed;
1056 if (!rpcbuf_init(&buffer, offered, mem_ctx))
1058 make_spoolss_q_enumjobs( &in, hnd, firstjob, num_jobs, level,
1061 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMJOBS,
1064 spoolss_io_q_enumjobs,
1065 spoolss_io_r_enumjobs,
1066 WERR_GENERAL_FAILURE );
1069 if (!W_ERROR_IS_OK(out.status))
1074 if (!decode_jobs_1(mem_ctx, out.buffer, out.returned, &ctr->job.job_info_1)) {
1075 return WERR_GENERAL_FAILURE;
1079 if (!decode_jobs_2(mem_ctx, out.buffer, out.returned, &ctr->job.job_info_2)) {
1080 return WERR_GENERAL_FAILURE;
1084 DEBUG(3, ("unsupported info level %d", level));
1085 return WERR_UNKNOWN_LEVEL;
1088 *returned = out.returned;
1093 /**********************************************************************
1094 **********************************************************************/
1096 WERROR rpccli_spoolss_getjob(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
1097 POLICY_HND *hnd, uint32 jobid, uint32 level,
1100 prs_struct qbuf, rbuf;
1110 if (!rpcbuf_init(&buffer, offered, mem_ctx))
1112 make_spoolss_q_getjob( &in, hnd, jobid, level, &buffer, offered );
1114 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_GETJOB,
1117 spoolss_io_q_getjob,
1118 spoolss_io_r_getjob,
1119 WERR_GENERAL_FAILURE );
1121 if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
1122 offered = out.needed;
1127 if (!rpcbuf_init(&buffer, offered, mem_ctx))
1129 make_spoolss_q_getjob( &in, hnd, jobid, level, &buffer, offered );
1131 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_GETJOB,
1134 spoolss_io_q_getjob,
1135 spoolss_io_r_getjob,
1136 WERR_GENERAL_FAILURE );
1139 if (!W_ERROR_IS_OK(out.status))
1144 if (!decode_jobs_1(mem_ctx, out.buffer, 1, &ctr->job.job_info_1)) {
1145 return WERR_GENERAL_FAILURE;
1149 if (!decode_jobs_2(mem_ctx, out.buffer, 1, &ctr->job.job_info_2)) {
1150 return WERR_GENERAL_FAILURE;
1154 return WERR_UNKNOWN_LEVEL;
1160 /**********************************************************************
1161 **********************************************************************/
1163 WERROR rpccli_spoolss_getprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
1164 POLICY_HND *hnd, const char *valuename,
1165 REGISTRY_VALUE *value)
1167 prs_struct qbuf, rbuf;
1168 SPOOL_Q_GETPRINTERDATA in;
1169 SPOOL_R_GETPRINTERDATA out;
1176 make_spoolss_q_getprinterdata( &in, hnd, valuename, offered );
1178 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_GETPRINTERDATA,
1181 spoolss_io_q_getprinterdata,
1182 spoolss_io_r_getprinterdata,
1183 WERR_GENERAL_FAILURE );
1185 if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
1186 offered = out.needed;
1191 make_spoolss_q_getprinterdata( &in, hnd, valuename, offered );
1193 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_GETPRINTERDATA,
1196 spoolss_io_q_getprinterdata,
1197 spoolss_io_r_getprinterdata,
1198 WERR_GENERAL_FAILURE );
1201 if (!W_ERROR_IS_OK(out.status))
1204 /* Return output parameters */
1207 value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data, out.needed);
1209 value->data_p = NULL;
1211 value->type = out.type;
1212 value->size = out.size;
1217 /**********************************************************************
1218 **********************************************************************/
1220 WERROR rpccli_spoolss_setprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
1221 POLICY_HND *hnd, REGISTRY_VALUE *value)
1223 prs_struct qbuf, rbuf;
1224 SPOOL_Q_SETPRINTERDATA in;
1225 SPOOL_R_SETPRINTERDATA out;
1230 make_spoolss_q_setprinterdata( &in, hnd, value->valuename,
1231 value->type, (char *)value->data_p, value->size);
1233 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_SETPRINTERDATA,
1236 spoolss_io_q_setprinterdata,
1237 spoolss_io_r_setprinterdata,
1238 WERR_GENERAL_FAILURE );
1243 /**********************************************************************
1244 **********************************************************************/
1246 WERROR rpccli_spoolss_enumprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
1247 POLICY_HND *hnd, uint32 ndx,
1248 uint32 value_offered, uint32 data_offered,
1249 uint32 *value_needed, uint32 *data_needed,
1250 REGISTRY_VALUE *value)
1252 prs_struct qbuf, rbuf;
1253 SPOOL_Q_ENUMPRINTERDATA in;
1254 SPOOL_R_ENUMPRINTERDATA out;
1259 make_spoolss_q_enumprinterdata( &in, hnd, ndx, value_offered, data_offered );
1261 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERDATA,
1264 spoolss_io_q_enumprinterdata,
1265 spoolss_io_r_enumprinterdata,
1266 WERR_GENERAL_FAILURE );
1269 *value_needed = out.realvaluesize;
1271 *data_needed = out.realdatasize;
1273 if (!W_ERROR_IS_OK(out.status))
1277 rpcstr_pull(value->valuename, out.value, sizeof(value->valuename), -1,
1279 if (out.realdatasize) {
1280 value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data,
1283 value->data_p = NULL;
1285 value->type = out.type;
1286 value->size = out.realdatasize;
1292 /**********************************************************************
1293 **********************************************************************/
1295 WERROR rpccli_spoolss_enumprinterdataex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
1296 POLICY_HND *hnd, const char *keyname,
1299 prs_struct qbuf, rbuf;
1300 SPOOL_Q_ENUMPRINTERDATAEX in;
1301 SPOOL_R_ENUMPRINTERDATAEX out;
1309 make_spoolss_q_enumprinterdataex( &in, hnd, keyname, offered );
1311 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERDATAEX,
1314 spoolss_io_q_enumprinterdataex,
1315 spoolss_io_r_enumprinterdataex,
1316 WERR_GENERAL_FAILURE );
1318 if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
1319 offered = out.needed;
1324 make_spoolss_q_enumprinterdataex( &in, hnd, keyname, offered );
1326 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERDATAEX,
1329 spoolss_io_q_enumprinterdataex,
1330 spoolss_io_r_enumprinterdataex,
1331 WERR_GENERAL_FAILURE );
1334 if (!W_ERROR_IS_OK(out.status))
1337 for (i = 0; i < out.returned; i++) {
1338 PRINTER_ENUM_VALUES *v = &out.ctr.values[i];
1341 rpcstr_pull(name, v->valuename.buffer, sizeof(name), -1,
1343 regval_ctr_addvalue(ctr, name, v->type, (const char *)v->data, v->data_len);
1349 /**********************************************************************
1350 **********************************************************************/
1352 WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
1353 POLICY_HND *hnd, const char *keyname,
1354 uint16 **keylist, uint32 *len)
1356 prs_struct qbuf, rbuf;
1357 SPOOL_Q_ENUMPRINTERKEY in;
1358 SPOOL_R_ENUMPRINTERKEY out;
1364 make_spoolss_q_enumprinterkey( &in, hnd, keyname, offered );
1366 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERKEY,
1369 spoolss_io_q_enumprinterkey,
1370 spoolss_io_r_enumprinterkey,
1371 WERR_GENERAL_FAILURE );
1373 if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
1374 offered = out.needed;
1379 make_spoolss_q_enumprinterkey( &in, hnd, keyname, offered );
1381 CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_ENUMPRINTERKEY,
1384 spoolss_io_q_enumprinterkey,
1385 spoolss_io_r_enumprinterkey,
1386 WERR_GENERAL_FAILURE );
1389 if ( !W_ERROR_IS_OK(out.status) )
1393 *keylist = SMB_MALLOC_ARRAY(uint16, out.keys.buf_len);
1397 memcpy(*keylist, out.keys.buffer, out.keys.buf_len * 2);
1399 *len = out.keys.buf_len * 2;