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.
28 #define prs_uint16 _prs_uint16
29 #define prs_uint32 _prs_uint32
30 #define prs_uint8s _prs_uint8s
31 #define prs_uint16s _prs_uint16s
32 #define prs_unistr _prs_unistr
33 #define init_unistr2 make_unistr2
34 #define init_buf_unistr2 make_buf_unistr2
38 extern int DEBUGLEVEL;
39 /*******************************************************************
40 return the length of a UNISTR string.
41 ********************************************************************/
42 static uint32 str_len_uni(UNISTR *source)
46 if (!source->buffer) return 0;
48 while (source->buffer[i]!=0x0000)
55 /*******************************************************************
56 This should be moved in a more generic lib.
57 ********************************************************************/
58 static BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
60 if(!prs_uint16("year", ps, depth, &(systime->year)))
62 if(!prs_uint16("month", ps, depth, &(systime->month)))
64 if(!prs_uint16("dayofweek", ps, depth, &(systime->dayofweek)))
66 if(!prs_uint16("day", ps, depth, &(systime->day)))
68 if(!prs_uint16("hour", ps, depth, &(systime->hour)))
70 if(!prs_uint16("minute", ps, depth, &(systime->minute)))
72 if(!prs_uint16("second", ps, depth, &(systime->second)))
74 if(!prs_uint16("milliseconds", ps, depth, &(systime->milliseconds)))
80 /*******************************************************************
81 ********************************************************************/
82 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
84 systime->year=unixtime->tm_year+1900;
85 systime->month=unixtime->tm_mon+1;
86 systime->dayofweek=unixtime->tm_wday;
87 systime->day=unixtime->tm_mday;
88 systime->hour=unixtime->tm_hour;
89 systime->minute=unixtime->tm_min;
90 systime->second=unixtime->tm_sec;
91 systime->milliseconds=0;
96 /*******************************************************************
97 reads or writes an DOC_INFO structure.
98 ********************************************************************/
99 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
101 if (info_1 == NULL) return False;
103 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
109 if(!prs_uint32("p_docname", ps, depth, &(info_1->p_docname)))
111 if(!prs_uint32("p_outputfile", ps, depth, &(info_1->p_outputfile)))
113 if(!prs_uint32("p_datatype", ps, depth, &(info_1->p_datatype)))
116 if(!smb_io_unistr2("", &(info_1->docname), info_1->p_docname, ps, depth))
118 if(!smb_io_unistr2("", &(info_1->outputfile), info_1->p_outputfile, ps, depth))
120 if(!smb_io_unistr2("", &(info_1->datatype), info_1->p_datatype, ps, depth))
126 /*******************************************************************
127 reads or writes an DOC_INFO structure.
128 ********************************************************************/
129 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
131 uint32 useless_ptr=0;
133 if (info == NULL) return False;
135 prs_debug(ps, depth, desc, "smb_io_doc_info");
141 if(!prs_uint32("switch_value", ps, depth, &(info->switch_value)))
144 if(!prs_uint32("doc_info_X ptr", ps, depth, &(useless_ptr)))
147 switch (info->switch_value)
150 if(!smb_io_doc_info_1("",&(info->doc_info_1), ps, depth))
155 this is just a placeholder
157 MSDN July 1998 says doc_info_2 is only on
158 Windows 95, and as Win95 doesn't do RPC to print
159 this case is nearly impossible
161 Maybe one day with Windows for dishwasher 2037 ...
164 /* smb_io_doc_info_2("",&(info->doc_info_2), ps, depth); */
167 DEBUG(0,("Something is obviously wrong somewhere !\n"));
174 /*******************************************************************
175 reads or writes an DOC_INFO_CONTAINER structure.
176 ********************************************************************/
177 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
179 if (cont == NULL) return False;
181 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
187 if(!prs_uint32("level", ps, depth, &(cont->level)))
190 if(!smb_io_doc_info("",&(cont->docinfo), ps, depth))
196 /*******************************************************************
197 reads or writes an NOTIFY OPTION TYPE structure.
198 ********************************************************************/
199 static BOOL smb_io_notify_option_type(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
201 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
207 if(!prs_uint16("type", ps, depth, &type->type))
209 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
211 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
213 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
215 if(!prs_uint32("count", ps, depth, &type->count))
217 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
223 /*******************************************************************
224 reads or writes an NOTIFY OPTION TYPE DATA.
225 ********************************************************************/
226 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
230 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
233 /* if there are no fields just return */
234 if (type->fields_ptr==0)
240 if(!prs_uint32("count2", ps, depth, &type->count2))
243 if (type->count2 != type->count)
244 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
246 /* parse the option type data */
247 for(i=0;i<type->count2;i++)
248 if(!prs_uint16("fields",ps,depth,&(type->fields[i])))
253 /*******************************************************************
254 reads or writes an NOTIFY OPTION structure.
255 ********************************************************************/
256 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
260 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
263 if(!prs_uint32("count", ps, depth, &ctr->count))
267 if (UNMARSHALLING(ps))
268 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)malloc(ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
271 /* the option type struct */
272 for(i=0;i<ctr->count;i++)
273 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
276 /* the type associated with the option type struct */
277 for(i=0;i<ctr->count;i++)
278 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
284 /*******************************************************************
285 reads or writes an NOTIFY OPTION structure.
286 ********************************************************************/
287 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
289 prs_debug(ps, depth, desc, "smb_io_notify_option");
292 if(!prs_uint32("version", ps, depth, &option->version))
294 if(!prs_uint32("flags", ps, depth, &option->flags))
296 if(!prs_uint32("count", ps, depth, &option->count))
298 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
301 /* marshalling or unmarshalling, that would work */
302 if (option->option_type_ptr!=0) {
303 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
307 option->ctr.type=NULL;
314 /*******************************************************************
315 reads or writes an NOTIFY INFO DATA structure.
316 ********************************************************************/
317 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
319 uint32 useless_ptr=0xADDE0FF0;
321 uint32 how_many_words;
325 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
328 how_many_words=data->size;
329 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))
351 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
353 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
358 /* length in ascii including \0 */
359 x=2*(data->notify_data.data.length+1);
360 if(!prs_uint32("string length", ps, depth, &x ))
362 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
370 /*******************************************************************
371 reads or writes an NOTIFY INFO DATA structure.
372 ********************************************************************/
373 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
374 prs_struct *ps, int depth)
379 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
385 isvalue=data->enc_type;
387 if (isvalue==False) {
388 /* length of string in unicode include \0 */
389 x=data->notify_data.data.length+1;
390 if(!prs_uint32("string length", ps, depth, &x ))
392 if(!prs_uint16s(True,"string",ps,depth,data->notify_data.data.string,x))
401 /*******************************************************************
402 reads or writes an NOTIFY INFO structure.
403 ********************************************************************/
404 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
408 prs_debug(ps, depth, desc, "smb_io_notify_info");
414 if(!prs_uint32("count", ps, depth, &info->count))
416 if(!prs_uint32("version", ps, depth, &info->version))
418 if(!prs_uint32("flags", ps, depth, &info->flags))
420 if(!prs_uint32("count", ps, depth, &info->count))
423 for (i=0;i<info->count;i++) {
424 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
428 /* now do the strings at the end of the stream */
429 for (i=0;i<info->count;i++) {
430 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
438 /*******************************************************************
439 ********************************************************************/
440 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
442 prs_debug(ps, depth, desc, "");
451 if (!prs_uint32("size", ps, depth, &(q_u->size)))
453 if (!prs_uint32("client_name_ptr", ps, depth, &(q_u->client_name_ptr)))
455 if (!prs_uint32("user_name_ptr", ps, depth, &(q_u->user_name_ptr)))
457 if (!prs_uint32("build", ps, depth, &(q_u->build)))
459 if (!prs_uint32("major", ps, depth, &(q_u->major)))
461 if (!prs_uint32("minor", ps, depth, &(q_u->minor)))
463 if (!prs_uint32("processor", ps, depth, &(q_u->processor)))
466 if (!smb_io_unistr2("", &(q_u->client_name), q_u->client_name_ptr, ps, depth))
470 if (!smb_io_unistr2("", &(q_u->user_name), q_u->user_name_ptr, ps, depth))
476 /*******************************************************************
477 ********************************************************************/
478 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
483 prs_debug(ps, depth, desc, "spool_io_user_level");
488 if (!prs_uint32("level", ps, depth, &q_u->level))
490 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
493 switch (q_u->level) {
495 if (!spool_io_user_level_1("", &(q_u->user1), ps, depth))
505 /*******************************************************************
506 * read or write a DEVICEMODE struct.
507 * on reading allocate memory for the private member
508 ********************************************************************/
509 static BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
511 prs_debug(ps, depth, desc, "spoolss_io_devmode");
514 if (!prs_uint16s(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
516 if (!prs_uint16("specversion", ps, depth, &(devmode->specversion)))
518 if (!prs_uint16("driverversion", ps, depth, &(devmode->driverversion)))
520 if (!prs_uint16("size", ps, depth, &(devmode->size)))
522 if (!prs_uint16("driverextra", ps, depth, &(devmode->driverextra)))
524 if (!prs_uint32("fields", ps, depth, &(devmode->fields)))
526 if (!prs_uint16("orientation", ps, depth, &(devmode->orientation)))
528 if (!prs_uint16("papersize", ps, depth, &(devmode->papersize)))
530 if (!prs_uint16("paperlength", ps, depth, &(devmode->paperlength)))
532 if (!prs_uint16("paperwidth", ps, depth, &(devmode->paperwidth)))
534 if (!prs_uint16("scale", ps, depth, &(devmode->scale)))
536 if (!prs_uint16("copies", ps, depth, &(devmode->copies)))
538 if (!prs_uint16("defaultsource", ps, depth, &(devmode->defaultsource)))
540 if (!prs_uint16("printquality", ps, depth, &(devmode->printquality)))
542 if (!prs_uint16("color", ps, depth, &(devmode->color)))
544 if (!prs_uint16("duplex", ps, depth, &(devmode->duplex)))
546 if (!prs_uint16("yresolution", ps, depth, &(devmode->yresolution)))
548 if (!prs_uint16("ttoption", ps, depth, &(devmode->ttoption)))
550 if (!prs_uint16("collate", ps, depth, &(devmode->collate)))
552 if (!prs_uint16s(True, "formname", ps, depth, devmode->formname.buffer, 32))
554 if (!prs_uint16("logpixels", ps, depth, &(devmode->logpixels)))
556 if (!prs_uint32("bitsperpel", ps, depth, &(devmode->bitsperpel)))
558 if (!prs_uint32("pelswidth", ps, depth, &(devmode->pelswidth)))
560 if (!prs_uint32("pelsheight", ps, depth, &(devmode->pelsheight)))
562 if (!prs_uint32("displayflags", ps, depth, &(devmode->displayflags)))
564 if (!prs_uint32("displayfrequency", ps, depth, &(devmode->displayfrequency)))
566 if (!prs_uint32("icmmethod", ps, depth, &(devmode->icmmethod)))
568 if (!prs_uint32("icmintent", ps, depth, &(devmode->icmintent)))
570 if (!prs_uint32("mediatype", ps, depth, &(devmode->mediatype)))
572 if (!prs_uint32("dithertype", ps, depth, &(devmode->dithertype)))
574 if (!prs_uint32("reserved1", ps, depth, &(devmode->reserved1)))
576 if (!prs_uint32("reserved2", ps, depth, &(devmode->reserved2)))
578 if (!prs_uint32("panningwidth", ps, depth, &(devmode->panningwidth)))
580 if (!prs_uint32("panningheight", ps, depth, &(devmode->panningheight)))
583 if (devmode->driverextra!=0)
585 if (UNMARSHALLING(ps)) {
586 devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8));
587 if(devmode->private == NULL)
589 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
592 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
593 if (!prs_uint8s(True, "private", ps, depth, devmode->private, devmode->driverextra))
600 void free_spoolss_devmode(DEVICEMODE *devmode)
605 safe_free(devmode->private);
609 /*******************************************************************
610 Read or write a DEVICEMODE container
611 ********************************************************************/
612 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
617 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
623 if (!prs_uint32("size", ps, depth, &dm_c->size))
626 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
629 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
630 if (UNMARSHALLING(ps))
631 /* if while reading there is no DEVMODE ... */
636 /* so we have a DEVICEMODE to follow */
637 if (UNMARSHALLING(ps)) {
638 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
639 dm_c->devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE));
640 if(dm_c->devmode == NULL)
642 ZERO_STRUCTP(dm_c->devmode);
645 /* this is bad code, shouldn't be there */
646 if (!prs_uint32("size", ps, depth, &dm_c->size))
649 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
655 /*******************************************************************
656 ********************************************************************/
657 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
662 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
665 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
668 if (!smb_io_unistr2("datatype", &(pd->datatype), pd->datatype_ptr, ps,depth))
674 if (!spoolss_io_devmode_cont("", &(pd->devmode_cont), ps, depth))
677 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
683 /*******************************************************************
685 ********************************************************************/
686 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
687 const fstring printername,
688 const fstring datatype,
689 uint32 access_required,
690 const fstring clientname,
691 const fstring user_name)
693 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
694 q_u->printername_ptr = (printername!=NULL)?1:0;
695 init_unistr2(&(q_u->printername), printername, strlen(printername));
697 q_u->printer_default.datatype_ptr = 0;
699 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
700 init_unistr2(&(q_u->printer_default.datatype), datatype, strlen(datatype));
702 q_u->printer_default.devmode_cont.size=0;
703 q_u->printer_default.devmode_cont.devmode_ptr=0;
704 q_u->printer_default.devmode_cont.devmode=NULL;
705 q_u->printer_default.access_required=access_required;
707 q_u->user_ctr.level=1;
709 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+8;
710 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
711 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
712 q_u->user_ctr.user1.build=1381;
713 q_u->user_ctr.user1.major=2;
714 q_u->user_ctr.user1.minor=0;
715 q_u->user_ctr.user1.processor=0;
716 init_unistr2(&(q_u->user_ctr.user1.client_name), clientname, strlen(clientname));
717 init_unistr2(&(q_u->user_ctr.user1.user_name), user_name, strlen(user_name));
722 /*******************************************************************
724 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
725 ********************************************************************/
726 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
731 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
737 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
739 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
745 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
748 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
750 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
756 void free_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u)
758 free_spoolss_devmode(q_u->printer_default.devmode_cont.devmode);
761 /*******************************************************************
763 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
764 * called from spoolss_open_printer_ex (cli_spoolss.c)
765 ********************************************************************/
766 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
768 if (r_u == NULL) return False;
770 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
776 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
779 if (!prs_uint32("status code", ps, depth, &(r_u->status)))
785 /*******************************************************************
787 * called from spoolss_q_getprinterdata (srv_spoolss.c)
788 ********************************************************************/
789 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
791 if (q_u == NULL) return False;
793 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
798 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
802 if (!smb_io_unistr2("valuename", &(q_u->valuename),True,ps,depth))
806 if (!prs_uint32("size", ps, depth, &(q_u->size)))
812 /*******************************************************************
814 * called from spoolss_r_getprinterdata (srv_spoolss.c)
815 ********************************************************************/
816 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
821 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
826 if (!prs_uint32("type", ps, depth, &(r_u->type)))
828 if (!prs_uint32("size", ps, depth, &(r_u->size)))
831 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
837 if (!prs_uint32("needed", ps, depth, &(r_u->needed)))
839 if (!prs_uint32("status", ps, depth, &(r_u->status)))
845 /*******************************************************************
847 ********************************************************************/
848 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
850 if (q_u == NULL) return False;
852 DEBUG(5,("make_spoolss_q_closeprinter\n"));
854 memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
859 /*******************************************************************
861 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
862 * called from spoolss_deleteprinter (cli_spoolss.c)
863 ********************************************************************/
864 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
866 if (q_u == NULL) return False;
868 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
874 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
880 /*******************************************************************
882 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
883 * called from spoolss_deleteprinter (cli_spoolss.c)
884 ********************************************************************/
885 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
887 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
893 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
895 if (!prs_uint32("status", ps, depth, &r_u->status))
902 /*******************************************************************
904 * called from static spoolss_q_closeprinter (srv_spoolss.c)
905 * called from spoolss_closeprinter (cli_spoolss.c)
906 ********************************************************************/
907 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
909 if (q_u == NULL) return False;
911 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
917 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
923 /*******************************************************************
925 * called from static spoolss_r_closeprinter (srv_spoolss.c)
926 * called from spoolss_closeprinter (cli_spoolss.c)
927 ********************************************************************/
928 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
930 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
936 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
938 if (!prs_uint32("status", ps, depth, &r_u->status))
944 /*******************************************************************
946 * called from spoolss_q_startdocprinter (srv_spoolss.c)
947 ********************************************************************/
948 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
950 if (q_u == NULL) return False;
952 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
958 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
961 if(!smb_io_doc_info_container("",&(q_u->doc_info_container), ps, depth))
967 /*******************************************************************
969 * called from spoolss_r_startdocprinter (srv_spoolss.c)
970 ********************************************************************/
971 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
973 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
975 if(!prs_uint32("jobid", ps, depth, &(r_u->jobid)))
977 if(!prs_uint32("status", ps, depth, &(r_u->status)))
983 /*******************************************************************
985 * called from spoolss_q_enddocprinter (srv_spoolss.c)
986 ********************************************************************/
987 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
989 if (q_u == NULL) return False;
991 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
997 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1003 /*******************************************************************
1004 * write a structure.
1005 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1006 ********************************************************************/
1007 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1009 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1011 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1017 /*******************************************************************
1019 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1020 ********************************************************************/
1021 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1023 if (q_u == NULL) return False;
1025 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1031 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1037 /*******************************************************************
1038 * write a structure.
1039 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1040 ********************************************************************/
1041 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1043 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1045 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1051 /*******************************************************************
1053 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1054 ********************************************************************/
1055 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1057 if (q_u == NULL) return False;
1059 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1065 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1071 /*******************************************************************
1072 * write a structure.
1073 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1074 ********************************************************************/
1075 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1077 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1079 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1085 /*******************************************************************
1087 * called from spoolss_q_writeprinter (srv_spoolss.c)
1088 ********************************************************************/
1089 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1091 if (q_u == NULL) return False;
1093 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1099 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
1101 if(!prs_uint32("buffer_size", ps, depth, &(q_u->buffer_size)))
1104 if (q_u->buffer_size!=0)
1106 q_u->buffer=(uint8 *)malloc(q_u->buffer_size*sizeof(uint8));
1107 if(q_u->buffer == NULL)
1109 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1114 if(!prs_uint32("buffer_size2", ps, depth, &(q_u->buffer_size2)))
1120 /*******************************************************************
1121 * write a structure.
1122 * called from spoolss_r_writeprinter (srv_spoolss.c)
1123 ********************************************************************/
1124 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1126 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1128 if(!prs_uint32("buffer_written", ps, depth, &(r_u->buffer_written)))
1130 if(!prs_uint32("status", ps, depth, &(r_u->status)))
1136 /*******************************************************************
1138 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1139 ********************************************************************/
1140 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1142 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1148 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1150 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1152 if(!prs_uint32("options", ps, depth, &q_u->options))
1154 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1156 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1162 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1165 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1168 if (q_u->option_ptr!=0) {
1170 if (UNMARSHALLING(ps))
1171 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1174 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1181 /*******************************************************************
1182 * write a structure.
1183 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1184 ********************************************************************/
1185 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1187 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1190 if(!prs_uint32("status", ps, depth, &r_u->status))
1196 /*******************************************************************
1198 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1199 ********************************************************************/
1200 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1202 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1208 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1211 if(!prs_uint32("change", ps, depth, &q_u->change))
1214 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1217 if (q_u->option_ptr!=0) {
1219 if (UNMARSHALLING(ps))
1220 if((q_u->option=(SPOOL_NOTIFY_OPTION *)malloc(sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1223 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1230 /*******************************************************************
1231 * write a structure.
1232 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1233 ********************************************************************/
1234 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1236 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1242 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1245 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1250 if(!prs_uint32("status", ps, depth, &r_u->status))
1256 /*******************************************************************
1257 * return the length of a uint16 (obvious, but the code is clean)
1258 ********************************************************************/
1259 static uint32 size_of_uint16(uint16 *value)
1261 return (sizeof(*value));
1264 /*******************************************************************
1265 * return the length of a uint32 (obvious, but the code is clean)
1266 ********************************************************************/
1267 static uint32 size_of_uint32(uint32 *value)
1269 return (sizeof(*value));
1271 /*******************************************************************
1272 * return the length of a UNICODE string in number of char, includes:
1273 * - the leading zero
1274 * - the relative pointer size
1275 ********************************************************************/
1276 static uint32 size_of_relative_string(UNISTR *string)
1280 size=str_len_uni(string); /* the string length */
1281 size=size+1; /* add the leading zero */
1282 size=size*2; /* convert in char */
1283 size=size+4; /* add the size of the ptr */
1288 /*******************************************************************
1289 * return the length of a uint32 (obvious, but the code is clean)
1290 ********************************************************************/
1291 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1296 return (4+devmode->size+devmode->driverextra);
1299 /*******************************************************************
1300 * return the length of a uint32 (obvious, but the code is clean)
1301 ********************************************************************/
1302 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1307 return (sizeof(SYSTEMTIME) +4);
1310 /*******************************************************************
1311 * write a UNICODE string.
1312 * used by all the RPC structs passing a buffer
1313 ********************************************************************/
1314 static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
1319 prs_debug(ps, depth, desc, "spoolss_smb_io_unistr");
1321 if (!prs_unistr("unistr", ps, depth, uni))
1328 /*******************************************************************
1329 * write a UNICODE string and its relative pointer.
1330 * used by all the RPC structs passing a buffer
1332 * As I'm a nice guy, I'm forcing myself to explain this code.
1333 * MS did a good job in the overall spoolss code except in some
1334 * functions where they are passing the API buffer directly in the
1335 * RPC request/reply. That's to maintain compatiility at the API level.
1336 * They could have done it the good way the first time.
1338 * So what happen is: the strings are written at the buffer's end,
1339 * in the reverse order of the original structure. Some pointers to
1340 * the strings are also in the buffer. Those are relative to the
1343 * If you don't understand or want to change that function,
1344 * first get in touch with me: jfm@samba.org
1346 ********************************************************************/
1347 static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1349 prs_struct *ps=&(buffer->prs);
1351 if (MARSHALLING(ps)) {
1352 uint32 struct_offset = prs_offset(ps);
1353 uint32 relative_offset;
1355 buffer->string_at_end -= 2*(str_len_uni(string)+1);
1356 if(!prs_set_offset(ps, buffer->string_at_end))
1359 /* write the string */
1360 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1363 if(!prs_set_offset(ps, struct_offset))
1366 relative_offset=buffer->string_at_end - buffer->struct_start;
1367 /* write its offset */
1368 if (!prs_uint32("offset", ps, depth, &relative_offset))
1374 /* read the offset */
1375 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1378 old_offset = prs_offset(ps);
1379 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
1382 /* read the string */
1383 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1386 if(!prs_set_offset(ps, old_offset))
1393 /*******************************************************************
1394 * write a array of UNICODE strings and its relative pointer.
1395 * used by 2 RPC structs
1396 ********************************************************************/
1397 static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1401 prs_struct *ps=&buffer->prs;
1403 if (MARSHALLING(ps)) {
1404 uint32 struct_offset = prs_offset(ps);
1405 uint32 relative_offset;
1414 relative_offset = 0;
1415 if (!prs_uint32("offset", ps, depth, &relative_offset))
1421 /* first write the last 0 */
1422 buffer->string_at_end -= 2;
1423 if(!prs_set_offset(ps, buffer->string_at_end))
1426 if(!prs_uint16("leading zero", ps, depth, &zero))
1434 #endif /* JRATEST */
1436 while (p && (*p!=0)) {
1440 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1442 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1444 if(!prs_set_offset(ps, buffer->string_at_end))
1447 /* write the string */
1448 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1455 if(!prs_set_offset(ps, struct_offset))
1458 relative_offset=buffer->string_at_end - buffer->struct_start;
1459 /* write its offset */
1460 if (!prs_uint32("offset", ps, depth, &relative_offset))
1465 uint16 *chaine2=NULL;
1471 /* read the offset */
1472 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1475 old_offset = prs_offset(ps);
1476 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1480 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1483 l_chaine=str_len_uni(&chaine);
1484 if((chaine2=(uint16 *)Realloc(chaine2, (l_chaine2+l_chaine+1)*sizeof(uint16))) == NULL)
1486 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1487 l_chaine2+=l_chaine+1;
1489 } while(l_chaine!=0);
1493 if(!prs_set_offset(ps, old_offset))
1500 /*******************************************************************
1501 Parse a DEVMODE structure and its relative pointer.
1502 ********************************************************************/
1503 static BOOL new_smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth,
1506 prs_struct *ps= &buffer->prs;
1508 prs_debug(ps, depth, desc, "new_smb_io_relsecdesc");
1511 if (MARSHALLING(ps)) {
1512 uint32 struct_offset = prs_offset(ps);
1513 uint32 relative_offset;
1516 relative_offset = 0;
1517 if (!prs_uint32("offset", ps, depth, &relative_offset))
1522 if (*secdesc != NULL) {
1523 buffer->string_at_end -= sec_desc_size(*secdesc);
1525 if(!prs_set_offset(ps, buffer->string_at_end))
1528 /* write the secdesc */
1529 if (!sec_io_desc(desc, secdesc, ps, depth))
1532 if(!prs_set_offset(ps, struct_offset))
1536 relative_offset=buffer->string_at_end - buffer->struct_start;
1537 /* write its offset */
1538 if (!prs_uint32("offset", ps, depth, &relative_offset))
1543 /* read the offset */
1544 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1547 old_offset = prs_offset(ps);
1548 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1552 if (!sec_io_desc(desc, secdesc, ps, depth))
1555 if(!prs_set_offset(ps, old_offset))
1561 /*******************************************************************
1562 Parse a DEVMODE structure and its relative pointer.
1563 ********************************************************************/
1564 static BOOL new_smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1566 prs_struct *ps=&buffer->prs;
1568 prs_debug(ps, depth, desc, "new_smb_io_reldevmode");
1571 if (MARSHALLING(ps)) {
1572 uint32 struct_offset = prs_offset(ps);
1573 uint32 relative_offset;
1575 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1577 if(!prs_set_offset(ps, buffer->string_at_end))
1580 /* write the DEVMODE */
1581 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1584 if(!prs_set_offset(ps, struct_offset))
1587 relative_offset=buffer->string_at_end - buffer->struct_start;
1588 /* write its offset */
1589 if (!prs_uint32("offset", ps, depth, &relative_offset))
1595 /* read the offset */
1596 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1599 old_offset = prs_offset(ps);
1600 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1603 /* read the string */
1604 if((*devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE))) == NULL)
1606 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1609 if(!prs_set_offset(ps, old_offset))
1616 /*******************************************************************
1617 Parse a PRINTER_INFO_0 structure.
1618 ********************************************************************/
1619 BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
1621 prs_struct *ps=&(buffer->prs);
1623 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
1626 buffer->struct_start=prs_offset(ps);
1628 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1630 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
1633 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
1635 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
1637 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
1640 if(!prs_uint16("year", ps, depth, &info->year))
1642 if(!prs_uint16("month", ps, depth, &info->month))
1644 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
1646 if(!prs_uint16("day", ps, depth, &info->day))
1648 if(!prs_uint16("hour", ps, depth, &info->hour))
1650 if(!prs_uint16("minute", ps, depth, &info->minute))
1652 if(!prs_uint16("second", ps, depth, &info->second))
1654 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
1657 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
1659 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
1662 if(!prs_uint16("major_version", ps, depth, &info->major_version))
1664 if(!prs_uint16("build_version", ps, depth, &info->build_version))
1666 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
1668 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
1670 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
1672 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
1674 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
1676 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
1678 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
1680 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
1682 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
1684 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
1686 if(!prs_uint32("change_id", ps, depth, &info->change_id))
1688 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
1690 if(!prs_uint32("status" , ps, depth, &info->status))
1692 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
1694 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
1696 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
1698 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
1700 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
1702 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
1704 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
1706 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
1708 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
1710 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
1716 /*******************************************************************
1717 Parse a PRINTER_INFO_1 structure.
1718 ********************************************************************/
1719 BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
1721 prs_struct *ps=&buffer->prs;
1723 prs_debug(ps, depth, desc, "new_smb_io_printer_info_1");
1726 buffer->struct_start=prs_offset(ps);
1728 if (!prs_uint32("flags", ps, depth, &info->flags))
1730 if (!new_smb_io_relstr("description", buffer, depth, &info->description))
1732 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1734 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
1740 /*******************************************************************
1741 Parse a PRINTER_INFO_2 structure.
1742 ********************************************************************/
1743 BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
1745 prs_struct *ps=&buffer->prs;
1747 prs_debug(ps, depth, desc, "new_smb_io_printer_info_2");
1750 buffer->struct_start=prs_offset(ps);
1752 if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
1754 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1756 if (!new_smb_io_relstr("sharename", buffer, depth, &info->sharename))
1758 if (!new_smb_io_relstr("portname", buffer, depth, &info->portname))
1760 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
1762 if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
1764 if (!new_smb_io_relstr("location", buffer, depth, &info->location))
1767 /* NT parses the DEVMODE at the end of the struct */
1768 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1771 if (!new_smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
1773 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1775 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1777 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
1780 if (!new_smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
1783 if (!prs_uint32("attributes", ps, depth, &info->attributes))
1785 if (!prs_uint32("priority", ps, depth, &info->priority))
1787 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
1789 if (!prs_uint32("starttime", ps, depth, &info->starttime))
1791 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
1793 if (!prs_uint32("status", ps, depth, &info->status))
1795 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
1797 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
1803 /*******************************************************************
1804 Parse a PRINTER_INFO_3 structure.
1805 ********************************************************************/
1806 BOOL new_smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
1808 prs_struct *ps=&(buffer->prs);
1810 prs_debug(ps, depth, desc, "new_smb_io_printer_info_3");
1813 buffer->struct_start=prs_offset(ps);
1815 if (!prs_uint32("flags", ps, depth, &info->flags))
1817 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
1823 /*******************************************************************
1824 Parse a DRIVER_INFO_1 structure.
1825 ********************************************************************/
1826 BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
1828 prs_struct *ps=&(buffer->prs);
1830 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_1");
1833 buffer->struct_start=prs_offset(ps);
1835 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1842 /*******************************************************************
1843 Parse a DRIVER_INFO_2 structure.
1844 ********************************************************************/
1845 BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
1847 prs_struct *ps=&(buffer->prs);
1849 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_2");
1852 buffer->struct_start=prs_offset(ps);
1854 if (!prs_uint32("version", ps, depth, &info->version))
1856 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1858 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
1860 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1862 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
1864 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
1871 /*******************************************************************
1872 Parse a DRIVER_INFO_3 structure.
1873 ********************************************************************/
1874 BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
1876 prs_struct *ps=&(buffer->prs);
1878 prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_3");
1881 buffer->struct_start=prs_offset(ps);
1883 if (!prs_uint32("version", ps, depth, &info->version))
1885 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
1887 if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
1889 if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
1891 if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
1893 if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
1895 if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
1898 if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
1901 if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
1903 if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
1910 /*******************************************************************
1911 Parse a JOB_INFO_1 structure.
1912 ********************************************************************/
1913 BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
1915 prs_struct *ps=&(buffer->prs);
1917 prs_debug(ps, depth, desc, "new_smb_io_job_info_1");
1920 buffer->struct_start=prs_offset(ps);
1922 if (!prs_uint32("jobid", ps, depth, &info->jobid))
1924 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1926 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
1928 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
1930 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
1932 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1934 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
1936 if (!prs_uint32("status", ps, depth, &info->status))
1938 if (!prs_uint32("priority", ps, depth, &info->priority))
1940 if (!prs_uint32("position", ps, depth, &info->position))
1942 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
1944 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
1946 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
1952 /*******************************************************************
1953 Parse a JOB_INFO_2 structure.
1954 ********************************************************************/
1955 BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
1958 prs_struct *ps=&(buffer->prs);
1960 prs_debug(ps, depth, desc, "new_smb_io_job_info_2");
1963 buffer->struct_start=prs_offset(ps);
1965 if (!prs_uint32("jobid",ps, depth, &info->jobid))
1967 if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
1969 if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
1971 if (!new_smb_io_relstr("username", buffer, depth, &info->username))
1973 if (!new_smb_io_relstr("document", buffer, depth, &info->document))
1975 if (!new_smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
1977 if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
1980 if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
1982 if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
1984 if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
1986 if (!new_smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
1988 if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
1991 /* SEC_DESC sec_desc;*/
1992 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
1995 if (!prs_uint32("status",ps, depth, &info->status))
1997 if (!prs_uint32("priority",ps, depth, &info->priority))
1999 if (!prs_uint32("position",ps, depth, &info->position))
2001 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2003 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2005 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2007 if (!prs_uint32("size",ps, depth, &info->size))
2009 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2011 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2013 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2019 /*******************************************************************
2020 ********************************************************************/
2021 BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2023 prs_struct *ps=&(buffer->prs);
2025 prs_debug(ps, depth, desc, "new_smb_io_form_1");
2028 buffer->struct_start=prs_offset(ps);
2030 if (!prs_uint32("flag", ps, depth, &(info->flag)))
2033 if (!new_smb_io_relstr("name", buffer, depth, &(info->name)))
2036 if (!prs_uint32("width", ps, depth, &(info->width)))
2038 if (!prs_uint32("length", ps, depth, &(info->length)))
2040 if (!prs_uint32("left", ps, depth, &(info->left)))
2042 if (!prs_uint32("top", ps, depth, &(info->top)))
2044 if (!prs_uint32("right", ps, depth, &(info->right)))
2046 if (!prs_uint32("bottom", ps, depth, &(info->bottom)))
2052 /*******************************************************************
2053 Read/write a BUFFER struct.
2054 ********************************************************************/
2055 static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER *buffer)
2060 prs_debug(ps, depth, desc, "new_spoolss_io_buffer");
2063 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2067 if (UNMARSHALLING(ps)) {
2069 buffer->string_at_end=0;
2071 if (buffer->ptr==0) {
2072 if (!prs_init(&buffer->prs, 0, 4, UNMARSHALL))
2077 if (!prs_uint32("size", ps, depth, &buffer->size))
2080 if (!prs_init(&buffer->prs, buffer->size, 4, UNMARSHALL))
2083 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
2086 if (!prs_set_offset(&buffer->prs, 0))
2089 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
2092 buffer->string_at_end=buffer->size;
2101 if (!prs_uint32("size", ps, depth, &buffer->size))
2103 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
2110 /*******************************************************************
2111 move a BUFFER from the query to the reply.
2112 ********************************************************************/
2113 void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2115 prs_switch_type(&src->prs, MARSHALL);
2116 if(!prs_set_offset(&src->prs, 0))
2118 prs_force_dynamic(&(src->prs));
2123 /*******************************************************************
2124 create a BUFFER struct.
2125 ********************************************************************/
2126 BOOL new_spoolss_allocate_buffer(NEW_BUFFER **buffer)
2131 if((*buffer=(NEW_BUFFER *)malloc(sizeof(NEW_BUFFER))) == NULL) {
2132 DEBUG(0,("new_spoolss_allocate_buffer: malloc fail for size %u.\n",
2133 (unsigned int)sizeof(NEW_BUFFER) ));
2139 (*buffer)->string_at_end=0;
2143 /*******************************************************************
2144 Destroy a BUFFER struct.
2145 ********************************************************************/
2146 void new_spoolss_free_buffer(NEW_BUFFER *buffer)
2151 prs_mem_free(&buffer->prs);
2154 buffer->string_at_end=0;
2159 /*******************************************************************
2160 Get the size of a BUFFER struct.
2161 ********************************************************************/
2162 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2164 return (buffer->size);
2168 /*******************************************************************
2169 Parse a DRIVER_DIRECTORY_1 structure.
2170 ********************************************************************/
2171 BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2173 prs_struct *ps=&(buffer->prs);
2175 prs_debug(ps, depth, desc, "new_smb_io_driverdir_1");
2178 buffer->struct_start=prs_offset(ps);
2180 if (!spoolss_smb_io_unistr(desc, &info->name, ps, depth))
2186 /*******************************************************************
2187 Parse a PORT_INFO_1 structure.
2188 ********************************************************************/
2189 BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2191 prs_struct *ps=&(buffer->prs);
2193 prs_debug(ps, depth, desc, "new_smb_io_port_1");
2196 buffer->struct_start=prs_offset(ps);
2198 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2204 /*******************************************************************
2205 Parse a PORT_INFO_2 structure.
2206 ********************************************************************/
2207 BOOL new_smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2209 prs_struct *ps=&(buffer->prs);
2211 prs_debug(ps, depth, desc, "new_smb_io_port_2");
2214 buffer->struct_start=prs_offset(ps);
2216 if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
2218 if(!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2220 if(!new_smb_io_relstr("description", buffer, depth, &info->description))
2222 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2224 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2231 /*******************************************************************
2232 ********************************************************************/
2233 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2235 prs_struct *ps=&(buffer->prs);
2237 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2240 buffer->struct_start=prs_offset(ps);
2242 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2248 /*******************************************************************
2249 ********************************************************************/
2250 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2252 prs_struct *ps=&(buffer->prs);
2254 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2257 buffer->struct_start=prs_offset(ps);
2259 if (new_smb_io_relstr("name", buffer, depth, &info->name))
2265 /*******************************************************************
2266 ********************************************************************/
2267 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2269 prs_struct *ps=&(buffer->prs);
2271 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2274 buffer->struct_start=prs_offset(ps);
2276 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2282 /*******************************************************************
2283 ********************************************************************/
2284 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2286 prs_struct *ps=&(buffer->prs);
2288 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2291 buffer->struct_start=prs_offset(ps);
2293 if (!new_smb_io_relstr("name", buffer, depth, &info->name))
2295 if (!new_smb_io_relstr("environment", buffer, depth, &info->environment))
2297 if (!new_smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2303 /*******************************************************************
2304 return the size required by a struct in the stream
2305 ********************************************************************/
2306 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2310 size+=size_of_relative_string( &info->printername );
2311 size+=size_of_relative_string( &info->servername );
2313 size+=size_of_uint32( &info->cjobs);
2314 size+=size_of_uint32( &info->total_jobs);
2315 size+=size_of_uint32( &info->total_bytes);
2317 size+=size_of_uint16( &info->year);
2318 size+=size_of_uint16( &info->month);
2319 size+=size_of_uint16( &info->dayofweek);
2320 size+=size_of_uint16( &info->day);
2321 size+=size_of_uint16( &info->hour);
2322 size+=size_of_uint16( &info->minute);
2323 size+=size_of_uint16( &info->second);
2324 size+=size_of_uint16( &info->milliseconds);
2326 size+=size_of_uint32( &info->global_counter);
2327 size+=size_of_uint32( &info->total_pages);
2329 size+=size_of_uint16( &info->major_version);
2330 size+=size_of_uint16( &info->build_version);
2332 size+=size_of_uint32( &info->unknown7);
2333 size+=size_of_uint32( &info->unknown8);
2334 size+=size_of_uint32( &info->unknown9);
2335 size+=size_of_uint32( &info->session_counter);
2336 size+=size_of_uint32( &info->unknown11);
2337 size+=size_of_uint32( &info->printer_errors);
2338 size+=size_of_uint32( &info->unknown13);
2339 size+=size_of_uint32( &info->unknown14);
2340 size+=size_of_uint32( &info->unknown15);
2341 size+=size_of_uint32( &info->unknown16);
2342 size+=size_of_uint32( &info->change_id);
2343 size+=size_of_uint32( &info->unknown18);
2344 size+=size_of_uint32( &info->status);
2345 size+=size_of_uint32( &info->unknown20);
2346 size+=size_of_uint32( &info->c_setprinter);
2348 size+=size_of_uint16( &info->unknown22);
2349 size+=size_of_uint16( &info->unknown23);
2350 size+=size_of_uint16( &info->unknown24);
2351 size+=size_of_uint16( &info->unknown25);
2352 size+=size_of_uint16( &info->unknown26);
2353 size+=size_of_uint16( &info->unknown27);
2354 size+=size_of_uint16( &info->unknown28);
2355 size+=size_of_uint16( &info->unknown29);
2360 /*******************************************************************
2361 return the size required by a struct in the stream
2362 ********************************************************************/
2363 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2367 size+=size_of_uint32( &info->flags );
2368 size+=size_of_relative_string( &info->description );
2369 size+=size_of_relative_string( &info->name );
2370 size+=size_of_relative_string( &info->comment );
2375 /*******************************************************************
2376 return the size required by a struct in the stream
2377 ********************************************************************/
2378 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2383 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2384 size += sec_desc_size( info->secdesc );
2386 size+=size_of_device_mode( info->devmode );
2388 size+=size_of_relative_string( &info->servername );
2389 size+=size_of_relative_string( &info->printername );
2390 size+=size_of_relative_string( &info->sharename );
2391 size+=size_of_relative_string( &info->portname );
2392 size+=size_of_relative_string( &info->drivername );
2393 size+=size_of_relative_string( &info->comment );
2394 size+=size_of_relative_string( &info->location );
2396 size+=size_of_relative_string( &info->sepfile );
2397 size+=size_of_relative_string( &info->printprocessor );
2398 size+=size_of_relative_string( &info->datatype );
2399 size+=size_of_relative_string( &info->parameters );
2401 size+=size_of_uint32( &info->attributes );
2402 size+=size_of_uint32( &info->priority );
2403 size+=size_of_uint32( &info->defaultpriority );
2404 size+=size_of_uint32( &info->starttime );
2405 size+=size_of_uint32( &info->untiltime );
2406 size+=size_of_uint32( &info->status );
2407 size+=size_of_uint32( &info->cjobs );
2408 size+=size_of_uint32( &info->averageppm );
2412 /*******************************************************************
2413 return the size required by a struct in the stream
2414 ********************************************************************/
2415 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
2417 /* The 4 is for the self relative pointer.. */
2418 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2419 return 4 + (uint32)sec_desc_size( info->secdesc );
2422 /*******************************************************************
2423 return the size required by a struct in the stream
2424 ********************************************************************/
2425 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2428 size+=size_of_relative_string( &info->name );
2433 /*******************************************************************
2434 return the size required by a struct in the stream
2435 ********************************************************************/
2436 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2439 size+=size_of_uint32( &info->version );
2440 size+=size_of_relative_string( &info->name );
2441 size+=size_of_relative_string( &info->architecture );
2442 size+=size_of_relative_string( &info->driverpath );
2443 size+=size_of_relative_string( &info->datafile );
2444 size+=size_of_relative_string( &info->configfile );
2449 /*******************************************************************
2450 return the size required by a struct in the stream
2451 ********************************************************************/
2452 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
2458 size+=size_of_uint32( &info->version );
2459 size+=size_of_relative_string( &info->name );
2460 size+=size_of_relative_string( &info->architecture );
2461 size+=size_of_relative_string( &info->driverpath );
2462 size+=size_of_relative_string( &info->datafile );
2463 size+=size_of_relative_string( &info->configfile );
2464 size+=size_of_relative_string( &info->helpfile );
2465 size+=size_of_relative_string( &info->monitorname );
2466 size+=size_of_relative_string( &info->defaultdatatype );
2468 string=info->dependentfiles;
2470 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2473 i=i+2; /* to count all chars including the leading zero */
2474 i=2*i; /* because we need the value in bytes */
2475 i=i+4; /* the offset pointer size */
2482 /*******************************************************************
2483 return the size required by a struct in the stream
2484 ********************************************************************/
2485 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
2488 size+=size_of_uint32( &info->jobid );
2489 size+=size_of_relative_string( &info->printername );
2490 size+=size_of_relative_string( &info->machinename );
2491 size+=size_of_relative_string( &info->username );
2492 size+=size_of_relative_string( &info->document );
2493 size+=size_of_relative_string( &info->datatype );
2494 size+=size_of_relative_string( &info->text_status );
2495 size+=size_of_uint32( &info->status );
2496 size+=size_of_uint32( &info->priority );
2497 size+=size_of_uint32( &info->position );
2498 size+=size_of_uint32( &info->totalpages );
2499 size+=size_of_uint32( &info->pagesprinted );
2500 size+=size_of_systemtime( &info->submitted );
2505 /*******************************************************************
2506 return the size required by a struct in the stream
2507 ********************************************************************/
2508 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
2512 size+=4; /* size of sec desc ptr */
2514 size+=size_of_uint32( &info->jobid );
2515 size+=size_of_relative_string( &info->printername );
2516 size+=size_of_relative_string( &info->machinename );
2517 size+=size_of_relative_string( &info->username );
2518 size+=size_of_relative_string( &info->document );
2519 size+=size_of_relative_string( &info->notifyname );
2520 size+=size_of_relative_string( &info->datatype );
2521 size+=size_of_relative_string( &info->printprocessor );
2522 size+=size_of_relative_string( &info->parameters );
2523 size+=size_of_relative_string( &info->drivername );
2524 size+=size_of_device_mode( info->devmode );
2525 size+=size_of_relative_string( &info->text_status );
2526 /* SEC_DESC sec_desc;*/
2527 size+=size_of_uint32( &info->status );
2528 size+=size_of_uint32( &info->priority );
2529 size+=size_of_uint32( &info->position );
2530 size+=size_of_uint32( &info->starttime );
2531 size+=size_of_uint32( &info->untiltime );
2532 size+=size_of_uint32( &info->totalpages );
2533 size+=size_of_uint32( &info->size );
2534 size+=size_of_systemtime( &info->submitted );
2535 size+=size_of_uint32( &info->timeelapsed );
2536 size+=size_of_uint32( &info->pagesprinted );
2541 /*******************************************************************
2542 return the size required by a struct in the stream
2543 ********************************************************************/
2544 uint32 spoolss_size_form_1(FORM_1 *info)
2548 size+=size_of_uint32( &(info->flag) );
2549 size+=size_of_relative_string( &(info->name) );
2550 size+=size_of_uint32( &(info->width) );
2551 size+=size_of_uint32( &(info->length) );
2552 size+=size_of_uint32( &(info->left) );
2553 size+=size_of_uint32( &(info->top) );
2554 size+=size_of_uint32( &(info->right) );
2555 size+=size_of_uint32( &(info->bottom) );
2560 /*******************************************************************
2561 return the size required by a struct in the stream
2562 ********************************************************************/
2563 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
2567 size+=size_of_relative_string( &info->port_name );
2572 /*******************************************************************
2573 return the size required by a struct in the stream
2574 ********************************************************************/
2575 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
2579 size=str_len_uni(&info->name); /* the string length */
2580 size=size+1; /* add the leading zero */
2581 size=size*2; /* convert in char */
2586 /*******************************************************************
2587 return the size required by a struct in the stream
2588 ********************************************************************/
2589 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
2593 size+=size_of_relative_string( &info->port_name );
2594 size+=size_of_relative_string( &info->monitor_name );
2595 size+=size_of_relative_string( &info->description );
2597 size+=size_of_uint32( &info->port_type );
2598 size+=size_of_uint32( &info->reserved );
2603 /*******************************************************************
2604 return the size required by a struct in the stream
2605 ********************************************************************/
2606 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
2609 size+=size_of_relative_string( &info->name );
2614 /*******************************************************************
2615 return the size required by a struct in the stream
2616 ********************************************************************/
2617 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
2620 size+=size_of_relative_string( &info->name );
2625 /*******************************************************************
2626 return the size required by a struct in the stream
2627 ********************************************************************/
2628 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
2631 size+=size_of_relative_string( &info->name );
2636 /*******************************************************************
2637 return the size required by a struct in the stream
2638 ********************************************************************/
2639 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
2642 size+=size_of_relative_string( &info->name);
2643 size+=size_of_relative_string( &info->environment);
2644 size+=size_of_relative_string( &info->dll_name);
2649 /*******************************************************************
2651 ********************************************************************/
2652 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
2653 const POLICY_HND *hnd,
2654 const fstring architecture,
2655 uint32 level, uint32 clientmajor, uint32 clientminor,
2656 NEW_BUFFER *buffer, uint32 offered)
2661 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2663 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
2666 q_u->clientmajorversion=clientmajor;
2667 q_u->clientminorversion=clientminor;
2670 q_u->offered=offered;
2675 /*******************************************************************
2677 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
2678 ********************************************************************/
2679 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
2681 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
2687 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2689 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
2691 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
2696 if(!prs_uint32("level", ps, depth, &q_u->level))
2699 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2705 if(!prs_uint32("offered", ps, depth, &q_u->offered))
2708 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
2710 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
2716 /*******************************************************************
2718 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
2719 ********************************************************************/
2720 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
2722 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
2728 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2733 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2735 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
2737 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
2739 if (!prs_uint32("status", ps, depth, &r_u->status))
2745 /*******************************************************************
2747 ********************************************************************/
2748 BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, uint32 flags,
2749 fstring servername, uint32 level,
2750 NEW_BUFFER *buffer, uint32 offered)
2754 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
2755 init_unistr2(&(q_u->servername), servername, strlen(servername));
2759 q_u->offered=offered;
2764 /*******************************************************************
2766 * called from spoolss_enumprinters (srv_spoolss.c)
2767 ********************************************************************/
2768 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
2770 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
2776 if (!prs_uint32("flags", ps, depth, &q_u->flags))
2778 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
2781 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
2786 if (!prs_uint32("level", ps, depth, &q_u->level))
2789 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2794 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2800 /*******************************************************************
2801 Parse a SPOOL_R_ENUMPRINTERS structure.
2802 ********************************************************************/
2803 BOOL new_spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
2805 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinters");
2811 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2817 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2820 if (!prs_uint32("returned", ps, depth, &r_u->returned))
2823 if (!prs_uint32("status", ps, depth, &r_u->status))
2829 /*******************************************************************
2830 * write a structure.
2831 * called from spoolss_r_enum_printers (srv_spoolss.c)
2833 ********************************************************************/
2834 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
2836 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
2842 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
2848 if (!prs_uint32("needed", ps, depth, &r_u->needed))
2851 if (!prs_uint32("status", ps, depth, &r_u->status))
2857 /*******************************************************************
2859 * called from spoolss_getprinter (srv_spoolss.c)
2860 ********************************************************************/
2861 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
2863 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
2869 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
2871 if (!prs_uint32("level", ps, depth, &q_u->level))
2874 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
2879 if (!prs_uint32("offered", ps, depth, &q_u->offered))
2885 /*******************************************************************
2887 ********************************************************************/
2888 BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level,
2889 NEW_BUFFER *buffer, uint32 offered)
2895 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
2899 q_u->offered=offered;
2904 /*******************************************************************
2905 ********************************************************************/
2906 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
2908 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
2914 if(!prs_uint32("status", ps, depth, &(r_u->status)))
2920 /*******************************************************************
2921 Delete the dynamic parts of a SPOOL_Q_SETPRINTER struct.
2922 ********************************************************************/
2924 void free_spoolss_q_setprinter(SPOOL_Q_SETPRINTER *q_u)
2926 free_spool_printer_info_level(&q_u->info);
2927 free_sec_desc_buf( &q_u->secdesc_ctr );
2928 free_devmode( q_u->devmode_ctr.devmode );
2931 /*******************************************************************
2932 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
2933 ********************************************************************/
2935 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
2937 uint32 ptr_sec_desc = 0;
2939 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
2945 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
2947 if(!prs_uint32("level", ps, depth, &q_u->level))
2950 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
2953 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
2960 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
2965 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
2971 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
2975 if(!prs_uint32("command", ps, depth, &q_u->command))
2981 /*******************************************************************
2982 ********************************************************************/
2983 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
2985 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
2991 if(!prs_uint32("status", ps, depth, &(r_u->status)))
2997 /*******************************************************************
2998 ********************************************************************/
2999 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3002 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3008 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3015 /*******************************************************************
3016 ********************************************************************/
3017 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3019 prs_debug(ps, depth, desc, "");
3025 if(!prs_uint32("status", ps, depth, &r_u->status))
3031 /*******************************************************************
3032 ********************************************************************/
3033 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3035 prs_debug(ps, depth, desc, "");
3041 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3043 if(!prs_uint32("level", ps, depth, &q_u->level))
3046 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3052 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3058 /*******************************************************************
3059 ********************************************************************/
3060 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3062 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3068 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3074 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3077 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3080 if (!prs_uint32("status", ps, depth, &r_u->status))
3087 /*******************************************************************
3088 ********************************************************************/
3089 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3100 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3101 q_u->firstjob = firstjob;
3102 q_u->numofjobs = numofjobs;
3104 q_u->buffer= buffer;
3105 q_u->offered = offered;
3109 /*******************************************************************
3110 ********************************************************************/
3111 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
3113 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
3119 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
3122 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
3124 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
3126 if (!prs_uint32("level", ps, depth, &q_u->level))
3129 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3132 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3138 /*******************************************************************
3139 ********************************************************************/
3140 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
3142 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
3148 if(!prs_uint32("status", ps, depth, &(r_u->status)))
3154 /*******************************************************************
3155 ********************************************************************/
3156 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
3158 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
3164 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3166 if(!prs_uint32("jobid", ps, depth, &(q_u->jobid)))
3172 /*******************************************************************
3173 ********************************************************************/
3174 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
3176 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
3182 if(!prs_uint32("status", ps, depth, &(r_u->status)))
3188 /*******************************************************************
3189 ********************************************************************/
3190 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3192 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3198 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3200 if(!prs_uint32("jobid", ps, depth, &(q_u->jobid)))
3203 * level is usually 0. If (level!=0) then I'm in trouble !
3204 * I will try to generate setjob command with level!=0, one day.
3206 if(!prs_uint32("level", ps, depth, &(q_u->level)))
3208 if(!prs_uint32("command", ps, depth, &(q_u->command)))
3214 /*******************************************************************
3215 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3216 ********************************************************************/
3217 BOOL new_spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3219 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinterdrivers");
3225 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3231 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3234 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3237 if (!prs_uint32("status", ps, depth, &r_u->status))
3244 /*******************************************************************
3245 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
3246 ********************************************************************/
3247 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
3250 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
3256 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3258 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
3263 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
3265 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
3270 if (!prs_uint32("level", ps, depth, &q_u->level))
3273 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3279 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3285 /*******************************************************************
3286 ********************************************************************/
3287 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
3290 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
3295 if (!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
3297 if (!prs_uint32("level", ps, depth, &(q_u->level)))
3300 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3305 if (!prs_uint32("offered", ps, depth, &(q_u->offered)))
3311 /*******************************************************************
3312 ********************************************************************/
3313 BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
3315 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumforms");
3321 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3327 if (!prs_uint32("size of buffer needed", ps, depth, &(r_u->needed)))
3330 if (!prs_uint32("numofforms", ps, depth, &(r_u->numofforms)))
3333 if (!prs_uint32("status", ps, depth, &(r_u->status)))
3340 /*******************************************************************
3341 Parse a SPOOL_R_ENUMPORTS structure.
3342 ********************************************************************/
3343 BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
3345 prs_debug(ps, depth, desc, "new_spoolss_io_r_enumports");
3351 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
3357 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3360 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3363 if (!prs_uint32("status", ps, depth, &r_u->status))
3369 /*******************************************************************
3370 ********************************************************************/
3371 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
3373 prs_debug(ps, depth, desc, "");
3379 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
3381 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
3386 if (!prs_uint32("level", ps, depth, &q_u->level))
3389 if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
3394 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3400 /*******************************************************************
3401 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
3402 ********************************************************************/
3403 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
3405 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
3411 if(!prs_uint32("flags", ps, depth, &il->flags))
3413 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
3415 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
3417 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3420 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
3422 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3424 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3430 /*******************************************************************
3431 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
3432 ********************************************************************/
3433 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
3435 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
3441 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
3447 /*******************************************************************
3448 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
3449 ********************************************************************/
3450 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
3452 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
3458 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
3460 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
3462 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
3464 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
3467 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
3469 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
3471 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
3473 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
3475 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
3477 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
3479 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
3481 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
3483 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
3486 if(!prs_uint32("attributes", ps, depth, &il->attributes))
3488 if(!prs_uint32("priority", ps, depth, &il->priority))
3490 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
3492 if(!prs_uint32("starttime", ps, depth, &il->starttime))
3494 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
3496 if(!prs_uint32("status", ps, depth, &il->status))
3498 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
3500 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
3503 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
3505 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
3507 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
3509 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
3511 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
3513 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
3515 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
3517 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
3519 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
3521 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
3523 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
3529 /*******************************************************************
3530 ********************************************************************/
3531 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
3533 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
3538 if(!prs_uint32("level", ps, depth, &il->level))
3540 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
3543 /* if no struct inside just return */
3544 if (il->info_ptr==0) {
3545 if (UNMARSHALLING(ps)) {
3552 switch (il->level) {
3554 * level 0 is used by setprinter when managing the queue
3555 * (hold, stop, start a queue)
3560 * level 2 is used by addprinter
3561 * and by setprinter when updating printer's info
3565 if (UNMARSHALLING(ps)) {
3566 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
3568 ZERO_STRUCTP(il->info_1);
3570 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
3575 if (UNMARSHALLING(ps)) {
3576 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
3578 ZERO_STRUCTP(il->info_2);
3580 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
3585 if (UNMARSHALLING(ps)) {
3586 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
3588 ZERO_STRUCTP(il->info_3);
3590 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
3599 /*******************************************************************
3600 ********************************************************************/
3601 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
3603 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
3607 * I think that's one of the few well written functions.
3608 * the sub-structures are correctly parsed and analysed
3609 * the info level are handled in a nice way.
3614 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
3616 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
3622 if(!prs_uint32("info_level", ps, depth, &q_u->level))
3625 if(!spool_io_printer_info_level("", &(q_u->info), ps, depth))
3628 /* the 4 unknown are all 0 */
3631 * en fait ils sont pas inconnu
3632 * par recoupement avec rpcSetPrinter
3633 * c'est le devicemode
3634 * et le security descriptor.
3637 if(!prs_uint32("unk0", ps, depth, &q_u->unk0))
3639 if(!prs_uint32("unk1", ps, depth, &q_u->unk1))
3641 if(!prs_uint32("unk2", ps, depth, &q_u->unk2))
3643 if(!prs_uint32("unk3", ps, depth, &q_u->unk3))
3646 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
3648 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
3655 /*******************************************************************
3656 ********************************************************************/
3657 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u, prs_struct *ps, int depth)
3659 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
3662 if(!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
3665 if(!prs_uint32("status", ps, depth, &(r_u->status)))
3671 /*******************************************************************
3672 ********************************************************************/
3673 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
3674 prs_struct *ps, int depth)
3676 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
3678 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
3682 if (UNMARSHALLING(ps)) {
3683 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
3696 if(!prs_uint32("cversion", ps, depth, &il->cversion))
3698 if(!prs_uint32("name", ps, depth, &il->name_ptr))
3700 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
3702 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
3704 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
3706 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
3708 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
3710 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
3712 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
3714 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
3716 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
3722 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3724 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
3726 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
3728 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
3730 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
3732 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
3734 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
3736 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
3742 if (il->dependentfiles_ptr)
3743 smb_io_buffer5("", &il->dependentfiles, ps, depth);
3748 void free_spool_printer_driver_info_level_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u)
3750 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il = *q_u;
3755 free_buffer5(&il->dependentfiles);
3760 /*******************************************************************
3761 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
3762 ********************************************************************/
3763 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
3764 prs_struct *ps, int depth)
3766 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
3768 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
3772 if (UNMARSHALLING(ps)) {
3773 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
3787 /* parse the main elements the packet */
3789 if(!prs_uint32("version", ps, depth, &il->version))
3791 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
3793 if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr))
3795 if(!prs_uint32("driverpath_ptr", ps, depth, &il->driverpath_ptr))
3797 if(!prs_uint32("datafile_ptr", ps, depth, &il->datafile_ptr))
3799 if(!prs_uint32("configfile_ptr", ps, depth, &il->configfile_ptr))
3801 if(!prs_uint32("helpfile_ptr", ps, depth, &il->helpfile_ptr))
3803 if(!prs_uint32("monitorname_ptr", ps, depth, &il->monitorname_ptr))
3805 if(!prs_uint32("defaultdatatype_ptr", ps, depth, &il->defaultdatatype_ptr))
3807 if(!prs_uint32("dependentfiles_len", ps, depth, &il->dependentfiles_len))
3809 if(!prs_uint32("dependentfiles_ptr", ps, depth, &il->dependentfiles_ptr))
3811 if(!prs_uint32("previousnames_len", ps, depth, &il->previousnames_len))
3813 if(!prs_uint32("previousnames_ptr", ps, depth, &il->previousnames_ptr))
3815 if(!smb_io_time("driverdate", &il->driverdate, ps, depth))
3817 if(!prs_uint64("driverversion", ps, depth, &il->driverversion))
3819 if(!prs_uint32("dummy4", ps, depth, &il->dummy4))
3821 if(!prs_uint32("mfgname_ptr", ps, depth, &il->mfgname_ptr))
3823 if(!prs_uint32("oemurl_ptr", ps, depth, &il->oemurl_ptr))
3825 if(!prs_uint32("hardwareid_ptr", ps, depth, &il->hardwareid_ptr))
3827 if(!prs_uint32("provider_ptr", ps, depth, &il->provider_ptr))
3830 /* parse the structures in the packet */
3832 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
3836 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
3840 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
3844 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
3848 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
3852 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
3856 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
3860 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
3864 if (il->dependentfiles_ptr) {
3865 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
3870 if (il->previousnames_ptr) {
3871 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
3876 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
3880 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
3884 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
3888 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
3896 void free_spool_printer_driver_info_level_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u)
3898 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il = *q_u;
3903 free_buffer5(&il->dependentfiles);
3904 free_buffer5(&il->previousnames);
3910 /*******************************************************************
3911 convert a buffer of UNICODE strings null terminated
3912 the buffer is terminated by a NULL
3914 convert to an dos codepage array (null terminated)
3916 dynamically allocate memory
3918 ********************************************************************/
3919 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
3925 if (buf5==NULL) return False;
3927 src = (char *)buf5->buffer;
3930 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
3931 unistr_to_dos(f, src, sizeof(f)-1);
3932 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
3933 *ar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
3934 fstrcpy((*ar)[n], f);
3937 fstrcpy((*ar)[n], "");
3942 /*******************************************************************
3943 read a UNICODE array with null terminated strings
3944 and null terminated array
3945 and size of array at beginning
3946 ********************************************************************/
3947 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
3949 if (buffer==NULL) return False;
3952 buffer->uni_str_len=buffer->uni_max_len;
3954 if(!prs_uint32("buffer_size", ps, depth, &(buffer->uni_max_len)))
3957 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
3963 /*******************************************************************
3964 ********************************************************************/
3965 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
3967 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
3972 if(!prs_uint32("level", ps, depth, &il->level))
3974 if(!prs_uint32("ptr", ps, depth, &il->ptr))
3980 switch (il->level) {
3982 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
3986 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
3996 void free_spool_printer_driver_info_level(SPOOL_PRINTER_DRIVER_INFO_LEVEL *il)
4001 switch (il->level) {
4003 free_spool_printer_driver_info_level_3(&il->info_3);
4006 free_spool_printer_driver_info_level_6(&il->info_6);
4011 /*******************************************************************
4012 ********************************************************************/
4013 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4015 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
4021 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
4023 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4028 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4031 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
4037 /*******************************************************************
4038 Free the dynamic parts of a printer driver.
4039 ********************************************************************/
4041 void free_spoolss_q_addprinterdriver(SPOOL_Q_ADDPRINTERDRIVER *q_u)
4043 free_spool_printer_driver_info_level(&q_u->info);
4046 /*******************************************************************
4047 ********************************************************************/
4048 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4050 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
4053 if(!prs_uint32("status", ps, depth, &q_u->status))
4060 /*******************************************************************
4061 ********************************************************************/
4062 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
4063 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
4065 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
4067 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
4071 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
4079 d->cversion=uni->cversion;
4081 unistr2_to_ascii(d->name, &(uni->name), sizeof(d->name)-1);
4082 unistr2_to_ascii(d->environment, &(uni->environment), sizeof(d->environment)-1);
4083 unistr2_to_ascii(d->driverpath, &(uni->driverpath), sizeof(d->driverpath)-1);
4084 unistr2_to_ascii(d->datafile, &(uni->datafile), sizeof(d->datafile)-1);
4085 unistr2_to_ascii(d->configfile, &(uni->configfile), sizeof(d->configfile)-1);
4086 unistr2_to_ascii(d->helpfile, &(uni->helpfile), sizeof(d->helpfile)-1);
4087 unistr2_to_ascii(d->monitorname, &(uni->monitorname), sizeof(d->monitorname)-1);
4088 unistr2_to_ascii(d->defaultdatatype, &(uni->defaultdatatype), sizeof(d->defaultdatatype)-1);
4090 DEBUGADD(8,( "version: %d\n", d->cversion));
4091 DEBUGADD(8,( "name: %s\n", d->name));
4092 DEBUGADD(8,( "environment: %s\n", d->environment));
4093 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
4094 DEBUGADD(8,( "datafile: %s\n", d->datafile));
4095 DEBUGADD(8,( "configfile: %s\n", d->configfile));
4096 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
4097 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
4098 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
4100 uniarray_2_dosarray(&(uni->dependentfiles), &(d->dependentfiles) );
4105 /*******************************************************************
4106 ********************************************************************/
4107 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
4108 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
4110 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
4112 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
4116 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
4124 d->version=uni->version;
4126 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
4127 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
4128 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
4129 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
4130 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
4131 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
4132 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
4133 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
4135 DEBUGADD(8,( "version: %d\n", d->version));
4136 DEBUGADD(8,( "name: %s\n", d->name));
4137 DEBUGADD(8,( "environment: %s\n", d->environment));
4138 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
4139 DEBUGADD(8,( "datafile: %s\n", d->datafile));
4140 DEBUGADD(8,( "configfile: %s\n", d->configfile));
4141 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
4142 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
4143 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
4145 uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles );
4146 uniarray_2_dosarray(&uni->previousnames, &d->previousnames );
4151 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
4152 NT_PRINTER_INFO_LEVEL_2 **asc)
4154 NT_PRINTER_INFO_LEVEL_2 *d;
4158 DEBUG(7,("Converting from UNICODE to ASCII\n"));
4159 time_unix=time(NULL);
4163 DEBUGADD(8,("allocating memory\n"));
4165 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
4170 /* we allocate memory iff called from
4171 * addprinter(ex) so we can do one time stuff here.
4173 (*asc)->setuptime=time_unix;
4176 DEBUGADD(8,("start converting\n"));
4180 d->attributes=uni->attributes;
4181 d->priority=uni->priority;
4182 d->default_priority=uni->default_priority;
4183 d->starttime=uni->starttime;
4184 d->untiltime=uni->untiltime;
4185 d->status=uni->status;
4186 d->cjobs=uni->cjobs;
4188 unix_to_nt_time(&time_nt, time_unix);
4189 d->changeid=time_nt.low;
4192 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
4193 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
4194 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
4195 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
4196 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
4197 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
4198 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
4199 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
4200 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
4201 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
4206 /*******************************************************************
4207 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
4208 ********************************************************************/
4209 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
4211 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
4216 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4218 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
4224 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
4226 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4232 if(!prs_uint32("level", ps, depth, &q_u->level))
4235 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4241 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4247 /*******************************************************************
4248 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
4249 ********************************************************************/
4250 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
4252 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
4258 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4264 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4267 if (!prs_uint32("status", ps, depth, &r_u->status))
4273 /*******************************************************************
4274 ********************************************************************/
4275 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
4277 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
4283 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4289 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4292 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4295 if (!prs_uint32("status", ps, depth, &r_u->status))
4301 /*******************************************************************
4302 ********************************************************************/
4303 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
4305 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
4311 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4313 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4319 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
4321 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4327 if (!prs_uint32("level", ps, depth, &q_u->level))
4330 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4336 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4342 /*******************************************************************
4343 ********************************************************************/
4344 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
4346 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
4352 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4358 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4361 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4364 if (!prs_uint32("status", ps, depth, &r_u->status))
4370 /*******************************************************************
4371 ********************************************************************/
4372 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
4374 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
4380 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4382 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4388 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
4390 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
4396 if (!prs_uint32("level", ps, depth, &q_u->level))
4399 if(!new_spoolss_io_buffer("buffer", ps, depth, q_u->buffer))
4405 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4411 /*******************************************************************
4412 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
4413 ********************************************************************/
4414 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
4416 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
4422 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4424 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
4430 if (!prs_uint32("level", ps, depth, &q_u->level))
4433 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4439 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4445 /*******************************************************************
4446 ********************************************************************/
4447 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
4449 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
4455 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4461 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4464 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4467 if (!prs_uint32("status", ps, depth, &r_u->status))
4473 /*******************************************************************
4474 ********************************************************************/
4475 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
4477 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
4482 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
4484 if(!prs_uint16s(False, "value", ps, depth, r_u->value, r_u->valuesize))
4486 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
4489 if(!prs_uint32("type", ps, depth, &r_u->type))
4492 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
4494 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
4496 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
4498 if(!prs_uint32("status", ps, depth, &r_u->status))
4504 /*******************************************************************
4505 ********************************************************************/
4506 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
4508 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
4513 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4515 if(!prs_uint32("index", ps, depth, &q_u->index))
4517 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
4519 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
4525 /*******************************************************************
4526 ********************************************************************/
4527 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
4528 const POLICY_HND *hnd,
4529 uint32 idx, uint32 valuelen, uint32 datalen)
4531 memcpy(&(q_u->handle), hnd, sizeof(q_u->handle));
4533 q_u->valuesize=valuelen;
4534 q_u->datasize=datalen;
4539 /*******************************************************************
4540 ********************************************************************/
4541 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
4543 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
4548 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4550 if(!smb_io_unistr2("", &(q_u->value), True, ps, depth))
4556 if(!prs_uint32("type", ps, depth, &(q_u->type)))
4559 if(!prs_uint32("max_len", ps, depth, &(q_u->max_len)))
4568 q_u->data=(uint8 *)malloc(q_u->max_len * sizeof(uint8));
4569 if(q_u->data == NULL)
4571 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
4578 if(!prs_uint32("real_len", ps, depth, &(q_u->real_len)))
4584 void free_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u)
4586 safe_free(q_u->data);
4589 /*******************************************************************
4590 ********************************************************************/
4591 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
4593 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
4598 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4604 /*******************************************************************
4605 ********************************************************************/
4606 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
4607 uint32 type, const uint8 *data, uint32 len)
4609 DEBUG(5,("converting a specific param struct\n"));
4613 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
4616 ZERO_STRUCTP(*param);
4617 DEBUGADD(6,("Allocated a new PARAM struct\n"));
4619 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
4620 (*param)->type = type;
4622 /* le champ data n'est pas NULL termine */
4623 /* on stocke donc la longueur */
4625 (*param)->data_len=len;
4627 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
4628 if((*param)->data == NULL)
4631 memcpy((*param)->data, data, len);
4633 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
4638 /*******************************************************************
4639 ********************************************************************/
4640 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
4642 prs_debug(ps, depth, desc, "spoolss_io_addform");
4649 if(!prs_uint32("flags", ps, depth, &(f->flags)))
4651 if(!prs_uint32("name_ptr", ps, depth, &(f->name_ptr)))
4653 if(!prs_uint32("size_x", ps, depth, &(f->size_x)))
4655 if(!prs_uint32("size_y", ps, depth, &(f->size_y)))
4657 if(!prs_uint32("left", ps, depth, &(f->left)))
4659 if(!prs_uint32("top", ps, depth, &(f->top)))
4661 if(!prs_uint32("right", ps, depth, &(f->right)))
4663 if(!prs_uint32("bottom", ps, depth, &(f->bottom)))
4666 if(!smb_io_unistr2("", &(f->name), f->name_ptr, ps, depth))
4673 /*******************************************************************
4674 ********************************************************************/
4675 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
4677 uint32 useless_ptr=0;
4678 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
4683 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4685 if(!prs_uint32("level", ps, depth, &(q_u->level)))
4687 if(!prs_uint32("level2", ps, depth, &(q_u->level2)))
4692 if(!prs_uint32("useless_ptr", ps, depth, &(useless_ptr)))
4694 if(!spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth))
4701 /*******************************************************************
4702 ********************************************************************/
4703 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
4705 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
4710 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4716 /*******************************************************************
4717 ********************************************************************/
4718 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
4720 uint32 useless_ptr=0;
4721 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
4726 if(!smb_io_pol_hnd("printer handle", &(q_u->handle), ps, depth))
4728 if(!smb_io_unistr2("", &(q_u->name), True, ps, depth))
4734 if(!prs_uint32("level", ps, depth, &(q_u->level)))
4736 if(!prs_uint32("level2", ps, depth, &(q_u->level2)))
4741 if(!prs_uint32("useless_ptr", ps, depth, &(useless_ptr)))
4743 if(!spoolss_io_addform("", &(q_u->form), useless_ptr, ps, depth))
4750 /*******************************************************************
4751 ********************************************************************/
4752 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
4754 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
4759 if(!prs_uint32("status", ps, depth, &(r_u->status)))
4765 /*******************************************************************
4766 Parse a SPOOL_R_GETJOB structure.
4767 ********************************************************************/
4768 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
4770 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
4776 if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
4782 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4785 if (!prs_uint32("status", ps, depth, &r_u->status))
4791 /*******************************************************************
4792 Parse a SPOOL_Q_GETJOB structure.
4793 ********************************************************************/
4794 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
4796 prs_debug(ps, depth, desc, "");
4802 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
4804 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4806 if(!prs_uint32("level", ps, depth, &q_u->level))
4809 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
4815 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4821 void free_devmode(DEVICEMODE *devmode)
4823 if (devmode!=NULL) {
4824 safe_free(devmode->private);
4829 void free_printer_info_1(PRINTER_INFO_1 *printer)
4834 void free_printer_info_2(PRINTER_INFO_2 *printer)
4836 if (printer!=NULL) {
4837 free_devmode(printer->devmode);
4838 printer->devmode = NULL;
4839 if (printer->secdesc != NULL)
4840 free_sec_desc(&printer->secdesc);
4845 void free_printer_info_3(PRINTER_INFO_3 *printer)
4847 if (printer!=NULL) {
4848 if (printer->secdesc != NULL)
4849 free_sec_desc(&printer->secdesc);
4854 void free_spool_printer_info_1(SPOOL_PRINTER_INFO_LEVEL_1 *printer)
4859 void free_spool_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 *printer)
4861 if (printer!=NULL) {
4862 if (printer->secdesc != NULL)
4863 free_sec_desc_buf(&printer->secdesc);
4868 void free_spool_printer_info_3(SPOOL_PRINTER_INFO_LEVEL_3 *printer)
4873 void free_spool_printer_info_level(SPOOL_PRINTER_INFO_LEVEL *pil)
4878 switch (pil->level) {
4880 free_spool_printer_info_1(pil->info_1);
4883 free_spool_printer_info_2(pil->info_2);
4886 free_spool_printer_info_3(pil->info_3);
4893 static PRINTER_INFO_2 *prt2_dup(const PRINTER_INFO_2* from)
4895 PRINTER_INFO_2 *copy = (PRINTER_INFO_2 *)malloc(sizeof(PRINTER_INFO_2));
4898 memcpy(copy, from, sizeof(*copy));
4905 void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries)
4907 void(*fn)(void*) = (void(*)(void*))&free_printer_info_2;
4908 free_void_array(num_entries, (void**)entries, *fn);
4911 PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array,
4912 const PRINTER_INFO_2 *prt)
4914 void*(*fn)(const void*) = (void*(*)(const void*))&prt2_dup;
4915 return (PRINTER_INFO_2*)add_copy_to_array(len,
4916 (void***)array, (const void*)prt, *fn, True);
4919 static PRINTER_INFO_1 *prt1_dup(const PRINTER_INFO_1* from)
4921 PRINTER_INFO_1 *copy = (PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1));
4924 memcpy(copy, from, sizeof(*copy));
4931 void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries)
4933 void(*fn)(void*) = (void(*)(void*))&free;
4934 free_void_array(num_entries, (void**)entries, *fn);
4937 PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array,
4938 const PRINTER_INFO_1 *prt)
4940 void*(*fn)(const void*) = (void*(*)(const void*))&prt1_dup;
4941 return (PRINTER_INFO_1*)add_copy_to_array(len,
4942 (void***)array, (const void*)prt, *fn, True);
4945 static JOB_INFO_1 *job1_dup(const JOB_INFO_1* from)
4947 JOB_INFO_1 *copy = (JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1));
4952 memcpy(copy, from, sizeof(*copy));
4962 void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries)
4964 void(*fn)(void*) = (void(*)(void*))&free;
4965 free_void_array(num_entries, (void**)entries, *fn);
4968 JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array,
4969 const JOB_INFO_1 *job)
4971 void*(*fn)(const void*) = (void*(*)(const void*))&job1_dup;
4972 return (JOB_INFO_1*)add_copy_to_array(len,
4973 (void***)array, (const void*)job, *fn, True);
4976 static JOB_INFO_2 *job2_dup(const JOB_INFO_2* from)
4978 JOB_INFO_2 *copy = (JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2));
4983 memcpy(copy, from, sizeof(*copy));
4993 void free_job_info_2(JOB_INFO_2 *job)
4997 free_devmode(job->devmode);
5002 void free_job2_array(uint32 num_entries, JOB_INFO_2 **entries)
5004 void(*fn)(void*) = (void(*)(void*))&free_job_info_2;
5005 free_void_array(num_entries, (void**)entries, *fn);
5008 JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array,
5009 const JOB_INFO_2 *job)
5011 void*(*fn)(const void*) = (void*(*)(const void*))&job2_dup;
5012 return (JOB_INFO_2*)add_copy_to_array(len,
5013 (void***)array, (const void*)job, *fn, True);
5016 /*******************************************************************
5017 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
5018 ********************************************************************/
5019 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
5021 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
5027 if(!smb_io_unistr2("", &(q_u->string), True, ps, depth))
5033 if(!prs_uint32("printer", ps, depth, &q_u->printer))
5035 if(!prs_uint32("type", ps, depth, &q_u->type))
5038 if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
5044 /*******************************************************************
5045 Parse a SPOOL_R_REPLYOPENPRINTER structure.
5046 ********************************************************************/
5047 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
5049 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
5055 if(!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
5058 if (!prs_uint32("status", ps, depth, &r_u->status))
5064 /*******************************************************************
5065 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
5066 ********************************************************************/
5067 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
5069 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
5075 if(!smb_io_pol_hnd("printer handle",&(q_u->handle),ps,depth))
5081 /*******************************************************************
5082 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
5083 ********************************************************************/
5084 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
5086 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
5092 if(!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
5095 if (!prs_uint32("status", ps, depth, &r_u->status))