Implemented AbortPrinter() from Gerald's Win32 test code. Just purge all
[samba.git] / source / rpc_server / srv_spoolss.c
1 #define OLD_NTDOMAIN 1
2 /* 
3  *  Unix SMB/Netbios implementation.
4  *  Version 1.9.
5  *  RPC Pipe client / server routines
6  *  Copyright (C) Andrew Tridgell              1992-2000,
7  *  Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
8  *  Copyright (C) Jean François Micouleau      1998-2000.
9  *  
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.
14  *  
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.
19  *  
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.
23  */
24
25 #include "includes.h"
26
27 extern int DEBUGLEVEL;
28
29 /********************************************************************
30  * api_spoolss_open_printer_ex
31  ********************************************************************/
32 static BOOL api_spoolss_open_printer_ex(pipes_struct *p)
33 {
34         SPOOL_Q_OPEN_PRINTER_EX q_u;
35         SPOOL_R_OPEN_PRINTER_EX r_u;
36         UNISTR2 *printername = NULL;
37         prs_struct *data = &p->in_data.data;
38         prs_struct *rdata = &p->out_data.rdata;
39
40         ZERO_STRUCT(q_u);
41         ZERO_STRUCT(r_u);
42
43         if (!spoolss_io_q_open_printer_ex("", &q_u, data, 0)) {
44                 DEBUG(0,("spoolss_io_q_open_printer_ex: unable to unmarshall SPOOL_Q_OPEN_PRINTER_EX.\n"));
45                 return False;
46         }
47
48         if (q_u.printername_ptr != 0)
49                 printername = &q_u.printername;
50
51         r_u.status = _spoolss_open_printer_ex( printername,
52                                                &q_u.printer_default,
53                                                q_u.user_switch, q_u.user_ctr,
54                                                &r_u.handle);
55
56         /* we _really_ need to switch to talloc() */
57         free_spoolss_q_open_printer_ex(&q_u);
58
59         if (!spoolss_io_r_open_printer_ex("",&r_u,rdata,0)){
60                 DEBUG(0,("spoolss_io_r_open_printer_ex: unable to marshall SPOOL_R_OPEN_PRINTER_EX.\n"));
61                 return False;
62         }
63
64         return True;
65 }
66
67 /********************************************************************
68  * api_spoolss_getprinterdata
69  *
70  * called from the spoolss dispatcher
71  ********************************************************************/
72 static BOOL api_spoolss_getprinterdata(pipes_struct *p)
73 {
74         SPOOL_Q_GETPRINTERDATA q_u;
75         SPOOL_R_GETPRINTERDATA r_u;
76         prs_struct *data = &p->in_data.data;
77         prs_struct *rdata = &p->out_data.rdata;
78
79         ZERO_STRUCT(q_u);
80         ZERO_STRUCT(r_u);
81
82         /* read the stream and fill the struct */
83         if (!spoolss_io_q_getprinterdata("", &q_u, data, 0)) {
84                 DEBUG(0,("spoolss_io_q_getprinterdata: unable to unmarshall SPOOL_Q_GETPRINTERDATA.\n"));
85                 return False;
86         }
87         
88         r_u.status = _spoolss_getprinterdata( &q_u.handle, &q_u.valuename,
89                                               q_u.size, &r_u.type, &r_u.size,
90                                               &r_u.data, &r_u.needed);
91
92         if (!spoolss_io_r_getprinterdata("", &r_u, rdata, 0)) {
93                 DEBUG(0,("spoolss_io_r_getprinterdata: unable to marshall SPOOL_R_GETPRINTERDATA.\n"));
94                 return False;
95         }
96
97         safe_free(r_u.data);
98
99         return True;
100 }
101
102 /********************************************************************
103  * api_spoolss_closeprinter
104  *
105  * called from the spoolss dispatcher
106  ********************************************************************/
107 static BOOL api_spoolss_closeprinter(pipes_struct *p)
108 {
109         SPOOL_Q_CLOSEPRINTER q_u;
110         SPOOL_R_CLOSEPRINTER r_u;
111         prs_struct *data = &p->in_data.data;
112         prs_struct *rdata = &p->out_data.rdata;
113
114         ZERO_STRUCT(q_u);
115         ZERO_STRUCT(r_u);
116
117         if (!spoolss_io_q_closeprinter("", &q_u, data, 0)) {
118                 DEBUG(0,("spoolss_io_q_closeprinter: unable to unmarshall SPOOL_Q_CLOSEPRINTER.\n"));
119                 return False;
120         }
121
122         r_u.status = _spoolss_closeprinter(&q_u.handle);
123         memcpy(&r_u.handle, &q_u.handle, sizeof(r_u.handle));
124
125         if (!spoolss_io_r_closeprinter("",&r_u,rdata,0)) {
126                 DEBUG(0,("spoolss_io_r_closeprinter: unable to marshall SPOOL_R_CLOSEPRINTER.\n"));
127                 return False;
128         }
129
130         return True;
131 }
132
133 /********************************************************************
134  * api_spoolss_abortprinter
135  *
136  * called from the spoolss dispatcher
137  ********************************************************************/
138 static BOOL api_spoolss_abortprinter(pipes_struct *p)
139 {
140         SPOOL_Q_ABORTPRINTER q_u;
141         SPOOL_R_ABORTPRINTER r_u;
142         prs_struct *data = &p->in_data.data;
143         prs_struct *rdata = &p->out_data.rdata;
144
145         ZERO_STRUCT(q_u);
146         ZERO_STRUCT(r_u);
147
148         if (!spoolss_io_q_abortprinter("", &q_u, data, 0)) {
149                 DEBUG(0,("spoolss_io_q_abortprinter: unable to unmarshall SPOOL_Q_ABORTPRINTER.\n"));
150                 return False;
151         }
152
153         r_u.status = _spoolss_abortprinter(&q_u.handle, p);
154
155         if (!spoolss_io_r_abortprinter("",&r_u,rdata,0)) {
156                 DEBUG(0,("spoolss_io_r_abortprinter: unable to marshall SPOOL_R_ABORTPRINTER.\n"));
157                 return False;
158         }
159
160         return True;
161 }
162
163 /********************************************************************
164  * api_spoolss_deleteprinter
165  *
166  * called from the spoolss dispatcher
167  ********************************************************************/
168 static BOOL api_spoolss_deleteprinter(pipes_struct *p)
169 {
170         SPOOL_Q_DELETEPRINTER q_u;
171         SPOOL_R_DELETEPRINTER r_u;
172         prs_struct *data = &p->in_data.data;
173         prs_struct *rdata = &p->out_data.rdata;
174
175         ZERO_STRUCT(q_u);
176         ZERO_STRUCT(r_u);
177
178         if (!spoolss_io_q_deleteprinter("", &q_u, data, 0)) {
179                 DEBUG(0,("spoolss_io_q_deleteprinter: unable to unmarshall SPOOL_Q_DELETEPRINTER.\n"));
180                 return False;
181         }
182
183         r_u.status = _spoolss_deleteprinter(&q_u.handle);
184         memcpy(&r_u.handle, &q_u.handle, sizeof(r_u.handle));
185
186         if (!spoolss_io_r_deleteprinter("",&r_u,rdata,0)) {
187                 DEBUG(0,("spoolss_io_r_deleteprinter: unable to marshall SPOOL_R_DELETEPRINTER.\n"));
188                 return False;
189         }
190
191         return True;
192 }
193
194
195 /********************************************************************
196  * api_spoolss_rffpcnex
197  * ReplyFindFirstPrinterChangeNotifyEx
198  ********************************************************************/
199 static BOOL api_spoolss_rffpcnex(pipes_struct *p)
200 {
201         SPOOL_Q_RFFPCNEX q_u;
202         SPOOL_R_RFFPCNEX r_u;
203         prs_struct *data = &p->in_data.data;
204         prs_struct *rdata = &p->out_data.rdata;
205
206         ZERO_STRUCT(q_u);
207         ZERO_STRUCT(r_u);
208
209         if (!spoolss_io_q_rffpcnex("", &q_u, data, 0)) {
210                 DEBUG(0,("spoolss_io_q_rffpcnex: unable to unmarshall SPOOL_Q_RFFPCNEX.\n"));
211                 return False;
212         }
213
214         r_u.status = _spoolss_rffpcnex(&q_u.handle, q_u.flags,
215                                        q_u.options, &q_u.localmachine,
216                                        q_u.printerlocal, q_u.option);
217
218         if (!spoolss_io_r_rffpcnex("", &r_u, rdata, 0)) {
219                 DEBUG(0,("spoolss_io_r_rffpcnex: unable to marshall SPOOL_R_RFFPCNEX.\n"));
220                 return False;
221         }
222
223         return True;
224 }
225
226
227 /********************************************************************
228  * api_spoolss_rfnpcnex
229  * ReplyFindNextPrinterChangeNotifyEx
230  * called from the spoolss dispatcher
231  *
232  ********************************************************************/
233 static BOOL api_spoolss_rfnpcnex(pipes_struct *p)
234 {
235         SPOOL_Q_RFNPCNEX q_u;
236         SPOOL_R_RFNPCNEX r_u;
237         prs_struct *data = &p->in_data.data;
238         prs_struct *rdata = &p->out_data.rdata;
239
240         ZERO_STRUCT(q_u);
241         ZERO_STRUCT(r_u);
242
243         if (!spoolss_io_q_rfnpcnex("", &q_u, data, 0)) {
244                 DEBUG(0,("spoolss_io_q_rfnpcnex: unable to unmarshall SPOOL_Q_RFNPCNEX.\n"));
245                 return False;
246         }
247
248         r_u.status = _spoolss_rfnpcnex(&q_u.handle, q_u.change,
249                                        q_u.option, &r_u.info);
250
251         safe_free(q_u.option);
252
253         /* we always have a NOTIFY_INFO struct */
254         r_u.info_ptr=0x1;
255
256         if (!spoolss_io_r_rfnpcnex("", &r_u, rdata, 0)) {
257                 DEBUG(0,("spoolss_io_r_rfnpcnex: unable to marshall SPOOL_R_RFNPCNEX.\n"));
258                 return False;
259         }
260
261         safe_free(r_u.info.data);
262
263         return True;
264 }
265
266
267 /********************************************************************
268  * api_spoolss_enumprinters
269  * called from the spoolss dispatcher
270  *
271  ********************************************************************/
272 static BOOL api_spoolss_enumprinters(pipes_struct *p)
273 {
274         SPOOL_Q_ENUMPRINTERS q_u;
275         SPOOL_R_ENUMPRINTERS r_u;
276         prs_struct *data = &p->in_data.data;
277         prs_struct *rdata = &p->out_data.rdata;
278
279         ZERO_STRUCT(q_u);
280         ZERO_STRUCT(r_u);
281
282         if(!new_spoolss_allocate_buffer(&q_u.buffer))
283                 return False;
284
285         if (!spoolss_io_q_enumprinters("", &q_u, data, 0)) {
286                 DEBUG(0,("spoolss_io_q_enumprinters: unable to unmarshall SPOOL_Q_ENUMPRINTERS.\n"));
287                 return False;
288         }
289
290         /* that's an [in out] buffer */
291         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
292
293         r_u.status = _spoolss_enumprinters( q_u.flags, &q_u.servername, q_u.level,
294                                             r_u.buffer, q_u.offered,
295                                             &r_u.needed, &r_u.returned);
296
297         if (!new_spoolss_io_r_enumprinters("", &r_u, rdata, 0)) {
298                 DEBUG(0,("new_spoolss_io_r_enumprinters: unable to marshall SPOOL_R_ENUMPRINTERS.\n"));
299                 new_spoolss_free_buffer(q_u.buffer);
300                 return False;
301         }
302
303         new_spoolss_free_buffer(q_u.buffer);
304
305         return True;
306 }
307
308 /********************************************************************
309  * api_spoolss_getprinter
310  * called from the spoolss dispatcher
311  *
312  ********************************************************************/
313 static BOOL api_spoolss_getprinter(pipes_struct *p)
314 {
315         SPOOL_Q_GETPRINTER q_u;
316         SPOOL_R_GETPRINTER r_u;
317         prs_struct *data = &p->in_data.data;
318         prs_struct *rdata = &p->out_data.rdata;
319
320         ZERO_STRUCT(q_u);
321         ZERO_STRUCT(r_u);
322
323         if(!new_spoolss_allocate_buffer(&q_u.buffer))
324                 return False;
325
326         if(!spoolss_io_q_getprinter("", &q_u, data, 0)) {
327                 DEBUG(0,("spoolss_io_q_getprinter: unable to unmarshall SPOOL_Q_GETPRINTER.\n"));
328                 return False;
329         }
330
331         /* that's an [in out] buffer */
332         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
333
334         r_u.status = _spoolss_getprinter(&q_u.handle, q_u.level,
335                                          r_u.buffer, q_u.offered, 
336                                          &r_u.needed);
337
338         if(!spoolss_io_r_getprinter("",&r_u,rdata,0)) {
339                 DEBUG(0,("spoolss_io_r_getprinter: unable to marshall SPOOL_R_GETPRINTER.\n"));
340                 new_spoolss_free_buffer(q_u.buffer);
341                 return False;
342         }
343
344         new_spoolss_free_buffer(q_u.buffer);
345         return True;
346 }
347
348
349 /********************************************************************
350  * api_spoolss_getprinter
351  * called from the spoolss dispatcher
352  *
353  ********************************************************************/
354 static BOOL api_spoolss_getprinterdriver2(pipes_struct *p)
355 {
356         SPOOL_Q_GETPRINTERDRIVER2 q_u;
357         SPOOL_R_GETPRINTERDRIVER2 r_u;
358         prs_struct *data = &p->in_data.data;
359         prs_struct *rdata = &p->out_data.rdata;
360
361         ZERO_STRUCT(q_u);
362         ZERO_STRUCT(r_u);
363
364         if(!new_spoolss_allocate_buffer(&q_u.buffer))
365                 return False;
366
367         if(!spoolss_io_q_getprinterdriver2("", &q_u, data, 0)) {
368                 DEBUG(0,("spoolss_io_q_getprinterdriver2: unable to unmarshall SPOOL_Q_GETPRINTERDRIVER2.\n"));
369                 return False;
370         }
371
372         /* that's an [in out] buffer */
373         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
374
375         r_u.status = _spoolss_getprinterdriver2(&q_u.handle, &q_u.architecture, q_u.level, 
376                                                 q_u.clientmajorversion, q_u.clientminorversion,
377                                                 r_u.buffer, q_u.offered,
378                                                 &r_u.needed, &r_u.servermajorversion, &r_u.serverminorversion);
379         
380         if(!spoolss_io_r_getprinterdriver2("",&r_u,rdata,0)) {
381                 DEBUG(0,("spoolss_io_r_getprinterdriver2: unable to marshall SPOOL_R_GETPRINTERDRIVER2.\n"));
382                 new_spoolss_free_buffer(q_u.buffer);
383                 return False;
384         }
385         
386         new_spoolss_free_buffer(q_u.buffer);
387         return True;
388 }
389
390 /********************************************************************
391  * api_spoolss_getprinter
392  * called from the spoolss dispatcher
393  *
394  ********************************************************************/
395 static BOOL api_spoolss_startpageprinter(pipes_struct *p)
396 {
397         SPOOL_Q_STARTPAGEPRINTER q_u;
398         SPOOL_R_STARTPAGEPRINTER r_u;
399         prs_struct *data = &p->in_data.data;
400         prs_struct *rdata = &p->out_data.rdata;
401
402         ZERO_STRUCT(q_u);
403         ZERO_STRUCT(r_u);
404
405         if(!spoolss_io_q_startpageprinter("", &q_u, data, 0)) {
406                 DEBUG(0,("spoolss_io_q_startpageprinter: unable to unmarshall SPOOL_Q_STARTPAGEPRINTER.\n"));
407                 return False;
408         }
409
410         r_u.status = _spoolss_startpageprinter(&q_u.handle);
411
412         if(!spoolss_io_r_startpageprinter("",&r_u,rdata,0)) {
413                 DEBUG(0,("spoolss_io_r_startpageprinter: unable to marshall SPOOL_R_STARTPAGEPRINTER.\n"));
414                 return False;
415         }
416
417         return True;
418 }
419
420
421 /********************************************************************
422  * api_spoolss_getprinter
423  * called from the spoolss dispatcher
424  *
425  ********************************************************************/
426 static BOOL api_spoolss_endpageprinter(pipes_struct *p)
427 {
428         SPOOL_Q_ENDPAGEPRINTER q_u;
429         SPOOL_R_ENDPAGEPRINTER r_u;
430         prs_struct *data = &p->in_data.data;
431         prs_struct *rdata = &p->out_data.rdata;
432
433         ZERO_STRUCT(q_u);
434         ZERO_STRUCT(r_u);
435
436         if(!spoolss_io_q_endpageprinter("", &q_u, data, 0)) {
437                 DEBUG(0,("spoolss_io_q_endpageprinter: unable to unmarshall SPOOL_Q_ENDPAGEPRINTER.\n"));
438                 return False;
439         }
440
441         r_u.status = _spoolss_endpageprinter(&q_u.handle);
442
443         if(!spoolss_io_r_endpageprinter("",&r_u,rdata,0)) {
444                 DEBUG(0,("spoolss_io_r_endpageprinter: unable to marshall SPOOL_R_ENDPAGEPRINTER.\n"));
445                 return False;
446         }
447
448         return True;
449 }
450
451 /********************************************************************
452 ********************************************************************/
453 static BOOL api_spoolss_startdocprinter(pipes_struct *p)
454 {
455         SPOOL_Q_STARTDOCPRINTER q_u;
456         SPOOL_R_STARTDOCPRINTER r_u;
457         prs_struct *data = &p->in_data.data;
458         prs_struct *rdata = &p->out_data.rdata;
459
460         ZERO_STRUCT(q_u);
461         ZERO_STRUCT(r_u);
462
463         if(!spoolss_io_q_startdocprinter("", &q_u, data, 0)) {
464                 DEBUG(0,("spoolss_io_q_startdocprinter: unable to unmarshall SPOOL_Q_STARTDOCPRINTER.\n"));
465                 return False;
466         }
467
468         r_u.status = _spoolss_startdocprinter(&q_u.handle,
469                                   q_u.doc_info_container.level, p,
470                                   &q_u.doc_info_container.docinfo,
471                                   &r_u.jobid);
472
473         if(!spoolss_io_r_startdocprinter("",&r_u,rdata,0)) {
474                 DEBUG(0,("spoolss_io_r_startdocprinter: unable to marshall SPOOL_R_STARTDOCPRINTER.\n"));
475                 return False;
476         }
477
478         return True;
479 }
480
481
482 /********************************************************************
483 ********************************************************************/
484 static BOOL api_spoolss_enddocprinter(pipes_struct *p)
485 {
486         SPOOL_Q_ENDDOCPRINTER q_u;
487         SPOOL_R_ENDDOCPRINTER r_u;
488         prs_struct *data = &p->in_data.data;
489         prs_struct *rdata = &p->out_data.rdata;
490
491         ZERO_STRUCT(q_u);
492         ZERO_STRUCT(r_u);
493
494         if(!spoolss_io_q_enddocprinter("", &q_u, data, 0)) {
495                 DEBUG(0,("spoolss_io_q_enddocprinter: unable to unmarshall SPOOL_Q_ENDDOCPRINTER.\n"));
496                 return False;
497         }
498
499         r_u.status = _spoolss_enddocprinter(&q_u.handle);
500
501         if(!spoolss_io_r_enddocprinter("",&r_u,rdata,0)) {
502                 DEBUG(0,("spoolss_io_r_enddocprinter: unable to marshall SPOOL_R_ENDDOCPRINTER.\n"));
503                 return False;
504         }
505
506         return True;            
507 }
508
509
510 /********************************************************************
511 ********************************************************************/
512 static BOOL api_spoolss_writeprinter(pipes_struct *p)
513 {
514         SPOOL_Q_WRITEPRINTER q_u;
515         SPOOL_R_WRITEPRINTER r_u;
516         prs_struct *data = &p->in_data.data;
517         prs_struct *rdata = &p->out_data.rdata;
518
519         ZERO_STRUCT(q_u);
520         ZERO_STRUCT(r_u);
521
522         if(!spoolss_io_q_writeprinter("", &q_u, data, 0)) {
523                 DEBUG(0,("spoolss_io_q_writeprinter: unable to unmarshall SPOOL_Q_WRITEPRINTER.\n"));
524                 return False;
525         }
526
527         r_u.status = _spoolss_writeprinter(&q_u.handle,
528                                            q_u.buffer_size,
529                                            q_u.buffer,
530                                            &q_u.buffer_size2);
531         r_u.buffer_written = q_u.buffer_size2;
532         safe_free(q_u.buffer);
533
534         if(!spoolss_io_r_writeprinter("",&r_u,rdata,0)) {
535                 DEBUG(0,("spoolss_io_r_writeprinter: unable to marshall SPOOL_R_WRITEPRINTER.\n"));
536                 return False;
537         }
538
539         return True;
540 }
541
542 /****************************************************************************
543
544 ****************************************************************************/
545 static BOOL api_spoolss_setprinter(pipes_struct *p)
546 {
547         SPOOL_Q_SETPRINTER q_u;
548         SPOOL_R_SETPRINTER r_u;
549         prs_struct *data = &p->in_data.data;
550         prs_struct *rdata = &p->out_data.rdata;
551
552         ZERO_STRUCT(q_u);
553         ZERO_STRUCT(r_u);
554
555         if(!spoolss_io_q_setprinter("", &q_u, data, 0)) {
556                 DEBUG(0,("spoolss_io_q_setprinter: unable to unmarshall SPOOL_Q_SETPRINTER.\n"));
557                 return False;
558         }
559         
560         r_u.status = _spoolss_setprinter(&q_u.handle, q_u.level, &q_u.info,
561                                          q_u.devmode_ctr, q_u.secdesc_ctr, 
562                                          q_u.command, p);
563         
564         if(!spoolss_io_r_setprinter("",&r_u,rdata,0)) {
565                 DEBUG(0,("spoolss_io_r_setprinter: unable to marshall SPOOL_R_SETPRINTER.\n"));
566                 free_spoolss_q_setprinter(&q_u);
567                 return False;
568         }
569
570         /* Free anything allocated in the unparse. */
571         free_spoolss_q_setprinter(&q_u);
572
573         return True;
574 }
575
576 /****************************************************************************
577 ****************************************************************************/
578 static BOOL api_spoolss_fcpn(pipes_struct *p)
579 {
580         SPOOL_Q_FCPN q_u;
581         SPOOL_R_FCPN r_u;
582         prs_struct *data = &p->in_data.data;
583         prs_struct *rdata = &p->out_data.rdata;
584
585         ZERO_STRUCT(q_u);
586         ZERO_STRUCT(r_u);
587
588         if(!spoolss_io_q_fcpn("", &q_u, data, 0)) {
589                 DEBUG(0,("spoolss_io_q_fcpn: unable to unmarshall SPOOL_Q_FCPN.\n"));
590                 return False;
591         }
592
593         r_u.status = _spoolss_fcpn(&q_u.handle);
594
595         if(!spoolss_io_r_fcpn("",&r_u,rdata,0)) {
596                 DEBUG(0,("spoolss_io_r_fcpn: unable to marshall SPOOL_R_FCPN.\n"));
597                 return False;
598         }
599
600         return True;
601 }
602
603
604 /****************************************************************************
605 ****************************************************************************/
606 static BOOL api_spoolss_addjob(pipes_struct *p)
607 {
608         SPOOL_Q_ADDJOB q_u;
609         SPOOL_R_ADDJOB r_u;
610         prs_struct *data = &p->in_data.data;
611         prs_struct *rdata = &p->out_data.rdata;
612
613         ZERO_STRUCT(q_u);
614         ZERO_STRUCT(r_u);
615
616         if(!new_spoolss_allocate_buffer(&q_u.buffer))
617                 return False;
618
619         if(!spoolss_io_q_addjob("", &q_u, data, 0)) {
620                 DEBUG(0,("spoolss_io_q_addjob: unable to unmarshall SPOOL_Q_ADDJOB.\n"));
621                 return False;
622         }
623
624         /* that's an [in out] buffer (despite appearences to the contrary) */
625         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
626
627         r_u.status = _spoolss_addjob(&q_u.handle, q_u.level,
628                                      r_u.buffer, q_u.offered, &r_u.needed);
629                 
630         if(!spoolss_io_r_addjob("",&r_u,rdata,0)) {
631                 DEBUG(0,("spoolss_io_r_addjob: unable to marshall SPOOL_R_ADDJOB.\n"));
632                 new_spoolss_free_buffer(q_u.buffer);
633                 return False;
634         }
635
636         new_spoolss_free_buffer(q_u.buffer);
637
638         return True;            
639 }
640
641
642 /****************************************************************************
643 ****************************************************************************/
644 static BOOL api_spoolss_enumjobs(pipes_struct *p)
645 {
646         SPOOL_Q_ENUMJOBS q_u;
647         SPOOL_R_ENUMJOBS r_u;
648         prs_struct *data = &p->in_data.data;
649         prs_struct *rdata = &p->out_data.rdata;
650
651         ZERO_STRUCT(q_u);
652         ZERO_STRUCT(r_u);
653
654         if(!new_spoolss_allocate_buffer(&q_u.buffer))
655                 return False;
656
657         if (!spoolss_io_q_enumjobs("", &q_u, data, 0)) {
658                 DEBUG(0,("spoolss_io_q_enumjobs: unable to unmarshall SPOOL_Q_ENUMJOBS.\n"));
659                 return False;
660         }
661
662         /* that's an [in out] buffer */
663         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
664
665         r_u.status = _spoolss_enumjobs(&q_u.handle, q_u.firstjob, q_u.numofjobs, q_u.level,
666                                         r_u.buffer, q_u.offered,
667                                         &r_u.needed, &r_u.returned);
668
669         if (!spoolss_io_r_enumjobs("",&r_u,rdata,0)) {
670                 DEBUG(0,("spoolss_io_r_enumjobs: unable to marshall SPOOL_R_ENUMJOBS.\n"));
671                 new_spoolss_free_buffer(q_u.buffer);
672                 return False;
673         }
674
675         new_spoolss_free_buffer(q_u.buffer);
676
677         return True;
678 }
679
680
681 /****************************************************************************
682 ****************************************************************************/
683 static BOOL api_spoolss_schedulejob(pipes_struct *p)
684 {
685         SPOOL_Q_SCHEDULEJOB q_u;
686         SPOOL_R_SCHEDULEJOB r_u;
687         prs_struct *data = &p->in_data.data;
688         prs_struct *rdata = &p->out_data.rdata;
689
690         ZERO_STRUCT(q_u);
691         ZERO_STRUCT(r_u);
692
693         if(!spoolss_io_q_schedulejob("", &q_u, data, 0)) {
694                 DEBUG(0,("spoolss_io_q_schedulejob: unable to unmarshall SPOOL_Q_SCHEDULEJOB.\n"));
695                 return False;
696         }
697
698         r_u.status = _spoolss_schedulejob(&q_u.handle, q_u.jobid);
699
700         if(!spoolss_io_r_schedulejob("",&r_u,rdata,0)) {
701                 DEBUG(0,("spoolss_io_r_schedulejob: unable to marshall SPOOL_R_SCHEDULEJOB.\n"));
702                 return False;
703         }
704
705         return True;
706 }
707
708 /****************************************************************************
709 ****************************************************************************/
710 static BOOL api_spoolss_setjob(pipes_struct *p)
711 {
712         SPOOL_Q_SETJOB q_u;
713         SPOOL_R_SETJOB r_u;
714         prs_struct *data = &p->in_data.data;
715         prs_struct *rdata = &p->out_data.rdata;
716
717         ZERO_STRUCT(q_u);
718         ZERO_STRUCT(r_u);
719
720         if(!spoolss_io_q_setjob("", &q_u, data, 0)) {
721                 DEBUG(0,("spoolss_io_q_setjob: unable to unmarshall SPOOL_Q_SETJOB.\n"));
722                 return False;
723         }
724
725         r_u.status = _spoolss_setjob(&q_u.handle, q_u.jobid,
726                                 q_u.level, p, &q_u.ctr, q_u.command);
727
728         if(!spoolss_io_r_setjob("",&r_u,rdata,0)) {
729                 DEBUG(0,("spoolss_io_r_setjob: unable to marshall SPOOL_R_SETJOB.\n"));
730                 return False;
731         }
732
733         return True;
734 }
735
736 /****************************************************************************
737 ****************************************************************************/
738
739 static BOOL api_spoolss_enumprinterdrivers(pipes_struct *p)
740 {
741         SPOOL_Q_ENUMPRINTERDRIVERS q_u;
742         SPOOL_R_ENUMPRINTERDRIVERS r_u;
743         prs_struct *data = &p->in_data.data;
744         prs_struct *rdata = &p->out_data.rdata;
745
746         ZERO_STRUCT(q_u);
747         ZERO_STRUCT(r_u);
748
749         if(!new_spoolss_allocate_buffer(&q_u.buffer))
750                 return False;
751
752         if (!spoolss_io_q_enumprinterdrivers("", &q_u, data, 0)) {
753                 DEBUG(0,("spoolss_io_q_enumprinterdrivers: unable to unmarshall SPOOL_Q_ENUMPRINTERDRIVERS.\n"));
754                 return False;
755         }
756
757         /* that's an [in out] buffer */
758         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
759
760         r_u.status = _spoolss_enumprinterdrivers(&q_u.name, &q_u.environment, q_u.level,
761                                                  r_u.buffer, q_u.offered,
762                                                  &r_u.needed, &r_u.returned);
763
764         if (!new_spoolss_io_r_enumprinterdrivers("",&r_u,rdata,0)) {
765                 DEBUG(0,("new_spoolss_io_r_enumprinterdrivers: unable to marshall SPOOL_R_ENUMPRINTERDRIVERS.\n"));
766                 new_spoolss_free_buffer(q_u.buffer);
767                 return False;
768         }
769
770         new_spoolss_free_buffer(q_u.buffer);
771
772         return True;
773 }
774
775
776 /****************************************************************************
777 ****************************************************************************/
778 static BOOL api_spoolss_enumforms(pipes_struct *p)
779 {
780         SPOOL_Q_ENUMFORMS q_u;
781         SPOOL_R_ENUMFORMS r_u;
782         prs_struct *data = &p->in_data.data;
783         prs_struct *rdata = &p->out_data.rdata;
784
785         ZERO_STRUCT(q_u);
786         ZERO_STRUCT(r_u);
787
788         if(!new_spoolss_allocate_buffer(&q_u.buffer))
789                 return False;
790
791         if (!spoolss_io_q_enumforms("", &q_u, data, 0)) {
792                 DEBUG(0,("spoolss_io_q_enumforms: unable to unmarshall SPOOL_Q_ENUMFORMS.\n"));
793                 return False;
794         }
795
796         /* that's an [in out] buffer */
797         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
798
799         r_u.status = _new_spoolss_enumforms(&q_u.handle, q_u.level, 
800                                 r_u.buffer, q_u.offered,
801                                 &r_u.needed, &r_u.numofforms);
802
803         if (!new_spoolss_io_r_enumforms("",&r_u,rdata,0)) {
804                 DEBUG(0,("new_spoolss_io_r_enumforms: unable to marshall SPOOL_R_ENUMFORMS.\n"));
805                 new_spoolss_free_buffer(q_u.buffer);
806                 return False;
807         }
808
809         new_spoolss_free_buffer(q_u.buffer);
810
811         return True;
812 }
813
814
815 /****************************************************************************
816 ****************************************************************************/
817 static BOOL api_spoolss_enumports(pipes_struct *p)
818 {
819         SPOOL_Q_ENUMPORTS q_u;
820         SPOOL_R_ENUMPORTS r_u;
821         prs_struct *data = &p->in_data.data;
822         prs_struct *rdata = &p->out_data.rdata;
823
824         ZERO_STRUCT(q_u);
825         ZERO_STRUCT(r_u);
826
827         if(!new_spoolss_allocate_buffer(&q_u.buffer))
828                 return False;
829
830         if(!spoolss_io_q_enumports("", &q_u, data, 0)) {
831                 DEBUG(0,("spoolss_io_q_enumports: unable to unmarshall SPOOL_Q_ENUMPORTS.\n"));
832                 return False;
833         }
834
835         /* that's an [in out] buffer */
836         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
837
838         r_u.status = _spoolss_enumports(&q_u.name, q_u.level,
839                                         r_u.buffer, q_u.offered,
840                                         &r_u.needed, &r_u.returned);
841
842         if (!new_spoolss_io_r_enumports("",&r_u,rdata,0)) {
843                 DEBUG(0,("new_spoolss_io_r_enumports: unable to marshall SPOOL_R_ENUMPORTS.\n"));
844                 new_spoolss_free_buffer(q_u.buffer);
845                 return False;
846         }
847
848         new_spoolss_free_buffer(q_u.buffer);
849
850         return True;
851 }
852
853
854 /****************************************************************************
855 ****************************************************************************/
856 static BOOL api_spoolss_addprinterex(pipes_struct *p)
857 {
858         SPOOL_Q_ADDPRINTEREX q_u;
859         SPOOL_R_ADDPRINTEREX r_u;
860         prs_struct *data = &p->in_data.data;
861         prs_struct *rdata = &p->out_data.rdata;
862         
863         ZERO_STRUCT(q_u);
864         ZERO_STRUCT(r_u);
865         
866         if(!spoolss_io_q_addprinterex("", &q_u, data, 0)) {
867                 DEBUG(0,("spoolss_io_q_addprinterex: unable to unmarshall SPOOL_Q_ADDPRINTEREX.\n"));
868                 return False;
869         }
870         
871         r_u.status = _spoolss_addprinterex(&q_u.server_name,
872                                 q_u.level, &q_u.info,
873                                 q_u.unk0, q_u.unk1, q_u.unk2, q_u.unk3,
874                                 q_u.user_switch, &q_u.user_ctr,
875                                 &r_u.handle);
876                                 
877         if(!spoolss_io_r_addprinterex("", &r_u, rdata, 0)) {
878                 DEBUG(0,("spoolss_io_r_addprinterex: unable to marshall SPOOL_R_ADDPRINTEREX.\n"));
879                 return False;
880         }
881         
882         if (q_u.info.info_ptr!=0) {
883                 switch (q_u.info.level) {
884                         case 1:
885                                 safe_free(q_u.info.info_1);
886                                 break;
887                         case 2:
888                                 safe_free(q_u.info.info_2);
889                                 break;
890                 }
891         }
892                 
893         return True;
894 }
895
896 /****************************************************************************
897 ****************************************************************************/
898 static BOOL api_spoolss_addprinterdriver(pipes_struct *p)
899 {
900         SPOOL_Q_ADDPRINTERDRIVER q_u;
901         SPOOL_R_ADDPRINTERDRIVER r_u;
902         prs_struct *data = &p->in_data.data;
903         prs_struct *rdata = &p->out_data.rdata;
904         
905         ZERO_STRUCT(q_u);
906         ZERO_STRUCT(r_u);
907         
908         if(!spoolss_io_q_addprinterdriver("", &q_u, data, 0)) {
909                 DEBUG(0,("spoolss_io_q_addprinterdriver: unable to unmarshall SPOOL_Q_ADDPRINTERDRIVER.\n"));
910                 free_spoolss_q_addprinterdriver(&q_u);
911                 return False;
912         }
913         
914         r_u.status = _spoolss_addprinterdriver(p, &q_u.server_name, q_u.level, &q_u.info);
915                                 
916         if(!spoolss_io_r_addprinterdriver("", &r_u, rdata, 0)) {
917                 DEBUG(0,("spoolss_io_r_addprinterdriver: unable to marshall SPOOL_R_ADDPRINTERDRIVER.\n"));
918                 free_spoolss_q_addprinterdriver(&q_u);
919                 return False;
920         }
921         
922         free_spoolss_q_addprinterdriver(&q_u);
923
924         return True;
925 }
926
927 /****************************************************************************
928 ****************************************************************************/
929 static BOOL api_spoolss_getprinterdriverdirectory(pipes_struct *p)
930 {
931         SPOOL_Q_GETPRINTERDRIVERDIR q_u;
932         SPOOL_R_GETPRINTERDRIVERDIR r_u;
933         prs_struct *data = &p->in_data.data;
934         prs_struct *rdata = &p->out_data.rdata;
935
936         ZERO_STRUCT(q_u);
937         ZERO_STRUCT(r_u);
938
939         if(!new_spoolss_allocate_buffer(&q_u.buffer))
940                 return False;
941
942         if(!spoolss_io_q_getprinterdriverdir("", &q_u, data, 0)) {
943                 DEBUG(0,("spoolss_io_q_getprinterdriverdir: unable to unmarshall SPOOL_Q_GETPRINTERDRIVERDIR.\n"));
944                 return False;
945         }
946
947         /* that's an [in out] buffer */
948         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
949
950         r_u.status = _spoolss_getprinterdriverdirectory(&q_u.name, &q_u.environment, q_u.level,
951                                                         r_u.buffer, q_u.offered,
952                                                         &r_u.needed);
953
954         if(!spoolss_io_r_getprinterdriverdir("", &r_u, rdata, 0)) {
955                 DEBUG(0,("spoolss_io_r_getprinterdriverdir: unable to marshall SPOOL_R_GETPRINTERDRIVERDIR.\n"));
956                 new_spoolss_free_buffer(q_u.buffer);
957                 return False;
958         }
959
960         new_spoolss_free_buffer(q_u.buffer);
961
962         return True;
963 }
964
965 /****************************************************************************
966 ****************************************************************************/
967 static BOOL api_spoolss_enumprinterdata(pipes_struct *p)
968 {
969         SPOOL_Q_ENUMPRINTERDATA q_u;
970         SPOOL_R_ENUMPRINTERDATA r_u;
971         prs_struct *data = &p->in_data.data;
972         prs_struct *rdata = &p->out_data.rdata;
973         
974         ZERO_STRUCT(q_u);
975         ZERO_STRUCT(r_u);
976         
977         if(!spoolss_io_q_enumprinterdata("", &q_u, data, 0)) {
978                 DEBUG(0,("spoolss_io_q_enumprinterdata: unable to unmarshall SPOOL_Q_ENUMPRINTERDATA.\n"));
979                 return False;
980         }
981         
982         r_u.status = _spoolss_enumprinterdata(&q_u.handle, q_u.index, q_u.valuesize, q_u.datasize,
983                                                 &r_u.valuesize, &r_u.value, &r_u.realvaluesize,
984                                                 &r_u.type,
985                                                 &r_u.datasize, &r_u.data, &r_u.realdatasize);
986                                 
987         if(!spoolss_io_r_enumprinterdata("", &r_u, rdata, 0)) {
988                 DEBUG(0,("spoolss_io_r_enumprinterdata: unable to marshall SPOOL_R_ENUMPRINTERDATA.\n"));
989                 safe_free(r_u.value);
990                 safe_free(r_u.data);
991                 return False;
992         }
993
994         safe_free(r_u.value);
995         safe_free(r_u.data);
996
997         return True;
998 }
999
1000 /****************************************************************************
1001 ****************************************************************************/
1002 static BOOL api_spoolss_setprinterdata(pipes_struct *p)
1003 {
1004         SPOOL_Q_SETPRINTERDATA q_u;
1005         SPOOL_R_SETPRINTERDATA r_u;
1006         prs_struct *data = &p->in_data.data;
1007         prs_struct *rdata = &p->out_data.rdata;
1008         
1009         ZERO_STRUCT(q_u);
1010         ZERO_STRUCT(r_u);
1011         
1012         if(!spoolss_io_q_setprinterdata("", &q_u, data, 0)) {
1013                 DEBUG(0,("spoolss_io_q_setprinterdata: unable to unmarshall SPOOL_Q_SETPRINTERDATA.\n"));
1014                 return False;
1015         }
1016         
1017         r_u.status = _spoolss_setprinterdata(&q_u.handle,
1018                                 &q_u.value, q_u.type, q_u.max_len,
1019                                 q_u.data, q_u.real_len, q_u.numeric_data);
1020                                 
1021         free_spoolss_q_setprinterdata(&q_u);
1022
1023         if(!spoolss_io_r_setprinterdata("", &r_u, rdata, 0)) {
1024                 DEBUG(0,("spoolss_io_r_setprinterdata: unable to marshall SPOOL_R_SETPRINTERDATA.\n"));
1025                 return False;
1026         }
1027
1028         return True;
1029 }
1030
1031 /****************************************************************************
1032 ****************************************************************************/
1033 static BOOL api_spoolss_addform(pipes_struct *p)
1034 {
1035         SPOOL_Q_ADDFORM q_u;
1036         SPOOL_R_ADDFORM r_u;
1037         prs_struct *data = &p->in_data.data;
1038         prs_struct *rdata = &p->out_data.rdata;
1039
1040         ZERO_STRUCT(q_u);
1041         ZERO_STRUCT(r_u);
1042         
1043         if(!spoolss_io_q_addform("", &q_u, data, 0)) {
1044                 DEBUG(0,("spoolss_io_q_addform: unable to unmarshall SPOOL_Q_ADDFORM.\n"));
1045                 return False;
1046         }
1047         
1048         r_u.status = _spoolss_addform(&q_u.handle, q_u.level, &q_u.form);
1049         
1050         if(!spoolss_io_r_addform("", &r_u, rdata, 0)) {
1051                 DEBUG(0,("spoolss_io_r_addform: unable to marshall SPOOL_R_ADDFORM.\n"));
1052                 return False;
1053         }
1054
1055         return True;
1056 }
1057
1058 /****************************************************************************
1059 ****************************************************************************/
1060 static BOOL api_spoolss_setform(pipes_struct *p)
1061 {
1062         SPOOL_Q_SETFORM q_u;
1063         SPOOL_R_SETFORM r_u;
1064         prs_struct *data = &p->in_data.data;
1065         prs_struct *rdata = &p->out_data.rdata;
1066
1067         ZERO_STRUCT(q_u);
1068         ZERO_STRUCT(r_u);
1069         
1070         if(!spoolss_io_q_setform("", &q_u, data, 0)) {
1071                 DEBUG(0,("spoolss_io_q_setform: unable to unmarshall SPOOL_Q_SETFORM.\n"));
1072                 return False;
1073         }
1074         
1075         r_u.status = _spoolss_setform(&q_u.handle, &q_u.name, q_u.level, &q_u.form);
1076                                       
1077         if(!spoolss_io_r_setform("", &r_u, rdata, 0)) {
1078                 DEBUG(0,("spoolss_io_r_setform: unable to marshall SPOOL_R_SETFORM.\n"));
1079                 return False;
1080         }
1081
1082         return True;
1083 }
1084
1085 /****************************************************************************
1086 ****************************************************************************/
1087 static BOOL api_spoolss_enumprintprocessors(pipes_struct *p)
1088 {
1089         SPOOL_Q_ENUMPRINTPROCESSORS q_u;
1090         SPOOL_R_ENUMPRINTPROCESSORS r_u;
1091         prs_struct *data = &p->in_data.data;
1092         prs_struct *rdata = &p->out_data.rdata;
1093
1094         ZERO_STRUCT(q_u);
1095         ZERO_STRUCT(r_u);
1096         
1097         if(!new_spoolss_allocate_buffer(&q_u.buffer))
1098                 return False;
1099
1100         if(!spoolss_io_q_enumprintprocessors("", &q_u, data, 0)) {
1101                 DEBUG(0,("spoolss_io_q_enumprintprocessors: unable to unmarshall SPOOL_Q_ENUMPRINTPROCESSORS.\n"));
1102                 return False;
1103         }
1104         
1105         /* that's an [in out] buffer */
1106         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
1107         
1108         r_u.status = _spoolss_enumprintprocessors(&q_u.name, &q_u.environment, q_u.level,
1109                                                   r_u.buffer, q_u.offered,
1110                                                   &r_u.needed, &r_u.returned);
1111
1112         if(!spoolss_io_r_enumprintprocessors("", &r_u, rdata, 0)) {
1113                 DEBUG(0,("spoolss_io_r_enumprintprocessors: unable to marshall SPOOL_R_ENUMPRINTPROCESSORS.\n"));
1114                 new_spoolss_free_buffer(q_u.buffer);
1115                 return False;
1116         }
1117         
1118         new_spoolss_free_buffer(q_u.buffer);
1119         
1120         return True;
1121 }
1122
1123 /****************************************************************************
1124 ****************************************************************************/
1125 static BOOL api_spoolss_enumprintprocdatatypes(pipes_struct *p)
1126 {
1127         SPOOL_Q_ENUMPRINTPROCDATATYPES q_u;
1128         SPOOL_R_ENUMPRINTPROCDATATYPES r_u;
1129         prs_struct *data = &p->in_data.data;
1130         prs_struct *rdata = &p->out_data.rdata;
1131
1132         ZERO_STRUCT(q_u);
1133         ZERO_STRUCT(r_u);
1134         
1135         if(!new_spoolss_allocate_buffer(&q_u.buffer))
1136                 return False;
1137
1138         if(!spoolss_io_q_enumprintprocdatatypes("", &q_u, data, 0)) {
1139                 DEBUG(0,("spoolss_io_q_enumprintprocdatatypes: unable to unmarshall SPOOL_Q_ENUMPRINTPROCDATATYPES.\n"));
1140                 return False;
1141         }
1142         
1143         /* that's an [in out] buffer */
1144         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
1145         
1146         r_u.status = _spoolss_enumprintprocdatatypes(&q_u.name, &q_u.processor, q_u.level,
1147                                                      r_u.buffer, q_u.offered,
1148                                                      &r_u.needed, &r_u.returned);
1149
1150         if(!spoolss_io_r_enumprintprocdatatypes("", &r_u, rdata, 0)) {
1151                 DEBUG(0,("spoolss_io_r_enumprintprocdatatypes: unable to marshall SPOOL_R_ENUMPRINTPROCDATATYPES.\n"));
1152                 new_spoolss_free_buffer(q_u.buffer);
1153                 return False;
1154         }
1155         
1156         new_spoolss_free_buffer(q_u.buffer);
1157         
1158         return True;
1159 }
1160
1161 /****************************************************************************
1162 ****************************************************************************/
1163 static BOOL api_spoolss_enumprintmonitors(pipes_struct *p)
1164 {
1165         SPOOL_Q_ENUMPRINTMONITORS q_u;
1166         SPOOL_R_ENUMPRINTMONITORS r_u;
1167         prs_struct *data = &p->in_data.data;
1168         prs_struct *rdata = &p->out_data.rdata;
1169
1170         ZERO_STRUCT(q_u);
1171         ZERO_STRUCT(r_u);
1172         
1173         if(!new_spoolss_allocate_buffer(&q_u.buffer))
1174                 return False;
1175
1176         if (!spoolss_io_q_enumprintmonitors("", &q_u, data, 0)) {
1177                 DEBUG(0,("spoolss_io_q_enumprintmonitors: unable to unmarshall SPOOL_Q_ENUMPRINTMONITORS.\n"));
1178                 return False;
1179         }
1180                 
1181         /* that's an [in out] buffer */
1182         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
1183
1184         r_u.status = _spoolss_enumprintmonitors(&q_u.name, q_u.level,
1185                                                 r_u.buffer, q_u.offered,
1186                                                 &r_u.needed, &r_u.returned);
1187
1188         if (!spoolss_io_r_enumprintmonitors("", &r_u, rdata, 0)) {
1189                 DEBUG(0,("spoolss_io_r_enumprintmonitors: unable to marshall SPOOL_R_ENUMPRINTMONITORS.\n"));
1190                 new_spoolss_free_buffer(q_u.buffer);
1191                 return False;
1192         }
1193         
1194         new_spoolss_free_buffer(q_u.buffer);
1195         
1196         return True;
1197 }
1198
1199 /****************************************************************************
1200 ****************************************************************************/
1201 static BOOL api_spoolss_getjob(pipes_struct *p)
1202 {
1203         SPOOL_Q_GETJOB q_u;
1204         SPOOL_R_GETJOB r_u;
1205         prs_struct *data = &p->in_data.data;
1206         prs_struct *rdata = &p->out_data.rdata;
1207         
1208         if(!new_spoolss_allocate_buffer(&q_u.buffer))
1209                 return False;
1210
1211         if(!spoolss_io_q_getjob("", &q_u, data, 0)) {
1212                 DEBUG(0,("spoolss_io_q_getjob: unable to unmarshall SPOOL_Q_GETJOB.\n"));
1213                 return False;
1214         }
1215
1216         /* that's an [in out] buffer */
1217         new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
1218
1219         r_u.status = _spoolss_getjob(&q_u.handle, q_u.jobid, q_u.level,
1220                                         r_u.buffer, q_u.offered,
1221                                         &r_u.needed);
1222         
1223         if(!spoolss_io_r_getjob("",&r_u,rdata,0)) {
1224                 DEBUG(0,("spoolss_io_r_getjob: unable to marshall SPOOL_R_GETJOB.\n"));
1225                 new_spoolss_free_buffer(q_u.buffer);
1226                 return False;
1227         }
1228                 
1229         new_spoolss_free_buffer(q_u.buffer);
1230         return True;
1231 }
1232
1233 /*******************************************************************
1234 \pipe\spoolss commands
1235 ********************************************************************/
1236 struct api_struct api_spoolss_cmds[] = 
1237 {
1238  {"SPOOLSS_OPENPRINTEREX",             SPOOLSS_OPENPRINTEREX,             api_spoolss_open_printer_ex           },
1239  {"SPOOLSS_GETPRINTERDATA",            SPOOLSS_GETPRINTERDATA,            api_spoolss_getprinterdata            },
1240  {"SPOOLSS_CLOSEPRINTER",              SPOOLSS_CLOSEPRINTER,              api_spoolss_closeprinter              },
1241  {"SPOOLSS_DELETEPRINTER",             SPOOLSS_DELETEPRINTER,             api_spoolss_deleteprinter             },
1242  {"SPOOLSS_ABORTPRINTER",              SPOOLSS_ABORTPRINTER,              api_spoolss_abortprinter              },
1243  {"SPOOLSS_RFFPCNEX",                  SPOOLSS_RFFPCNEX,                  api_spoolss_rffpcnex                  },
1244  {"SPOOLSS_RFNPCNEX",                  SPOOLSS_RFNPCNEX,                  api_spoolss_rfnpcnex                  },
1245  {"SPOOLSS_ENUMPRINTERS",              SPOOLSS_ENUMPRINTERS,              api_spoolss_enumprinters              },
1246  {"SPOOLSS_GETPRINTER",                SPOOLSS_GETPRINTER,                api_spoolss_getprinter                },
1247  {"SPOOLSS_GETPRINTERDRIVER2",         SPOOLSS_GETPRINTERDRIVER2,         api_spoolss_getprinterdriver2         }, 
1248  {"SPOOLSS_STARTPAGEPRINTER",          SPOOLSS_STARTPAGEPRINTER,          api_spoolss_startpageprinter          },
1249  {"SPOOLSS_ENDPAGEPRINTER",            SPOOLSS_ENDPAGEPRINTER,            api_spoolss_endpageprinter            }, 
1250  {"SPOOLSS_STARTDOCPRINTER",           SPOOLSS_STARTDOCPRINTER,           api_spoolss_startdocprinter           },
1251  {"SPOOLSS_ENDDOCPRINTER",             SPOOLSS_ENDDOCPRINTER,             api_spoolss_enddocprinter             },
1252  {"SPOOLSS_WRITEPRINTER",              SPOOLSS_WRITEPRINTER,              api_spoolss_writeprinter              },
1253  {"SPOOLSS_SETPRINTER",                SPOOLSS_SETPRINTER,                api_spoolss_setprinter                },
1254  {"SPOOLSS_FCPN",                      SPOOLSS_FCPN,                      api_spoolss_fcpn                      },
1255  {"SPOOLSS_ADDJOB",                    SPOOLSS_ADDJOB,                    api_spoolss_addjob                    },
1256  {"SPOOLSS_ENUMJOBS",                  SPOOLSS_ENUMJOBS,                  api_spoolss_enumjobs                  },
1257  {"SPOOLSS_SCHEDULEJOB",               SPOOLSS_SCHEDULEJOB,               api_spoolss_schedulejob               },
1258  {"SPOOLSS_SETJOB",                    SPOOLSS_SETJOB,                    api_spoolss_setjob                    },
1259  {"SPOOLSS_ENUMFORMS",                 SPOOLSS_ENUMFORMS,                 api_spoolss_enumforms                 },
1260  {"SPOOLSS_ENUMPORTS",                 SPOOLSS_ENUMPORTS,                 api_spoolss_enumports                 },
1261  {"SPOOLSS_ENUMPRINTERDRIVERS",        SPOOLSS_ENUMPRINTERDRIVERS,        api_spoolss_enumprinterdrivers        },
1262  {"SPOOLSS_ADDPRINTEREX",              SPOOLSS_ADDPRINTEREX,              api_spoolss_addprinterex              },
1263  {"SPOOLSS_ADDPRINTERDRIVER",          SPOOLSS_ADDPRINTERDRIVER,          api_spoolss_addprinterdriver          },
1264  {"SPOOLSS_GETPRINTERDRIVERDIRECTORY", SPOOLSS_GETPRINTERDRIVERDIRECTORY, api_spoolss_getprinterdriverdirectory },
1265  {"SPOOLSS_ENUMPRINTERDATA",           SPOOLSS_ENUMPRINTERDATA,           api_spoolss_enumprinterdata           },
1266  {"SPOOLSS_SETPRINTERDATA",            SPOOLSS_SETPRINTERDATA,            api_spoolss_setprinterdata            },
1267  {"SPOOLSS_ADDFORM",                   SPOOLSS_ADDFORM,                   api_spoolss_addform                   },
1268  {"SPOOLSS_SETFORM",                   SPOOLSS_SETFORM,                   api_spoolss_setform                   },
1269  {"SPOOLSS_ENUMPRINTPROCESSORS",       SPOOLSS_ENUMPRINTPROCESSORS,       api_spoolss_enumprintprocessors       },
1270  {"SPOOLSS_ENUMMONITORS",              SPOOLSS_ENUMMONITORS,              api_spoolss_enumprintmonitors         },
1271  {"SPOOLSS_GETJOB",                    SPOOLSS_GETJOB,                    api_spoolss_getjob                    },
1272  {"SPOOLSS_ENUMPRINTPROCDATATYPES",    SPOOLSS_ENUMPRINTPROCDATATYPES,    api_spoolss_enumprintprocdatatypes    },
1273  { NULL,                               0,                                 NULL                                  }
1274 };
1275
1276 /*******************************************************************
1277 receives a spoolss pipe and responds.
1278 ********************************************************************/
1279 BOOL api_spoolss_rpc(pipes_struct *p)
1280 {
1281         return api_rpcTNP(p, "api_spoolss_rpc", api_spoolss_cmds);
1282 }
1283
1284 #undef OLD_NTDOMAIN