2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-2000,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
7 * Copyright (C) Jean François Micouleau 1998-2000.
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.
29 #define prs_uint16 _prs_uint16
30 #define prs_uint32 _prs_uint32
31 #define prs_uint8s _prs_uint8s
32 #define prs_uint16s _prs_uint16s
33 #define prs_unistr _prs_unistr
34 #define init_unistr2 make_unistr2
35 #define init_buf_unistr2 make_buf_unistr2
39 extern int DEBUGLEVEL;
40 /*******************************************************************
41 return the length of a UNISTR string.
42 ********************************************************************/
43 static uint32 str_len_uni(UNISTR *source)
47 while (source->buffer[i]!=0x0000)
54 /*******************************************************************
55 This should be moved in a more generic lib.
56 ********************************************************************/
57 static BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
59 if(!prs_uint16("year", ps, depth, &(systime->year)))
61 if(!prs_uint16("month", ps, depth, &(systime->month)))
63 if(!prs_uint16("dayofweek", ps, depth, &(systime->dayofweek)))
65 if(!prs_uint16("day", ps, depth, &(systime->day)))
67 if(!prs_uint16("hour", ps, depth, &(systime->hour)))
69 if(!prs_uint16("minute", ps, depth, &(systime->minute)))
71 if(!prs_uint16("second", ps, depth, &(systime->second)))
73 if(!prs_uint16("milliseconds", ps, depth, &(systime->milliseconds)))
79 /*******************************************************************
80 ********************************************************************/
81 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
83 systime->year=unixtime->tm_year+1900;
84 systime->month=unixtime->tm_mon+1;
85 systime->dayofweek=unixtime->tm_wday;
86 systime->day=unixtime->tm_mday;
87 systime->hour=unixtime->tm_hour;
88 systime->minute=unixtime->tm_min;
89 systime->second=unixtime->tm_sec;
90 systime->milliseconds=0;
95 /*******************************************************************
96 reads or writes an DOC_INFO structure.
97 ********************************************************************/
98 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
100 if (info_1 == NULL) return False;
102 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
108 if(!prs_uint32("p_docname", ps, depth, &(info_1->p_docname)))
110 if(!prs_uint32("p_outputfile", ps, depth, &(info_1->p_outputfile)))
112 if(!prs_uint32("p_datatype", ps, depth, &(info_1->p_datatype)))
115 if(!smb_io_unistr2("", &(info_1->docname), info_1->p_docname, ps, depth))
117 if(!smb_io_unistr2("", &(info_1->outputfile), info_1->p_outputfile, ps, depth))
119 if(!smb_io_unistr2("", &(info_1->datatype), info_1->p_datatype, ps, depth))
125 /*******************************************************************
126 reads or writes an DOC_INFO structure.
127 ********************************************************************/
128 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
130 uint32 useless_ptr=0;
132 if (info == NULL) return False;
134 prs_debug(ps, depth, desc, "smb_io_doc_info");
140 if(!prs_uint32("switch_value", ps, depth, &(info->switch_value)))
143 if(!prs_uint32("doc_info_X ptr", ps, depth, &(useless_ptr)))
146 switch (info->switch_value)
149 if(!smb_io_doc_info_1("",&(info->doc_info_1), ps, depth))
154 this is just a placeholder
156 MSDN July 1998 says doc_info_2 is only on
157 Windows 95, and as Win95 doesn't do RPC to print
158 this case is nearly impossible
160 Maybe one day with Windows for dishwasher 2037 ...
163 /* smb_io_doc_info_2("",&(info->doc_info_2), ps, depth); */
166 DEBUG(0,("Something is obviously wrong somewhere !\n"));
173 /*******************************************************************
174 reads or writes an DOC_INFO_CONTAINER structure.
175 ********************************************************************/
176 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
178 if (cont == NULL) return False;
180 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
186 if(!prs_uint32("level", ps, depth, &(cont->level)))
189 if(!smb_io_doc_info("",&(cont->docinfo), ps, depth))
195 /*******************************************************************
196 reads or writes an NOTIFY OPTION TYPE structure.
197 ********************************************************************/
198 static BOOL smb_io_notify_option_type(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
200 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
206 if(!prs_uint16("type", ps, depth, &type->type))
208 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
210 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
212 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
214 if(!prs_uint32("count", ps, depth, &type->count))
216 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
222 /*******************************************************************
223 reads or writes an NOTIFY OPTION TYPE DATA.
224 ********************************************************************/
225 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
229 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
232 /* if there are no fields just return */
233 if (type->fields_ptr==0)
239 if(!prs_uint32("count2", ps, depth, &type->count2))
242 if (type->count2 != type->count)
243 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
245 /* parse the option type data */
246 for(i=0;i<type->count2;i++)
247 if(!prs_uint16("fields",ps,depth,&(type->fields[i])))
252 /*******************************************************************
253 reads or writes an NOTIFY OPTION structure.
254 ********************************************************************/
255 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
259 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
262 if(!prs_uint32("count", ps, depth, &ctr->count))
266 if (UNMARSHALLING(ps))
267 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)malloc(ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
270 /* the option type struct */
271 for(i=0;i<ctr->count;i++)
272 if(!smb_io_notify_option_type("", &(ctr->type[i]) , ps, depth))
275 /* the type associated with the option type struct */
276 for(i=0;i<ctr->count;i++)
277 if(!smb_io_notify_option_type_data("", &(ctr->type[i]) , ps, depth))
283 /*******************************************************************
284 reads or writes an NOTIFY OPTION structure.
285 ********************************************************************/
286 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
288 prs_debug(ps, depth, desc, "smb_io_notify_option");
291 if(!prs_uint32("version", ps, depth, &option->version))
293 if(!prs_uint32("flags", ps, depth, &option->flags))
295 if(!prs_uint32("count", ps, depth, &option->count))
297 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
300 /* marshalling or unmarshalling, that would work */
301 if (option->option_type_ptr!=0) {
302 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
306 option->ctr.type=NULL;
313 /*******************************************************************
314 reads or writes an NOTIFY INFO DATA structure.
315 ********************************************************************/
316 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
318 uint32 useless_ptr=0xADDE0FF0;
320 uint32 how_many_words;
324 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
327 how_many_words=data->size;
328 if (how_many_words==POINTER)
330 how_many_words=TWO_VALUE;
333 isvalue=data->enc_type;
337 if(!prs_uint16("type", ps, depth, &(data->type)))
339 if(!prs_uint16("field", ps, depth, &(data->field)))
343 if(!prs_uint32("how many words", ps, depth, &how_many_words))
345 if(!prs_uint32("id", ps, depth, &(data->id)))
347 if(!prs_uint32("how many words", ps, depth, &how_many_words))
353 if(!prs_uint32("value[0]", ps, depth, &(data->notify_data.value[0])))
355 if(!prs_uint32("value[1]", ps, depth, &(data->notify_data.value[1])))
362 /* length in ascii including \0 */
363 x=2*(data->notify_data.data.length+1);
364 if(!prs_uint32("string length", ps, depth, &x ))
366 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
374 /*******************************************************************
375 reads or writes an NOTIFY INFO DATA structure.
376 ********************************************************************/
377 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
378 prs_struct *ps, int depth)
383 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
389 isvalue=data->enc_type;
393 /* length of string in unicode include \0 */
394 x=data->notify_data.data.length+1;
395 if(!prs_uint32("string length", ps, depth, &x ))
397 if(!prs_uint16s(True,"string",ps,depth,data->notify_data.data.string,x))
406 /*******************************************************************
407 reads or writes an NOTIFY INFO structure.
408 ********************************************************************/
409 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
413 prs_debug(ps, depth, desc, "smb_io_notify_info");
419 if(!prs_uint32("count", ps, depth, &(info->count)))
421 if(!prs_uint32("version", ps, depth, &(info->version)))
423 if(!prs_uint32("flags", ps, depth, &(info->flags)))
425 if(!prs_uint32("count", ps, depth, &(info->count)))
428 for (i=0;i<info->count;i++)
430 if(!smb_io_notify_info_data(desc, &(info->data[i]), ps, depth))
434 /* now do the strings at the end of the stream */
435 for (i=0;i<info->count;i++)
437 if(!smb_io_notify_info_data_strings(desc, &(info->data[i]), ps, depth))
445 /*******************************************************************
446 ********************************************************************/
447 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
449 prs_debug(ps, depth, desc, "");
458 if (!prs_uint32("size", ps, depth, &(q_u->size)))
460 if (!prs_uint32("client_name_ptr", ps, depth, &(q_u->client_name_ptr)))
462 if (!prs_uint32("user_name_ptr", ps, depth, &(q_u->user_name_ptr)))
464 if (!prs_uint32("build", ps, depth, &(q_u->build)))
466 if (!prs_uint32("major", ps, depth, &(q_u->major)))
468 if (!prs_uint32("minor", ps, depth, &(q_u->minor)))
470 if (!prs_uint32("processor", ps, depth, &(q_u->processor)))
473 if (!smb_io_unistr2("", &(q_u->client_name), q_u->client_name_ptr, ps, depth))
477 if (!smb_io_unistr2("", &(q_u->user_name), q_u->user_name_ptr, ps, depth))
483 /*******************************************************************
484 ********************************************************************/
485 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
490 prs_debug(ps, depth, desc, "spool_io_user_level");
495 if (!prs_uint32("level", ps, depth, &q_u->level))
497 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
500 switch (q_u->level) {
502 if (!spool_io_user_level_1("", &(q_u->user1), ps, depth))
512 /*******************************************************************
513 * read or write a DEVICEMODE struct.
514 * on reading allocate memory for the private member
515 ********************************************************************/
516 static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
518 prs_debug(ps, depth, desc, "spoolss_io_devmode");
521 if (!prs_uint16s(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
523 if (!prs_uint16("specversion", ps, depth, &(devmode->specversion)))
525 if (!prs_uint16("driverversion", ps, depth, &(devmode->driverversion)))
527 if (!prs_uint16("size", ps, depth, &(devmode->size)))
529 if (!prs_uint16("driverextra", ps, depth, &(devmode->driverextra)))
531 if (!prs_uint32("fields", ps, depth, &(devmode->fields)))
533 if (!prs_uint16("orientation", ps, depth, &(devmode->orientation)))
535 if (!prs_uint16("papersize", ps, depth, &(devmode->papersize)))
537 if (!prs_uint16("paperlength", ps, depth, &(devmode->paperlength)))
539 if (!prs_uint16("paperwidth", ps, depth, &(devmode->paperwidth)))
541 if (!prs_uint16("scale", ps, depth, &(devmode->scale)))
543 if (!prs_uint16("copies", ps, depth, &(devmode->copies)))
545 if (!prs_uint16("defaultsource", ps, depth, &(devmode->defaultsource)))
547 if (!prs_uint16("printquality", ps, depth, &(devmode->printquality)))
549 if (!prs_uint16("color", ps, depth, &(devmode->color)))
551 if (!prs_uint16("duplex", ps, depth, &(devmode->duplex)))
553 if (!prs_uint16("yresolution", ps, depth, &(devmode->yresolution)))
555 if (!prs_uint16("ttoption", ps, depth, &(devmode->ttoption)))
557 if (!prs_uint16("collate", ps, depth, &(devmode->collate)))
559 if (!prs_uint16s(True, "formname", ps, depth, devmode->formname.buffer, 32))
561 if (!prs_uint16("logpixels", ps, depth, &(devmode->logpixels)))
563 if (!prs_uint32("bitsperpel", ps, depth, &(devmode->bitsperpel)))
565 if (!prs_uint32("pelswidth", ps, depth, &(devmode->pelswidth)))
567 if (!prs_uint32("pelsheight", ps, depth, &(devmode->pelsheight)))
569 if (!prs_uint32("displayflags", ps, depth, &(devmode->displayflags)))
571 if (!prs_uint32("displayfrequency", ps, depth, &(devmode->displayfrequency)))
573 if (!prs_uint32("icmmethod", ps, depth, &(devmode->icmmethod)))
575 if (!prs_uint32("icmintent", ps, depth, &(devmode->icmintent)))
577 if (!prs_uint32("mediatype", ps, depth, &(devmode->mediatype)))
579 if (!prs_uint32("dithertype", ps, depth, &(devmode->dithertype)))
581 if (!prs_uint32("reserved1", ps, depth, &(devmode->reserved1)))
583 if (!prs_uint32("reserved2", ps, depth, &(devmode->reserved2)))
585 if (!prs_uint32("panningwidth", ps, depth, &(devmode->panningwidth)))
587 if (!prs_uint32("panningheight", ps, depth, &(devmode->panningheight)))
590 if (devmode->driverextra!=0)
592 if (UNMARSHALLING(ps)) {
593 devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8));
594 if(devmode->private == NULL)
596 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
599 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
600 if (!prs_uint8s(True, "private", ps, depth, devmode->private, devmode->driverextra))
607 /*******************************************************************
608 Read or write a DEVICEMODE container
609 ********************************************************************/
610 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
615 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
621 if (!prs_uint32("size", ps, depth, &dm_c->size))
624 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
627 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
628 if (UNMARSHALLING(ps))
629 /* if while reading there is no DEVMODE ... */
634 /* so we have a DEVICEMODE to follow */
635 if (UNMARSHALLING(ps)) {
636 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
637 dm_c->devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE));
638 if(dm_c->devmode == NULL)
640 ZERO_STRUCTP(dm_c->devmode);
643 /* this is bad code, shouldn't be there */
644 if (!prs_uint32("size", ps, depth, &dm_c->size))
647 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
653 /*******************************************************************
654 ********************************************************************/
655 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
660 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
663 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
666 if (!smb_io_unistr2("datatype", &(pd->datatype), pd->datatype_ptr, ps,depth))
672 if (!spoolss_io_devmode_cont("", &(pd->devmode_cont), ps, depth))
675 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
681 /*******************************************************************
683 ********************************************************************/
684 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, fstring printername, fstring datatype,
685 uint32 access_required, fstring clientname, fstring user_name)
687 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
688 q_u->printername_ptr = (printername!=NULL)?1:0;
689 init_unistr2(&(q_u->printername), printername, strlen(printername));
691 q_u->printer_default.datatype_ptr = 0;
693 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
694 init_unistr2(&(q_u->printer_default.datatype), datatype, strlen(datatype));
696 q_u->printer_default.devmode_cont.size=0;
697 q_u->printer_default.devmode_cont.devmode_ptr=0;
698 q_u->printer_default.devmode_cont.devmode=NULL;
699 q_u->printer_default.access_required=access_required;
701 q_u->user_ctr.level=1;
703 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+8;
704 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
705 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
706 q_u->user_ctr.user1.build=1381;
707 q_u->user_ctr.user1.major=2;
708 q_u->user_ctr.user1.minor=0;
709 q_u->user_ctr.user1.processor=0;
710 init_unistr2(&(q_u->user_ctr.user1.client_name), clientname, strlen(clientname));
711 init_unistr2(&(q_u->user_ctr.user1.user_name), user_name, strlen(user_name));
716 /*******************************************************************
718 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
719 ********************************************************************/
720 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
725 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
731 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
733 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
739 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
742 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
744 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
750 /*******************************************************************
752 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
753 * called from spoolss_open_printer_ex (cli_spoolss.c)
754 ********************************************************************/
755 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
757 if (r_u == NULL) return False;
759 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
765 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
768 if (!prs_uint32("status code", ps, depth, &(r_u->status)))
773 /*******************************************************************
775 ********************************************************************/
776 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
781 int len_name = valuename != NULL ? strlen(valuename) : 0;
783 if (q_u == NULL) return False;
785 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
787 memcpy(&(q_u->handle), handle, sizeof(q_u->handle));
788 init_unistr2(&(q_u->valuename), valuename, len_name);
794 /*******************************************************************
796 * called from spoolss_q_getprinterdata (srv_spoolss.c)
797 ********************************************************************/
798 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
800 if (q_u == NULL) return False;
802 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
807 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
811 if (!smb_io_unistr2("valuename", &(q_u->valuename),True,ps,depth))
815 if (!prs_uint32("size", ps, depth, &(q_u->size)))
821 /*******************************************************************
823 * called from spoolss_r_getprinterdata (srv_spoolss.c)
824 ********************************************************************/
825 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
830 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
835 if (!prs_uint32("type", ps, depth, &(r_u->type)))
837 if (!prs_uint32("size", ps, depth, &(r_u->size)))
840 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
846 if (!prs_uint32("needed", ps, depth, &(r_u->needed)))
848 if (!prs_uint32("status", ps, depth, &(r_u->status)))
854 /*******************************************************************
856 ********************************************************************/
857 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
859 if (q_u == NULL) return False;
861 DEBUG(5,("make_spoolss_q_closeprinter\n"));
863 memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
868 /*******************************************************************
870 * called from static spoolss_q_closeprinter (srv_spoolss.c)
871 * called from spoolss_closeprinter (cli_spoolss.c)
872 ********************************************************************/
873 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
875 if (q_u == NULL) return False;
877 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
883 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
889 /*******************************************************************
891 * called from static spoolss_r_closeprinter (srv_spoolss.c)
892 * called from spoolss_closeprinter (cli_spoolss.c)
893 ********************************************************************/
894 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
896 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
902 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
904 if (!prs_uint32("status", ps, depth, &r_u->status))
910 /*******************************************************************
912 * called from spoolss_q_startdocprinter (srv_spoolss.c)
913 ********************************************************************/
914 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
916 if (q_u == NULL) return False;
918 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
924 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
927 if(!smb_io_doc_info_container("",&(q_u->doc_info_container), ps, depth))
933 /*******************************************************************
935 * called from spoolss_r_startdocprinter (srv_spoolss.c)
936 ********************************************************************/
937 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
939 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
941 if(!prs_uint32("jobid", ps, depth, &(r_u->jobid)))
943 if(!prs_uint32("status", ps, depth, &(r_u->status)))
949 /*******************************************************************
951 * called from spoolss_q_enddocprinter (srv_spoolss.c)
952 ********************************************************************/
953 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
955 if (q_u == NULL) return False;
957 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
963 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
969 /*******************************************************************
971 * called from spoolss_r_enddocprinter (srv_spoolss.c)
972 ********************************************************************/
973 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
975 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
977 if(!prs_uint32("status", ps, depth, &(r_u->status)))
983 /*******************************************************************
985 * called from spoolss_q_startpageprinter (srv_spoolss.c)
986 ********************************************************************/
987 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
989 if (q_u == NULL) return False;
991 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
997 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1003 /*******************************************************************
1004 * write a structure.
1005 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1006 ********************************************************************/
1007 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1009 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1011 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1017 /*******************************************************************
1019 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1020 ********************************************************************/
1021 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1023 if (q_u == NULL) return False;
1025 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1031 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1037 /*******************************************************************
1038 * write a structure.
1039 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1040 ********************************************************************/
1041 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1043 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1045 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1051 /*******************************************************************
1053 * called from spoolss_q_writeprinter (srv_spoolss.c)
1054 ********************************************************************/
1055 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1057 if (q_u == NULL) return False;
1059 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1065 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1067 if(!prs_uint32("buffer_size", ps, depth, &(q_u->buffer_size)))
1070 if (q_u->buffer_size!=0)
1072 q_u->buffer=(uint8 *)malloc(q_u->buffer_size*sizeof(uint8));
1073 if(q_u->buffer == NULL)
1075 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1080 if(!prs_uint32("buffer_size2", ps, depth, &(q_u->buffer_size2)))
1086 /*******************************************************************
1087 * write a structure.
1088 * called from spoolss_r_writeprinter (srv_spoolss.c)
1089 ********************************************************************/
1090 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1092 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1094 if(!prs_uint32("buffer_written", ps, depth, &(r_u->buffer_written)))
1096 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1102 /*******************************************************************
1104 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1105 ********************************************************************/
1106 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1108 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1114 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1116 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1118 if(!prs_uint32("options", ps, depth, &q_u->options))
1120 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1122 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1128 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1131 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1134 if (q_u->option_ptr!=0) {
1136 if (UNMARSHALLING(ps))
1137 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1140 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1147 /*******************************************************************
1148 * write a structure.
1149 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1150 ********************************************************************/
1151 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1153 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1156 if(!prs_uint32("status", ps, depth, &r_u->status))
1162 /*******************************************************************
1164 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1165 ********************************************************************/
1166 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1168 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1174 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1177 if(!prs_uint32("change", ps, depth, &q_u->change))
1180 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1183 if (q_u->option_ptr!=0) {
1185 if (UNMARSHALLING(ps))
1186 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1189 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1196 /*******************************************************************
1197 * write a structure.
1198 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1199 ********************************************************************/
1200 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1202 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1208 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1211 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1216 if(!prs_uint32("status", ps, depth, &r_u->status))
1222 /*******************************************************************
1223 * return the length of a uint16 (obvious, but the code is clean)
1224 ********************************************************************/
1225 static uint32 size_of_uint16(uint16 *value)
1227 return (sizeof(*value));
1230 /*******************************************************************
1231 * return the length of a uint32 (obvious, but the code is clean)
1232 ********************************************************************/
1233 static uint32 size_of_uint32(uint32 *value)
1235 return (sizeof(*value));
1237 /*******************************************************************
1238 * return the length of a UNICODE string in number of char, includes:
1239 * - the leading zero
1240 * - the relative pointer size
1241 ********************************************************************/
1242 static uint32 size_of_relative_string(UNISTR *string)
1246 size=str_len_uni(string); /* the string length */
1247 size=size+1; /* add the leading zero */
1248 size=size*2; /* convert in char */
1249 size=size+4; /* add the size of the ptr */
1254 /*******************************************************************
1255 * return the length of a uint32 (obvious, but the code is clean)
1256 ********************************************************************/
1257 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1262 return (4+devmode->size+devmode->driverextra);
1265 /*******************************************************************
1266 * return the length of a uint32 (obvious, but the code is clean)
1267 ********************************************************************/
1268 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1273 return (sizeof(SYSTEMTIME) +4);
1276 /*******************************************************************
1277 * write a UNICODE string.
1278 * used by all the RPC structs passing a buffer
1279 ********************************************************************/
1280 static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
1285 prs_debug(ps, depth, desc, "spoolss_smb_io_unistr");
1287 if (!prs_unistr("unistr", ps, depth, uni))
1294 /*******************************************************************
1295 * write a UNICODE string and its relative pointer.
1296 * used by all the RPC structs passing a buffer
1298 * As I'm a nice guy, I'm forcing myself to explain this code.
1299 * MS did a good job in the overall spoolss code except in some
1300 * functions where they are passing the API buffer directly in the
1301 * RPC request/reply. That's to maintain compatiility at the API level.
1302 * They could have done it the good way the first time.
1304 * So what happen is: the strings are written at the buffer's end,
1305 * in the reverse order of the original structure. Some pointers to
1306 * the strings are also in the buffer. Those are relative to the
1309 * If you don't understand or want to change that function,
1310 * first get in touch with me: jfm@samba.org
1312 ********************************************************************/
1313 static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1315 prs_struct *ps=&(buffer->prs);
1317 if (MARSHALLING(ps)) {
1318 uint32 struct_offset = prs_offset(ps);
1319 uint32 relative_offset;
1321 buffer->string_at_end -= 2*(str_len_uni(string)+1);
1322 prs_set_offset(ps, buffer->string_at_end);
1324 /* write the string */
1325 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1328 prs_set_offset(ps, struct_offset);
1330 relative_offset=buffer->string_at_end - buffer->struct_start;
1331 /* write its offset */
1332 if (!prs_uint32("offset", ps, depth, &relative_offset))
1338 /* read the offset */
1339 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1342 old_offset = prs_offset(ps);
1343 prs_set_offset(ps, buffer->string_at_end+buffer->struct_start);
1345 /* read the string */
1346 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1349 prs_set_offset(ps, old_offset);
1355 /*******************************************************************
1356 * write a array of UNICODE strings and its relative pointer.
1357 * used by 2 RPC structs
1358 ********************************************************************/
1359 static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1363 prs_struct *ps=&(buffer->prs);
1365 if (MARSHALLING(ps)) {
1366 uint32 struct_offset = prs_offset(ps);
1367 uint32 relative_offset;
1374 /* first write the last 0 */
1375 buffer->string_at_end -= 2;
1376 prs_set_offset(ps, buffer->string_at_end);
1378 if(!prs_uint16("leading zero", ps, depth, &zero))
1386 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1388 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1390 prs_set_offset(ps, buffer->string_at_end);
1392 /* write the string */
1393 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1398 } while (*p!=0); /* end on the last leading 0 */
1400 prs_set_offset(ps, struct_offset);
1402 relative_offset=buffer->string_at_end - buffer->struct_start;
1403 /* write its offset */
1404 if (!prs_uint32("offset", ps, depth, &relative_offset))
1409 uint16 *chaine2=NULL;
1415 /* read the offset */
1416 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1419 old_offset = prs_offset(ps);
1420 prs_set_offset(ps, buffer->string_at_end + buffer->struct_start);
1423 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1426 l_chaine=str_len_uni(&chaine);
1427 if((chaine2=(uint16 *)Realloc(chaine2, (l_chaine2+l_chaine+1)*sizeof(uint16))) == NULL)
1429 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1430 l_chaine2+=l_chaine+1;
1432 } while(l_chaine!=0);
1436 prs_set_offset(ps, old_offset);
1442 /*******************************************************************
1443 Parse a DEVMODE structure and its relative pointer.
1444 ********************************************************************/
1445 static BOOL new_smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1447 prs_struct *ps=&(buffer->prs);
1449 prs_debug(ps, depth, desc, "new_smb_io_reldevmode");
1452 if (MARSHALLING(ps)) {
1453 uint32 struct_offset = prs_offset(ps);
1454 uint32 relative_offset;
1456 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1458 prs_set_offset(ps, buffer->string_at_end);
1460 /* write the DEVMODE */
1461 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1464 prs_set_offset(ps, struct_offset);
1466 relative_offset=buffer->string_at_end - buffer->struct_start;
1467 /* write its offset */
1468 if (!prs_uint32("offset", ps, depth, &relative_offset))
1474 /* read the offset */
1475 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1478 old_offset = prs_offset(ps);
1479 prs_set_offset(ps, buffer->string_at_end + buffer->struct_start);
1481 /* read the string */
1482 if((*devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE))) == NULL)
1484 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1487 prs_set_offset(ps, old_offset);
1493 /*******************************************************************
1494 Parse a PRINTER_INFO_0 structure.
1495 ********************************************************************/
1496 BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
1498 prs_struct *ps=&(buffer->prs);
1500 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
1503 buffer->struct_start=prs_offset(ps);
1505 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1507 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
1510 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
1512 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
1514 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
1517 if(!prs_uint16("year", ps, depth, &info->year))
1519 if(!prs_uint16("month", ps, depth, &info->month))
1521 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
1523 if(!prs_uint16("day", ps, depth, &info->day))
1525 if(!prs_uint16("hour", ps, depth, &info->hour))
1527 if(!prs_uint16("minute", ps, depth, &info->minute))
1529 if(!prs_uint16("second", ps, depth, &info->second))
1531 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
1534 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
1536 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
1539 if(!prs_uint16("major_version", ps, depth, &info->major_version))
1541 if(!prs_uint16("build_version", ps, depth, &info->build_version))
1543 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
1545 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
1547 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
1549 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
1551 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
1553 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
1555 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
1557 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
1559 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
1561 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
1563 if(!prs_uint32("change_id", ps, depth, &info->change_id))
1565 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
1567 if(!prs_uint32("status" , ps, depth, &info->status))
1569 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
1571 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
1573 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
1575 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
1577 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
1579 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
1581 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
1583 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
1585 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
1587 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
1593 /*******************************************************************
1594 Parse a PRINTER_INFO_1 structure.
1595 ********************************************************************/
1596 BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
1598 prs_struct *ps=&(buffer->prs);
1600 prs_debug(ps, depth, desc, "new_smb_io_printer_info_1");
1603 buffer->struct_start=prs_offset(ps);
1605 if (!prs_uint32("flags", ps, depth, &info->flags))
1607 if (!new_smb_io_relstr("description", buffer, depth, &info->description))
1609 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1611 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
1617 /*******************************************************************
1618 Parse a PRINTER_INFO_2 structure.
1619 ********************************************************************/
1620 BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
1622 /* hack for the SEC DESC */
1625 prs_struct *ps=&(buffer->prs);
1627 prs_debug(ps, depth, desc, "new_smb_io_printer_info_2");
1630 buffer->struct_start=prs_offset(ps);
1632 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
1634 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1636 if (!new_smb_io_relstr("sharename", buffer, depth, &info->sharename))
1638 if (!new_smb_io_relstr("portname", buffer, depth, &info->portname))
1640 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
1642 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
1644 if (!new_smb_io_relstr("location", buffer, depth, &info->location))
1647 /* NT parses the DEVMODE at the end of the struct */
1648 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1651 if (!new_smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
1653 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1655 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1657 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
1660 if (!prs_uint32("security descriptor", ps, depth, &pipo))
1662 if (!prs_uint32("attributes", ps, depth, &info->attributes))
1664 if (!prs_uint32("priority", ps, depth, &info->priority))
1666 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
1668 if (!prs_uint32("starttime", ps, depth, &info->starttime))
1670 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
1672 if (!prs_uint32("status", ps, depth, &info->status))
1674 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
1676 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
1682 /*******************************************************************
1683 Parse a DRIVER_INFO_1 structure.
1684 ********************************************************************/
1685 BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
1687 prs_struct *ps=&(buffer->prs);
1689 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_1");
1692 buffer->struct_start=prs_offset(ps);
1694 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1701 /*******************************************************************
1702 Parse a DRIVER_INFO_2 structure.
1703 ********************************************************************/
1704 BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
1706 prs_struct *ps=&(buffer->prs);
1708 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_2");
1711 buffer->struct_start=prs_offset(ps);
1713 if (!prs_uint32("version", ps, depth, &info->version))
1715 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1717 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
1719 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1721 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
1723 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
1730 /*******************************************************************
1731 Parse a DRIVER_INFO_3 structure.
1732 ********************************************************************/
1733 BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
1735 prs_struct *ps=&(buffer->prs);
1737 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_3");
1740 buffer->struct_start=prs_offset(ps);
1742 if (!prs_uint32("version", ps, depth, &info->version))
1744 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1746 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
1748 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1750 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
1752 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
1754 if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
1757 if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
1760 if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
1762 if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
1769 /*******************************************************************
1770 Parse a JOB_INFO_1 structure.
1771 ********************************************************************/
1772 BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
1774 prs_struct *ps=&(buffer->prs);
1776 prs_debug(ps, depth, desc, "new_smb_io_job_info_1");
1779 buffer->struct_start=prs_offset(ps);
1781 if (!prs_uint32("jobid", ps, depth, &info->jobid))
1783 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1785 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
1787 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
1789 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
1791 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1793 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
1795 if (!prs_uint32("status", ps, depth, &info->status))
1797 if (!prs_uint32("priority", ps, depth, &info->priority))
1799 if (!prs_uint32("position", ps, depth, &info->position))
1801 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
1803 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
1805 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
1811 /*******************************************************************
1812 Parse a JOB_INFO_2 structure.
1813 ********************************************************************/
1814 BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
1817 prs_struct *ps=&(buffer->prs);
1819 prs_debug(ps, depth, desc, "new_smb_io_job_info_2");
1822 buffer->struct_start=prs_offset(ps);
1824 if (!prs_uint32("jobid",ps, depth, &info->jobid))
1826 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1828 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
1830 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
1832 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
1834 if (!new_smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
1836 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1839 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1841 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
1843 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
1845 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1847 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
1850 /* SEC_DESC sec_desc;*/
1851 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
1854 if (!prs_uint32("status",ps, depth, &info->status))
1856 if (!prs_uint32("priority",ps, depth, &info->priority))
1858 if (!prs_uint32("position",ps, depth, &info->position))
1860 if (!prs_uint32("starttime",ps, depth, &info->starttime))
1862 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
1864 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
1866 if (!prs_uint32("size",ps, depth, &info->size))
1868 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
1870 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
1872 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
1878 /*******************************************************************
1879 ********************************************************************/
1880 BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
1882 prs_struct *ps=&(buffer->prs);
1884 prs_debug(ps, depth, desc, "new_smb_io_form_1");
1887 buffer->struct_start=prs_offset(ps);
1889 if (!prs_uint32("flag", ps, depth, &(info->flag)))
1892 if (!new_smb_io_relstr("name", buffer, depth, &(info->name)))
1895 if (!prs_uint32("width", ps, depth, &(info->width)))
1897 if (!prs_uint32("length", ps, depth, &(info->length)))
1899 if (!prs_uint32("left", ps, depth, &(info->left)))
1901 if (!prs_uint32("top", ps, depth, &(info->top)))
1903 if (!prs_uint32("right", ps, depth, &(info->right)))
1905 if (!prs_uint32("bottom", ps, depth, &(info->bottom)))
1911 /*******************************************************************
1912 Read/write a BUFFER struct.
1913 ********************************************************************/
1914 static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER *buffer)
1919 prs_debug(ps, depth, desc, "new_spoolss_io_buffer");
1922 if (!prs_uint32("ptr", ps, depth, &(buffer->ptr)))
1926 if (UNMARSHALLING(ps)) {
1928 buffer->string_at_end=0;
1930 if (buffer->ptr==0) {
1931 if (!prs_init(&(buffer->prs), 0, 4, UNMARSHALL))
1936 if (!prs_uint32("size", ps, depth, &buffer->size))
1939 if (!prs_init(&(buffer->prs), buffer->size, 4, UNMARSHALL))
1942 if (!prs_append_some_prs_data(&(buffer->prs), ps, prs_offset(ps), buffer->size))
1945 if (!prs_set_offset(&buffer->prs, 0))
1948 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
1951 buffer->string_at_end=buffer->size;
1960 if (!prs_uint32("size", ps, depth, &(buffer->size)))
1962 if (!prs_append_some_prs_data(ps, &(buffer->prs), 0, buffer->size))
1969 /*******************************************************************
1970 move a BUFFER from the query to the reply.
1971 ********************************************************************/
1972 void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
1974 prs_switch_type(&(src->prs), MARSHALL);
1975 prs_set_offset(&(src->prs), 0);
1976 prs_force_dynamic(&(src->prs));
1981 /*******************************************************************
1982 create a BUFFER struct.
1983 ********************************************************************/
1984 BOOL new_spoolss_allocate_buffer(NEW_BUFFER **buffer)
1989 if((*buffer=(NEW_BUFFER *)malloc(sizeof(NEW_BUFFER))) == NULL) {
1990 DEBUG(0,("new_spoolss_allocate_buffer: malloc fail for size %u.\n",
1991 (unsigned int)sizeof(NEW_BUFFER) ));
1997 (*buffer)->string_at_end=0;
2001 /*******************************************************************
2002 Destroy a BUFFER struct.
2003 ********************************************************************/
2004 void new_spoolss_free_buffer(NEW_BUFFER *buffer)
2009 prs_mem_free(&(buffer->prs));
2012 buffer->string_at_end=0;
2017 /*******************************************************************
2018 Get the size of a BUFFER struct.
2019 ********************************************************************/
2020 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2022 return (buffer->size);
2026 /*******************************************************************
2027 Parse a DRIVER_DIRECTORY_1 structure.
2028 ********************************************************************/
2029 BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2031 prs_struct *ps=&(buffer->prs);
2033 prs_debug(ps, depth, desc, "new_smb_io_driverdir_1");
2036 buffer->struct_start=prs_offset(ps);
2038 if (!spoolss_smb_io_unistr(desc, &info->name, ps, depth))
2044 /*******************************************************************
2045 Parse a PORT_INFO_1 structure.
2046 ********************************************************************/
2047 BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2049 prs_struct *ps=&(buffer->prs);
2051 prs_debug(ps, depth, desc, "new_smb_io_port_1");
2054 buffer->struct_start=prs_offset(ps);
2056 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2062 /*******************************************************************
2063 Parse a PORT_INFO_2 structure.
2064 ********************************************************************/
2065 BOOL new_smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2067 prs_struct *ps=&(buffer->prs);
2069 prs_debug(ps, depth, desc, "new_smb_io_port_2");
2072 buffer->struct_start=prs_offset(ps);
2074 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2076 if(!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2078 if(!new_smb_io_relstr("description", buffer, depth, &info->description))
2080 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2082 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2089 /*******************************************************************
2090 ********************************************************************/
2091 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2093 prs_struct *ps=&(buffer->prs);
2095 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2098 buffer->struct_start=prs_offset(ps);
2100 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2106 /*******************************************************************
2107 ********************************************************************/
2108 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2110 prs_struct *ps=&(buffer->prs);
2112 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2115 buffer->struct_start=prs_offset(ps);
2117 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2123 /*******************************************************************
2124 ********************************************************************/
2125 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2127 prs_struct *ps=&(buffer->prs);
2129 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2132 buffer->struct_start=prs_offset(ps);
2134 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2140 /*******************************************************************
2141 ********************************************************************/
2142 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2144 prs_struct *ps=&(buffer->prs);
2146 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2149 buffer->struct_start=prs_offset(ps);
2151 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2153 if (!new_smb_io_relstr("environment", buffer, depth, &info->environment))
2155 if (!new_smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2161 /*******************************************************************
2162 return the size required by a struct in the stream
2163 ********************************************************************/
2164 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2168 size+=size_of_relative_string( &info->printername );
2169 size+=size_of_relative_string( &info->servername );
2171 size+=size_of_uint32( &info->cjobs);
2172 size+=size_of_uint32( &info->total_jobs);
2173 size+=size_of_uint32( &info->total_bytes);
2175 size+=size_of_uint16( &info->year);
2176 size+=size_of_uint16( &info->month);
2177 size+=size_of_uint16( &info->dayofweek);
2178 size+=size_of_uint16( &info->day);
2179 size+=size_of_uint16( &info->hour);
2180 size+=size_of_uint16( &info->minute);
2181 size+=size_of_uint16( &info->second);
2182 size+=size_of_uint16( &info->milliseconds);
2184 size+=size_of_uint32( &info->global_counter);
2185 size+=size_of_uint32( &info->total_pages);
2187 size+=size_of_uint16( &info->major_version);
2188 size+=size_of_uint16( &info->build_version);
2190 size+=size_of_uint32( &info->unknown7);
2191 size+=size_of_uint32( &info->unknown8);
2192 size+=size_of_uint32( &info->unknown9);
2193 size+=size_of_uint32( &info->session_counter);
2194 size+=size_of_uint32( &info->unknown11);
2195 size+=size_of_uint32( &info->printer_errors);
2196 size+=size_of_uint32( &info->unknown13);
2197 size+=size_of_uint32( &info->unknown14);
2198 size+=size_of_uint32( &info->unknown15);
2199 size+=size_of_uint32( &info->unknown16);
2200 size+=size_of_uint32( &info->change_id);
2201 size+=size_of_uint32( &info->unknown18);
2202 size+=size_of_uint32( &info->status);
2203 size+=size_of_uint32( &info->unknown20);
2204 size+=size_of_uint32( &info->c_setprinter);
2206 size+=size_of_uint16( &info->unknown22);
2207 size+=size_of_uint16( &info->unknown23);
2208 size+=size_of_uint16( &info->unknown24);
2209 size+=size_of_uint16( &info->unknown25);
2210 size+=size_of_uint16( &info->unknown26);
2211 size+=size_of_uint16( &info->unknown27);
2212 size+=size_of_uint16( &info->unknown28);
2213 size+=size_of_uint16( &info->unknown29);
2218 /*******************************************************************
2219 return the size required by a struct in the stream
2220 ********************************************************************/
2221 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2225 size+=size_of_uint32( &(info->flags) );
2226 size+=size_of_relative_string( &(info->description) );
2227 size+=size_of_relative_string( &(info->name) );
2228 size+=size_of_relative_string( &(info->comment) );
2233 /*******************************************************************
2234 return the size required by a struct in the stream
2235 ********************************************************************/
2236 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2240 size+=4; /* the security descriptor */
2242 size+=size_of_device_mode( info->devmode );
2244 size+=size_of_relative_string( &info->servername );
2245 size+=size_of_relative_string( &info->printername );
2246 size+=size_of_relative_string( &info->sharename );
2247 size+=size_of_relative_string( &info->portname );
2248 size+=size_of_relative_string( &info->drivername );
2249 size+=size_of_relative_string( &info->comment );
2250 size+=size_of_relative_string( &info->location );
2252 size+=size_of_relative_string( &info->sepfile );
2253 size+=size_of_relative_string( &info->printprocessor );
2254 size+=size_of_relative_string( &info->datatype );
2255 size+=size_of_relative_string( &info->parameters );
2257 size+=size_of_uint32( &info->attributes );
2258 size+=size_of_uint32( &info->priority );
2259 size+=size_of_uint32( &info->defaultpriority );
2260 size+=size_of_uint32( &info->starttime );
2261 size+=size_of_uint32( &info->untiltime );
2262 size+=size_of_uint32( &info->status );
2263 size+=size_of_uint32( &info->cjobs );
2264 size+=size_of_uint32( &info->averageppm );
2268 /*******************************************************************
2269 return the size required by a struct in the stream
2270 ********************************************************************/
2271 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2274 size+=size_of_relative_string( &info->name );
2279 /*******************************************************************
2280 return the size required by a struct in the stream
2281 ********************************************************************/
2282 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2285 size+=size_of_uint32( &info->version );
2286 size+=size_of_relative_string( &info->name );
2287 size+=size_of_relative_string( &info->architecture );
2288 size+=size_of_relative_string( &info->driverpath );
2289 size+=size_of_relative_string( &info->datafile );
2290 size+=size_of_relative_string( &info->configfile );
2295 /*******************************************************************
2296 return the size required by a struct in the stream
2297 ********************************************************************/
2298 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
2304 size+=size_of_uint32( &info->version );
2305 size+=size_of_relative_string( &info->name );
2306 size+=size_of_relative_string( &info->architecture );
2307 size+=size_of_relative_string( &info->driverpath );
2308 size+=size_of_relative_string( &info->datafile );
2309 size+=size_of_relative_string( &info->configfile );
2310 size+=size_of_relative_string( &info->helpfile );
2311 size+=size_of_relative_string( &info->monitorname );
2312 size+=size_of_relative_string( &info->defaultdatatype );
2314 string=info->dependentfiles;
2316 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2318 i=i+2; /* to count all chars including the leading zero */
2319 i=2*i; /* because we need the value in bytes */
2320 i=i+4; /* the offset pointer size */
2327 /*******************************************************************
2328 return the size required by a struct in the stream
2329 ********************************************************************/
2330 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
2333 size+=size_of_uint32( &info->jobid );
2334 size+=size_of_relative_string( &info->printername );
2335 size+=size_of_relative_string( &info->machinename );
2336 size+=size_of_relative_string( &info->username );
2337 size+=size_of_relative_string( &info->document );
2338 size+=size_of_relative_string( &info->datatype );
2339 size+=size_of_relative_string( &info->text_status );
2340 size+=size_of_uint32( &info->status );
2341 size+=size_of_uint32( &info->priority );
2342 size+=size_of_uint32( &info->position );
2343 size+=size_of_uint32( &info->totalpages );
2344 size+=size_of_uint32( &info->pagesprinted );
2345 size+=size_of_systemtime( &info->submitted );
2350 /*******************************************************************
2351 return the size required by a struct in the stream
2352 ********************************************************************/
2353 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
2357 size+=4; /* size of sec desc ptr */
2359 size+=size_of_uint32( &info->jobid );
2360 size+=size_of_relative_string( &info->printername );
2361 size+=size_of_relative_string( &info->machinename );
2362 size+=size_of_relative_string( &info->username );
2363 size+=size_of_relative_string( &info->document );
2364 size+=size_of_relative_string( &info->notifyname );
2365 size+=size_of_relative_string( &info->datatype );
2366 size+=size_of_relative_string( &info->printprocessor );
2367 size+=size_of_relative_string( &info->parameters );
2368 size+=size_of_relative_string( &info->drivername );
2369 size+=size_of_device_mode( info->devmode );
2370 size+=size_of_relative_string( &info->text_status );
2371 /* SEC_DESC sec_desc;*/
2372 size+=size_of_uint32( &info->status );
2373 size+=size_of_uint32( &info->priority );
2374 size+=size_of_uint32( &info->position );
2375 size+=size_of_uint32( &info->starttime );
2376 size+=size_of_uint32( &info->untiltime );
2377 size+=size_of_uint32( &info->totalpages );
2378 size+=size_of_uint32( &info->size );
2379 size+=size_of_systemtime( &info->submitted );
2380 size+=size_of_uint32( &info->timeelapsed );
2381 size+=size_of_uint32( &info->pagesprinted );
2386 /*******************************************************************
2387 return the size required by a struct in the stream
2388 ********************************************************************/
2389 uint32 spoolss_size_form_1(FORM_1 *info)
2393 size+=size_of_uint32( &(info->flag) );
2394 size+=size_of_relative_string( &(info->name) );
2395 size+=size_of_uint32( &(info->width) );
2396 size+=size_of_uint32( &(info->length) );
2397 size+=size_of_uint32( &(info->left) );
2398 size+=size_of_uint32( &(info->top) );
2399 size+=size_of_uint32( &(info->right) );
2400 size+=size_of_uint32( &(info->bottom) );
2405 /*******************************************************************
2406 return the size required by a struct in the stream
2407 ********************************************************************/
2408 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
2412 size+=size_of_relative_string( &info->port_name );
2417 /*******************************************************************
2418 return the size required by a struct in the stream
2419 ********************************************************************/
2420 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
2424 size=str_len_uni(&info->name); /* the string length */
2425 size=size+1; /* add the leading zero */
2426 size=size*2; /* convert in char */
2431 /*******************************************************************
2432 return the size required by a struct in the stream
2433 ********************************************************************/
2434 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
2438 size+=size_of_relative_string( &info->port_name );
2439 size+=size_of_relative_string( &info->monitor_name );
2440 size+=size_of_relative_string( &info->description );
2442 size+=size_of_uint32( &info->port_type );
2443 size+=size_of_uint32( &info->reserved );
2448 /*******************************************************************
2449 return the size required by a struct in the stream
2450 ********************************************************************/
2451 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
2454 size+=size_of_relative_string( &info->name );
2459 /*******************************************************************
2460 return the size required by a struct in the stream
2461 ********************************************************************/
2462 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
2465 size+=size_of_relative_string( &info->name );
2470 /*******************************************************************
2471 return the size required by a struct in the stream
2472 ********************************************************************/
2473 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
2476 size+=size_of_relative_string( &info->name );
2481 /*******************************************************************
2482 return the size required by a struct in the stream
2483 ********************************************************************/
2484 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
2487 size+=size_of_relative_string( &info->name);
2488 size+=size_of_relative_string( &info->environment);
2489 size+=size_of_relative_string( &info->dll_name);
2494 /*******************************************************************
2496 ********************************************************************/
2497 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
2498 const POLICY_HND *hnd, fstring architecture,
2499 uint32 level, uint32 clientmajor, uint32 clientminor,
2500 NEW_BUFFER *buffer, uint32 offered)
2507 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2509 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
2512 q_u->clientmajorversion=clientmajor;
2513 q_u->clientminorversion=clientminor;
2516 q_u->offered=offered;
2521 /*******************************************************************
2523 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
2524 ********************************************************************/
2525 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
2527 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
2533 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2535 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
2537 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
2542 if(!prs_uint32("level", ps, depth, &q_u->level))
2545 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2551 if(!prs_uint32("offered", ps, depth, &q_u->offered))
2554 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
2556 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
2562 /*******************************************************************
2564 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
2565 ********************************************************************/
2566 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
2568 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
2574 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2579 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2581 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
2583 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
2585 if (!prs_uint32("status", ps, depth, &r_u->status))
2591 /*******************************************************************
2593 ********************************************************************/
2594 BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, uint32 flags,
2595 fstring servername, uint32 level,
2596 NEW_BUFFER *buffer, uint32 offered)
2600 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
2601 init_unistr2(&(q_u->servername), servername, strlen(servername));
2605 q_u->offered=offered;
2610 /*******************************************************************
2612 * called from spoolss_enumprinters (srv_spoolss.c)
2613 ********************************************************************/
2614 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
2616 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
2622 if (!prs_uint32("flags", ps, depth, &q_u->flags))
2624 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
2627 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
2632 if (!prs_uint32("level", ps, depth, &q_u->level))
2635 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2640 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2646 /*******************************************************************
2647 Parse a SPOOL_R_ENUMPRINTERS structure.
2648 ********************************************************************/
2649 BOOL new_spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
2651 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinters");
2657 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2663 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2666 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2669 if (!prs_uint32("status", ps, depth, &r_u->status))
2675 /*******************************************************************
2676 * write a structure.
2677 * called from spoolss_r_enum_printers (srv_spoolss.c)
2679 ********************************************************************/
2680 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
2682 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
2688 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2694 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2697 if (!prs_uint32("status", ps, depth, &r_u->status))
2703 /*******************************************************************
2705 * called from spoolss_getprinter (srv_spoolss.c)
2706 ********************************************************************/
2707 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
2709 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
2715 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2717 if (!prs_uint32("level", ps, depth, &q_u->level))
2720 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2725 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2731 /*******************************************************************
2733 ********************************************************************/
2734 BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level,
2735 NEW_BUFFER *buffer, uint32 offered)
2741 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2745 q_u->offered=offered;
2750 /*******************************************************************
2751 ********************************************************************/
2752 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
2754 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
2760 if(!prs_uint32("status", ps, depth, &(r_u->status)))
2766 /*******************************************************************
2767 ********************************************************************/
2768 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
2770 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
2776 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
2778 if(!prs_uint32("level", ps, depth, &q_u->level))
2781 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
2784 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
2787 if(!prs_uint32("security.size_of_buffer", ps, depth, &q_u->security.size_of_buffer))
2789 if(!prs_uint32("security.data", ps, depth, &q_u->security.data))
2792 if(!prs_uint32("command", ps, depth, &q_u->command))
2798 /*******************************************************************
2799 ********************************************************************/
2800 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
2802 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
2808 if(!prs_uint32("status", ps, depth, &(r_u->status)))
2814 /*******************************************************************
2815 ********************************************************************/
2816 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
2819 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
2825 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
2832 /*******************************************************************
2833 ********************************************************************/
2834 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
2836 prs_debug(ps, depth, desc, "");
2842 if(!prs_uint32("status", ps, depth, &r_u->status))
2848 /*******************************************************************
2849 ********************************************************************/
2850 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
2852 prs_debug(ps, depth, desc, "");
2858 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2860 if(!prs_uint32("level", ps, depth, &q_u->level))
2863 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2869 if(!prs_uint32("offered", ps, depth, &q_u->offered))
2875 /*******************************************************************
2876 ********************************************************************/
2877 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
2879 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
2885 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2891 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2894 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2897 if (!prs_uint32("status", ps, depth, &r_u->status))
2904 /*******************************************************************
2905 ********************************************************************/
2906 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
2917 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2918 q_u->firstjob = firstjob;
2919 q_u->numofjobs = numofjobs;
2921 q_u->buffer= buffer;
2922 q_u->offered = offered;
2926 /*******************************************************************
2927 ********************************************************************/
2928 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
2930 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
2936 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
2939 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
2941 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
2943 if (!prs_uint32("level", ps, depth, &q_u->level))
2946 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2949 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2955 /*******************************************************************
2956 ********************************************************************/
2957 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
2959 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
2965 if(!prs_uint32("status", ps, depth, &(r_u->status)))
2971 /*******************************************************************
2972 ********************************************************************/
2973 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
2975 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
2981 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
2983 if(!prs_uint32("jobid", ps, depth, &(q_u->jobid)))
2989 /*******************************************************************
2990 ********************************************************************/
2991 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
2993 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
2999 if(!prs_uint32("status", ps, depth, &(r_u->status)))
3005 /*******************************************************************
3006 ********************************************************************/
3007 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3009 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3015 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3017 if(!prs_uint32("jobid", ps, depth, &(q_u->jobid)))
3020 * level is usually 0. If (level!=0) then I'm in trouble !
3021 * I will try to generate setjob command with level!=0, one day.
3023 if(!prs_uint32("level", ps, depth, &(q_u->level)))
3025 if(!prs_uint32("command", ps, depth, &(q_u->command)))
3031 /*******************************************************************
3032 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3033 ********************************************************************/
3034 BOOL new_spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3036 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinterdrivers");
3042 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3048 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3051 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3054 if (!prs_uint32("status", ps, depth, &r_u->status))
3061 /*******************************************************************
3062 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
3063 ********************************************************************/
3064 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
3067 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
3073 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3075 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
3080 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
3082 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3087 if (!prs_uint32("level", ps, depth, &q_u->level))
3090 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3096 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3102 /*******************************************************************
3103 ********************************************************************/
3104 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
3107 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
3112 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3114 if (!prs_uint32("level", ps, depth, &(q_u->level)))
3117 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3122 if (!prs_uint32("offered", ps, depth, &(q_u->offered)))
3128 /*******************************************************************
3129 ********************************************************************/
3130 BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
3132 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumforms");
3138 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3144 if (!prs_uint32("size of buffer needed", ps, depth, &(r_u->needed)))
3147 if (!prs_uint32("numofforms", ps, depth, &(r_u->numofforms)))
3150 if (!prs_uint32("status", ps, depth, &(r_u->status)))
3157 /*******************************************************************
3158 Parse a SPOOL_R_ENUMPORTS structure.
3159 ********************************************************************/
3160 BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
3162 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumports");
3168 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3174 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3177 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3180 if (!prs_uint32("status", ps, depth, &r_u->status))
3186 /*******************************************************************
3187 ********************************************************************/
3188 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
3190 prs_debug(ps, depth, desc, "");
3196 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
3198 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
3203 if (!prs_uint32("level", ps, depth, &q_u->level))
3206 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3211 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3217 /*******************************************************************
3218 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
3219 ********************************************************************/
3220 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
3222 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
3228 if(!prs_uint32("flags", ps, depth, &il->flags))
3230 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
3232 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
3234 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3237 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
3239 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3241 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3247 /*******************************************************************
3248 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
3249 ********************************************************************/
3250 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
3252 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
3258 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
3260 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
3262 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
3264 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
3266 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
3268 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3270 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
3272 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
3274 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
3276 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
3278 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
3280 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
3282 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
3285 if(!prs_uint32("attributes", ps, depth, &il->attributes))
3287 if(!prs_uint32("priority", ps, depth, &il->priority))
3289 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
3291 if(!prs_uint32("starttime", ps, depth, &il->starttime))
3293 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
3295 if(!prs_uint32("status", ps, depth, &il->status))
3297 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
3299 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
3302 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
3304 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
3306 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
3308 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
3310 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
3312 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3314 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
3316 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
3318 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
3320 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
3322 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
3328 /*******************************************************************
3329 ********************************************************************/
3330 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
3332 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
3337 if(!prs_uint32("level", ps, depth, &il->level))
3339 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
3342 /* if no struct inside just return */
3343 if (il->info_ptr==0) {
3344 if (UNMARSHALLING(ps)) {
3351 switch (il->level) {
3353 * level 0 is used by setprinter when managing the queue
3354 * (hold, stop, start a queue)
3359 * level 2 is used by addprinter
3360 * and by setprinter when updating printer's info
3363 if (UNMARSHALLING(ps)) {
3364 il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_1));
3365 if(il->info_1 == NULL)
3368 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
3372 if (UNMARSHALLING(ps)) {
3373 il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2));
3374 if(il->info_2 == NULL)
3377 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
3385 /*******************************************************************
3386 ********************************************************************/
3387 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
3389 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
3393 * I think that's one of the few well written functions.
3394 * the sub-structures are correctly parsed and analysed
3395 * the info level are handled in a nice way.
3400 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
3402 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
3408 if(!prs_uint32("info_level", ps, depth, &q_u->level))
3411 if(!spool_io_printer_info_level("", &(q_u->info), ps, depth))
3414 /* the 4 unknown are all 0 */
3417 * en fait ils sont pas inconnu
3418 * par recoupement avec rpcSetPrinter
3419 * c'est le devicemode
3420 * et le security descriptor.
3423 if(!prs_uint32("unk0", ps, depth, &q_u->unk0))
3425 if(!prs_uint32("unk1", ps, depth, &q_u->unk1))
3427 if(!prs_uint32("unk2", ps, depth, &q_u->unk2))
3429 if(!prs_uint32("unk3", ps, depth, &q_u->unk3))
3432 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
3434 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
3441 /*******************************************************************
3442 ********************************************************************/
3443 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u, prs_struct *ps, int depth)
3445 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
3448 if(!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
3451 if(!prs_uint32("status", ps, depth, &(r_u->status)))
3457 /*******************************************************************
3458 ********************************************************************/
3459 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
3460 prs_struct *ps, int depth)
3462 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
3464 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
3468 if (UNMARSHALLING(ps)) {
3469 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
3482 if(!prs_uint32("cversion", ps, depth, &il->cversion))
3484 if(!prs_uint32("name", ps, depth, &il->name_ptr))
3486 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
3488 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
3490 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
3492 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
3494 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
3496 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
3498 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
3500 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
3502 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
3508 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3510 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
3512 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
3514 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
3516 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
3518 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
3520 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
3522 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
3528 if (il->dependentfiles_ptr)
3529 smb_io_buffer5("", &(il->dependentfiles), ps, depth);
3535 /*******************************************************************
3536 convert a buffer of UNICODE strings null terminated
3537 the buffer is terminated by a NULL
3539 convert to an ascii array (null terminated)
3541 dynamically allocate memory
3543 ********************************************************************/
3544 BOOL uniarray_2_ascarray(BUFFER5 *buf5, char ***ar)
3555 if (buf5==NULL) return False;
3562 string=(char *)malloc(sizeof(char)*buf5->buf_len);
3566 destend = string + buf5->buf_len;
3569 while (dest < destend)
3571 *(dest++) = (char)*(src++);
3574 /* that ugly for the first one but that's working */
3575 array=(char **)Realloc(array, sizeof(char *)*(i+1));
3580 while ( n < buf5->buf_len )
3582 if ( *(string++) == '\0' )
3584 array=(char **)Realloc(array, sizeof(char *)*(i+1));
3593 DEBUG(10,("Number of dependent files: [%d]\n", i-1));
3598 /*******************************************************************
3599 read a UNICODE array with null terminated strings
3600 and null terminated array
3601 and size of array at beginning
3602 ********************************************************************/
3603 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
3605 if (buffer==NULL) return False;
3608 buffer->uni_str_len=buffer->uni_max_len;
3610 if(!prs_uint32("buffer_size", ps, depth, &(buffer->uni_max_len)))
3613 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
3619 /*******************************************************************
3620 ********************************************************************/
3621 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
3623 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
3628 if(!prs_uint32("level", ps, depth, &il->level))
3630 if(!prs_uint32("ptr", ps, depth, &il->ptr))
3636 switch (il->level) {
3638 if(!spool_io_printer_driver_info_level_3("", &(il->info_3), ps, depth))
3646 /*******************************************************************
3647 ********************************************************************/
3648 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
3650 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
3656 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
3658 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
3663 if(!prs_uint32("info_level", ps, depth, &q_u->level))
3666 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
3672 /*******************************************************************
3673 ********************************************************************/
3674 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
3676 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
3679 if(!prs_uint32("status", ps, depth, &q_u->status))
3686 /*******************************************************************
3687 ********************************************************************/
3688 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
3689 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
3691 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
3693 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
3697 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
3705 d->cversion=uni->cversion;
3707 unistr2_to_ascii(d->name, &(uni->name), sizeof(d->name)-1);
3708 unistr2_to_ascii(d->environment, &(uni->environment), sizeof(d->environment)-1);
3709 unistr2_to_ascii(d->driverpath, &(uni->driverpath), sizeof(d->driverpath)-1);
3710 unistr2_to_ascii(d->datafile, &(uni->datafile), sizeof(d->datafile)-1);
3711 unistr2_to_ascii(d->configfile, &(uni->configfile), sizeof(d->configfile)-1);
3712 unistr2_to_ascii(d->helpfile, &(uni->helpfile), sizeof(d->helpfile)-1);
3713 unistr2_to_ascii(d->monitorname, &(uni->monitorname), sizeof(d->monitorname)-1);
3714 unistr2_to_ascii(d->defaultdatatype, &(uni->defaultdatatype), sizeof(d->defaultdatatype)-1);
3716 DEBUGADD(8,( "version: %d\n", d->cversion));
3717 DEBUGADD(8,( "name: %s\n", d->name));
3718 DEBUGADD(8,( "environment: %s\n", d->environment));
3719 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
3720 DEBUGADD(8,( "datafile: %s\n", d->datafile));
3721 DEBUGADD(8,( "configfile: %s\n", d->configfile));
3722 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
3723 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
3724 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
3726 uniarray_2_ascarray(&(uni->dependentfiles), &(d->dependentfiles) );
3731 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
3732 NT_PRINTER_INFO_LEVEL_2 **asc)
3734 NT_PRINTER_INFO_LEVEL_2 *d;
3738 DEBUG(7,("Converting from UNICODE to ASCII\n"));
3739 time_unix=time(NULL);
3743 DEBUGADD(8,("allocating memory\n"));
3745 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
3750 /* we allocate memory iff called from
3751 * addprinter(ex) so we can do one time stuff here.
3753 (*asc)->setuptime=time_unix;
3756 DEBUGADD(8,("start converting\n"));
3760 d->attributes=uni->attributes;
3761 d->priority=uni->priority;
3762 d->default_priority=uni->default_priority;
3763 d->starttime=uni->starttime;
3764 d->untiltime=uni->untiltime;
3765 d->status=uni->status;
3766 d->cjobs=uni->cjobs;
3768 unix_to_nt_time(&time_nt, time_unix);
3769 d->changeid=time_nt.low;
3773 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
3774 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
3775 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
3776 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
3777 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
3778 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
3779 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
3780 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
3781 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
3782 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
3787 /*******************************************************************
3788 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
3789 ********************************************************************/
3790 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
3792 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
3797 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3799 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
3805 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
3807 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3813 if(!prs_uint32("level", ps, depth, &q_u->level))
3816 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3822 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3828 /*******************************************************************
3829 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
3830 ********************************************************************/
3831 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
3833 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
3839 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3845 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3848 if (!prs_uint32("status", ps, depth, &r_u->status))
3854 /*******************************************************************
3855 ********************************************************************/
3856 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
3858 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
3864 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3870 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3873 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3876 if (!prs_uint32("status", ps, depth, &r_u->status))
3882 /*******************************************************************
3883 ********************************************************************/
3884 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
3886 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
3892 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3894 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
3900 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
3902 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3908 if (!prs_uint32("level", ps, depth, &q_u->level))
3911 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3917 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3923 /*******************************************************************
3924 ********************************************************************/
3925 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
3927 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
3933 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3939 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3942 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3945 if (!prs_uint32("status", ps, depth, &r_u->status))
3951 /*******************************************************************
3952 ********************************************************************/
3953 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
3955 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
3961 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3963 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
3969 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
3971 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
3977 if (!prs_uint32("level", ps, depth, &q_u->level))
3980 if(!new_spoolss_io_buffer("buffer", ps, depth, q_u->buffer))
3986 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3992 /*******************************************************************
3993 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
3994 ********************************************************************/
3995 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
3997 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
4003 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4005 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4011 if (!prs_uint32("level", ps, depth, &q_u->level))
4014 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4020 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4026 /*******************************************************************
4027 ********************************************************************/
4028 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
4030 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
4036 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4042 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4045 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4048 if (!prs_uint32("status", ps, depth, &r_u->status))
4054 /*******************************************************************
4055 ********************************************************************/
4056 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
4058 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
4063 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
4065 if(!prs_uint16s(False, "value", ps, depth, r_u->value, r_u->valuesize))
4067 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
4070 if(!prs_uint32("type", ps, depth, &r_u->type))
4073 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
4075 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
4077 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
4079 if(!prs_uint32("status", ps, depth, &r_u->status))
4085 /*******************************************************************
4086 ********************************************************************/
4087 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
4089 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
4094 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4096 if(!prs_uint32("index", ps, depth, &q_u->index))
4098 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
4100 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
4106 /*******************************************************************
4107 ********************************************************************/
4108 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u, POLICY_HND *hnd, uint32 idx, uint32 valuelen, uint32 datalen)
4110 memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
4112 q_u->valuesize=valuelen;
4113 q_u->datasize=datalen;
4118 /*******************************************************************
4119 ********************************************************************/
4120 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
4122 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
4127 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4129 if(!smb_io_unistr2("", &(q_u->value), True, ps, depth))
4135 if(!prs_uint32("type", ps, depth, &(q_u->type)))
4138 if(!prs_uint32("max_len", ps, depth, &(q_u->max_len)))
4147 q_u->data=(uint8 *)malloc(q_u->max_len * sizeof(uint8));
4148 if(q_u->data == NULL)
4150 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
4157 if(!prs_uint32("real_len", ps, depth, &(q_u->real_len)))
4163 /*******************************************************************
4164 ********************************************************************/
4165 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
4167 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
4172 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4178 /*******************************************************************
4179 ********************************************************************/
4180 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
4181 uint32 type, const uint8 *data, uint32 len)
4183 DEBUG(5,("converting a specific param struct\n"));
4187 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
4190 ZERO_STRUCTP(*param);
4191 DEBUGADD(6,("Allocated a new PARAM struct\n"));
4193 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
4194 (*param)->type = type;
4196 /* le champ data n'est pas NULL termine */
4197 /* on stocke donc la longueur */
4199 (*param)->data_len=len;
4201 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
4202 if((*param)->data == NULL)
4205 memcpy((*param)->data, data, len);
4207 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
4212 /*******************************************************************
4213 ********************************************************************/
4214 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
4216 prs_debug(ps, depth, desc, "spoolss_io_addform");
4223 if(!prs_uint32("flags", ps, depth, &(f->flags)))
4225 if(!prs_uint32("name_ptr", ps, depth, &(f->name_ptr)))
4227 if(!prs_uint32("size_x", ps, depth, &(f->size_x)))
4229 if(!prs_uint32("size_y", ps, depth, &(f->size_y)))
4231 if(!prs_uint32("left", ps, depth, &(f->left)))
4233 if(!prs_uint32("top", ps, depth, &(f->top)))
4235 if(!prs_uint32("right", ps, depth, &(f->right)))
4237 if(!prs_uint32("bottom", ps, depth, &(f->bottom)))
4240 if(!smb_io_unistr2("", &(f->name), f->name_ptr, ps, depth))
4247 /*******************************************************************
4248 ********************************************************************/
4249 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
4251 uint32 useless_ptr=0;
4252 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
4257 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4259 if(!prs_uint32("level", ps, depth, &(q_u->level)))
4261 if(!prs_uint32("level2", ps, depth, &(q_u->level2)))
4266 if(!prs_uint32("useless_ptr", ps, depth, &(useless_ptr)))
4268 if(!spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth))
4275 /*******************************************************************
4276 ********************************************************************/
4277 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
4279 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
4284 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4290 /*******************************************************************
4291 ********************************************************************/
4292 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
4294 uint32 useless_ptr=0;
4295 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
4300 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4302 if(!smb_io_unistr2("", &(q_u->name), True, ps, depth))
4308 if(!prs_uint32("level", ps, depth, &(q_u->level)))
4310 if(!prs_uint32("level2", ps, depth, &(q_u->level2)))
4315 if(!prs_uint32("useless_ptr", ps, depth, &(useless_ptr)))
4317 if(!spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth))
4324 /*******************************************************************
4325 ********************************************************************/
4326 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
4328 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
4333 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4339 /*******************************************************************
4340 Parse a SPOOL_R_GETJOB structure.
4341 ********************************************************************/
4342 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
4344 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
4350 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4356 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4359 if (!prs_uint32("status", ps, depth, &r_u->status))
4365 /*******************************************************************
4366 Parse a SPOOL_Q_GETJOB structure.
4367 ********************************************************************/
4368 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
4370 prs_debug(ps, depth, desc, "");
4376 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
4378 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4380 if(!prs_uint32("level", ps, depth, &q_u->level))
4383 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4389 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4395 void free_devmode(DEVICEMODE *devmode)
4399 if (devmode->private!=NULL)
4400 free(devmode->private);
4405 void free_printer_info_2(PRINTER_INFO_2 *printer)
4409 free_devmode(printer->devmode);
4414 static PRINTER_INFO_2 *prt2_dup(const PRINTER_INFO_2* from)
4416 PRINTER_INFO_2 *copy = (PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2));
4421 memcpy(copy, from, sizeof(*copy));
4431 void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries)
4433 void(*fn)(void*) = (void(*)(void*))&free_printer_info_2;
4434 free_void_array(num_entries, (void**)entries, *fn);
4437 PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array,
4438 const PRINTER_INFO_2 *prt)
4440 void*(*fn)(const void*) = (void*(*)(const void*))&prt2_dup;
4441 return (PRINTER_INFO_2*)add_copy_to_array(len,
4442 (void***)array, (const void*)prt, *fn, True);
4445 static PRINTER_INFO_1 *prt1_dup(const PRINTER_INFO_1* from)
4447 PRINTER_INFO_1 *copy = (PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1));
4452 memcpy(copy, from, sizeof(*copy));
4462 void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries)
4464 void(*fn)(void*) = (void(*)(void*))&free;
4465 free_void_array(num_entries, (void**)entries, *fn);
4468 PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array,
4469 const PRINTER_INFO_1 *prt)
4471 void*(*fn)(const void*) = (void*(*)(const void*))&prt1_dup;
4472 return (PRINTER_INFO_1*)add_copy_to_array(len,
4473 (void***)array, (const void*)prt, *fn, True);
4476 static JOB_INFO_1 *job1_dup(const JOB_INFO_1* from)
4478 JOB_INFO_1 *copy = (JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1));
4483 memcpy(copy, from, sizeof(*copy));
4493 void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries)
4495 void(*fn)(void*) = (void(*)(void*))&free;
4496 free_void_array(num_entries, (void**)entries, *fn);
4499 JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array,
4500 const JOB_INFO_1 *job)
4502 void*(*fn)(const void*) = (void*(*)(const void*))&job1_dup;
4503 return (JOB_INFO_1*)add_copy_to_array(len,
4504 (void***)array, (const void*)job, *fn, True);
4507 static JOB_INFO_2 *job2_dup(const JOB_INFO_2* from)
4509 JOB_INFO_2 *copy = (JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2));
4514 memcpy(copy, from, sizeof(*copy));
4524 void free_job_info_2(JOB_INFO_2 *job)
4528 free_devmode(job->devmode);
4533 void free_job2_array(uint32 num_entries, JOB_INFO_2 **entries)
4535 void(*fn)(void*) = (void(*)(void*))&free_job_info_2;
4536 free_void_array(num_entries, (void**)entries, *fn);
4539 JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array,
4540 const JOB_INFO_2 *job)
4542 void*(*fn)(const void*) = (void*(*)(const void*))&job2_dup;
4543 return (JOB_INFO_2*)add_copy_to_array(len,
4544 (void***)array, (const void*)job, *fn, True);