me stupid.
[Samba.git] / source / rpc_client / cli_spoolss.c
bloba06f3afb6a42f8a898cd574924c57d4be3031086
1 /*
2 * Unix SMB/Netbios implementation.
3 * Version 1.9.
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.
25 #include "includes.h"
26 #include "rpc_parse.h"
27 #include "nterr.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)
38 prs_struct rbuf;
39 prs_struct buf;
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))
47 return False;
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))
64 prs_mem_free(&buf);
65 ZERO_STRUCT(r_o);
67 prs_switch_type(&buffer->prs, UNMARSHALL);
68 prs_set_offset(&buffer->prs, 0);
69 r_o.buffer=buffer;
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)));
77 *needed=r_o.needed;
78 *returned=r_o.returned;
82 prs_mem_free(&rbuf);
83 prs_mem_free(&buf );
85 cli_connection_unlink(con);
87 return r_o.status;
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)
97 prs_struct rbuf;
98 prs_struct buf;
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))
106 return False;
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))
121 ZERO_STRUCT(r_o);
123 prs_switch_type(&buffer->prs, UNMARSHALL);
124 prs_set_offset(&buffer->prs, 0);
125 r_o.buffer=buffer;
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)));
135 *needed=r_o.needed;
136 *returned=r_o.returned;
141 prs_mem_free(&rbuf);
142 prs_mem_free(&buf );
144 cli_connection_unlink(con);
146 return r_o.status;
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)
156 prs_struct rbuf;
157 prs_struct buf;
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))
165 return False;
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))
180 prs_mem_free(&buf );
181 ZERO_STRUCT(r_o);
183 prs_switch_type(&buffer->prs, UNMARSHALL);
184 prs_set_offset(&buffer->prs, 0);
185 r_o.buffer=buffer;
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)));
194 *needed=r_o.needed;
195 *returned=r_o.returned;
199 prs_mem_free(&rbuf);
200 prs_mem_free(&buf );
202 cli_connection_unlink(con);
204 return r_o.status;
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)
214 prs_struct rbuf;
215 prs_struct buf;
216 SPOOL_Q_ENUMJOBS q_o;
217 SPOOL_R_ENUMJOBS r_o;
218 TALLOC_CTX *ctx = prs_get_mem_context(&buffer->prs);
220 if (hnd == NULL)
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))
236 ZERO_STRUCT(r_o);
237 prs_mem_free(&buf );
239 r_o.buffer=buffer;
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)));
247 *needed=r_o.needed;
248 *returned=r_o.returned;
252 prs_mem_free(&rbuf);
253 prs_mem_free(&buf );
255 return r_o.status;
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,
264 uint32 *rdatalen)
266 prs_struct rbuf;
267 prs_struct buf;
268 SPOOL_Q_ENUMPRINTERDATA q_o;
269 SPOOL_R_ENUMPRINTERDATA r_o;
270 TALLOC_CTX *mem_ctx = NULL;
272 if (hnd == 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"));
278 return False;
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))
293 ZERO_STRUCT(r_o);
294 prs_mem_free(&buf );
296 r_o.data=data;
297 r_o.value=value;
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;
308 *type=r_o.type;
309 *datalen=r_o.datasize;
310 *rdatalen=r_o.realdatasize;
315 prs_mem_free(&rbuf);
316 prs_mem_free(&buf );
317 if (mem_ctx)
318 talloc_destroy(mem_ctx);
320 return r_o.status;
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,
328 uint32 *needed)
330 prs_struct rbuf;
331 prs_struct buf;
332 SPOOL_Q_GETPRINTER q_o;
333 SPOOL_R_GETPRINTER r_o;
334 TALLOC_CTX *ctx = prs_get_mem_context(&buffer->prs);
336 if (hnd == NULL)
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))
352 ZERO_STRUCT(r_o);
353 prs_mem_free(&buf );
355 prs_switch_type(&buffer->prs, UNMARSHALL);
356 prs_set_offset(&buffer->prs, 0);
357 r_o.buffer=buffer;
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)));
365 *needed=r_o.needed;
369 prs_mem_free(&rbuf);
370 prs_mem_free(&buf );
372 return 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,
381 uint32 *needed)
383 prs_struct rbuf;
384 prs_struct buf;
385 SPOOL_Q_GETPRINTERDRIVER2 q_o;
386 SPOOL_R_GETPRINTERDRIVER2 r_o;
387 TALLOC_CTX *ctx = prs_get_mem_context(&buffer->prs);
389 if (hnd == NULL)
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))
405 ZERO_STRUCT(r_o);
406 prs_mem_free(&buf );
408 prs_switch_type(&buffer->prs, UNMARSHALL);
409 prs_set_offset(&buffer->prs, 0);
410 r_o.buffer=buffer;
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)));
419 *needed=r_o.needed;
423 prs_mem_free(&rbuf);
424 prs_mem_free(&buf );
426 return 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,
437 POLICY_HND *hnd)
439 prs_struct rbuf;
440 prs_struct buf;
441 SPOOL_Q_OPEN_PRINTER_EX q_o;
442 BOOL valid_pol = False;
443 fstring srv_name;
444 char *s = NULL;
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], '\\');
452 if (s != NULL)
453 *s = '\0';
455 if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
456 return False;
458 if (hnd == NULL)
459 return False;
461 if ((mem_ctx=talloc_init()) == NULL)
463 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
464 return False;
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;
481 BOOL p = True;
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)));
489 p = False;
492 if (p)
494 /* ok, at last: we're happy. return the policy handle */
495 *hnd = r_o.handle;
497 /* associate the handle returned with the current
498 state of the clienjt connection */
499 valid_pol = RpcHndList_set_connection(hnd, con);
504 prs_mem_free(&rbuf);
505 prs_mem_free(&buf );
506 if (mem_ctx)
507 talloc_destroy(mem_ctx);
509 return valid_pol;
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)
518 prs_struct rbuf;
519 prs_struct buf;
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;
532 if (hnd == NULL)
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,
554 2, info2);
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))
560 ZERO_STRUCT(r_o);
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)));
568 valid_pol = False;
572 if (valid_pol)
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);
584 prs_mem_free(&rbuf);
585 prs_mem_free(&buf );
587 if (mem_ctx)
588 talloc_destroy(mem_ctx);
590 return valid_pol;
593 /****************************************************************************
594 do a SPOOL Close
595 ****************************************************************************/
596 BOOL spoolss_closeprinter(POLICY_HND *hnd)
598 prs_struct rbuf;
599 prs_struct buf;
600 SPOOL_Q_CLOSEPRINTER q_c;
601 BOOL valid_close = False;
602 TALLOC_CTX *mem_ctx = NULL;
604 if (hnd == NULL)
605 return False;
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"));
611 return False;
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)));
634 else
635 valid_close = True;
638 prs_mem_free(&rbuf);
639 prs_mem_free(&buf );
640 if (mem_ctx)
641 talloc_destroy(mem_ctx);
643 /* disassociate with the cli_connection */
644 RpcHndList_del_connection(hnd);
646 return valid_close;
649 /****************************************************************************
650 do a SPOOLSS Get printer datas
651 ****************************************************************************/
652 uint32 spoolss_getprinterdata(const POLICY_HND *hnd, const UNISTR2 *valuename,
653 uint32 in_size,
654 uint32 *type,
655 uint32 *out_size,
656 uint8 *data,
657 uint32 *needed)
659 prs_struct rbuf;
660 prs_struct buf;
661 SPOOL_Q_GETPRINTERDATA q_o;
662 SPOOL_R_GETPRINTERDATA r_o;
663 TALLOC_CTX *mem_ctx = NULL;
665 if (hnd == 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"));
671 return False;
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))
686 ZERO_STRUCT(r_o);
687 prs_mem_free(&buf );
689 r_o.data=data;
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)));
698 *type=r_o.type;
699 *out_size=r_o.size;
700 *needed=r_o.needed;
704 prs_mem_free(&rbuf);
705 prs_mem_free(&buf );
707 return 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,
715 uint32 *needed)
717 prs_struct rbuf;
718 prs_struct buf;
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))
726 return False;
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,
737 buffer, offered);
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))
743 prs_mem_free(&buf );
744 ZERO_STRUCT(r_o);
746 prs_switch_type(&buffer->prs, UNMARSHALL);
747 prs_set_offset(&buffer->prs, 0);
748 r_o.buffer=buffer;
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)));
757 *needed=r_o.needed;
761 prs_mem_free(&rbuf);
762 prs_mem_free(&buf );
764 cli_connection_unlink(con);
766 return r_o.status;
769 /******************************************************************************
770 AddPrinterDriver()
771 *****************************************************************************/
772 uint32 spoolss_addprinterdriver(const char *srv_name, uint32 level, PRINTER_DRIVER_CTR *info)
774 prs_struct rbuf;
775 prs_struct buf;
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))
782 return False;
784 if ((mem_ctx=talloc_init()) == NULL)
786 DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
787 return False;
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))
799 ZERO_STRUCT(r_o);
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)));
812 prs_mem_free(&rbuf);
813 prs_mem_free(&buf );
815 if (mem_ctx)
816 talloc_destroy(mem_ctx);
818 return r_o.status;