2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-2000,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
7 * Copyright (C) Paul Ashton 1997-2000,
8 * Copyright (C) Jean Francois Micouleau 1998-2000,
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include "rpc_parse.h"
29 extern int DEBUGLEVEL
;
31 /****************************************************************************
32 do a SPOOLSS Enum Printer Drivers
33 ****************************************************************************/
34 uint32
spoolss_enum_printerdrivers(const char *srv_name
, const char *environment
,
35 uint32 level
, NEW_BUFFER
*buffer
, uint32 offered
,
36 uint32
*needed
, uint32
*returned
)
40 SPOOL_Q_ENUMPRINTERDRIVERS q_o
;
41 SPOOL_R_ENUMPRINTERDRIVERS r_o
;
42 TALLOC_CTX
*ctx
= prs_get_mem_context(&buffer
->prs
);
44 struct cli_connection
*con
= NULL
;
46 if (!cli_connection_init(srv_name
, PIPE_SPOOLSS
, &con
))
49 prs_init(&buf
, MAX_PDU_FRAG_LEN
, ctx
, MARSHALL
);
50 prs_init(&rbuf
, 0, ctx
, UNMARSHALL
);
52 /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
54 DEBUG(5,("SPOOLSS Enum Printer Drivers (Server: %s Environment: %s level: %d)\n",
55 srv_name
, environment
, level
));
57 make_spoolss_q_enumprinterdrivers(&q_o
, srv_name
, environment
,
58 level
, buffer
, offered
);
60 /* turn parameters into data stream */
61 if (spoolss_io_q_enumprinterdrivers("", &q_o
, &buf
, 0) &&
62 rpc_con_pipe_req(con
, SPOOLSS_ENUMPRINTERDRIVERS
, &buf
, &rbuf
))
67 prs_switch_type(&buffer
->prs
, UNMARSHALL
);
68 prs_set_offset(&buffer
->prs
, 0);
71 if(spoolss_io_r_enumprinterdrivers("", &r_o
, &rbuf
, 0))
73 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
75 DEBUG(3,("SPOOLSS_ENUMPRINTERDRIVERS: %s\n", get_nt_error_msg(r_o
.status
)));
78 *returned
=r_o
.returned
;
85 cli_connection_unlink(con
);
90 /****************************************************************************
91 do a SPOOLSS Enum Printers
92 ****************************************************************************/
93 uint32
spoolss_enum_printers(uint32 flags
, fstring srv_name
, uint32 level
,
94 NEW_BUFFER
*buffer
, uint32 offered
,
95 uint32
*needed
, uint32
*returned
)
99 SPOOL_Q_ENUMPRINTERS q_o
;
100 SPOOL_R_ENUMPRINTERS r_o
;
101 TALLOC_CTX
*ctx
= prs_get_mem_context(&buffer
->prs
);
103 struct cli_connection
*con
= NULL
;
105 if (!cli_connection_init(srv_name
, PIPE_SPOOLSS
, &con
))
108 prs_init(&buf
, MAX_PDU_FRAG_LEN
, ctx
, MARSHALL
);
109 prs_init(&rbuf
, 0, ctx
, UNMARSHALL
);
111 /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
113 DEBUG(5,("SPOOLSS Enum Printers (Server: %s level: %d)\n", srv_name
, level
));
115 make_spoolss_q_enumprinters(&q_o
, flags
, "", level
, buffer
, offered
);
117 /* turn parameters into data stream */
118 if (spoolss_io_q_enumprinters("", &q_o
, &buf
, 0) &&
119 rpc_con_pipe_req(con
, SPOOLSS_ENUMPRINTERS
, &buf
, &rbuf
))
123 prs_switch_type(&buffer
->prs
, UNMARSHALL
);
124 prs_set_offset(&buffer
->prs
, 0);
127 if(new_spoolss_io_r_enumprinters("", &r_o
, &rbuf
, 0))
129 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
131 /* report error code */
132 DEBUG(3,("SPOOLSS_ENUMPRINTERS: %s\n", get_nt_error_msg(r_o
.status
)));
136 *returned
=r_o
.returned
;
144 cli_connection_unlink(con
);
149 /****************************************************************************
150 do a SPOOLSS Enum Ports
151 ****************************************************************************/
152 uint32
spoolss_enum_ports(fstring srv_name
, uint32 level
,
153 NEW_BUFFER
*buffer
, uint32 offered
,
154 uint32
*needed
, uint32
*returned
)
158 SPOOL_Q_ENUMPORTS q_o
;
159 SPOOL_R_ENUMPORTS r_o
;
160 TALLOC_CTX
*ctx
= prs_get_mem_context(&buffer
->prs
);
162 struct cli_connection
*con
= NULL
;
164 if (!cli_connection_init(srv_name
, PIPE_SPOOLSS
, &con
))
167 prs_init(&buf
, MAX_PDU_FRAG_LEN
, ctx
, MARSHALL
);
168 prs_init(&rbuf
, 0, ctx
, UNMARSHALL
);
170 /* create and send a MSRPC command with api SPOOLSS_ENUMPORTS */
172 DEBUG(5,("SPOOLSS Enum Ports (Server: %s level: %d)\n", srv_name
, level
));
174 make_spoolss_q_enumports(&q_o
, "", level
, buffer
, offered
);
176 /* turn parameters into data stream */
177 if (spoolss_io_q_enumports("", &q_o
, &buf
, 0) &&
178 rpc_con_pipe_req(con
, SPOOLSS_ENUMPORTS
, &buf
, &rbuf
))
183 prs_switch_type(&buffer
->prs
, UNMARSHALL
);
184 prs_set_offset(&buffer
->prs
, 0);
187 if(new_spoolss_io_r_enumports("", &r_o
, &rbuf
, 0))
189 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
191 DEBUG(3,("SPOOLSS_ENUMPORTS: %s\n", get_nt_error_msg(r_o
.status
)));
195 *returned
=r_o
.returned
;
202 cli_connection_unlink(con
);
207 /****************************************************************************
208 do a SPOOLSS Enum Jobs
209 ****************************************************************************/
210 uint32
spoolss_enum_jobs(const POLICY_HND
*hnd
, uint32 firstjob
, uint32 numofjobs
,
211 uint32 level
, NEW_BUFFER
*buffer
, uint32 offered
,
212 uint32
*needed
, uint32
*returned
)
216 SPOOL_Q_ENUMJOBS q_o
;
217 SPOOL_R_ENUMJOBS r_o
;
218 TALLOC_CTX
*ctx
= prs_get_mem_context(&buffer
->prs
);
221 return NT_STATUS_INVALID_PARAMETER
;
223 prs_init(&buf
, MAX_PDU_FRAG_LEN
, ctx
, MARSHALL
);
224 prs_init(&rbuf
, 0, ctx
, UNMARSHALL
);
226 /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
228 DEBUG(5,("SPOOLSS Enum Jobs level: %d)\n", level
));
230 make_spoolss_q_enumjobs(&q_o
, hnd
, firstjob
, numofjobs
, level
, buffer
, offered
);
232 /* turn parameters into data stream */
233 if (spoolss_io_q_enumjobs("", &q_o
, &buf
, 0) &&
234 rpc_hnd_pipe_req(hnd
, SPOOLSS_ENUMJOBS
, &buf
, &rbuf
))
241 if(spoolss_io_r_enumjobs("", &r_o
, &rbuf
, 0))
243 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
245 DEBUG(3,("SPOOLSS_ENUMJOBS: %s\n", get_nt_error_msg(r_o
.status
)));
248 *returned
=r_o
.returned
;
258 /***************************************************************************
259 do a SPOOLSS Enum printer datas
260 ****************************************************************************/
261 uint32
spoolss_enum_printerdata(const POLICY_HND
*hnd
, uint32 idx
,
262 uint32
*valuelen
, uint16
*value
, uint32
*rvaluelen
,
263 uint32
*type
, uint32
*datalen
, uint8
*data
,
268 SPOOL_Q_ENUMPRINTERDATA q_o
;
269 SPOOL_R_ENUMPRINTERDATA r_o
;
270 TALLOC_CTX
*mem_ctx
= NULL
;
273 return NT_STATUS_INVALID_PARAMETER
;
275 if ((mem_ctx
=talloc_init()) == NULL
)
277 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
280 prs_init(&buf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
281 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
283 /* create and send a MSRPC command with api SPOOLSS_ENUMPRINTERDATA*/
285 DEBUG(4,("SPOOLSS Enum Printer data\n"));
287 make_spoolss_q_enumprinterdata(&q_o
, hnd
, idx
, *valuelen
, *datalen
);
289 /* turn parameters into data stream */
290 if (spoolss_io_q_enumprinterdata("", &q_o
, &buf
, 0) &&
291 rpc_hnd_pipe_req(hnd
, SPOOLSS_ENUMPRINTERDATA
, &buf
, &rbuf
))
299 if(spoolss_io_r_enumprinterdata("", &r_o
, &rbuf
, 0))
301 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
303 DEBUG(3,("SPOOLSS_ENUMPRINTERDATA: %s\n", get_nt_error_msg(r_o
.status
)));
306 *valuelen
=r_o
.valuesize
;
307 *rvaluelen
=r_o
.realvaluesize
;
309 *datalen
=r_o
.datasize
;
310 *rdatalen
=r_o
.realdatasize
;
318 talloc_destroy(mem_ctx
);
323 /****************************************************************************
324 do a SPOOLSS Enum printer datas
325 ****************************************************************************/
326 uint32
spoolss_getprinter(const POLICY_HND
*hnd
, uint32 level
,
327 NEW_BUFFER
*buffer
, uint32 offered
,
332 SPOOL_Q_GETPRINTER q_o
;
333 SPOOL_R_GETPRINTER r_o
;
334 TALLOC_CTX
*ctx
= prs_get_mem_context(&buffer
->prs
);
337 return NT_STATUS_INVALID_PARAMETER
;
339 prs_init(&buf
, MAX_PDU_FRAG_LEN
, ctx
, MARSHALL
);
340 prs_init(&rbuf
, 0, ctx
, UNMARSHALL
);
342 /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
344 DEBUG(5,("SPOOLSS Enum Printer data)\n"));
346 make_spoolss_q_getprinter(&q_o
, hnd
, level
, buffer
, offered
);
348 /* turn parameters into data stream */
349 if (spoolss_io_q_getprinter("", &q_o
, &buf
, 0) &&
350 rpc_hnd_pipe_req(hnd
, SPOOLSS_GETPRINTER
, &buf
, &rbuf
))
355 prs_switch_type(&buffer
->prs
, UNMARSHALL
);
356 prs_set_offset(&buffer
->prs
, 0);
359 if(!spoolss_io_r_getprinter("", &r_o
, &rbuf
, 0))
361 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
363 DEBUG(3,("SPOOLSS_GETPRINTER: %s\n", get_nt_error_msg(r_o
.status
)));
375 /****************************************************************************
376 do a SPOOLSS Enum printer driver
377 ****************************************************************************/
378 uint32
spoolss_getprinterdriver(const POLICY_HND
*hnd
,
379 const char *environment
, uint32 level
,
380 NEW_BUFFER
*buffer
, uint32 offered
,
385 SPOOL_Q_GETPRINTERDRIVER2 q_o
;
386 SPOOL_R_GETPRINTERDRIVER2 r_o
;
387 TALLOC_CTX
*ctx
= prs_get_mem_context(&buffer
->prs
);
390 return NT_STATUS_INVALID_PARAMETER
;
392 prs_init(&buf
, MAX_PDU_FRAG_LEN
, ctx
, MARSHALL
);
393 prs_init(&rbuf
, 0, ctx
, UNMARSHALL
);
395 /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
397 DEBUG(5,("SPOOLSS Enum Printer driver)\n"));
399 make_spoolss_q_getprinterdriver2(&q_o
, hnd
, environment
, level
, 2, 0, buffer
, offered
);
401 /* turn parameters into data stream */
402 if (spoolss_io_q_getprinterdriver2("", &q_o
, &buf
, 0) &&
403 rpc_hnd_pipe_req(hnd
, SPOOLSS_GETPRINTERDRIVER2
, &buf
, &rbuf
))
408 prs_switch_type(&buffer
->prs
, UNMARSHALL
);
409 prs_set_offset(&buffer
->prs
, 0);
412 if(spoolss_io_r_getprinterdriver2("", &r_o
, &rbuf
, 0))
414 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
416 DEBUG(3,("SPOOLSS_GETPRINTERDRIVER2: %s\n", get_nt_error_msg(r_o
.status
)));
431 /****************************************************************************
432 do a SPOOLSS Open Printer Ex
433 ****************************************************************************/
434 BOOL
spoolss_open_printer_ex( const char *printername
,
435 const char *datatype
, uint32 access_required
,
436 const char *station
, const char *username
,
441 SPOOL_Q_OPEN_PRINTER_EX q_o
;
442 BOOL valid_pol
= False
;
445 struct cli_connection
*con
= NULL
;
446 TALLOC_CTX
*mem_ctx
= NULL
;
448 memset(srv_name
, 0, sizeof(srv_name
));
449 fstrcpy(srv_name
, printername
);
451 s
= strchr_m(&srv_name
[2], '\\');
455 if (!cli_connection_init(srv_name
, PIPE_SPOOLSS
, &con
))
461 if ((mem_ctx
=talloc_init()) == NULL
)
463 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
466 prs_init(&buf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
467 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
469 /* create and send a MSRPC command with api SPOOLSS_OPENPRINTEREX */
471 DEBUG(5,("SPOOLSS Open Printer Ex\n"));
473 make_spoolss_q_open_printer_ex(&q_o
, printername
, datatype
,
474 access_required
, station
, username
);
476 /* turn parameters into data stream */
477 if (spoolss_io_q_open_printer_ex("", &q_o
, &buf
, 0) &&
478 rpc_con_pipe_req(con
, SPOOLSS_OPENPRINTEREX
, &buf
, &rbuf
))
480 SPOOL_R_OPEN_PRINTER_EX r_o
;
483 spoolss_io_r_open_printer_ex("", &r_o
, &rbuf
, 0);
485 if (prs_offset(&rbuf
)!= 0 && r_o
.status
!= 0)
487 /* report error code */
488 DEBUG(3,("SPOOLSS_OPENPRINTEREX: %s\n", get_nt_error_msg(r_o
.status
)));
494 /* ok, at last: we're happy. return the policy handle */
497 /* associate the handle returned with the current
498 state of the clienjt connection */
499 valid_pol
= RpcHndList_set_connection(hnd
, con
);
507 talloc_destroy(mem_ctx
);
512 /****************************************************************************
513 do a SPOOLSS AddPrinterEx()
514 **ALWAYS** uses as PRINTER_INFO level 2 struct
515 ****************************************************************************/
516 BOOL
spoolss_addprinterex(POLICY_HND
*hnd
, const char* srv_name
, PRINTER_INFO_2
*info2
)
520 SPOOL_Q_ADDPRINTEREX q_o
;
521 SPOOL_R_ADDPRINTEREX r_o
;
522 struct cli_connection
*con
= NULL
;
523 TALLOC_CTX
*mem_ctx
= NULL
;
524 fstring the_client_name
;
525 BOOL valid_pol
= True
;
529 if (!cli_connection_init(srv_name
, PIPE_SPOOLSS
, &con
))
530 return NT_STATUS_ACCESS_DENIED
;
533 return NT_STATUS_INVALID_PARAMETER
;
535 if ((mem_ctx
=talloc_init()) == NULL
)
537 DEBUG(0,("spoolss_addprinterex: talloc_init() failed!\n"));
538 return NT_STATUS_ACCESS_DENIED
;
540 prs_init(&buf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
541 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
543 /* create and send a MSRPC command with api SPOOLSS_ENUMPORTS */
544 DEBUG(5,("SPOOLSS Add Printer Ex (Server: %s)\n", srv_name
));
546 fstrcpy(the_client_name
, "\\\\");
547 fstrcat(the_client_name
, con
->pCli_state
->desthost
);
548 strupper(the_client_name
);
551 make_spoolss_q_addprinterex(mem_ctx
, &q_o
, srv_name
, the_client_name
,
552 /* "Administrator", */
553 con
->pCli_state
->user_name
,
556 /* turn parameters into data stream and send the request */
557 if (spoolss_io_q_addprinterex("", &q_o
, &buf
, 0) &&
558 rpc_con_pipe_req(con
, SPOOLSS_ADDPRINTEREX
, &buf
, &rbuf
))
562 if(spoolss_io_r_addprinterex("", &r_o
, &rbuf
, 0))
564 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
566 /* report error code */
567 DEBUG(3,("SPOOLSS_ADDPRINTEREX: %s\n", get_nt_error_msg(r_o
.status
)));
574 /* ok, at last: we're happy. return the policy handle */
575 copy_policy_hnd( hnd
, &r_o
.handle
);
577 /* associate the handle returned with the current
578 state of the clienjt connection */
579 RpcHndList_set_connection(hnd
, con
);
588 talloc_destroy(mem_ctx
);
593 /****************************************************************************
595 ****************************************************************************/
596 BOOL
spoolss_closeprinter(POLICY_HND
*hnd
)
600 SPOOL_Q_CLOSEPRINTER q_c
;
601 BOOL valid_close
= False
;
602 TALLOC_CTX
*mem_ctx
= NULL
;
607 /* create and send a MSRPC command with api SPOOLSS_CLOSEPRINTER */
608 if ((mem_ctx
=talloc_init()) == NULL
)
610 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
613 prs_init(&buf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
614 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
616 DEBUG(4,("SPOOL Close Printer\n"));
618 /* store the parameters */
619 make_spoolss_q_closeprinter(&q_c
, hnd
);
621 /* turn parameters into data stream */
622 if (spoolss_io_q_closeprinter("", &q_c
, &buf
, 0) &&
623 rpc_hnd_pipe_req(hnd
, SPOOLSS_CLOSEPRINTER
, &buf
, &rbuf
))
625 SPOOL_R_CLOSEPRINTER r_c
;
627 spoolss_io_r_closeprinter("", &r_c
, &rbuf
, 0);
629 if (prs_offset(&rbuf
)!=0 && r_c
.status
!= 0)
631 /* report error code */
632 DEBUG(3,("SPOOL_CLOSEPRINTER: %s\n", get_nt_error_msg(r_c
.status
)));
641 talloc_destroy(mem_ctx
);
643 /* disassociate with the cli_connection */
644 RpcHndList_del_connection(hnd
);
649 /****************************************************************************
650 do a SPOOLSS Get printer datas
651 ****************************************************************************/
652 uint32
spoolss_getprinterdata(const POLICY_HND
*hnd
, const UNISTR2
*valuename
,
661 SPOOL_Q_GETPRINTERDATA q_o
;
662 SPOOL_R_GETPRINTERDATA r_o
;
663 TALLOC_CTX
*mem_ctx
= NULL
;
666 return NT_STATUS_INVALID_PARAMETER
;
668 if ((mem_ctx
=talloc_init()) == NULL
)
670 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
673 prs_init(&buf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
674 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
676 /* create and send a MSRPC command with api SPOOLSS_GETPRINTERDATA */
678 DEBUG(5,("SPOOLSS Get Printer data)\n"));
680 make_spoolss_q_getprinterdata(&q_o
, hnd
,(UNISTR2
*)valuename
, in_size
);
682 /* turn parameters into data stream */
683 if (spoolss_io_q_getprinterdata("", &q_o
, &buf
, 0) &&
684 rpc_hnd_pipe_req(hnd
, SPOOLSS_GETPRINTERDATA
, &buf
, &rbuf
))
691 if(spoolss_io_r_getprinterdata("", &r_o
, &rbuf
, 0))
693 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
695 DEBUG(3,("SPOOLSS_GETPRINTERDATA: %s\n", get_nt_error_msg(r_o
.status
)));
710 /****************************************************************************
711 do a SPOOLSS Get Printer Driver Direcotry
712 ****************************************************************************/
713 uint32
spoolss_getprinterdriverdir(fstring srv_name
, fstring env_name
, uint32 level
,
714 NEW_BUFFER
*buffer
, uint32 offered
,
719 SPOOL_Q_GETPRINTERDRIVERDIR q_o
;
720 SPOOL_R_GETPRINTERDRIVERDIR r_o
;
721 TALLOC_CTX
*ctx
= prs_get_mem_context(&buffer
->prs
);
723 struct cli_connection
*con
= NULL
;
725 if (!cli_connection_init(srv_name
, PIPE_SPOOLSS
, &con
))
728 prs_init(&buf
, MAX_PDU_FRAG_LEN
, ctx
, MARSHALL
);
729 prs_init(&rbuf
, 0, ctx
, UNMARSHALL
);
731 /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
733 DEBUG(5,("SPOOLSS GetPrinterDriverDir (Server: %s Env: %s level: %d)\n",
734 srv_name
, env_name
, level
));
736 make_spoolss_q_getprinterdriverdir(&q_o
, srv_name
, env_name
, level
,
739 /* turn parameters into data stream */
740 if (spoolss_io_q_getprinterdriverdir("", &q_o
, &buf
, 0) &&
741 rpc_con_pipe_req(con
, SPOOLSS_GETPRINTERDRIVERDIRECTORY
, &buf
, &rbuf
))
746 prs_switch_type(&buffer
->prs
, UNMARSHALL
);
747 prs_set_offset(&buffer
->prs
, 0);
750 if(spoolss_io_r_getprinterdriverdir("", &r_o
, &rbuf
, 0))
752 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
754 DEBUG(3,("SPOOLSS_GETPRINTERDRIVERDIRECTORY: %s\n", get_nt_error_msg(r_o
.status
)));
764 cli_connection_unlink(con
);
769 /******************************************************************************
771 *****************************************************************************/
772 uint32
spoolss_addprinterdriver(const char *srv_name
, uint32 level
, PRINTER_DRIVER_CTR
*info
)
776 SPOOL_Q_ADDPRINTERDRIVER q_o
;
777 SPOOL_R_ADDPRINTERDRIVER r_o
;
778 TALLOC_CTX
*mem_ctx
= NULL
;
779 struct cli_connection
*con
= NULL
;
781 if (!cli_connection_init(srv_name
, PIPE_SPOOLSS
, &con
))
784 if ((mem_ctx
=talloc_init()) == NULL
)
786 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
789 prs_init(&buf
, MAX_PDU_FRAG_LEN
, mem_ctx
, MARSHALL
);
790 prs_init(&rbuf
, 0, mem_ctx
, UNMARSHALL
);
792 /* make the ADDPRINTERDRIVER PDU */
793 make_spoolss_q_addprinterdriver(mem_ctx
, &q_o
, srv_name
, level
, info
);
795 /* turn the data into an io stream */
796 if (spoolss_io_q_addprinterdriver("", &q_o
, &buf
, 0) &&
797 rpc_con_pipe_req(con
, SPOOLSS_ADDPRINTERDRIVER
, &buf
, &rbuf
))
801 if(spoolss_io_r_addprinterdriver("", &r_o
, &rbuf
, 0))
803 if (r_o
.status
!= NT_STATUS_NOPROBLEMO
)
805 /* report error code */
806 DEBUG(3,("SPOOLSS_ADDPRINTERDRIVER: %s\n", get_nt_error_msg(r_o
.status
)));
816 talloc_destroy(mem_ctx
);