2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1998,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-1998,
7 * Copyright (C) Jean François Micouleau 1998.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 extern int DEBUGLEVEL;
31 /*******************************************************************
32 return the length of a UNISTR string.
33 ********************************************************************/
34 static uint32 str_len_uni(UNISTR *source)
38 while (source->buffer[i]!=0x0000)
45 /*******************************************************************
46 This should be moved in a more generic lib.
47 ********************************************************************/
48 static void spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
50 prs_uint16("year", ps, depth, &(systime->year));
51 prs_uint16("month", ps, depth, &(systime->month));
52 prs_uint16("dayofweek", ps, depth, &(systime->dayofweek));
53 prs_uint16("day", ps, depth, &(systime->day));
54 prs_uint16("hour", ps, depth, &(systime->hour));
55 prs_uint16("minute", ps, depth, &(systime->minute));
56 prs_uint16("second", ps, depth, &(systime->second));
57 prs_uint16("milliseconds", ps, depth, &(systime->milliseconds));
60 /*******************************************************************
61 ********************************************************************/
62 void make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
64 systime->year=unixtime->tm_year+1900;
65 systime->month=unixtime->tm_mon+1;
66 systime->dayofweek=unixtime->tm_wday;
67 systime->day=unixtime->tm_mday;
68 systime->hour=unixtime->tm_hour;
69 systime->minute=unixtime->tm_min;
70 systime->second=unixtime->tm_sec;
71 systime->milliseconds=0;
74 /*******************************************************************
75 reads or writes an PRINTER_HND structure.
76 ********************************************************************/
77 static void smb_io_prt_hnd(char *desc, PRINTER_HND *hnd, prs_struct *ps, int depth)
79 if (hnd == NULL) return;
81 prs_debug(ps, depth, desc, "smb_io_prt_hnd");
86 prs_uint8s (False, "data", ps, depth, hnd->data, PRINTER_HND_SIZE);
89 /*******************************************************************
90 reads or writes an DOC_INFO structure.
91 ********************************************************************/
92 static void smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
94 if (info_1 == NULL) return;
96 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
101 prs_uint32("p_docname", ps, depth, &(info_1->p_docname));
102 prs_uint32("p_outputfile", ps, depth, &(info_1->p_outputfile));
103 prs_uint32("p_datatype", ps, depth, &(info_1->p_datatype));
105 smb_io_unistr2("", &(info_1->docname), info_1->p_docname, ps, depth);
106 smb_io_unistr2("", &(info_1->outputfile), info_1->p_outputfile, ps, depth);
107 smb_io_unistr2("", &(info_1->datatype), info_1->p_datatype, ps, depth);
110 /*******************************************************************
111 reads or writes an DOC_INFO structure.
112 ********************************************************************/
113 static void smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
115 uint32 useless_ptr=0;
117 if (info == NULL) return;
119 prs_debug(ps, depth, desc, "smb_io_doc_info");
124 prs_uint32("switch_value", ps, depth, &(info->switch_value));
126 prs_uint32("doc_info_X ptr", ps, depth, &(useless_ptr));
128 switch (info->switch_value)
131 smb_io_doc_info_1("",&(info->doc_info_1), ps, depth);
135 this is just a placeholder
137 MSDN July 1998 says doc_info_2 is only on
138 Windows 95, and as Win95 doesn't do RPC to print
139 this case is nearly impossible
141 Maybe one day with Windows for dishwasher 2037 ...
144 /* smb_io_doc_info_2("",&(info->doc_info_2), ps, depth); */
147 DEBUG(0,("Something is obviously wrong somewhere !\n"));
152 /*******************************************************************
153 reads or writes an DOC_INFO_CONTAINER structure.
154 ********************************************************************/
155 static void smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
157 if (cont == NULL) return;
159 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
164 prs_uint32("level", ps, depth, &(cont->level));
166 smb_io_doc_info("",&(cont->docinfo), ps, depth);
169 /*******************************************************************
170 reads or writes an NOTIFY OPTION TYPE structure.
171 ********************************************************************/
172 static void smb_io_notify_option_type(char *desc,
173 SPOOL_NOTIFY_OPTION_TYPE *type,
174 prs_struct *ps, int depth)
178 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
183 prs_uint16("type", ps, depth, &(type->type));
184 prs_uint16("reserved0", ps, depth, &(type->reserved0));
185 prs_uint32("reserved1", ps, depth, &(type->reserved1));
186 prs_uint32("reserved2", ps, depth, &(type->reserved2));
187 prs_uint32("count", ps, depth, &(type->count));
188 prs_uint32("useless ptr", ps, depth, &useless_ptr);
192 /*******************************************************************
193 reads or writes an NOTIFY OPTION TYPE DATA.
194 ********************************************************************/
195 static void smb_io_notify_option_type_data(char *desc,
196 SPOOL_NOTIFY_OPTION_TYPE *type,
197 prs_struct *ps, int depth)
202 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
207 prs_uint32("count", ps, depth, &count);
209 if (count != type->count)
211 DEBUG(4,("What a mess, count was %x now is %x !\n",type->count,count));
216 /* read the option type struct */
217 prs_uint16("fields",ps,depth,&(type->fields[i]));
221 /*******************************************************************
222 reads or writes an NOTIFY OPTION structure.
223 ********************************************************************/
224 static void smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option,
225 prs_struct *ps, int depth)
230 prs_debug(ps, depth, desc, "smb_io_notify_option");
235 /* memory pointer to the struct */
236 prs_uint32("useless ptr", ps, depth, &useless_ptr);
238 prs_uint32("version", ps, depth, &(option->version));
239 prs_uint32("reserved", ps, depth, &(option->reserved));
240 prs_uint32("count", ps, depth, &(option->count));
241 prs_uint32("useless ptr", ps, depth, &useless_ptr);
242 prs_uint32("count", ps, depth, &(option->count));
244 /* read the option type struct */
245 for(i=0;i<option->count;i++)
247 smb_io_notify_option_type("",&(option->type[i]) ,ps, depth);
250 /* now read the type associated with the option type struct */
251 for(i=0;i<option->count;i++)
253 smb_io_notify_option_type_data("",&(option->type[i]) ,ps, depth);
259 /*******************************************************************
260 reads or writes an NOTIFY INFO DATA structure.
261 ********************************************************************/
262 static void smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
263 prs_struct *ps, int depth)
265 uint32 useless_ptr=0xADDE0FF0;
267 uint32 how_many_words;
271 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
274 how_many_words=data->size;
275 if (how_many_words==POINTER)
277 how_many_words=TWO_VALUE;
280 isvalue=data->enc_type;
283 prs_uint16("type", ps, depth, &(data->type));
284 prs_uint16("field", ps, depth, &(data->field));
287 prs_uint32("how many words", ps, depth, &how_many_words);
288 prs_uint32("id", ps, depth, &(data->id));
289 prs_uint32("how many words", ps, depth, &how_many_words);
294 prs_uint32("value[0]", ps, depth, &(data->notify_data.value[0]));
295 prs_uint32("value[1]", ps, depth, &(data->notify_data.value[1]));
301 /* length in ascii including \0 */
302 x=2*(data->notify_data.data.length+1);
303 prs_uint32("string length", ps, depth, &x );
304 prs_uint32("pointer", ps, depth, &useless_ptr);
309 /*******************************************************************
310 reads or writes an NOTIFY INFO DATA structure.
311 ********************************************************************/
312 void smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
313 prs_struct *ps, int depth)
318 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
322 isvalue=data->enc_type;
326 /* length of string in unicode include \0 */
327 x=data->notify_data.data.length+1;
328 prs_uint32("string length", ps, depth, &x );
329 prs_uint16s(True,"string",ps,depth,data->notify_data.data.string,x);
334 /*******************************************************************
335 reads or writes an NOTIFY INFO structure.
336 ********************************************************************/
337 static void smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info,
338 prs_struct *ps, int depth)
340 uint32 useless_ptr=0x0001;
344 prs_debug(ps, depth, desc, "smb_io_notify_info");
349 prs_uint32("pointer", ps, depth, &useless_ptr);
350 prs_uint32("count", ps, depth, &(info->count));
351 prs_uint32("version", ps, depth, &(info->version));
352 prs_uint32("flags", ps, depth, &(info->flags));
353 prs_uint32("count", ps, depth, &(info->count));
355 for (i=0;i<info->count;i++)
358 smb_io_notify_info_data(desc, &(info->data[i]), ps, depth);
361 /* now do the strings at the end of the stream */
362 for (i=0;i<info->count;i++)
365 smb_io_notify_info_data_strings(desc, &(info->data[i]),
370 /*******************************************************************
372 * called from spoolss_r_open_printer (srv_spoolss.c)
373 ********************************************************************/
374 void spoolss_io_r_open_printer(char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
376 if (r_u == NULL) return;
378 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
382 smb_io_prt_hnd("printer handle",&(r_u->handle),ps,depth);
386 prs_uint32("status code", ps, depth, &(r_u->status));
390 /*******************************************************************
392 * called from spoolss_q_open_printer (srv_spoolss.c)
393 ********************************************************************/
394 void spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
396 if (q_u == NULL) return;
398 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
403 prs_uint32("unknown0", ps, depth, &(q_u->unknown0));
404 smb_io_unistr2("", &(q_u->printername),True,ps,depth);
408 prs_uint32("unknown1", ps, depth, &(q_u->unknown1));
409 prs_uint32("cbbuf", ps, depth, &(q_u->cbbuf));
410 prs_uint32("devmod", ps, depth, &(q_u->devmod));
411 prs_uint32("access required", ps, depth, &(q_u->access_required));
413 /* don't care to decode end of packet by now */
414 /* but when acl will be implemented, it will be useful */
416 prs_uint32("unknown2", ps, depth, &(q_u->unknown2));
417 prs_uint32("unknown3", ps, depth, &(q_u->unknown3));
418 prs_uint32("unknown4", ps, depth, &(q_u->unknown4));
419 prs_uint32("unknown5", ps, depth, &(q_u->unknown5));
420 prs_uint32("unknown6", ps, depth, &(q_u->unknown6));
421 prs_uint32("unknown7", ps, depth, &(q_u->unknown7));
422 prs_uint32("unknown8", ps, depth, &(q_u->unknown8));
423 prs_uint32("unknown9", ps, depth, &(q_u->unknown9));
424 prs_uint32("unknown10", ps, depth, &(q_u->unknown10));
425 prs_uint32("unknown11", ps, depth, &(q_u->unknown11));
427 smb_io_unistr2("", &(q_u->station),True,ps,depth);
429 smb_io_unistr2("", &(q_u->username),True,ps,depth);
432 /*******************************************************************
434 * called from spoolss_q_getprinterdata (srv_spoolss.c)
435 ********************************************************************/
436 void spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
438 if (q_u == NULL) return;
440 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
444 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
446 smb_io_unistr2("", &(q_u->valuename),True,ps,depth);
448 prs_uint32("size", ps, depth, &(q_u->size));
451 /*******************************************************************
453 * called from spoolss_r_getprinterdata (srv_spoolss.c)
454 ********************************************************************/
455 void spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
457 if (r_u == NULL) return;
459 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
462 /* grow buffer mem enough */
463 mem_grow_data(&(ps->data), ps->io, r_u->size+100, 0);
466 prs_uint32("type", ps, depth, &(r_u->type));
467 prs_uint32("size", ps, depth, &(r_u->size));
469 prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size);
472 prs_uint32("needed", ps, depth, &(r_u->needed));
473 prs_uint32("status", ps, depth, &(r_u->status));
477 /*******************************************************************
479 * called from spoolss_q_closeprinter (srv_spoolss.c)
480 ********************************************************************/
481 void spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
483 if (q_u == NULL) return;
485 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
490 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
493 /*******************************************************************
495 * called from spoolss_r_closeprinter (srv_spoolss.c)
496 ********************************************************************/
497 void spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
499 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
503 smb_io_prt_hnd("printer handle",&(r_u->handle),ps,depth);
504 prs_uint32("status", ps, depth, &(r_u->status));
508 /*******************************************************************
510 * called from spoolss_q_startdocprinter (srv_spoolss.c)
511 ********************************************************************/
512 void spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
514 if (q_u == NULL) return;
516 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
521 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
523 smb_io_doc_info_container("",&(q_u->doc_info_container), ps, depth);
526 /*******************************************************************
528 * called from spoolss_r_startdocprinter (srv_spoolss.c)
529 ********************************************************************/
530 void spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
532 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
534 prs_uint32("jobid", ps, depth, &(r_u->jobid));
535 prs_uint32("status", ps, depth, &(r_u->status));
538 /*******************************************************************
540 * called from spoolss_q_enddocprinter (srv_spoolss.c)
541 ********************************************************************/
542 void spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
544 if (q_u == NULL) return;
546 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
551 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
554 /*******************************************************************
556 * called from spoolss_r_enddocprinter (srv_spoolss.c)
557 ********************************************************************/
558 void spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
560 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
562 prs_uint32("status", ps, depth, &(r_u->status));
565 /*******************************************************************
567 * called from spoolss_q_startpageprinter (srv_spoolss.c)
568 ********************************************************************/
569 void spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
571 if (q_u == NULL) return;
573 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
578 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
581 /*******************************************************************
583 * called from spoolss_r_startpageprinter (srv_spoolss.c)
584 ********************************************************************/
585 void spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
587 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
589 prs_uint32("status", ps, depth, &(r_u->status));
592 /*******************************************************************
594 * called from spoolss_q_endpageprinter (srv_spoolss.c)
595 ********************************************************************/
596 void spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
598 if (q_u == NULL) return;
600 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
605 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
608 /*******************************************************************
610 * called from spoolss_r_endpageprinter (srv_spoolss.c)
611 ********************************************************************/
612 void spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
614 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
616 prs_uint32("status", ps, depth, &(r_u->status));
619 /*******************************************************************
621 * called from spoolss_q_writeprinter (srv_spoolss.c)
622 ********************************************************************/
623 void spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
625 if (q_u == NULL) return;
627 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
632 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
633 prs_uint32("buffer_size", ps, depth, &(q_u->buffer_size));
635 if (q_u->buffer_size!=0)
637 q_u->buffer=(uint8 *)malloc(q_u->buffer_size*sizeof(uint8));
638 prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size);
641 prs_uint32("buffer_size2", ps, depth, &(q_u->buffer_size2));
644 /*******************************************************************
646 * called from spoolss_r_writeprinter (srv_spoolss.c)
647 ********************************************************************/
648 void spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
650 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
652 prs_uint32("buffer_written", ps, depth, &(r_u->buffer_written));
653 prs_uint32("status", ps, depth, &(r_u->status));
656 /*******************************************************************
658 * called from spoolss_q_rffpcnex (srv_spoolss.c)
659 ********************************************************************/
660 void spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u,
661 prs_struct *ps, int depth)
665 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
669 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
670 prs_uint32("flags", ps, depth, &(q_u->flags));
671 prs_uint32("options", ps, depth, &(q_u->options));
672 prs_uint32("useless ptr", ps, depth, &useless_ptr);
675 smb_io_unistr2("", &(q_u->localmachine), True, ps, depth);
678 prs_uint32("printerlocal", ps, depth, &(q_u->printerlocal));
680 smb_io_notify_option("notify option", &(q_u->option), ps, depth);
684 /*******************************************************************
686 * called from spoolss_r_rffpcnex (srv_spoolss.c)
687 ********************************************************************/
688 void spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u,
689 prs_struct *ps, int depth)
691 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
694 prs_uint32("status", ps, depth, &(r_u->status));
697 /*******************************************************************
699 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
700 ********************************************************************/
701 void spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u,
702 prs_struct *ps, int depth)
705 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
710 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
712 prs_uint32("change", ps, depth, &(q_u->change));
714 smb_io_notify_option("notify option",&(q_u->option),ps,depth);
717 /*******************************************************************
719 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
720 ********************************************************************/
721 void spoolss_io_r_rfnpcnex(char *desc,
722 SPOOL_R_RFNPCNEX *r_u,
723 prs_struct *ps, int depth)
727 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
732 smb_io_notify_info("notify info",&(r_u->info),ps,depth);
734 prs_uint32("status", ps, depth, &(x));
737 /*******************************************************************
738 * return the length of a uint32 (obvious, but the code is clean)
739 ********************************************************************/
740 static uint32 size_of_uint32(uint32 *value)
742 return (sizeof(*value));
745 /*******************************************************************
746 * return the length of a UNICODE string in number of char, includes:
748 * - the relative pointer size
749 ********************************************************************/
750 static uint32 size_of_relative_string(UNISTR *string)
754 size=str_len_uni(string); /* the string length */
755 size=size+1; /* add the leading zero */
756 size=size*2; /* convert in char */
757 size=size+4; /* add the size of the ptr */
761 /*******************************************************************
762 * return the length of a uint32 (obvious, but the code is clean)
763 ********************************************************************/
764 static uint32 size_of_device_mode(DEVICEMODE *devmode)
772 /*******************************************************************
773 * return the length of a uint32 (obvious, but the code is clean)
774 ********************************************************************/
775 static uint32 size_of_systemtime(SYSTEMTIME *systime)
780 return (sizeof(SYSTEMTIME) +4);
783 /*******************************************************************
784 * write a UNICODE string.
785 * used by all the RPC structs passing a buffer
786 ********************************************************************/
787 static void spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
789 if (uni == NULL) return;
791 prs_debug(ps, depth, desc, "spoolss_smb_io_unistr");
793 prs_unistr("unistr", ps, depth, uni);
797 /*******************************************************************
798 * write a UNICODE string and its relative pointer.
799 * used by all the RPC structs passing a buffer
800 ********************************************************************/
801 static void smb_io_relstr(char *desc, prs_struct *ps, int depth, UNISTR *buffer,
802 uint32 *start_offset, uint32 *end_offset)
804 uint32 struct_offset;
805 uint32 relative_offset;
807 struct_offset=ps->offset;
808 *end_offset-= 2*(str_len_uni(buffer)+1);
809 ps->offset=*end_offset;
810 spoolss_smb_io_unistr(desc, buffer, ps, depth);
812 ps->offset=struct_offset;
813 relative_offset=*end_offset-*start_offset;
815 prs_uint32("offset", ps, depth, &(relative_offset));
819 /*******************************************************************
820 * write a array UNICODE strings and its relative pointer.
821 * used by 2 RPC structs
822 ********************************************************************/
823 static void smb_io_relarraystr(char *desc, prs_struct *ps, int depth, UNISTR ***buffer,
824 uint32 *start_offset, uint32 *end_offset)
827 uint32 struct_offset;
828 uint32 relative_offset;
829 struct_offset=ps->offset;
832 while ( (*buffer)[i]!=0x0000 )
834 *end_offset-= 2*(str_len_uni((*buffer)[i])+1);
835 ps->offset=*end_offset;
836 spoolss_smb_io_unistr(desc, (*buffer)[i], ps, depth);
841 ps->offset=struct_offset;
842 relative_offset=*end_offset-*start_offset;
844 prs_uint32("offset", ps, depth, &(relative_offset));
847 /*******************************************************************
848 * write a DEVICEMODE struct.
849 * on reading allocate memory for the private member
850 ********************************************************************/
851 static void smb_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
853 prs_debug(ps, depth, desc, "smb_io_devmode");
856 prs_uint16s(True,"devicename", ps, depth, devmode->devicename.buffer, 32);
857 prs_uint16("specversion", ps, depth, &(devmode->specversion));
858 prs_uint16("driverversion", ps, depth, &(devmode->driverversion));
859 prs_uint16("size", ps, depth, &(devmode->size));
860 prs_uint16("driverextra", ps, depth, &(devmode->driverextra));
861 prs_uint32("fields", ps, depth, &(devmode->fields));
862 prs_uint16("orientation", ps, depth, &(devmode->orientation));
863 prs_uint16("papersize", ps, depth, &(devmode->papersize));
864 prs_uint16("paperlength", ps, depth, &(devmode->paperlength));
865 prs_uint16("paperwidth", ps, depth, &(devmode->paperwidth));
866 prs_uint16("scale", ps, depth, &(devmode->scale));
867 prs_uint16("copies", ps, depth, &(devmode->copies));
868 prs_uint16("defaultsource", ps, depth, &(devmode->defaultsource));
869 prs_uint16("printquality", ps, depth, &(devmode->printquality));
870 prs_uint16("color", ps, depth, &(devmode->color));
871 prs_uint16("duplex", ps, depth, &(devmode->duplex));
872 prs_uint16("yresolution", ps, depth, &(devmode->yresolution));
873 prs_uint16("ttoption", ps, depth, &(devmode->ttoption));
874 prs_uint16("collate", ps, depth, &(devmode->collate));
875 prs_uint16s(True, "formname", ps, depth, devmode->formname.buffer, 32);
876 prs_uint16("logpixels", ps, depth, &(devmode->logpixels));
877 prs_uint32("bitsperpel", ps, depth, &(devmode->bitsperpel));
878 prs_uint32("pelswidth", ps, depth, &(devmode->pelswidth));
879 prs_uint32("pelsheight", ps, depth, &(devmode->pelsheight));
880 prs_uint32("displayflags", ps, depth, &(devmode->displayflags));
881 prs_uint32("displayfrequency", ps, depth, &(devmode->displayfrequency));
882 prs_uint32("icmmethod", ps, depth, &(devmode->icmmethod));
883 prs_uint32("icmintent", ps, depth, &(devmode->icmintent));
884 prs_uint32("mediatype", ps, depth, &(devmode->mediatype));
885 prs_uint32("dithertype", ps, depth, &(devmode->dithertype));
886 prs_uint32("reserved1", ps, depth, &(devmode->reserved1));
887 prs_uint32("reserved2", ps, depth, &(devmode->reserved2));
888 prs_uint32("panningwidth", ps, depth, &(devmode->panningwidth));
889 prs_uint32("panningheight", ps, depth, &(devmode->panningheight));
891 if (devmode->driverextra!=0)
895 devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8));
896 DEBUG(7,("smb_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
898 DEBUG(7,("smb_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
900 prs_uint8s(True, "private", ps, depth, devmode->private, devmode->driverextra);
901 DEBUG(8,("smb_io_devmode: parsed\n"));
905 /*******************************************************************
906 * write a DEVMODE struct and its relative pointer.
907 * used by all the RPC structs passing a buffer
908 ********************************************************************/
909 static void smb_io_reldevmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode,
910 uint32 *start_offset, uint32 *end_offset)
912 uint32 struct_offset;
913 uint32 relative_offset;
915 prs_debug(ps, depth, desc, "smb_io_reldevmode");
918 struct_offset=ps->offset;
919 *end_offset-= (devmode->size+devmode->driverextra);
920 ps->offset=*end_offset;
922 smb_io_devmode(desc, ps, depth, devmode);
924 ps->offset=struct_offset;
925 relative_offset=*end_offset-*start_offset;
927 prs_uint32("offset", ps, depth, &(relative_offset));
930 /*******************************************************************
931 ********************************************************************/
932 static void smb_io_printer_info_0(char *desc, PRINTER_INFO_0 *info, prs_struct *ps, int depth,
933 uint32 *start_offset, uint32 *end_offset)
935 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
937 *start_offset=ps->offset;
939 smb_io_relstr("printername",ps, depth, &(info->printername), start_offset, end_offset);
940 smb_io_relstr("servername",ps, depth, &(info->servername), start_offset, end_offset);
941 prs_uint32("cjobs", ps, depth, &(info->cjobs));
942 prs_uint32("attributes", ps, depth, &(info->attributes));
944 prs_uint32("unknown0", ps, depth, &(info->unknown0));
945 prs_uint32("unknown1", ps, depth, &(info->unknown1));
946 prs_uint32("unknown2", ps, depth, &(info->unknown2));
947 prs_uint32("unknown3", ps, depth, &(info->unknown3));
948 prs_uint32("unknown4", ps, depth, &(info->unknown4));
949 prs_uint32("unknown5", ps, depth, &(info->unknown5));
950 prs_uint32("unknown6", ps, depth, &(info->unknown6));
951 prs_uint16("majorversion", ps, depth, &(info->majorversion));
952 prs_uint16("buildversion", ps, depth, &(info->buildversion));
953 prs_uint32("unknown7", ps, depth, &(info->unknown7));
954 prs_uint32("unknown8", ps, depth, &(info->unknown8));
955 prs_uint32("unknown9", ps, depth, &(info->unknown9));
956 prs_uint32("unknown10", ps, depth, &(info->unknown10));
957 prs_uint32("unknown11", ps, depth, &(info->unknown11));
958 prs_uint32("unknown12", ps, depth, &(info->unknown12));
959 prs_uint32("unknown13", ps, depth, &(info->unknown13));
960 prs_uint32("unknown14", ps, depth, &(info->unknown14));
961 prs_uint32("unknown15", ps, depth, &(info->unknown15));
962 prs_uint32("unknown16", ps, depth, &(info->unknown16));
963 prs_uint32("unknown17", ps, depth, &(info->unknown17));
964 prs_uint32("unknown18", ps, depth, &(info->unknown18));
965 prs_uint32("status" , ps, depth, &(info->status));
966 prs_uint32("unknown20", ps, depth, &(info->unknown20));
967 prs_uint32("unknown21", ps, depth, &(info->unknown21));
968 prs_uint16("unknown22", ps, depth, &(info->unknown22));
969 prs_uint32("unknown23", ps, depth, &(info->unknown23));
972 /*******************************************************************
973 ********************************************************************/
974 static void smb_io_printer_info_1(char *desc, PRINTER_INFO_1 *info, prs_struct *ps, int depth,
975 uint32 *start_offset, uint32 *end_offset)
977 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
979 *start_offset=ps->offset;
981 prs_uint32("flags", ps, depth, &(info->flags));
982 smb_io_relstr("description",ps, depth, &(info->description), start_offset, end_offset);
983 smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset);
984 smb_io_relstr("comment",ps, depth, &(info->comment), start_offset, end_offset);
987 /*******************************************************************
988 ********************************************************************/
989 static void smb_io_printer_info_2(char *desc, PRINTER_INFO_2 *info, prs_struct *ps, int depth,
990 uint32 *start_offset, uint32 *end_offset)
993 uint32 devmode_offset;
994 uint32 backup_offset;
996 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
998 *start_offset=ps->offset;
1000 smb_io_relstr("servername", ps, depth, &(info->servername), start_offset, end_offset);
1001 smb_io_relstr("printername", ps, depth, &(info->printername), start_offset, end_offset);
1002 smb_io_relstr("sharename", ps, depth, &(info->sharename), start_offset, end_offset);
1003 smb_io_relstr("portname", ps, depth, &(info->portname), start_offset, end_offset);
1004 smb_io_relstr("drivername", ps, depth, &(info->drivername), start_offset, end_offset);
1005 smb_io_relstr("comment", ps, depth, &(info->comment), start_offset, end_offset);
1006 smb_io_relstr("location", ps, depth, &(info->location), start_offset, end_offset);
1008 devmode_offset=ps->offset;
1009 ps->offset=ps->offset+4;
1011 smb_io_relstr("sepfile", ps, depth, &(info->sepfile), start_offset, end_offset);
1012 smb_io_relstr("printprocessor",ps, depth, &(info->printprocessor), start_offset, end_offset);
1013 smb_io_relstr("datatype", ps, depth, &(info->datatype), start_offset, end_offset);
1014 smb_io_relstr("parameters", ps, depth, &(info->parameters), start_offset, end_offset);
1016 prs_uint32("security descriptor", ps, depth, &(pipo));
1018 prs_uint32("attributes", ps, depth, &(info->attributes));
1019 prs_uint32("priority", ps, depth, &(info->priority));
1020 prs_uint32("defpriority", ps, depth, &(info->defaultpriority));
1021 prs_uint32("starttime", ps, depth, &(info->starttime));
1022 prs_uint32("untiltime", ps, depth, &(info->untiltime));
1023 prs_uint32("status", ps, depth, &(info->status));
1024 prs_uint32("jobs", ps, depth, &(info->cjobs));
1025 prs_uint32("averageppm", ps, depth, &(info->averageppm));
1028 I'm not sure if putting the devmode at the end the struct is worth it
1031 backup_offset=ps->offset;
1032 ps->offset=devmode_offset;
1033 smb_io_reldevmode("devmode", ps, depth, info->devmode, start_offset, end_offset);
1034 ps->offset=backup_offset;
1037 /*******************************************************************
1038 ********************************************************************/
1039 static void smb_io_printer_driver_info_1(char *desc, DRIVER_INFO_1 *info, prs_struct *ps, int depth,
1040 uint32 *start_offset, uint32 *end_offset)
1042 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
1044 *start_offset=ps->offset;
1046 smb_io_relstr("name", ps, depth, &(info->name), start_offset, end_offset);
1049 /*******************************************************************
1050 ********************************************************************/
1051 static void smb_io_printer_driver_info_2(char *desc, DRIVER_INFO_2 *info,prs_struct *ps, int depth,
1052 uint32 *start_offset, uint32 *end_offset)
1054 prs_debug(ps, depth, desc, "smb_io_printer_xxx");
1056 *start_offset=ps->offset;
1058 prs_uint32("version", ps, depth, &(info->version));
1059 smb_io_relstr("name", ps, depth, &(info->name), start_offset, end_offset);
1060 smb_io_relstr("architecture", ps, depth, &(info->architecture), start_offset, end_offset);
1061 smb_io_relstr("driverpath", ps, depth, &(info->driverpath), start_offset, end_offset);
1062 smb_io_relstr("datafile", ps, depth, &(info->datafile), start_offset, end_offset);
1063 smb_io_relstr("configfile", ps, depth, &(info->configfile), start_offset, end_offset);
1066 /*******************************************************************
1067 ********************************************************************/
1068 static void smb_io_printer_driver_info_3(char *desc, DRIVER_INFO_3 *info,prs_struct *ps, int depth,
1069 uint32 *start_offset, uint32 *end_offset)
1071 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
1073 *start_offset=ps->offset;
1075 prs_uint32("version", ps, depth, &(info->version));
1076 smb_io_relstr("name", ps, depth, &(info->name), start_offset, end_offset);
1077 smb_io_relstr("architecture", ps, depth, &(info->architecture), start_offset, end_offset);
1078 smb_io_relstr("driverpath", ps, depth, &(info->driverpath), start_offset, end_offset);
1079 smb_io_relstr("datafile", ps, depth, &(info->datafile), start_offset, end_offset);
1080 smb_io_relstr("configfile", ps, depth, &(info->configfile), start_offset, end_offset);
1081 smb_io_relstr("helpfile", ps, depth, &(info->helpfile), start_offset, end_offset);
1083 smb_io_relarraystr("dependentfiles", ps, depth, &(info->dependentfiles), start_offset, end_offset);
1085 smb_io_relstr("monitorname", ps, depth, &(info->monitorname), start_offset, end_offset);
1086 smb_io_relstr("defaultdatatype", ps, depth, &(info->defaultdatatype), start_offset, end_offset);
1089 /*******************************************************************
1090 ********************************************************************/
1091 static void smb_io_job_info_1(char *desc, JOB_INFO_1 *info, prs_struct *ps, int depth,
1092 uint32 *start_offset, uint32 *end_offset)
1094 prs_debug(ps, depth, desc, "smb_io_job_info_1");
1096 *start_offset=ps->offset;
1098 prs_uint32("jobid", ps, depth, &(info->jobid));
1099 smb_io_relstr("printername", ps, depth, &(info->printername), start_offset, end_offset);
1100 smb_io_relstr("machinename", ps, depth, &(info->machinename), start_offset, end_offset);
1101 smb_io_relstr("username", ps, depth, &(info->username), start_offset, end_offset);
1102 smb_io_relstr("document", ps, depth, &(info->document), start_offset, end_offset);
1103 smb_io_relstr("datatype", ps, depth, &(info->datatype), start_offset, end_offset);
1104 smb_io_relstr("text_status", ps, depth, &(info->text_status), start_offset, end_offset);
1105 prs_uint32("status", ps, depth, &(info->status));
1106 prs_uint32("priority", ps, depth, &(info->priority));
1107 prs_uint32("position", ps, depth, &(info->position));
1108 prs_uint32("totalpages", ps, depth, &(info->totalpages));
1109 prs_uint32("pagesprinted", ps, depth, &(info->pagesprinted));
1110 spoolss_io_system_time("submitted", ps, depth, &(info->submitted) );
1113 /*******************************************************************
1114 ********************************************************************/
1115 static void smb_io_job_info_2(char *desc, JOB_INFO_2 *info, prs_struct *ps, int depth,
1116 uint32 *start_offset, uint32 *end_offset)
1119 prs_debug(ps, depth, desc, "smb_io_job_info_2");
1121 *start_offset=ps->offset;
1123 prs_uint32("jobid", ps, depth, &(info->jobid));
1124 smb_io_relstr("printername", ps, depth, &(info->printername), start_offset, end_offset);
1125 smb_io_relstr("machinename", ps, depth, &(info->machinename), start_offset, end_offset);
1126 smb_io_relstr("username", ps, depth, &(info->username), start_offset, end_offset);
1127 smb_io_relstr("document", ps, depth, &(info->document), start_offset, end_offset);
1128 smb_io_relstr("notifyname", ps, depth, &(info->notifyname), start_offset, end_offset);
1129 smb_io_relstr("datatype", ps, depth, &(info->datatype), start_offset, end_offset);
1131 smb_io_relstr("printprocessor", ps, depth, &(info->printprocessor), start_offset, end_offset);
1132 smb_io_relstr("parameters", ps, depth, &(info->parameters), start_offset, end_offset);
1133 smb_io_relstr("drivername", ps, depth, &(info->drivername), start_offset, end_offset);
1134 smb_io_reldevmode("devmode", ps, depth, info->devmode, start_offset, end_offset);
1135 smb_io_relstr("text_status", ps, depth, &(info->text_status), start_offset, end_offset);
1137 /* SEC_DESC sec_desc;*/
1138 prs_uint32("Hack! sec desc", ps, depth, &pipo);
1140 prs_uint32("status", ps, depth, &(info->status));
1141 prs_uint32("priority", ps, depth, &(info->priority));
1142 prs_uint32("position", ps, depth, &(info->position));
1143 prs_uint32("starttime", ps, depth, &(info->starttime));
1144 prs_uint32("untiltime", ps, depth, &(info->untiltime));
1145 prs_uint32("totalpages", ps, depth, &(info->totalpages));
1146 prs_uint32("size", ps, depth, &(info->size));
1147 spoolss_io_system_time("submitted", ps, depth, &(info->submitted) );
1148 prs_uint32("timeelapsed", ps, depth, &(info->timeelapsed));
1149 prs_uint32("pagesprinted", ps, depth, &(info->pagesprinted));
1152 /*******************************************************************
1153 ********************************************************************/
1154 static void smb_io_form_1(char *desc, FORM_1 *info, prs_struct *ps, int depth,
1155 uint32 *start_offset, uint32 *end_offset)
1157 prs_debug(ps, depth, desc, "smb_io_form_1");
1159 *start_offset=ps->offset;
1161 prs_uint32("flag", ps, depth, &(info->flag));
1162 smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset);
1163 prs_uint32("width", ps, depth, &(info->width));
1164 prs_uint32("length", ps, depth, &(info->length));
1165 prs_uint32("left", ps, depth, &(info->left));
1166 prs_uint32("top", ps, depth, &(info->top));
1167 prs_uint32("right", ps, depth, &(info->right));
1168 prs_uint32("bottom", ps, depth, &(info->bottom));
1171 /*******************************************************************
1172 ********************************************************************/
1173 static void smb_io_port_2(char *desc, PORT_INFO_2 *info, prs_struct *ps, int depth,
1174 uint32 *start_offset, uint32 *end_offset)
1176 prs_debug(ps, depth, desc, "smb_io_form_1");
1178 *start_offset=ps->offset;
1180 smb_io_relstr("port_name",ps, depth, &(info->port_name), start_offset, end_offset);
1181 smb_io_relstr("monitor_name",ps, depth, &(info->monitor_name), start_offset, end_offset);
1182 smb_io_relstr("description",ps, depth, &(info->description), start_offset, end_offset);
1183 prs_uint32("port_type", ps, depth, &(info->port_type));
1184 prs_uint32("reserved", ps, depth, &(info->reserved));
1187 /*******************************************************************
1188 ********************************************************************/
1189 static void smb_io_processor_info_1(char *desc, PRINTPROCESSOR_1 *info, prs_struct *ps, int depth,
1190 uint32 *start_offset, uint32 *end_offset)
1192 prs_debug(ps, depth, desc, "smb_io_processor_info_1");
1194 *start_offset=ps->offset;
1196 smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset);
1199 /*******************************************************************
1200 ********************************************************************/
1201 static void smb_io_monitor_info_1(char *desc, PRINTMONITOR_1 *info, prs_struct *ps, int depth,
1202 uint32 *start_offset, uint32 *end_offset)
1204 prs_debug(ps, depth, desc, "smb_io_monitor_info_1");
1206 *start_offset=ps->offset;
1208 smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset);
1211 /*******************************************************************
1212 return the size required by a struct in the stream
1213 ********************************************************************/
1214 static uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
1218 size+=size_of_uint32( &(info->attributes) );
1219 size+=size_of_relative_string( &(info->printername) );
1220 size+=size_of_relative_string( &(info->servername) );
1224 /*******************************************************************
1225 return the size required by a struct in the stream
1226 ********************************************************************/
1227 static uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
1231 size+=size_of_uint32( &(info->flags) );
1232 size+=size_of_relative_string( &(info->description) );
1233 size+=size_of_relative_string( &(info->name) );
1234 size+=size_of_relative_string( &(info->comment) );
1238 /*******************************************************************
1239 return the size required by a struct in the stream
1240 ********************************************************************/
1241 static uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
1245 size+=4; /* the security descriptor */
1246 size+=info->devmode->size+4; /* size of the devmode and the ptr */
1247 size+=info->devmode->driverextra; /* if a devmode->private section exists, add its size */
1249 size+=size_of_relative_string( &(info->servername) );
1250 size+=size_of_relative_string( &(info->printername) );
1251 size+=size_of_relative_string( &(info->sharename) );
1252 size+=size_of_relative_string( &(info->portname) );
1253 size+=size_of_relative_string( &(info->drivername) );
1254 size+=size_of_relative_string( &(info->comment) );
1255 size+=size_of_relative_string( &(info->location) );
1257 size+=size_of_relative_string( &(info->sepfile) );
1258 size+=size_of_relative_string( &(info->printprocessor) );
1259 size+=size_of_relative_string( &(info->datatype) );
1260 size+=size_of_relative_string( &(info->parameters) );
1262 size+=size_of_uint32( &(info->attributes) );
1263 size+=size_of_uint32( &(info->priority) );
1264 size+=size_of_uint32( &(info->defaultpriority) );
1265 size+=size_of_uint32( &(info->starttime) );
1266 size+=size_of_uint32( &(info->untiltime) );
1267 size+=size_of_uint32( &(info->status) );
1268 size+=size_of_uint32( &(info->cjobs) );
1269 size+=size_of_uint32( &(info->averageppm) );
1273 /*******************************************************************
1274 return the size required by a struct in the stream
1275 ********************************************************************/
1276 static uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
1279 DEBUG(9,("Sizing driver info_1\n"));
1280 size+=size_of_relative_string( &(info->name) );
1282 DEBUGADD(9,("size: [%d]\n", size));
1286 /*******************************************************************
1287 return the size required by a struct in the stream
1288 ********************************************************************/
1289 static uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
1292 DEBUG(9,("Sizing driver info_2\n"));
1293 size+=size_of_uint32( &(info->version) );
1294 size+=size_of_relative_string( &(info->name) );
1295 size+=size_of_relative_string( &(info->architecture) );
1296 size+=size_of_relative_string( &(info->driverpath) );
1297 size+=size_of_relative_string( &(info->datafile) );
1298 size+=size_of_relative_string( &(info->configfile) );
1300 DEBUGADD(9,("size: [%d]\n", size));
1304 /*******************************************************************
1305 return the size required by a struct in the stream
1306 ********************************************************************/
1307 static uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
1313 DEBUG(9,("Sizing driver info_3\n"));
1314 size+=size_of_uint32( &(info->version) );
1315 size+=size_of_relative_string( &(info->name) );
1316 size+=size_of_relative_string( &(info->architecture) );
1317 size+=size_of_relative_string( &(info->driverpath) );
1318 size+=size_of_relative_string( &(info->datafile) );
1319 size+=size_of_relative_string( &(info->configfile) );
1320 size+=size_of_relative_string( &(info->helpfile) );
1321 size+=size_of_relative_string( &(info->monitorname) );
1322 size+=size_of_relative_string( &(info->defaultdatatype) );
1324 string=info->dependentfiles;
1326 while ( (string)[i]!=0x0000 )
1328 size+=2*(1+ str_len_uni( string[i] ) );
1333 DEBUGADD(9,("size: [%d]\n", size));
1337 /*******************************************************************
1338 return the size required by a struct in the stream
1339 ********************************************************************/
1340 static uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
1343 size+=size_of_uint32( &(info->jobid) );
1344 size+=size_of_relative_string( &(info->printername) );
1345 size+=size_of_relative_string( &(info->machinename) );
1346 size+=size_of_relative_string( &(info->username) );
1347 size+=size_of_relative_string( &(info->document) );
1348 size+=size_of_relative_string( &(info->datatype) );
1349 size+=size_of_relative_string( &(info->text_status) );
1350 size+=size_of_uint32( &(info->status) );
1351 size+=size_of_uint32( &(info->priority) );
1352 size+=size_of_uint32( &(info->position) );
1353 size+=size_of_uint32( &(info->totalpages) );
1354 size+=size_of_uint32( &(info->pagesprinted) );
1355 size+=size_of_systemtime( &(info->submitted) );
1359 /*******************************************************************
1360 return the size required by a struct in the stream
1361 ********************************************************************/
1362 static uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
1366 size+=4; /* size of sec desc ptr */
1368 size+=size_of_uint32( &(info->jobid) );
1369 size+=size_of_relative_string( &(info->printername) );
1370 size+=size_of_relative_string( &(info->machinename) );
1371 size+=size_of_relative_string( &(info->username) );
1372 size+=size_of_relative_string( &(info->document) );
1373 size+=size_of_relative_string( &(info->notifyname) );
1374 size+=size_of_relative_string( &(info->datatype) );
1375 size+=size_of_relative_string( &(info->printprocessor) );
1376 size+=size_of_relative_string( &(info->parameters) );
1377 size+=size_of_relative_string( &(info->drivername) );
1378 size+=size_of_device_mode( info->devmode );
1379 size+=size_of_relative_string( &(info->text_status) );
1380 /* SEC_DESC sec_desc;*/
1381 size+=size_of_uint32( &(info->status) );
1382 size+=size_of_uint32( &(info->priority) );
1383 size+=size_of_uint32( &(info->position) );
1384 size+=size_of_uint32( &(info->starttime) );
1385 size+=size_of_uint32( &(info->untiltime) );
1386 size+=size_of_uint32( &(info->totalpages) );
1387 size+=size_of_uint32( &(info->size) );
1388 size+=size_of_systemtime( &(info->submitted) );
1389 size+=size_of_uint32( &(info->timeelapsed) );
1390 size+=size_of_uint32( &(info->pagesprinted) );
1394 /*******************************************************************
1395 return the size required by a struct in the stream
1396 ********************************************************************/
1397 static uint32 spoolss_size_form_1(FORM_1 *info)
1401 size+=size_of_uint32( &(info->flag) );
1402 size+=size_of_relative_string( &(info->name) );
1403 size+=size_of_uint32( &(info->width) );
1404 size+=size_of_uint32( &(info->length) );
1405 size+=size_of_uint32( &(info->left) );
1406 size+=size_of_uint32( &(info->top) );
1407 size+=size_of_uint32( &(info->right) );
1408 size+=size_of_uint32( &(info->bottom) );
1413 /*******************************************************************
1414 return the size required by a struct in the stream
1415 ********************************************************************/
1416 static uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
1420 size+=size_of_relative_string( &(info->port_name) );
1421 size+=size_of_relative_string( &(info->monitor_name) );
1422 size+=size_of_relative_string( &(info->description) );
1424 size+=size_of_uint32( &(info->port_type) );
1425 size+=size_of_uint32( &(info->reserved) );
1430 /*******************************************************************
1431 return the size required by a struct in the stream
1432 ********************************************************************/
1433 static uint32 spoolss_size_processor_info_1(PRINTPROCESSOR_1 *info)
1436 size+=size_of_relative_string( &(info->name) );
1441 /*******************************************************************
1442 return the size required by a struct in the stream
1443 ********************************************************************/
1444 static uint32 spoolss_size_monitor_info_1(PRINTMONITOR_1 *info)
1447 size+=size_of_relative_string( &(info->name) );
1452 /*******************************************************************
1453 * read a uint8 buffer of size *size.
1454 * allocate memory for it
1455 * return a pointer to the allocated memory and the size
1456 * return NULL and a size of 0 if the buffer is empty
1458 * jfmxxxx: fix it to also write a buffer
1459 ********************************************************************/
1460 static void spoolss_io_read_buffer(char *desc, prs_struct *ps, int depth, BUFFER *buffer)
1462 prs_debug(ps, depth, desc, "spoolss_io_read_buffer");
1467 prs_uint32("pointer", ps, depth, &(buffer->ptr));
1469 if (buffer->ptr != 0x0000)
1471 prs_uint32("size", ps, depth, &(buffer->size));
1472 buffer->data=(uint8 *)malloc( (buffer->size) * sizeof(uint8) );
1473 prs_uint8s(True,"buffer", ps, depth, buffer->data, buffer->size);
1479 buffer->data=0x0000;
1480 buffer->size=0x0000;
1484 /*******************************************************************
1485 * read a uint8 buffer of size *size.
1486 * allocate memory for it
1487 * return a pointer to the allocated memory and the size
1488 * return NULL and a size of 0 if the buffer is empty
1490 * jfmxxxx: fix it to also write a buffer
1491 ********************************************************************/
1492 void spoolss_io_free_buffer(BUFFER *buffer)
1494 DEBUG(8,("spoolss_io_free_buffer\n"));
1496 if (buffer->ptr != 0x0000)
1502 /*******************************************************************
1504 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
1505 ********************************************************************/
1506 void spoolss_io_q_getprinterdriver2(char *desc,
1507 SPOOL_Q_GETPRINTERDRIVER2 *q_u,
1508 prs_struct *ps, int depth)
1511 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
1516 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
1517 prs_uint32("pointer", ps, depth, &useless_ptr);
1518 smb_io_unistr2("architecture", &(q_u->architecture),True,ps,depth);
1522 prs_uint32("level", ps, depth, &(q_u->level));
1523 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
1527 prs_uint32("buffer size", ps, depth, &(q_u->buf_size));
1528 prs_uint32("status", ps, depth, &(q_u->status));
1532 /*******************************************************************
1534 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
1535 ********************************************************************/
1536 void spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u,
1537 prs_struct *ps, int depth)
1539 uint32 useless_ptr=0xADDE0FF0;
1540 uint32 start_offset, end_offset, beginning;
1541 uint32 bufsize_required=0;
1543 DRIVER_INFO_1 *info1;
1544 DRIVER_INFO_2 *info2;
1545 DRIVER_INFO_3 *info3;
1547 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
1551 prs_uint32("pointer", ps, depth, &useless_ptr);
1553 info1 = r_u->printer.info1;
1554 info2 = r_u->printer.info2;
1555 info3 = r_u->printer.info3;
1561 bufsize_required += spoolss_size_printer_driver_info_1(info1);
1566 bufsize_required += spoolss_size_printer_driver_info_2(info2);
1571 bufsize_required += spoolss_size_printer_driver_info_3(info3);
1576 DEBUG(4,("spoolss_io_r_getprinterdriver2, size needed: %d\n",bufsize_required));
1577 DEBUG(4,("spoolss_io_r_getprinterdriver2, size offered: %d\n",r_u->offered));
1579 /* check if the buffer is big enough for the datas */
1580 if (r_u->offered<bufsize_required)
1582 /* it's too small */
1583 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
1584 r_u->offered=0; /* don't send back the buffer */
1586 DEBUG(4,("spoolss_io_r_getprinterdriver2, buffer too small\n"));
1588 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
1592 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
1594 DEBUG(4,("spoolss_io_r_getprinterdriver2, buffer large enough\n"));
1596 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
1598 beginning=ps->offset;
1599 start_offset=ps->offset;
1600 end_offset=start_offset+r_u->offered;
1606 smb_io_printer_driver_info_1(desc,
1616 smb_io_printer_driver_info_2(desc,
1626 smb_io_printer_driver_info_3(desc,
1637 ps->offset=beginning+r_u->offered;
1642 * if the buffer was too small, send the minimum required size
1643 * if it was too large, send the real needed size
1646 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
1647 prs_uint32("pipo", ps, depth, &pipo);
1648 prs_uint32("pipo", ps, depth, &pipo);
1649 prs_uint32("status", ps, depth, &(r_u->status));
1653 /*******************************************************************
1655 * called from spoolss_enumprinters (srv_spoolss.c)
1656 ********************************************************************/
1657 void spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u,
1658 prs_struct *ps, int depth)
1661 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
1666 prs_uint32("flags", ps, depth, &(q_u->flags));
1668 prs_uint32("useless ptr", ps, depth, &useless_ptr);
1670 smb_io_unistr2("", &(q_u->servername),True,ps,depth);
1674 prs_uint32("level", ps, depth, &(q_u->level));
1676 spoolss_io_read_buffer("buffer", ps, depth, &(q_u->buffer));
1679 /*******************************************************************
1680 * write a structure.
1681 * called from spoolss_r_enum_printers (srv_spoolss.c)
1683 ********************************************************************/
1684 void spoolss_io_r_enumprinters(char *desc,
1685 SPOOL_R_ENUMPRINTERS *r_u,
1686 prs_struct *ps, int depth)
1688 uint32 useless_ptr=0xADDE0FF0;
1690 uint32 start_offset, end_offset, beginning;
1691 uint32 bufsize_required=0;
1693 PRINTER_INFO_1 *info1;
1694 PRINTER_INFO_2 *info2;
1696 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
1699 prs_uint32("pointer", ps, depth, &useless_ptr);
1701 for(i=0;i<r_u->returned;i++)
1706 info1 = r_u->printer.printers_1[i];
1707 bufsize_required += spoolss_size_printer_info_1(info1);
1710 info2 = r_u->printer.printers_2[i];
1711 bufsize_required += spoolss_size_printer_info_2(info2);
1716 DEBUG(4,("spoolss_io_r_enumprinters, size needed: %d\n",bufsize_required));
1717 DEBUG(4,("spoolss_io_r_enumprinters, size offered: %d\n",r_u->offered));
1719 if (r_u->offered<bufsize_required)
1722 * so the buffer is too small to handle datas
1723 * reply the minimum size required in the status
1724 * make the buffer equal 0
1725 * and reply no printers in buffer
1727 r_u->status=ERROR_INSUFFICIENT_BUFFER;
1729 /*r_u->returned=0;*/
1731 DEBUG(4,("spoolss_io_r_enumprinters, buffer too small\n"));
1733 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
1734 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
1735 prs_uint32("count", ps, depth, &(r_u->returned));
1736 prs_uint32("status", ps, depth, &(r_u->status));
1740 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
1742 DEBUG(4,("spoolss_io_r_enumprinters, buffer large enough\n"));
1744 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
1746 beginning=ps->offset;
1747 start_offset=ps->offset;
1748 end_offset=start_offset+r_u->offered;
1750 for(i=0;i<r_u->returned;i++)
1755 info1=r_u->printer.printers_1[i];
1756 smb_io_printer_info_1(desc, info1, ps, depth,
1757 &start_offset, &end_offset);
1760 info2=r_u->printer.printers_2[i];
1761 smb_io_printer_info_2(desc, info2, ps, depth,
1762 &start_offset, &end_offset);
1767 ps->offset=beginning+r_u->offered;
1770 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
1771 prs_uint32("count", ps, depth, &(r_u->returned));
1772 prs_uint32("status", ps, depth, &(r_u->status));
1775 /*******************************************************************
1776 * write a structure.
1777 * called from spoolss_r_enum_printers (srv_spoolss.c)
1779 ********************************************************************/
1780 void spoolss_io_r_getprinter(char *desc,
1781 SPOOL_R_GETPRINTER *r_u,
1782 prs_struct *ps, int depth)
1784 uint32 useless_ptr=0xADDE0FF0;
1785 uint32 start_offset, end_offset, beginning;
1786 uint32 bufsize_required=0;
1788 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
1793 prs_uint32("pointer", ps, depth, &useless_ptr);
1799 PRINTER_INFO_0 *info;
1800 info = r_u->printer.info0;
1801 bufsize_required += spoolss_size_printer_info_0(info);
1806 PRINTER_INFO_1 *info;
1807 info = r_u->printer.info1;
1808 bufsize_required += spoolss_size_printer_info_1(info);
1813 PRINTER_INFO_2 *info;
1814 info = r_u->printer.info2;
1815 bufsize_required += spoolss_size_printer_info_2(info);
1820 DEBUG(4,("spoolss_io_r_getprinter, size needed: %d\n",bufsize_required));
1821 DEBUG(4,("spoolss_io_r_getprinter, size offered: %d\n",r_u->offered));
1823 /* check if the buffer is big enough for the datas */
1824 if (r_u->offered<bufsize_required)
1826 /* it's too small */
1827 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
1828 r_u->offered=0; /* don't send back the buffer */
1830 DEBUG(4,("spoolss_io_r_getprinter, buffer too small\n"));
1832 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
1836 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
1838 DEBUG(4,("spoolss_io_r_getprinter, buffer large enough\n"));
1840 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
1841 beginning=ps->offset;
1842 start_offset=ps->offset;
1843 end_offset=start_offset+r_u->offered;
1849 PRINTER_INFO_0 *info;
1850 info = r_u->printer.info0;
1851 smb_io_printer_info_0(desc,
1861 PRINTER_INFO_1 *info;
1862 info = r_u->printer.info1;
1863 smb_io_printer_info_1(desc,
1873 PRINTER_INFO_2 *info;
1874 info = r_u->printer.info2;
1875 smb_io_printer_info_2(desc,
1886 ps->offset=beginning+r_u->offered;
1891 * if the buffer was too small, send the minimum required size
1892 * if it was too large, send the real needed size
1895 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
1896 prs_uint32("status", ps, depth, &(r_u->status));
1900 /*******************************************************************
1901 * read a uint8 buffer of size *size.
1902 * allocate memory for it
1903 * return a pointer to the allocated memory and the size
1904 * return NULL and a size of 0 if the buffer is empty
1906 * jfmxxxx: fix it to also write a buffer
1907 ********************************************************************/
1908 static void spoolss_io_read_buffer8(char *desc, prs_struct *ps, uint8 **buffer, uint32 *size,int depth)
1912 prs_debug(ps, depth, desc, "spoolss_io_read_buffer8");
1917 prs_uint32("buffer pointer", ps, depth, &useless_ptr);
1919 if (useless_ptr != 0x0000)
1921 prs_uint32("buffer size", ps, depth, size);
1922 *buffer=(uint8 *)malloc( (*size) * sizeof(uint8) );
1923 prs_uint8s(True,"buffer",ps,depth,*buffer,*size);
1933 /*******************************************************************
1935 * called from spoolss_getprinter (srv_spoolss.c)
1936 ********************************************************************/
1937 void spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u,
1938 prs_struct *ps, int depth)
1942 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
1947 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
1949 prs_uint32("level", ps, depth, &(q_u->level));
1951 spoolss_io_read_buffer8("",ps, &buffer, &count,depth);
1952 if (buffer != 0x0000)
1957 prs_uint32("buffer size", ps, depth, &(q_u->offered));
1960 /*******************************************************************
1961 ********************************************************************/
1962 void spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
1964 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
1969 prs_uint32("status", ps, depth, &(r_u->status));
1972 /*******************************************************************
1973 ********************************************************************/
1974 static void spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE **devmode)
1976 uint32 devmode_size=0x0;
1977 uint32 useless_ptr=0x0;
1979 prs_debug(ps, depth, desc, "spoolss_io_devmode");
1982 prs_uint32("devmode_size", ps, depth, &(devmode_size));
1983 prs_uint32("useless_ptr", ps, depth, &(useless_ptr));
1985 if (devmode_size!=0 && useless_ptr!=0)
1987 /* so we have a DEVICEMODE to follow */
1990 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
1991 *devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE));
1992 ZERO_STRUCTP(*devmode);
1995 /* this is bad code, shouldn't be there */
1996 prs_uint32("devmode_size", ps, depth, &(devmode_size));
1998 smb_io_devmode(desc, ps, depth, *devmode);
2002 /*******************************************************************
2003 ********************************************************************/
2004 void spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
2006 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
2011 smb_io_prt_hnd("printer handle", &(q_u->handle),ps,depth);
2012 prs_uint32("level", ps, depth, &(q_u->level));
2014 /* again a designed mess */
2015 /* sometimes I'm wondering how all of this work ! */
2017 /* To be correct it need to be split in 3 functions */
2019 spool_io_printer_info_level("", &(q_u->info), ps, depth);
2021 spoolss_io_devmode(desc, ps, depth, &(q_u->devmode));
2023 prs_uint32("security.size_of_buffer", ps, depth, &(q_u->security.size_of_buffer));
2024 prs_uint32("security.data", ps, depth, &(q_u->security.data));
2026 prs_uint32("command", ps, depth, &(q_u->command));
2029 /*******************************************************************
2030 ********************************************************************/
2031 void spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
2033 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
2038 prs_uint32("status", ps, depth, &(r_u->status));
2041 /*******************************************************************
2042 ********************************************************************/
2043 void spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
2046 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
2051 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
2055 /*******************************************************************
2056 ********************************************************************/
2057 void spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
2059 prs_debug(ps, depth, desc, "");
2064 prs_uint32("status", ps, depth, &(r_u->status));
2067 /*******************************************************************
2068 ********************************************************************/
2069 void spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
2072 prs_debug(ps, depth, desc, "");
2077 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
2078 prs_uint32("level", ps, depth, &(q_u->level));
2080 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
2084 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
2087 /*******************************************************************
2088 ********************************************************************/
2089 void spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
2091 uint32 useless_ptr=0xADDE0FF0;
2092 uint32 start_offset, end_offset, beginning;
2093 uint32 bufsize_required=0;
2096 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
2101 prs_uint32("pointer", ps, depth, &useless_ptr);
2108 info=r_u->job.job_info_1;
2110 for (i=0; i<r_u->numofjobs; i++)
2112 bufsize_required += spoolss_size_job_info_1(&(info[i]));
2119 info=r_u->job.job_info_2;
2121 for (i=0; i<r_u->numofjobs; i++)
2123 bufsize_required += spoolss_size_job_info_2(&(info[i]));
2129 DEBUG(4,("spoolss_io_r_enumjobs, size needed: %d\n",bufsize_required));
2130 DEBUG(4,("spoolss_io_r_enumjobs, size offered: %d\n",r_u->offered));
2132 /* check if the buffer is big enough for the datas */
2133 if (r_u->offered<bufsize_required)
2135 /* it's too small */
2136 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
2137 r_u->offered=0; /* don't send back the buffer */
2139 DEBUG(4,("spoolss_io_r_enumjobs, buffer too small\n"));
2141 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
2145 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
2147 DEBUG(4,("spoolss_io_r_enumjobs, buffer large enough\n"));
2149 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
2150 beginning=ps->offset;
2151 start_offset=ps->offset;
2152 end_offset=start_offset+r_u->offered;
2159 for (i=0; i<r_u->numofjobs; i++)
2161 info = &(r_u->job.job_info_1[i]);
2162 smb_io_job_info_1(desc,
2174 for (i=0; i<r_u->numofjobs; i++)
2176 info = &(r_u->job.job_info_2[i]);
2177 smb_io_job_info_2(desc,
2188 ps->offset=beginning+r_u->offered;
2193 * if the buffer was too small, send the minimum required size
2194 * if it was too large, send the real needed size
2197 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
2198 prs_uint32("numofjobs", ps, depth, &(r_u->numofjobs));
2199 prs_uint32("status", ps, depth, &(r_u->status));
2202 /*******************************************************************
2203 ********************************************************************/
2204 void spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
2207 prs_debug(ps, depth, desc, "");
2212 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
2213 prs_uint32("firstjob", ps, depth, &(q_u->firstjob));
2214 prs_uint32("numofjobs", ps, depth, &(q_u->numofjobs));
2215 prs_uint32("level", ps, depth, &(q_u->level));
2217 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
2221 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
2224 /*******************************************************************
2225 ********************************************************************/
2226 void spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
2228 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
2233 prs_uint32("status", ps, depth, &(r_u->status));
2236 /*******************************************************************
2237 ********************************************************************/
2238 void spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
2240 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
2245 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
2246 prs_uint32("jobid", ps, depth, &(q_u->jobid));
2249 /*******************************************************************
2250 ********************************************************************/
2251 void spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
2253 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
2258 prs_uint32("status", ps, depth, &(r_u->status));
2261 /*******************************************************************
2262 ********************************************************************/
2263 void spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
2265 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
2270 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
2271 prs_uint32("jobid", ps, depth, &(q_u->jobid));
2273 * level is usually 0. If (level!=0) then I'm in trouble !
2274 * I will try to generate setjob command with level!=0, one day.
2276 prs_uint32("level", ps, depth, &(q_u->level));
2277 prs_uint32("command", ps, depth, &(q_u->command));
2280 /*******************************************************************
2281 ********************************************************************/
2282 void spoolss_io_r_enumdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
2284 uint32 useless_ptr=0xADDE0FF0;
2285 uint32 start_offset, end_offset, beginning;
2286 uint32 bufsize_required=0;
2289 prs_debug(ps, depth, desc, "spoolss_io_r_enumdrivers");
2293 prs_uint32("pointer", ps, depth, &useless_ptr);
2295 DEBUG(7,("Level [%d], number [%d]\n", r_u->level, r_u->numofdrivers));
2300 DRIVER_INFO_1 *driver_info_1;
2301 driver_info_1=r_u->driver.driver_info_1;
2303 for (i=0; i<r_u->numofdrivers; i++)
2305 bufsize_required += spoolss_size_printer_driver_info_1(&(driver_info_1[i]));
2311 DRIVER_INFO_2 *driver_info_2;
2312 driver_info_2=r_u->driver.driver_info_2;
2314 for (i=0; i<r_u->numofdrivers; i++)
2316 bufsize_required += spoolss_size_printer_driver_info_2(&(driver_info_2[i]));
2322 DRIVER_INFO_3 *driver_info_3;
2323 driver_info_3=r_u->driver.driver_info_3;
2325 for (i=0; i<r_u->numofdrivers; i++)
2327 bufsize_required += spoolss_size_printer_driver_info_3(&(driver_info_3[i]));
2333 DEBUGADD(7,("size needed: %d\n",bufsize_required));
2334 DEBUGADD(7,("size offered: %d\n",r_u->offered));
2336 /* check if the buffer is big enough for the datas */
2338 if (r_u->offered<bufsize_required)
2341 /* it's too small */
2342 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
2343 r_u->offered=0; /* don't send back the buffer */
2344 DEBUGADD(8,("buffer too small\n"));
2346 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
2350 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
2352 DEBUGADD(8,("buffer large enough\n"));
2354 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
2355 beginning=ps->offset;
2356 start_offset=ps->offset;
2357 end_offset=start_offset+r_u->offered;
2363 DRIVER_INFO_1 *info;
2364 for (i=0; i<r_u->numofdrivers; i++)
2366 info = &(r_u->driver.driver_info_1[i]);
2367 smb_io_printer_driver_info_1(desc, info, ps, depth, &start_offset, &end_offset);
2373 DRIVER_INFO_2 *info;
2374 for (i=0; i<r_u->numofdrivers; i++)
2376 info = &(r_u->driver.driver_info_2[i]);
2377 smb_io_printer_driver_info_2(desc, info, ps, depth, &start_offset, &end_offset);
2383 DRIVER_INFO_3 *info;
2384 for (i=0; i<r_u->numofdrivers; i++)
2386 info = &(r_u->driver.driver_info_3[i]);
2387 smb_io_printer_driver_info_3(desc, info, ps, depth, &start_offset, &end_offset);
2392 ps->offset=beginning+r_u->offered;
2397 * if the buffer was too small, send the minimum required size
2398 * if it was too large, send the real needed size
2401 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
2402 prs_uint32("numofdrivers", ps, depth, &(r_u->numofdrivers));
2403 prs_uint32("status", ps, depth, &(r_u->status));
2406 /*******************************************************************
2407 ********************************************************************/
2408 void spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
2411 uint32 useless_ptr=0xADDE0FF0;
2412 prs_debug(ps, depth, desc, "");
2416 prs_uint32("pointer", ps, depth, &useless_ptr);
2417 smb_io_unistr2("", &(q_u->name),True,ps,depth);
2419 prs_uint32("pointer", ps, depth, &useless_ptr);
2420 smb_io_unistr2("", &(q_u->environment),True,ps,depth);
2422 prs_uint32("level", ps, depth, &(q_u->level));
2423 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
2425 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
2428 /*******************************************************************
2429 ********************************************************************/
2430 void spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
2432 uint32 useless_ptr=0xADDE0FF0;
2433 uint32 start_offset, end_offset, beginning;
2434 uint32 bufsize_required=0;
2437 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
2441 prs_uint32("pointer", ps, depth, &useless_ptr);
2447 forms_1=r_u->forms_1;
2449 for (i=0; i<r_u->numofforms; i++)
2451 bufsize_required += spoolss_size_form_1(&(forms_1[i]));
2457 DEBUG(4,("spoolss_io_r_enumforms, size needed: %d\n",bufsize_required));
2458 DEBUG(4,("spoolss_io_r_enumforms, size offered: %d\n",r_u->offered));
2460 /* check if the buffer is big enough for the datas */
2462 if (r_u->offered<bufsize_required)
2465 /* it's too small */
2466 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
2467 r_u->offered=0; /* don't send back the buffer */
2469 DEBUG(4,("spoolss_io_r_enumforms, buffer too small\n"));
2471 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
2475 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
2477 DEBUG(4,("spoolss_io_r_enumforms, buffer large enough\n"));
2479 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
2481 if (r_u->offered!=0)
2483 beginning=ps->offset;
2484 start_offset=ps->offset;
2485 end_offset=start_offset+r_u->offered;
2492 for (i=0; i<r_u->numofforms; i++)
2494 info = &(r_u->forms_1[i]);
2495 smb_io_form_1(desc, info, ps, depth, &start_offset, &end_offset);
2500 ps->offset=beginning+r_u->offered;
2506 * if the buffer was too small, send the minimum required size
2507 * if it was too large, send the real needed size
2510 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
2511 prs_uint32("numofforms", ps, depth, &(r_u->numofforms));
2512 prs_uint32("status", ps, depth, &(r_u->status));
2515 /*******************************************************************
2516 ********************************************************************/
2517 void spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
2520 prs_debug(ps, depth, desc, "");
2524 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
2525 prs_uint32("level", ps, depth, &(q_u->level));
2526 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
2528 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
2531 /*******************************************************************
2532 ********************************************************************/
2533 void spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
2535 uint32 useless_ptr=0xADDE0FF0;
2536 uint32 start_offset, end_offset, beginning;
2537 uint32 bufsize_required=0;
2540 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
2544 prs_uint32("pointer", ps, depth, &useless_ptr);
2549 PORT_INFO_2 *port_2;
2550 port_2=r_u->port.port_info_2;
2552 for (i=0; i<r_u->numofports; i++)
2554 bufsize_required += spoolss_size_port_info_2(&(port_2[i]));
2560 DEBUG(4,("size needed: %d\n",bufsize_required));
2561 DEBUG(4,("size offered: %d\n",r_u->offered));
2563 /* check if the buffer is big enough for the datas */
2564 if (r_u->offered<bufsize_required)
2567 /* it's too small */
2568 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
2569 r_u->offered=0; /* don't send back the buffer */
2571 DEBUG(4,("buffer too small\n"));
2573 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
2577 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
2579 DEBUG(4,("buffer large enough\n"));
2581 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
2582 beginning=ps->offset;
2583 start_offset=ps->offset;
2584 end_offset=start_offset+r_u->offered;
2591 for (i=0; i<r_u->numofports; i++)
2593 info = &(r_u->port.port_info_2[i]);
2594 smb_io_port_2(desc, info, ps, depth, &start_offset, &end_offset);
2599 ps->offset=beginning+r_u->offered;
2604 * if the buffer was too small, send the minimum required size
2605 * if it was too large, send the real needed size
2608 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
2609 prs_uint32("numofports", ps, depth, &(r_u->numofports));
2610 prs_uint32("status", ps, depth, &(r_u->status));
2613 /*******************************************************************
2614 ********************************************************************/
2615 void spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
2618 prs_debug(ps, depth, desc, "");
2622 prs_uint32("useless", ps, depth, &useless);
2623 smb_io_unistr2("", &(q_u->name),True,ps,depth);
2625 prs_uint32("level", ps, depth, &(q_u->level));
2626 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
2628 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
2632 /*******************************************************************
2633 ********************************************************************/
2634 void spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 **q_u, prs_struct *ps, int depth)
2636 SPOOL_PRINTER_INFO_LEVEL_2 *il;
2638 prs_debug(ps, depth, desc, "");
2644 il=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2));
2647 DEBUG(7,("lecture: memoire ok\n"));
2656 prs_uint32("servername_ptr", ps, depth, &(il->servername_ptr));
2657 prs_uint32("printername_ptr", ps, depth, &(il->printername_ptr));
2658 prs_uint32("sharename_ptr", ps, depth, &(il->sharename_ptr));
2659 prs_uint32("portname_ptr", ps, depth, &(il->portname_ptr));
2660 prs_uint32("drivername_ptr", ps, depth, &(il->drivername_ptr));
2661 prs_uint32("comment_ptr", ps, depth, &(il->comment_ptr));
2662 prs_uint32("location_ptr", ps, depth, &(il->location_ptr));
2663 prs_uint32("devmode_ptr", ps, depth, &(il->devmode_ptr));
2664 prs_uint32("sepfile_ptr", ps, depth, &(il->sepfile_ptr));
2665 prs_uint32("printprocessor_ptr", ps, depth, &(il->printprocessor_ptr));
2666 prs_uint32("datatype_ptr", ps, depth, &(il->datatype_ptr));
2667 prs_uint32("parameters_ptr", ps, depth, &(il->parameters_ptr));
2668 prs_uint32("secdesc_ptr", ps, depth, &(il->secdesc_ptr));
2670 prs_uint32("attributes", ps, depth, &(il->attributes));
2671 prs_uint32("priority", ps, depth, &(il->priority));
2672 prs_uint32("default_priority", ps, depth, &(il->default_priority));
2673 prs_uint32("starttime", ps, depth, &(il->starttime));
2674 prs_uint32("untiltime", ps, depth, &(il->untiltime));
2675 prs_uint32("status", ps, depth, &(il->status));
2676 prs_uint32("cjobs", ps, depth, &(il->cjobs));
2677 prs_uint32("averageppm", ps, depth, &(il->averageppm));
2679 smb_io_unistr2("", &(il->servername), il->servername_ptr, ps, depth);
2680 smb_io_unistr2("", &(il->printername), il->printername_ptr, ps, depth);
2681 smb_io_unistr2("", &(il->sharename), il->sharename_ptr, ps, depth);
2682 smb_io_unistr2("", &(il->portname), il->portname_ptr, ps, depth);
2683 smb_io_unistr2("", &(il->drivername), il->drivername_ptr, ps, depth);
2684 smb_io_unistr2("", &(il->comment), il->comment_ptr, ps, depth);
2685 smb_io_unistr2("", &(il->location), il->location_ptr, ps, depth);
2686 smb_io_unistr2("", &(il->sepfile), il->sepfile_ptr, ps, depth);
2687 smb_io_unistr2("", &(il->printprocessor), il->printprocessor_ptr, ps, depth);
2688 smb_io_unistr2("", &(il->datatype), il->datatype_ptr, ps, depth);
2689 smb_io_unistr2("", &(il->parameters), il->parameters_ptr, ps, depth);
2693 /* this code as nothing to do here !!!
2695 if (il->secdesc_ptr)
2698 sec_io_desc_buf("", &(il->secdesc), ps, depth);
2704 /*******************************************************************
2705 ********************************************************************/
2706 void spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
2710 prs_debug(ps, depth, desc, "");
2714 prs_uint32("info level", ps, depth, &level);
2715 prs_uint32("useless", ps, depth, &useless);
2720 * level 0 is used by setprinter when managing the queue
2721 * (hold, stop, start a queue)
2726 * level 2 is used by addprinter
2727 * and by setprinter when updating printer's info
2730 spool_io_printer_info_level_2("", &(il->info_2), ps, depth);
2736 /*******************************************************************
2737 ********************************************************************/
2738 void spool_io_user_level_1(char *desc, SPOOL_USER_LEVEL_1 **q_u, prs_struct *ps, int depth)
2740 SPOOL_USER_LEVEL_1 *il;
2741 prs_debug(ps, depth, desc, "");
2747 il=(SPOOL_USER_LEVEL_1 *)malloc(sizeof(SPOOL_USER_LEVEL_1));
2757 prs_uint32("size", ps, depth, &(il->size));
2758 prs_uint32("client_name_ptr", ps, depth, &(il->client_name_ptr));
2759 prs_uint32("user_name_ptr", ps, depth, &(il->user_name_ptr));
2760 prs_uint32("build", ps, depth, &(il->build));
2761 prs_uint32("major", ps, depth, &(il->major));
2762 prs_uint32("minor", ps, depth, &(il->minor));
2763 prs_uint32("processor", ps, depth, &(il->processor));
2765 smb_io_unistr2("", &(il->client_name), il->client_name_ptr, ps, depth);
2767 smb_io_unistr2("", &(il->user_name), il->user_name_ptr, ps, depth);
2770 /*******************************************************************
2771 ********************************************************************/
2772 void spool_io_user_level(char *desc, SPOOL_USER_LEVEL *q_u, prs_struct *ps, int depth)
2776 prs_debug(ps, depth, desc, "spool_io_user_level");
2780 prs_uint32("info_level", ps, depth, &level);
2781 prs_uint32("useless", ps, depth, &useless);
2786 spool_io_user_level_1("", &(q_u->user_level_1), ps, depth);
2792 /*******************************************************************
2793 ********************************************************************/
2794 void spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
2797 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
2801 * I think that's one of the few well written functions.
2802 * the sub-structures are correctly parsed and analysed
2803 * the info level are handled in a nice way.
2807 prs_uint32("useless", ps, depth, &useless);
2808 smb_io_unistr2("", &(q_u->server_name),True,ps,depth);
2811 prs_uint32("info_level", ps, depth, &(q_u->level));
2813 spool_io_printer_info_level("", &(q_u->info), ps, depth);
2815 /* the 4 unknown are all 0 */
2818 * en fait ils sont pas inconnu
2819 * par recoupement avec rpcSetPrinter
2820 * c'est le devicemode
2821 * et le security descriptor.
2824 prs_uint32("unk0", ps, depth, &(q_u->unk0));
2825 prs_uint32("unk1", ps, depth, &(q_u->unk1));
2826 prs_uint32("unk2", ps, depth, &(q_u->unk2));
2827 prs_uint32("unk3", ps, depth, &(q_u->unk3));
2829 prs_uint32("info_level", ps, depth, &(q_u->user_level));
2831 spool_io_user_level("", &(q_u->user), ps, depth);
2835 /*******************************************************************
2836 ********************************************************************/
2837 void spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u, prs_struct *ps, int depth)
2839 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
2842 smb_io_prt_hnd("printer handle",&(r_u->handle),ps,depth);
2844 prs_uint32("status", ps, depth, &(r_u->status));
2847 /*******************************************************************
2848 ********************************************************************/
2849 void spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
2850 prs_struct *ps, int depth)
2852 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
2854 prs_debug(ps, depth, desc, "");
2860 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
2863 DEBUG(1,("lecture: memoire ok\n"));
2872 prs_uint32("cversion", ps, depth, &(il->cversion));
2873 prs_uint32("name", ps, depth, &(il->name_ptr));
2874 prs_uint32("environment", ps, depth, &(il->environment_ptr));
2875 prs_uint32("driverpath", ps, depth, &(il->driverpath_ptr));
2876 prs_uint32("datafile", ps, depth, &(il->datafile_ptr));
2877 prs_uint32("configfile", ps, depth, &(il->configfile_ptr));
2878 prs_uint32("helpfile", ps, depth, &(il->helpfile_ptr));
2879 prs_uint32("monitorname", ps, depth, &(il->monitorname_ptr));
2880 prs_uint32("defaultdatatype", ps, depth, &(il->defaultdatatype_ptr));
2881 prs_uint32("dependentfilessize", ps, depth, &(il->dependentfilessize));
2882 prs_uint32("dependentfiles", ps, depth, &(il->dependentfiles_ptr));
2886 smb_io_unistr2("", &(il->name), il->name_ptr, ps, depth);
2887 smb_io_unistr2("", &(il->environment), il->environment_ptr, ps, depth);
2888 smb_io_unistr2("", &(il->driverpath), il->driverpath_ptr, ps, depth);
2889 smb_io_unistr2("", &(il->datafile), il->datafile_ptr, ps, depth);
2890 smb_io_unistr2("", &(il->configfile), il->configfile_ptr, ps, depth);
2891 smb_io_unistr2("", &(il->helpfile), il->helpfile_ptr, ps, depth);
2892 smb_io_unistr2("", &(il->monitorname), il->monitorname_ptr, ps, depth);
2893 smb_io_unistr2("", &(il->defaultdatatype), il->defaultdatatype_ptr, ps, depth);
2896 if (il->dependentfiles_ptr)
2897 smb_io_buffer5("", &(il->dependentfiles), ps, depth);
2902 /*******************************************************************
2903 convert a buffer of UNICODE strings null terminated
2904 the buffer is terminated by a NULL
2906 convert to an ascii array (null terminated)
2908 dynamically allocate memory
2910 ********************************************************************/
2911 void uniarray_2_ascarray(BUFFER5 *buf5, char ***ar)
2922 if (buf5==NULL) return;
2929 string=(char *)malloc(sizeof(char)*buf5->buf_len);
2931 destend = string + buf5->buf_len;
2934 while (dest < destend)
2936 *(dest++) = (char)*(src++);
2939 /* that ugly for the first one but that's working */
2940 array=(char **)Realloc(array, sizeof(char *)*(i+1));
2943 while ( n < buf5->buf_len )
2945 if ( *(string++) == '\0' )
2947 array=(char **)Realloc(array, sizeof(char *)*(i+1));
2954 DEBUG(10,("Number of dependent files: [%d]\n", i-1));
2957 /*******************************************************************
2958 read a UNICODE array with null terminated strings
2959 and null terminated array
2960 and size of array at beginning
2961 ********************************************************************/
2962 void smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
2965 if (buffer==NULL) return;
2968 buffer->uni_str_len=buffer->uni_max_len;
2970 prs_uint32("buffer_size", ps, depth, &(buffer->uni_max_len));
2972 prs_unistr2(True, "buffer ", ps, depth, buffer);
2976 /*******************************************************************
2977 ********************************************************************/
2978 void spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
2982 prs_debug(ps, depth, desc, "");
2986 prs_uint32("info level", ps, depth, &level);
2987 prs_uint32("useless", ps, depth, &useless);
2992 spool_io_printer_driver_info_level_3("", &(il->info_3), ps, depth);
2998 /*******************************************************************
2999 ********************************************************************/
3000 void spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
3003 prs_debug(ps, depth, desc, "");
3007 prs_uint32("useless", ps, depth, &useless);
3008 smb_io_unistr2("", &(q_u->server_name),True,ps,depth);
3010 prs_uint32("info_level", ps, depth, &(q_u->level));
3012 spool_io_printer_driver_info_level("", &(q_u->info), ps, depth);
3015 /*******************************************************************
3016 ********************************************************************/
3017 void spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
3019 prs_debug(ps, depth, desc, "");
3022 prs_uint32("status", ps, depth, &(q_u->status));
3026 /*******************************************************************
3027 ********************************************************************/
3028 void uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
3029 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
3031 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
3033 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
3037 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
3043 d->cversion=uni->cversion;
3045 unistr2_to_ascii(d->name, &(uni->name), sizeof(d->name)-1);
3046 unistr2_to_ascii(d->environment, &(uni->environment), sizeof(d->environment)-1);
3047 unistr2_to_ascii(d->driverpath, &(uni->driverpath), sizeof(d->driverpath)-1);
3048 unistr2_to_ascii(d->datafile, &(uni->datafile), sizeof(d->datafile)-1);
3049 unistr2_to_ascii(d->configfile, &(uni->configfile), sizeof(d->configfile)-1);
3050 unistr2_to_ascii(d->helpfile, &(uni->helpfile), sizeof(d->helpfile)-1);
3051 unistr2_to_ascii(d->monitorname, &(uni->monitorname), sizeof(d->monitorname)-1);
3052 unistr2_to_ascii(d->defaultdatatype, &(uni->defaultdatatype), sizeof(d->defaultdatatype)-1);
3054 DEBUGADD(8,( "version: %d\n", d->cversion));
3055 DEBUGADD(8,( "name: %s\n", d->name));
3056 DEBUGADD(8,( "environment: %s\n", d->environment));
3057 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
3058 DEBUGADD(8,( "datafile: %s\n", d->datafile));
3059 DEBUGADD(8,( "configfile: %s\n", d->configfile));
3060 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
3061 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
3062 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
3064 uniarray_2_ascarray(&(uni->dependentfiles), &(d->dependentfiles) );
3067 void uni_2_asc_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 *uni,
3068 NT_PRINTER_INFO_LEVEL_2 **asc)
3070 NT_PRINTER_INFO_LEVEL_2 *d;
3072 DEBUG(7,("Converting from UNICODE to ASCII\n"));
3076 DEBUGADD(8,("allocating memory\n"));
3078 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
3081 DEBUGADD(8,("start converting\n"));
3085 d->attributes=uni->attributes;
3086 d->priority=uni->priority;
3087 d->default_priority=uni->default_priority;
3088 d->starttime=uni->starttime;
3089 d->untiltime=uni->untiltime;
3090 d->status=uni->status;
3091 d->cjobs=uni->cjobs;
3093 unistr2_to_ascii(d->servername, &(uni->servername), sizeof(d->servername)-1);
3094 unistr2_to_ascii(d->printername, &(uni->printername), sizeof(d->printername)-1);
3095 unistr2_to_ascii(d->sharename, &(uni->sharename), sizeof(d->sharename)-1);
3096 unistr2_to_ascii(d->portname, &(uni->portname), sizeof(d->portname)-1);
3097 unistr2_to_ascii(d->drivername, &(uni->drivername), sizeof(d->drivername)-1);
3098 unistr2_to_ascii(d->comment, &(uni->comment), sizeof(d->comment)-1);
3099 unistr2_to_ascii(d->location, &(uni->location), sizeof(d->location)-1);
3100 unistr2_to_ascii(d->sepfile, &(uni->sepfile), sizeof(d->sepfile)-1);
3101 unistr2_to_ascii(d->printprocessor, &(uni->printprocessor), sizeof(d->printprocessor)-1);
3102 unistr2_to_ascii(d->datatype, &(uni->datatype), sizeof(d->datatype)-1);
3103 unistr2_to_ascii(d->parameters, &(uni->parameters), sizeof(d->parameters)-1);
3106 void convert_printer_info(SPOOL_PRINTER_INFO_LEVEL uni,
3107 NT_PRINTER_INFO_LEVEL *printer,
3114 uni_2_asc_printer_info_2(uni.info_2, &(printer->info_2));
3124 void convert_printer_driver_info(SPOOL_PRINTER_DRIVER_INFO_LEVEL uni,
3125 NT_PRINTER_DRIVER_INFO_LEVEL *printer,
3132 printer->info_3=NULL;
3133 uni_2_asc_printer_driver_3(uni.info_3, &(printer->info_3));
3143 void convert_devicemode(DEVICEMODE devmode, NT_DEVICEMODE *nt_devmode)
3145 unistr_to_ascii(nt_devmode->devicename,
3146 devmode.devicename.buffer,
3149 unistr_to_ascii(nt_devmode->formname,
3150 devmode.formname.buffer,
3153 nt_devmode->specversion=devmode.specversion;
3154 nt_devmode->driverversion=devmode.driverversion;
3155 nt_devmode->size=devmode.size;
3156 nt_devmode->driverextra=devmode.driverextra;
3157 nt_devmode->fields=devmode.fields;
3158 nt_devmode->orientation=devmode.orientation;
3159 nt_devmode->papersize=devmode.papersize;
3160 nt_devmode->paperlength=devmode.paperlength;
3161 nt_devmode->paperwidth=devmode.paperwidth;
3162 nt_devmode->scale=devmode.scale;
3163 nt_devmode->copies=devmode.copies;
3164 nt_devmode->defaultsource=devmode.defaultsource;
3165 nt_devmode->printquality=devmode.printquality;
3166 nt_devmode->color=devmode.color;
3167 nt_devmode->duplex=devmode.duplex;
3168 nt_devmode->yresolution=devmode.yresolution;
3169 nt_devmode->ttoption=devmode.ttoption;
3170 nt_devmode->collate=devmode.collate;
3172 nt_devmode->logpixels=devmode.logpixels;
3173 nt_devmode->bitsperpel=devmode.bitsperpel;
3174 nt_devmode->pelswidth=devmode.pelswidth;
3175 nt_devmode->pelsheight=devmode.pelsheight;
3176 nt_devmode->displayflags=devmode.displayflags;
3177 nt_devmode->displayfrequency=devmode.displayfrequency;
3178 nt_devmode->icmmethod=devmode.icmmethod;
3179 nt_devmode->icmintent=devmode.icmintent;
3180 nt_devmode->mediatype=devmode.mediatype;
3181 nt_devmode->dithertype=devmode.dithertype;
3182 nt_devmode->reserved1=devmode.reserved1;
3183 nt_devmode->reserved2=devmode.reserved2;
3184 nt_devmode->panningwidth=devmode.panningwidth;
3185 nt_devmode->panningheight=devmode.panningheight;
3187 if (nt_devmode->driverextra != 0)
3189 /* if we had a previous private delete it and make a new one */
3190 if (nt_devmode->private != NULL)
3191 free(nt_devmode->private);
3192 nt_devmode->private=(uint8 *)malloc(nt_devmode->driverextra * sizeof(uint8));
3193 memcpy(nt_devmode->private, devmode.private, nt_devmode->driverextra);
3198 /*******************************************************************
3199 ********************************************************************/
3200 void spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
3202 uint32 useless_ptr=0xADDE0FF0;
3203 uint32 start_offset, end_offset, beginning;
3204 uint32 bufsize_required=0;
3206 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
3211 prs_uint32("pointer", ps, depth, &useless_ptr);
3217 DRIVER_DIRECTORY_1 *driver_info_1;
3218 driver_info_1=&(r_u->driver.driver_info_1);
3220 bufsize_required = size_of_relative_string(&(driver_info_1->name));
3225 DEBUG(4,("spoolss_io_r_getprinterdriverdir, size needed: %d\n",bufsize_required));
3226 DEBUG(4,("spoolss_io_r_getprinterdriverdir, size offered: %d\n",r_u->offered));
3228 /* check if the buffer is big enough for the datas */
3230 if (r_u->offered<bufsize_required)
3233 /* it's too small */
3234 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
3235 r_u->offered=0; /* don't send back the buffer */
3236 DEBUG(4,("spoolss_io_r_getprinterdriverdir, buffer too small\n"));
3238 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
3242 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
3244 DEBUG(4,("spoolss_io_r_getprinterdriverdir, buffer large enough\n"));
3246 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
3247 beginning=ps->offset;
3248 start_offset=ps->offset;
3249 end_offset=start_offset+r_u->offered;
3255 DRIVER_DIRECTORY_1 *info;
3256 info = &(r_u->driver.driver_info_1);
3257 prs_unistr("name", ps, depth, &(info->name));
3258 /*smb_io_printer_driver_dir_1(desc, info, ps, depth, &start_offset, &end_offset);*/
3262 ps->offset=beginning+r_u->offered;
3267 * if the buffer was too small, send the minimum required size
3268 * if it was too large, send the real needed size
3271 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
3272 prs_uint32("status", ps, depth, &(r_u->status));
3275 /*******************************************************************
3276 ********************************************************************/
3277 void spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
3280 uint32 useless_ptr=0xADDE0FF0;
3281 prs_debug(ps, depth, desc, "");
3285 prs_uint32("pointer", ps, depth, &useless_ptr);
3286 smb_io_unistr2("", &(q_u->name),True,ps,depth);
3288 prs_uint32("pointer", ps, depth, &useless_ptr);
3289 smb_io_unistr2("", &(q_u->environment),True,ps,depth);
3291 prs_uint32("level", ps, depth, &(q_u->level));
3292 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
3294 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
3297 /*******************************************************************
3298 ********************************************************************/
3299 void spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
3301 uint32 useless_ptr=0xADDE0FF0;
3302 uint32 start_offset, end_offset, beginning;
3303 uint32 bufsize_required=0;
3306 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
3310 prs_uint32("pointer", ps, depth, &useless_ptr);
3315 PRINTPROCESSOR_1 *info_1;
3318 for (i=0; i<r_u->numofprintprocessors; i++)
3320 bufsize_required += spoolss_size_processor_info_1(&(info_1[i]));
3326 DEBUG(4,("size needed: %d\n",bufsize_required));
3327 DEBUG(4,("size offered: %d\n",r_u->offered));
3329 /* check if the buffer is big enough for the datas */
3330 if (r_u->offered<bufsize_required)
3333 /* it's too small */
3334 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
3335 r_u->offered=0; /* don't send back the buffer */
3337 DEBUG(4,("buffer too small\n"));
3339 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
3343 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
3345 DEBUG(4,("buffer large enough\n"));
3347 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
3348 beginning=ps->offset;
3349 start_offset=ps->offset;
3350 end_offset=start_offset+r_u->offered;
3356 PRINTPROCESSOR_1 *info_1;
3357 for (i=0; i<r_u->numofprintprocessors; i++)
3359 info_1 = &(r_u->info_1[i]);
3360 smb_io_processor_info_1(desc, info_1, ps, depth, &start_offset, &end_offset);
3365 ps->offset=beginning+r_u->offered;
3370 * if the buffer was too small, send the minimum required size
3371 * if it was too large, send the real needed size
3374 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
3375 prs_uint32("numofprintprocessors", ps, depth, &(r_u->numofprintprocessors));
3376 prs_uint32("status", ps, depth, &(r_u->status));
3379 /*******************************************************************
3380 ********************************************************************/
3381 void spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
3384 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
3388 prs_uint32("useless", ps, depth, &useless);
3389 smb_io_unistr2("", &(q_u->name),True,ps,depth);
3391 prs_uint32("useless", ps, depth, &useless);
3392 smb_io_unistr2("", &(q_u->environment),True,ps,depth);
3394 prs_uint32("level", ps, depth, &(q_u->level));
3395 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
3397 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
3400 /*******************************************************************
3401 ********************************************************************/
3402 void spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
3404 uint32 useless_ptr=0xADDE0FF0;
3405 uint32 start_offset, end_offset, beginning;
3406 uint32 bufsize_required=0;
3409 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
3413 prs_uint32("pointer", ps, depth, &useless_ptr);
3418 PRINTMONITOR_1 *info_1;
3421 for (i=0; i<r_u->numofprintmonitors; i++)
3423 bufsize_required += spoolss_size_monitor_info_1(&(info_1[i]));
3429 DEBUG(4,("size needed: %d\n",bufsize_required));
3430 DEBUG(4,("size offered: %d\n",r_u->offered));
3432 /* check if the buffer is big enough for the datas */
3433 if (r_u->offered<bufsize_required)
3436 /* it's too small */
3437 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
3438 r_u->offered=0; /* don't send back the buffer */
3440 DEBUG(4,("buffer too small\n"));
3442 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
3446 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
3448 DEBUG(4,("buffer large enough\n"));
3450 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
3451 beginning=ps->offset;
3452 start_offset=ps->offset;
3453 end_offset=start_offset+r_u->offered;
3459 PRINTMONITOR_1 *info_1;
3460 for (i=0; i<r_u->numofprintmonitors; i++)
3462 info_1 = &(r_u->info_1[i]);
3463 smb_io_monitor_info_1(desc, info_1, ps, depth, &start_offset, &end_offset);
3468 ps->offset=beginning+r_u->offered;
3473 * if the buffer was too small, send the minimum required size
3474 * if it was too large, send the real needed size
3477 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
3478 prs_uint32("numofprintmonitors", ps, depth, &(r_u->numofprintmonitors));
3479 prs_uint32("status", ps, depth, &(r_u->status));
3482 /*******************************************************************
3483 ********************************************************************/
3484 void spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
3487 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
3491 prs_uint32("useless", ps, depth, &useless);
3492 smb_io_unistr2("", &(q_u->name),True,ps,depth);
3494 prs_uint32("level", ps, depth, &(q_u->level));
3495 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
3497 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
3500 /*******************************************************************
3501 ********************************************************************/
3502 void spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
3504 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
3508 prs_uint32("valuesize", ps, depth, &(r_u->valuesize));
3509 prs_unistr("value", ps, depth, &(r_u->value));
3510 prs_uint32("realvaluesize", ps, depth, &(r_u->realvaluesize));
3512 prs_uint32("type", ps, depth, &(r_u->type));
3514 prs_uint32("datasize", ps, depth, &(r_u->datasize));
3515 prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize);
3516 prs_uint32("realdatasize", ps, depth, &(r_u->realdatasize));
3517 prs_uint32("status", ps, depth, &(r_u->status));
3520 /*******************************************************************
3521 ********************************************************************/
3522 void spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
3524 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
3528 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
3529 prs_uint32("index", ps, depth, &(q_u->index));
3530 prs_uint32("valuesize", ps, depth, &(q_u->valuesize));
3531 prs_uint32("datasize", ps, depth, &(q_u->datasize));
3534 /*******************************************************************
3535 ********************************************************************/
3536 void spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
3538 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
3542 smb_io_prt_hnd("printer handle", &(q_u->handle), ps, depth);
3543 smb_io_unistr2("", &(q_u->value), True, ps, depth);
3547 prs_uint32("type", ps, depth, &(q_u->type));
3549 prs_uint32("max_len", ps, depth, &(q_u->max_len));
3557 q_u->data=(uint8 *)malloc(q_u->max_len * sizeof(uint8));
3558 prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len);
3563 prs_uint32("real_len", ps, depth, &(q_u->real_len));
3566 /*******************************************************************
3567 ********************************************************************/
3568 void spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
3570 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
3574 prs_uint32("status", ps, depth, &(r_u->status));
3577 /*******************************************************************
3578 ********************************************************************/
3579 void convert_specific_param(NT_PRINTER_PARAM **param, UNISTR2 value , uint32 type, uint8 *data, uint32 len)
3581 DEBUG(5,("converting a specific param struct\n"));
3585 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
3586 ZERO_STRUCTP(*param);
3587 DEBUGADD(6,("Allocated a new PARAM struct\n"));
3589 unistr2_to_ascii((*param)->value, &value, sizeof((*param)->value)-1);
3590 (*param)->type = type;
3592 /* le champ data n'est pas NULL termine */
3593 /* on stocke donc la longueur */
3595 (*param)->data_len=len;
3597 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
3599 memcpy((*param)->data, data, len);
3601 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
3604 /*******************************************************************
3605 ********************************************************************/
3606 static void spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
3608 prs_debug(ps, depth, desc, "spoolss_io_addform");
3614 prs_uint32("flags", ps, depth, &(f->flags));
3615 prs_uint32("name_ptr", ps, depth, &(f->name_ptr));
3616 prs_uint32("size_x", ps, depth, &(f->size_x));
3617 prs_uint32("size_y", ps, depth, &(f->size_y));
3618 prs_uint32("left", ps, depth, &(f->left));
3619 prs_uint32("top", ps, depth, &(f->top));
3620 prs_uint32("right", ps, depth, &(f->right));
3621 prs_uint32("bottom", ps, depth, &(f->bottom));
3623 smb_io_unistr2("", &(f->name), f->name_ptr, ps, depth);
3627 /*******************************************************************
3628 ********************************************************************/
3629 void spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
3631 uint32 useless_ptr=0;
3632 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
3636 smb_io_prt_hnd("printer handle", &(q_u->handle), ps, depth);
3637 prs_uint32("level", ps, depth, &(q_u->level));
3638 prs_uint32("level2", ps, depth, &(q_u->level2));
3642 prs_uint32("useless_ptr", ps, depth, &(useless_ptr));
3643 spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth);
3647 /*******************************************************************
3648 ********************************************************************/
3649 void spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
3651 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
3655 prs_uint32("status", ps, depth, &(r_u->status));
3658 /*******************************************************************
3659 ********************************************************************/
3660 void spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
3662 uint32 useless_ptr=0;
3663 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
3667 smb_io_prt_hnd("printer handle", &(q_u->handle), ps, depth);
3668 smb_io_unistr2("", &(q_u->name), True, ps, depth);
3672 prs_uint32("level", ps, depth, &(q_u->level));
3673 prs_uint32("level2", ps, depth, &(q_u->level2));
3677 prs_uint32("useless_ptr", ps, depth, &(useless_ptr));
3678 spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth);
3682 /*******************************************************************
3683 ********************************************************************/
3684 void spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
3686 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
3690 prs_uint32("status", ps, depth, &(r_u->status));
3693 /*******************************************************************
3694 ********************************************************************/
3695 void spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
3697 uint32 useless_ptr=0xADDE0FF0;
3698 uint32 start_offset, end_offset, beginning;
3699 uint32 bufsize_required=0;
3701 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
3706 prs_uint32("pointer", ps, depth, &useless_ptr);
3713 info=r_u->job.job_info_1;
3715 bufsize_required += spoolss_size_job_info_1(info);
3721 info=r_u->job.job_info_2;
3723 bufsize_required += spoolss_size_job_info_2(info);
3728 DEBUG(4,("spoolss_io_r_getjob, size needed: %d\n",bufsize_required));
3729 DEBUG(4,("spoolss_io_r_getjob, size offered: %d\n",r_u->offered));
3731 /* check if the buffer is big enough for the datas */
3732 if (r_u->offered<bufsize_required)
3734 /* it's too small */
3735 r_u->status=ERROR_INSUFFICIENT_BUFFER; /* say so */
3736 r_u->offered=0; /* don't send back the buffer */
3738 DEBUG(4,("spoolss_io_r_getjob, buffer too small\n"));
3740 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
3744 mem_grow_data(&(ps->data), ps->io, r_u->offered, 0);
3746 DEBUG(4,("spoolss_io_r_enumjobs, buffer large enough\n"));
3748 prs_uint32("size of buffer", ps, depth, &(r_u->offered));
3749 beginning=ps->offset;
3750 start_offset=ps->offset;
3751 end_offset=start_offset+r_u->offered;
3758 info = r_u->job.job_info_1;
3759 smb_io_job_info_1(desc, info, ps, depth, &start_offset, &end_offset);
3765 info = r_u->job.job_info_2;
3766 smb_io_job_info_2(desc, info, ps, depth, &start_offset, &end_offset);
3771 ps->offset=beginning+r_u->offered;
3776 * if the buffer was too small, send the minimum required size
3777 * if it was too large, send the real needed size
3780 prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
3781 prs_uint32("status", ps, depth, &(r_u->status));
3784 /*******************************************************************
3785 ********************************************************************/
3786 void spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
3789 prs_debug(ps, depth, desc, "");
3794 smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
3795 prs_uint32("jobid", ps, depth, &(q_u->jobid));
3796 prs_uint32("level", ps, depth, &(q_u->level));
3798 spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
3802 prs_uint32("buf_size", ps, depth, &(q_u->buf_size));