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,
8 * Copyright (C) Gerald Carter 2000,
9 * Copyright (C) Tim Potter 2001.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 /*******************************************************************
29 return the length of a UNISTR string.
30 ********************************************************************/
32 static uint32 str_len_uni(UNISTR *source)
39 while (source->buffer[i])
45 /*******************************************************************
46 This should be moved in a more generic lib.
47 ********************************************************************/
49 static BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
51 if(!prs_uint16("year", ps, depth, &(systime->year)))
53 if(!prs_uint16("month", ps, depth, &(systime->month)))
55 if(!prs_uint16("dayofweek", ps, depth, &(systime->dayofweek)))
57 if(!prs_uint16("day", ps, depth, &(systime->day)))
59 if(!prs_uint16("hour", ps, depth, &(systime->hour)))
61 if(!prs_uint16("minute", ps, depth, &(systime->minute)))
63 if(!prs_uint16("second", ps, depth, &(systime->second)))
65 if(!prs_uint16("milliseconds", ps, depth, &(systime->milliseconds)))
71 /*******************************************************************
72 ********************************************************************/
74 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
76 systime->year=unixtime->tm_year+1900;
77 systime->month=unixtime->tm_mon+1;
78 systime->dayofweek=unixtime->tm_wday;
79 systime->day=unixtime->tm_mday;
80 systime->hour=unixtime->tm_hour;
81 systime->minute=unixtime->tm_min;
82 systime->second=unixtime->tm_sec;
83 systime->milliseconds=0;
88 /*******************************************************************
89 reads or writes an DOC_INFO structure.
90 ********************************************************************/
92 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
94 if (info_1 == NULL) return False;
96 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
102 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
104 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
106 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
109 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
111 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
113 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
119 /*******************************************************************
120 reads or writes an DOC_INFO structure.
121 ********************************************************************/
123 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
125 uint32 useless_ptr=0;
127 if (info == NULL) return False;
129 prs_debug(ps, depth, desc, "smb_io_doc_info");
135 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
138 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
141 switch (info->switch_value)
144 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
149 this is just a placeholder
151 MSDN July 1998 says doc_info_2 is only on
152 Windows 95, and as Win95 doesn't do RPC to print
153 this case is nearly impossible
155 Maybe one day with Windows for dishwasher 2037 ...
158 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
161 DEBUG(0,("Something is obviously wrong somewhere !\n"));
168 /*******************************************************************
169 reads or writes an DOC_INFO_CONTAINER structure.
170 ********************************************************************/
172 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
174 if (cont == NULL) return False;
176 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
182 if(!prs_uint32("level", ps, depth, &cont->level))
185 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
191 /*******************************************************************
192 reads or writes an NOTIFY OPTION TYPE structure.
193 ********************************************************************/
195 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
196 structure. The _TYPE structure is really the deferred referrants (i.e
197 the notify fields array) of the _TYPE structure. -tpot */
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 ********************************************************************/
227 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
231 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
234 /* if there are no fields just return */
235 if (type->fields_ptr==0)
241 if(!prs_uint32("count2", ps, depth, &type->count2))
244 if (type->count2 != type->count)
245 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
247 /* parse the option type data */
248 for(i=0;i<type->count2;i++)
249 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
254 /*******************************************************************
255 reads or writes an NOTIFY OPTION structure.
256 ********************************************************************/
258 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
262 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
265 if(!prs_uint32("count", ps, depth, &ctr->count))
269 if (UNMARSHALLING(ps))
270 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)prs_alloc_mem(ps,ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
273 /* the option type struct */
274 for(i=0;i<ctr->count;i++)
275 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
278 /* the type associated with the option type struct */
279 for(i=0;i<ctr->count;i++)
280 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
286 /*******************************************************************
287 reads or writes an NOTIFY OPTION structure.
288 ********************************************************************/
290 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
292 prs_debug(ps, depth, desc, "smb_io_notify_option");
295 if(!prs_uint32("version", ps, depth, &option->version))
297 if(!prs_uint32("flags", ps, depth, &option->flags))
299 if(!prs_uint32("count", ps, depth, &option->count))
301 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
304 /* marshalling or unmarshalling, that would work */
305 if (option->option_type_ptr!=0) {
306 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
310 option->ctr.type=NULL;
317 /*******************************************************************
318 reads or writes an NOTIFY INFO DATA structure.
319 ********************************************************************/
321 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
323 uint32 useless_ptr=0xADDE0FF0;
325 uint32 how_many_words;
329 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
332 how_many_words=data->size;
333 if (how_many_words==POINTER) {
334 how_many_words=TWO_VALUE;
337 isvalue=data->enc_type;
341 if(!prs_uint16("type", ps, depth, &data->type))
343 if(!prs_uint16("field", ps, depth, &data->field))
347 if(!prs_uint32("how many words", ps, depth, &how_many_words))
349 if(!prs_uint32("id", ps, depth, &data->id))
351 if(!prs_uint32("how many words", ps, depth, &how_many_words))
358 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
360 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
365 /* length in ascii including \0 */
366 x=2*(data->notify_data.data.length+1);
367 if(!prs_uint32("string length", ps, depth, &x ))
369 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
377 /*******************************************************************
378 reads or writes an NOTIFY INFO DATA structure.
379 ********************************************************************/
381 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
382 prs_struct *ps, int depth)
387 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
393 isvalue=data->enc_type;
395 if (isvalue==False) {
396 /* length of string in unicode include \0 */
397 x=data->notify_data.data.length+1;
398 if(!prs_uint32("string length", ps, depth, &x ))
400 if (MARSHALLING(ps)) {
401 /* These are already in little endian format. Don't byte swap. */
404 /* No memory allocated for this string
405 therefore following the data.string
406 pointer is a bad idea. Use a pointer to
407 the uint32 length union member to
408 provide a source for a unicode NULL */
410 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
413 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
418 /* Tallocate memory for string */
420 data->notify_data.data.string = (uint16 *)prs_alloc_mem(ps, x * 2);
421 if (!data->notify_data.data.string)
424 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
434 /*******************************************************************
435 reads or writes an NOTIFY INFO structure.
436 ********************************************************************/
438 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
442 prs_debug(ps, depth, desc, "smb_io_notify_info");
448 if(!prs_uint32("count", ps, depth, &info->count))
450 if(!prs_uint32("version", ps, depth, &info->version))
452 if(!prs_uint32("flags", ps, depth, &info->flags))
454 if(!prs_uint32("count", ps, depth, &info->count))
457 for (i=0;i<info->count;i++) {
458 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
462 /* now do the strings at the end of the stream */
463 for (i=0;i<info->count;i++) {
464 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
471 /*******************************************************************
472 ********************************************************************/
474 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
476 prs_debug(ps, depth, desc, "");
480 if (UNMARSHALLING(ps))
485 if (!prs_uint32("size", ps, depth, &q_u->size))
487 if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
489 if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
491 if (!prs_uint32("build", ps, depth, &q_u->build))
493 if (!prs_uint32("major", ps, depth, &q_u->major))
495 if (!prs_uint32("minor", ps, depth, &q_u->minor))
497 if (!prs_uint32("processor", ps, depth, &q_u->processor))
500 if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
504 if (!smb_io_unistr2("", &q_u->user_name, q_u->user_name_ptr, ps, depth))
510 /*******************************************************************
511 ********************************************************************/
513 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
518 prs_debug(ps, depth, desc, "spool_io_user_level");
523 if (!prs_uint32("level", ps, depth, &q_u->level))
525 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
528 switch (q_u->level) {
530 if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
540 /*******************************************************************
541 * read or write a DEVICEMODE struct.
542 * on reading allocate memory for the private member
543 ********************************************************************/
545 BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
547 prs_debug(ps, depth, desc, "spoolss_io_devmode");
550 if (UNMARSHALLING(ps)) {
551 devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
552 if (devmode->devicename.buffer == NULL)
556 if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
558 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
560 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
562 if (!prs_uint16("size", ps, depth, &devmode->size))
564 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
566 if (!prs_uint32("fields", ps, depth, &devmode->fields))
568 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
570 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
572 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
574 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
576 if (!prs_uint16("scale", ps, depth, &devmode->scale))
578 if (!prs_uint16("copies", ps, depth, &devmode->copies))
580 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
582 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
584 if (!prs_uint16("color", ps, depth, &devmode->color))
586 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
588 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
590 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
592 if (!prs_uint16("collate", ps, depth, &devmode->collate))
595 if (UNMARSHALLING(ps)) {
596 devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
597 if (devmode->formname.buffer == NULL)
601 if (!prs_uint16uni(True, "formname", ps, depth, devmode->formname.buffer, 32))
603 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
605 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
607 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
609 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
611 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
613 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
615 if (!prs_uint32("icmmethod", ps, depth, &devmode->icmmethod))
617 if (!prs_uint32("icmintent", ps, depth, &devmode->icmintent))
619 if (!prs_uint32("mediatype", ps, depth, &devmode->mediatype))
621 if (!prs_uint32("dithertype", ps, depth, &devmode->dithertype))
623 if (!prs_uint32("reserved1", ps, depth, &devmode->reserved1))
625 if (!prs_uint32("reserved2", ps, depth, &devmode->reserved2))
627 if (!prs_uint32("panningwidth", ps, depth, &devmode->panningwidth))
629 if (!prs_uint32("panningheight", ps, depth, &devmode->panningheight))
632 if (devmode->driverextra!=0) {
633 if (UNMARSHALLING(ps)) {
634 devmode->private=(uint8 *)prs_alloc_mem(ps, devmode->driverextra*sizeof(uint8));
635 if(devmode->private == NULL)
637 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
640 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
641 if (!prs_uint8s(False, "private", ps, depth,
642 devmode->private, devmode->driverextra))
649 /*******************************************************************
650 Read or write a DEVICEMODE container
651 ********************************************************************/
653 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
658 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
664 if (!prs_uint32("size", ps, depth, &dm_c->size))
667 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
670 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
671 if (UNMARSHALLING(ps))
672 /* if while reading there is no DEVMODE ... */
677 /* so we have a DEVICEMODE to follow */
678 if (UNMARSHALLING(ps)) {
679 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
680 dm_c->devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE));
681 if(dm_c->devmode == NULL)
685 /* this is bad code, shouldn't be there */
686 if (!prs_uint32("size", ps, depth, &dm_c->size))
689 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
695 /*******************************************************************
696 ********************************************************************/
698 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
703 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
706 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
709 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
715 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
718 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
724 /*******************************************************************
726 ********************************************************************/
728 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
729 const fstring printername,
730 const fstring datatype,
731 uint32 access_required,
732 const fstring clientname,
733 const fstring user_name)
735 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
736 q_u->printername_ptr = (printername!=NULL)?1:0;
737 init_unistr2(&q_u->printername, printername, strlen(printername)+1);
739 q_u->printer_default.datatype_ptr = 0;
741 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
742 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
744 q_u->printer_default.devmode_cont.size=0;
745 q_u->printer_default.devmode_cont.devmode_ptr=0;
746 q_u->printer_default.devmode_cont.devmode=NULL;
747 q_u->printer_default.access_required=access_required;
749 q_u->user_ctr.level=1;
751 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
752 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
753 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
754 q_u->user_ctr.user1.build=1381;
755 q_u->user_ctr.user1.major=2;
756 q_u->user_ctr.user1.minor=0;
757 q_u->user_ctr.user1.processor=0;
758 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
759 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
764 /*******************************************************************
766 ********************************************************************/
767 BOOL make_spoolss_q_addprinterex(
769 SPOOL_Q_ADDPRINTEREX *q_u,
770 const char *srv_name,
771 const char* clientname,
772 const char* user_name,
774 PRINTER_INFO_CTR *ctr)
776 DEBUG(5,("make_spoolss_q_addprinterex\n"));
778 if (!ctr) return False;
780 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
781 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
785 q_u->info.level = level;
786 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
790 /* init q_u->info.info2 from *info */
791 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2))
793 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
801 q_u->unk0 = q_u->unk1 = q_u->unk2 = q_u->unk3 = 0;
805 q_u->user_ctr.level=1;
807 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
808 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
809 q_u->user_ctr.user1.build=1381;
810 q_u->user_ctr.user1.major=2;
811 q_u->user_ctr.user1.minor=0;
812 q_u->user_ctr.user1.processor=0;
813 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
814 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
815 q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
816 q_u->user_ctr.user1.client_name.uni_str_len + 2;
821 /*******************************************************************
822 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
823 *******************************************************************/
825 BOOL make_spoolss_printer_info_2(
827 SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
832 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
834 /* allocate the necessary memory */
835 if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2))))
837 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
841 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
842 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
843 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
844 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
845 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
846 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
847 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
848 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
849 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
850 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
851 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
852 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
853 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
854 inf->attributes = info->attributes;
855 inf->priority = info->priority;
856 inf->default_priority = info->defaultpriority;
857 inf->starttime = info->starttime;
858 inf->untiltime = info->untiltime;
859 inf->cjobs = info->cjobs;
860 inf->averageppm = info->averageppm;
861 init_unistr2_from_unistr(&inf->servername, &info->servername);
862 init_unistr2_from_unistr(&inf->printername, &info->printername);
863 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
864 init_unistr2_from_unistr(&inf->portname, &info->portname);
865 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
866 init_unistr2_from_unistr(&inf->comment, &info->comment);
867 init_unistr2_from_unistr(&inf->location, &info->location);
868 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
869 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
870 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
871 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
872 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
873 inf->secdesc = inf->secdesc;
880 /*******************************************************************
882 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
883 ********************************************************************/
885 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
890 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
896 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
898 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
904 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
907 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
909 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
915 /*******************************************************************
917 ********************************************************************/
918 BOOL make_spoolss_q_deleteprinterdriver(
920 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
926 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
928 q_u->server_ptr = (server!=NULL)?1:0;
930 /* these must be NULL terminated or else NT4 will
931 complain about invalid parameters --jerry */
932 init_unistr2(&q_u->server, server, strlen(server)+1);
933 init_unistr2(&q_u->arch, arch, strlen(arch)+1);
934 init_unistr2(&q_u->driver, driver, strlen(driver)+1);
940 /*******************************************************************
942 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
943 * called from spoolss_open_printer_ex (cli_spoolss.c)
944 ********************************************************************/
946 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
948 if (r_u == NULL) return False;
950 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
956 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
959 if (!prs_werror("status code", ps, depth, &(r_u->status)))
965 /*******************************************************************
967 ********************************************************************/
969 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
970 const POLICY_HND *handle,
971 UNISTR2 *valuename, uint32 size)
973 if (q_u == NULL) return False;
975 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
977 q_u->handle = *handle;
978 copy_unistr2(&q_u->valuename, valuename);
984 /*******************************************************************
986 * called from spoolss_q_getprinterdata (srv_spoolss.c)
987 ********************************************************************/
989 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
994 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
999 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1003 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1007 if (!prs_uint32("size", ps, depth, &q_u->size))
1013 /*******************************************************************
1015 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1016 ********************************************************************/
1018 BOOL spoolss_io_q_deleteprinterdata(char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1023 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1028 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1032 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1038 /*******************************************************************
1039 * write a structure.
1040 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1041 ********************************************************************/
1043 BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1045 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1047 if(!prs_werror("status", ps, depth, &r_u->status))
1053 /*******************************************************************
1054 * write a structure.
1055 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1056 ********************************************************************/
1058 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1063 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1068 if (!prs_uint32("type", ps, depth, &r_u->type))
1070 if (!prs_uint32("size", ps, depth, &r_u->size))
1073 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
1079 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1081 if (!prs_werror("status", ps, depth, &r_u->status))
1087 /*******************************************************************
1089 ********************************************************************/
1091 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1093 if (q_u == NULL) return False;
1095 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1097 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1102 /*******************************************************************
1104 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1105 * called from spoolss_abortprinter (cli_spoolss.c)
1106 ********************************************************************/
1108 BOOL spoolss_io_q_abortprinter(char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1110 if (q_u == NULL) return False;
1112 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1118 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1124 /*******************************************************************
1125 * write a structure.
1126 * called from spoolss_r_abortprinter (srv_spoolss.c)
1127 ********************************************************************/
1129 BOOL spoolss_io_r_abortprinter(char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1131 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1133 if(!prs_werror("status", ps, depth, &r_u->status))
1139 /*******************************************************************
1141 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1142 * called from spoolss_deleteprinter (cli_spoolss.c)
1143 ********************************************************************/
1145 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1147 if (q_u == NULL) return False;
1149 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1155 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1161 /*******************************************************************
1162 * write a structure.
1163 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1164 * called from spoolss_deleteprinter (cli_spoolss.c)
1165 ********************************************************************/
1167 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1169 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1175 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1177 if (!prs_werror("status", ps, depth, &r_u->status))
1184 /*******************************************************************
1186 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1187 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1188 ********************************************************************/
1190 BOOL spoolss_io_q_deleteprinterdriver(char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1192 if (q_u == NULL) return False;
1194 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1200 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1202 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1204 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1206 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1214 /*******************************************************************
1215 * write a structure.
1216 ********************************************************************/
1217 BOOL spoolss_io_r_deleteprinterdriver(char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1219 if (r_u == NULL) return False;
1221 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1227 if (!prs_werror("status", ps, depth, &r_u->status))
1235 /*******************************************************************
1237 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1238 * called from spoolss_closeprinter (cli_spoolss.c)
1239 ********************************************************************/
1241 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1243 if (q_u == NULL) return False;
1245 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1251 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1257 /*******************************************************************
1258 * write a structure.
1259 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1260 * called from spoolss_closeprinter (cli_spoolss.c)
1261 ********************************************************************/
1263 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1265 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1271 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1273 if (!prs_werror("status", ps, depth, &r_u->status))
1279 /*******************************************************************
1281 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1282 ********************************************************************/
1284 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1286 if (q_u == NULL) return False;
1288 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1294 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1297 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1303 /*******************************************************************
1304 * write a structure.
1305 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1306 ********************************************************************/
1308 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1310 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1312 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1314 if(!prs_werror("status", ps, depth, &r_u->status))
1320 /*******************************************************************
1322 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1323 ********************************************************************/
1325 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1327 if (q_u == NULL) return False;
1329 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1335 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1341 /*******************************************************************
1342 * write a structure.
1343 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1344 ********************************************************************/
1346 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1348 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1350 if(!prs_werror("status", ps, depth, &r_u->status))
1356 /*******************************************************************
1358 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1359 ********************************************************************/
1361 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1363 if (q_u == NULL) return False;
1365 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1371 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1377 /*******************************************************************
1378 * write a structure.
1379 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1380 ********************************************************************/
1382 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1384 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1386 if(!prs_werror("status", ps, depth, &r_u->status))
1392 /*******************************************************************
1394 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1395 ********************************************************************/
1397 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1399 if (q_u == NULL) return False;
1401 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1407 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1413 /*******************************************************************
1414 * write a structure.
1415 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1416 ********************************************************************/
1418 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1420 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1422 if(!prs_werror("status", ps, depth, &r_u->status))
1428 /*******************************************************************
1430 * called from spoolss_q_writeprinter (srv_spoolss.c)
1431 ********************************************************************/
1433 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1435 if (q_u == NULL) return False;
1437 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1443 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1445 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1448 if (q_u->buffer_size!=0)
1450 if (UNMARSHALLING(ps))
1451 q_u->buffer=(uint8 *)prs_alloc_mem(ps,q_u->buffer_size*sizeof(uint8));
1452 if(q_u->buffer == NULL)
1454 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1459 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1465 /*******************************************************************
1466 * write a structure.
1467 * called from spoolss_r_writeprinter (srv_spoolss.c)
1468 ********************************************************************/
1470 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1472 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1474 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1476 if(!prs_werror("status", ps, depth, &r_u->status))
1482 /*******************************************************************
1484 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1485 ********************************************************************/
1487 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1489 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1495 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1497 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1499 if(!prs_uint32("options", ps, depth, &q_u->options))
1501 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1503 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1509 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1512 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1515 if (q_u->option_ptr!=0) {
1517 if (UNMARSHALLING(ps))
1518 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1521 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1528 /*******************************************************************
1529 * write a structure.
1530 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1531 ********************************************************************/
1533 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1535 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1538 if(!prs_werror("status", ps, depth, &r_u->status))
1544 /*******************************************************************
1546 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1547 ********************************************************************/
1549 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1551 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1557 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1560 if(!prs_uint32("change", ps, depth, &q_u->change))
1563 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1566 if (q_u->option_ptr!=0) {
1568 if (UNMARSHALLING(ps))
1569 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1572 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1579 /*******************************************************************
1580 * write a structure.
1581 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1582 ********************************************************************/
1584 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1586 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1592 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1595 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1600 if(!prs_werror("status", ps, depth, &r_u->status))
1606 /*******************************************************************
1607 * return the length of a uint16 (obvious, but the code is clean)
1608 ********************************************************************/
1610 static uint32 size_of_uint16(uint16 *value)
1612 return (sizeof(*value));
1615 /*******************************************************************
1616 * return the length of a uint32 (obvious, but the code is clean)
1617 ********************************************************************/
1619 static uint32 size_of_uint32(uint32 *value)
1621 return (sizeof(*value));
1624 /*******************************************************************
1625 * return the length of a NTTIME (obvious, but the code is clean)
1626 ********************************************************************/
1628 static uint32 size_of_nttime(NTTIME *value)
1630 return (sizeof(*value));
1633 /*******************************************************************
1634 * return the length of a UNICODE string in number of char, includes:
1635 * - the leading zero
1636 * - the relative pointer size
1637 ********************************************************************/
1639 static uint32 size_of_relative_string(UNISTR *string)
1643 size=str_len_uni(string); /* the string length */
1644 size=size+1; /* add the leading zero */
1645 size=size*2; /* convert in char */
1646 /* Ensure size is 4 byte multiple (prs_align is being called...). */
1647 size += ((4 - (size & 3)) & 3);
1648 size=size+4; /* add the size of the ptr */
1653 /*******************************************************************
1654 * return the length of a uint32 (obvious, but the code is clean)
1655 ********************************************************************/
1657 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1662 return (4+devmode->size+devmode->driverextra);
1665 /*******************************************************************
1666 * return the length of a uint32 (obvious, but the code is clean)
1667 ********************************************************************/
1669 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1674 return (sizeof(SYSTEMTIME) +4);
1677 /*******************************************************************
1678 * write a UNICODE string.
1679 * used by all the RPC structs passing a buffer
1680 ********************************************************************/
1682 static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
1687 prs_debug(ps, depth, desc, "spoolss_smb_io_unistr");
1690 /* there should be no align here as it can mess up
1691 parsing a NEW_BUFFER->prs */
1697 if (!prs_unistr("unistr", ps, depth, uni))
1703 /*******************************************************************
1704 * write a UNICODE string and its relative pointer.
1705 * used by all the RPC structs passing a buffer
1707 * As I'm a nice guy, I'm forcing myself to explain this code.
1708 * MS did a good job in the overall spoolss code except in some
1709 * functions where they are passing the API buffer directly in the
1710 * RPC request/reply. That's to maintain compatiility at the API level.
1711 * They could have done it the good way the first time.
1713 * So what happen is: the strings are written at the buffer's end,
1714 * in the reverse order of the original structure. Some pointers to
1715 * the strings are also in the buffer. Those are relative to the
1718 * If you don't understand or want to change that function,
1719 * first get in touch with me: jfm@samba.org
1721 ********************************************************************/
1723 static BOOL smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1725 prs_struct *ps=&buffer->prs;
1727 if (MARSHALLING(ps)) {
1728 uint32 struct_offset = prs_offset(ps);
1729 uint32 relative_offset;
1731 buffer->string_at_end -= (size_of_relative_string(string) - 4);
1732 if(!prs_set_offset(ps, buffer->string_at_end))
1736 buffer->string_at_end = prs_offset(ps);
1738 /* write the string */
1739 if (!smb_io_unistr(desc, string, ps, depth))
1742 if(!prs_set_offset(ps, struct_offset))
1745 relative_offset=buffer->string_at_end - buffer->struct_start;
1746 /* write its offset */
1747 if (!prs_uint32("offset", ps, depth, &relative_offset))
1753 /* read the offset */
1754 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1757 old_offset = prs_offset(ps);
1758 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
1761 /* read the string */
1762 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1765 if(!prs_set_offset(ps, old_offset))
1771 /*******************************************************************
1772 * write a array of UNICODE strings and its relative pointer.
1773 * used by 2 RPC structs
1774 ********************************************************************/
1776 static BOOL smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1780 prs_struct *ps=&buffer->prs;
1782 if (MARSHALLING(ps)) {
1783 uint32 struct_offset = prs_offset(ps);
1784 uint32 relative_offset;
1791 /* first write the last 0 */
1792 buffer->string_at_end -= 2;
1793 if(!prs_set_offset(ps, buffer->string_at_end))
1796 if(!prs_uint16("leading zero", ps, depth, &zero))
1799 while (p && (*p!=0)) {
1803 /* Yes this should be malloc not talloc. Don't change. */
1805 chaine.buffer = malloc((q-p+1)*sizeof(uint16));
1806 if (chaine.buffer == NULL)
1809 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1811 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1813 if(!prs_set_offset(ps, buffer->string_at_end)) {
1814 SAFE_FREE(chaine.buffer);
1818 /* write the string */
1819 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth)) {
1820 SAFE_FREE(chaine.buffer);
1826 SAFE_FREE(chaine.buffer);
1829 if(!prs_set_offset(ps, struct_offset))
1832 relative_offset=buffer->string_at_end - buffer->struct_start;
1833 /* write its offset */
1834 if (!prs_uint32("offset", ps, depth, &relative_offset))
1842 uint16 *chaine2=NULL;
1845 size_t realloc_size = 0;
1849 /* read the offset */
1850 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1853 old_offset = prs_offset(ps);
1854 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1858 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1861 l_chaine=str_len_uni(&chaine);
1863 /* we're going to add two more bytes here in case this
1864 is the last string in the array and we need to add
1865 an extra NULL for termination */
1870 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
1872 /* Yes this should be realloc - it's freed below. JRA */
1874 if((tc2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL) {
1879 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1880 l_chaine2+=l_chaine+1;
1883 } while(l_chaine!=0);
1885 /* the end should be bould NULL terminated so add
1886 the second one here */
1889 chaine2[l_chaine2] = '\0';
1890 *string=(uint16 *)talloc_memdup(prs_get_mem_context(ps),chaine2,realloc_size);
1894 if(!prs_set_offset(ps, old_offset))
1900 /*******************************************************************
1901 Parse a DEVMODE structure and its relative pointer.
1902 ********************************************************************/
1904 static BOOL smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
1906 prs_struct *ps= &buffer->prs;
1908 prs_debug(ps, depth, desc, "smb_io_relsecdesc");
1911 if (MARSHALLING(ps)) {
1912 uint32 struct_offset = prs_offset(ps);
1913 uint32 relative_offset;
1916 relative_offset = 0;
1917 if (!prs_uint32("offset", ps, depth, &relative_offset))
1922 if (*secdesc != NULL) {
1923 buffer->string_at_end -= sec_desc_size(*secdesc);
1925 if(!prs_set_offset(ps, buffer->string_at_end))
1927 /* write the secdesc */
1928 if (!sec_io_desc(desc, secdesc, ps, depth))
1931 if(!prs_set_offset(ps, struct_offset))
1935 relative_offset=buffer->string_at_end - buffer->struct_start;
1936 /* write its offset */
1938 if (!prs_uint32("offset", ps, depth, &relative_offset))
1943 /* read the offset */
1944 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1947 old_offset = prs_offset(ps);
1948 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1952 if (!sec_io_desc(desc, secdesc, ps, depth))
1955 if(!prs_set_offset(ps, old_offset))
1961 /*******************************************************************
1962 Parse a DEVMODE structure and its relative pointer.
1963 ********************************************************************/
1965 static BOOL smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1967 prs_struct *ps=&buffer->prs;
1969 prs_debug(ps, depth, desc, "smb_io_reldevmode");
1972 if (MARSHALLING(ps)) {
1973 uint32 struct_offset = prs_offset(ps);
1974 uint32 relative_offset;
1976 if (*devmode == NULL) {
1978 if (!prs_uint32("offset", ps, depth, &relative_offset))
1980 DEBUG(8, ("boing, the devmode was NULL\n"));
1985 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1987 if(!prs_set_offset(ps, buffer->string_at_end))
1990 /* write the DEVMODE */
1991 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1994 if(!prs_set_offset(ps, struct_offset))
1997 relative_offset=buffer->string_at_end - buffer->struct_start;
1998 /* write its offset */
1999 if (!prs_uint32("offset", ps, depth, &relative_offset))
2005 /* read the offset */
2006 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2009 old_offset = prs_offset(ps);
2010 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2013 /* read the string */
2014 if((*devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE))) == NULL)
2016 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2019 if(!prs_set_offset(ps, old_offset))
2025 /*******************************************************************
2026 Parse a PRINTER_INFO_0 structure.
2027 ********************************************************************/
2029 BOOL smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2031 prs_struct *ps=&buffer->prs;
2033 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2036 buffer->struct_start=prs_offset(ps);
2038 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2040 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2043 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2045 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2047 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2050 if(!prs_uint16("year", ps, depth, &info->year))
2052 if(!prs_uint16("month", ps, depth, &info->month))
2054 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2056 if(!prs_uint16("day", ps, depth, &info->day))
2058 if(!prs_uint16("hour", ps, depth, &info->hour))
2060 if(!prs_uint16("minute", ps, depth, &info->minute))
2062 if(!prs_uint16("second", ps, depth, &info->second))
2064 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2067 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2069 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2072 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2074 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2076 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2078 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2080 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2082 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2084 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2086 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2088 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2090 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2092 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2094 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2096 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2098 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2100 if(!prs_uint32("status" , ps, depth, &info->status))
2102 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2104 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2106 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2108 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2110 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2112 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2114 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2116 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2118 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2120 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2126 /*******************************************************************
2127 Parse a PRINTER_INFO_1 structure.
2128 ********************************************************************/
2130 BOOL smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2132 prs_struct *ps=&buffer->prs;
2134 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2137 buffer->struct_start=prs_offset(ps);
2139 if (!prs_uint32("flags", ps, depth, &info->flags))
2141 if (!smb_io_relstr("description", buffer, depth, &info->description))
2143 if (!smb_io_relstr("name", buffer, depth, &info->name))
2145 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2151 /*******************************************************************
2152 Parse a PRINTER_INFO_2 structure.
2153 ********************************************************************/
2155 BOOL smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2157 prs_struct *ps=&buffer->prs;
2159 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2162 buffer->struct_start=prs_offset(ps);
2164 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2166 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2168 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2170 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2172 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2174 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2176 if (!smb_io_relstr("location", buffer, depth, &info->location))
2179 /* NT parses the DEVMODE at the end of the struct */
2180 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2183 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2185 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2187 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2189 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2192 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2195 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2197 if (!prs_uint32("priority", ps, depth, &info->priority))
2199 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2201 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2203 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2205 if (!prs_uint32("status", ps, depth, &info->status))
2207 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2209 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2213 if (!prs_uint32_post("secdesc_ptr", ps, depth, NULL, sec_offset, info->secdesc ? prs_offset(ps)-buffer->struct_start : 0 ))
2216 if (!sec_io_desc("secdesc", &info->secdesc, ps, depth))
2222 /*******************************************************************
2223 Parse a PRINTER_INFO_3 structure.
2224 ********************************************************************/
2226 BOOL smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2228 prs_struct *ps=&buffer->prs;
2230 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2233 buffer->struct_start=prs_offset(ps);
2235 if (!prs_uint32("flags", ps, depth, &info->flags))
2237 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2243 /*******************************************************************
2244 Parse a PORT_INFO_1 structure.
2245 ********************************************************************/
2247 BOOL smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2249 prs_struct *ps=&buffer->prs;
2251 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2254 buffer->struct_start=prs_offset(ps);
2256 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2262 /*******************************************************************
2263 Parse a PORT_INFO_2 structure.
2264 ********************************************************************/
2266 BOOL smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2268 prs_struct *ps=&buffer->prs;
2270 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2273 buffer->struct_start=prs_offset(ps);
2275 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2277 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2279 if (!smb_io_relstr("description", buffer, depth, &info->description))
2281 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2283 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2289 /*******************************************************************
2290 Parse a DRIVER_INFO_1 structure.
2291 ********************************************************************/
2293 BOOL smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2295 prs_struct *ps=&buffer->prs;
2297 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2300 buffer->struct_start=prs_offset(ps);
2302 if (!smb_io_relstr("name", buffer, depth, &info->name))
2308 /*******************************************************************
2309 Parse a DRIVER_INFO_2 structure.
2310 ********************************************************************/
2312 BOOL smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2314 prs_struct *ps=&buffer->prs;
2316 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2319 buffer->struct_start=prs_offset(ps);
2321 if (!prs_uint32("version", ps, depth, &info->version))
2323 if (!smb_io_relstr("name", buffer, depth, &info->name))
2325 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2327 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2329 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2331 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2337 /*******************************************************************
2338 Parse a DRIVER_INFO_3 structure.
2339 ********************************************************************/
2341 BOOL smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2343 prs_struct *ps=&buffer->prs;
2345 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2348 buffer->struct_start=prs_offset(ps);
2350 if (!prs_uint32("version", ps, depth, &info->version))
2352 if (!smb_io_relstr("name", buffer, depth, &info->name))
2354 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2356 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2358 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2360 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2362 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2365 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2368 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2370 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2376 /*******************************************************************
2377 Parse a DRIVER_INFO_6 structure.
2378 ********************************************************************/
2380 BOOL smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2382 prs_struct *ps=&buffer->prs;
2384 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2387 buffer->struct_start=prs_offset(ps);
2389 if (!prs_uint32("version", ps, depth, &info->version))
2391 if (!smb_io_relstr("name", buffer, depth, &info->name))
2393 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2395 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2397 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2399 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2401 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2404 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2407 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2409 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2412 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2415 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2417 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2420 if (!prs_uint32("padding", ps, depth, &info->padding))
2423 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2426 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2429 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2431 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2433 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2435 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2441 /*******************************************************************
2442 Parse a JOB_INFO_1 structure.
2443 ********************************************************************/
2445 BOOL smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2447 prs_struct *ps=&buffer->prs;
2449 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2452 buffer->struct_start=prs_offset(ps);
2454 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2456 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2458 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2460 if (!smb_io_relstr("username", buffer, depth, &info->username))
2462 if (!smb_io_relstr("document", buffer, depth, &info->document))
2464 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2466 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2468 if (!prs_uint32("status", ps, depth, &info->status))
2470 if (!prs_uint32("priority", ps, depth, &info->priority))
2472 if (!prs_uint32("position", ps, depth, &info->position))
2474 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2476 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2478 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2484 /*******************************************************************
2485 Parse a JOB_INFO_2 structure.
2486 ********************************************************************/
2488 BOOL smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2491 prs_struct *ps=&buffer->prs;
2493 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2496 buffer->struct_start=prs_offset(ps);
2498 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2500 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2502 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2504 if (!smb_io_relstr("username", buffer, depth, &info->username))
2506 if (!smb_io_relstr("document", buffer, depth, &info->document))
2508 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2510 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2513 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2515 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2517 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2519 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2521 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2524 /* SEC_DESC sec_desc;*/
2525 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2528 if (!prs_uint32("status",ps, depth, &info->status))
2530 if (!prs_uint32("priority",ps, depth, &info->priority))
2532 if (!prs_uint32("position",ps, depth, &info->position))
2534 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2536 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2538 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2540 if (!prs_uint32("size",ps, depth, &info->size))
2542 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2544 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2546 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2552 /*******************************************************************
2553 ********************************************************************/
2555 BOOL smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2557 prs_struct *ps=&buffer->prs;
2559 prs_debug(ps, depth, desc, "smb_io_form_1");
2562 buffer->struct_start=prs_offset(ps);
2564 if (!prs_uint32("flag", ps, depth, &info->flag))
2567 if (!smb_io_relstr("name", buffer, depth, &info->name))
2570 if (!prs_uint32("width", ps, depth, &info->width))
2572 if (!prs_uint32("length", ps, depth, &info->length))
2574 if (!prs_uint32("left", ps, depth, &info->left))
2576 if (!prs_uint32("top", ps, depth, &info->top))
2578 if (!prs_uint32("right", ps, depth, &info->right))
2580 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2586 /*******************************************************************
2587 Read/write a BUFFER struct.
2588 ********************************************************************/
2590 static BOOL spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
2592 NEW_BUFFER *buffer = *pp_buffer;
2594 prs_debug(ps, depth, desc, "spoolss_io_buffer");
2597 if (UNMARSHALLING(ps))
2598 buffer = *pp_buffer = (NEW_BUFFER *)prs_alloc_mem(ps, sizeof(NEW_BUFFER));
2603 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2607 if (UNMARSHALLING(ps)) {
2609 buffer->string_at_end=0;
2611 if (buffer->ptr==0) {
2613 * JRA. I'm not sure if the data in here is in big-endian format if
2614 * the client is big-endian. Leave as default (little endian) for now.
2617 if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
2622 if (!prs_uint32("size", ps, depth, &buffer->size))
2626 * JRA. I'm not sure if the data in here is in big-endian format if
2627 * the client is big-endian. Leave as default (little endian) for now.
2630 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
2633 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
2636 if (!prs_set_offset(&buffer->prs, 0))
2639 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
2642 buffer->string_at_end=buffer->size;
2650 if (buffer->ptr==0) {
2651 /* We have finished with the data in buffer->prs - free it. */
2652 prs_mem_free(&buffer->prs);
2656 if (!prs_uint32("size", ps, depth, &buffer->size))
2659 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
2665 /* We have finished with the data in buffer->prs - free it. */
2666 prs_mem_free(&buffer->prs);
2672 /*******************************************************************
2673 move a BUFFER from the query to the reply.
2674 As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
2675 this is ok. This is an OPTIMIZATION and is not strictly neccessary.
2676 ********************************************************************/
2678 void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2680 prs_switch_type(&src->prs, MARSHALL);
2681 if(!prs_set_offset(&src->prs, 0))
2683 prs_force_dynamic(&(src->prs));
2688 /*******************************************************************
2689 Get the size of a BUFFER struct.
2690 ********************************************************************/
2692 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2694 return (buffer->size);
2697 /*******************************************************************
2698 Parse a DRIVER_DIRECTORY_1 structure.
2699 ********************************************************************/
2701 BOOL smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2703 prs_struct *ps=&buffer->prs;
2705 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2708 buffer->struct_start=prs_offset(ps);
2710 if (!smb_io_unistr(desc, &info->name, ps, depth))
2716 /*******************************************************************
2717 Parse a PORT_INFO_1 structure.
2718 ********************************************************************/
2720 BOOL smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2722 prs_struct *ps=&buffer->prs;
2724 prs_debug(ps, depth, desc, "smb_io_port_1");
2727 buffer->struct_start=prs_offset(ps);
2729 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2735 /*******************************************************************
2736 Parse a PORT_INFO_2 structure.
2737 ********************************************************************/
2739 BOOL smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2741 prs_struct *ps=&buffer->prs;
2743 prs_debug(ps, depth, desc, "smb_io_port_2");
2746 buffer->struct_start=prs_offset(ps);
2748 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2750 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2752 if(!smb_io_relstr("description", buffer, depth, &info->description))
2754 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2756 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2762 /*******************************************************************
2763 ********************************************************************/
2765 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2767 prs_struct *ps=&buffer->prs;
2769 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2772 buffer->struct_start=prs_offset(ps);
2774 if (smb_io_relstr("name", buffer, depth, &info->name))
2780 /*******************************************************************
2781 ********************************************************************/
2783 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2785 prs_struct *ps=&buffer->prs;
2787 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2790 buffer->struct_start=prs_offset(ps);
2792 if (smb_io_relstr("name", buffer, depth, &info->name))
2798 /*******************************************************************
2799 ********************************************************************/
2801 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2803 prs_struct *ps=&buffer->prs;
2805 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2808 buffer->struct_start=prs_offset(ps);
2810 if (!smb_io_relstr("name", buffer, depth, &info->name))
2816 /*******************************************************************
2817 ********************************************************************/
2819 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2821 prs_struct *ps=&buffer->prs;
2823 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2826 buffer->struct_start=prs_offset(ps);
2828 if (!smb_io_relstr("name", buffer, depth, &info->name))
2830 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
2832 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2838 /*******************************************************************
2839 return the size required by a struct in the stream
2840 ********************************************************************/
2842 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2846 size+=size_of_relative_string( &info->printername );
2847 size+=size_of_relative_string( &info->servername );
2849 size+=size_of_uint32( &info->cjobs);
2850 size+=size_of_uint32( &info->total_jobs);
2851 size+=size_of_uint32( &info->total_bytes);
2853 size+=size_of_uint16( &info->year);
2854 size+=size_of_uint16( &info->month);
2855 size+=size_of_uint16( &info->dayofweek);
2856 size+=size_of_uint16( &info->day);
2857 size+=size_of_uint16( &info->hour);
2858 size+=size_of_uint16( &info->minute);
2859 size+=size_of_uint16( &info->second);
2860 size+=size_of_uint16( &info->milliseconds);
2862 size+=size_of_uint32( &info->global_counter);
2863 size+=size_of_uint32( &info->total_pages);
2865 size+=size_of_uint16( &info->major_version);
2866 size+=size_of_uint16( &info->build_version);
2868 size+=size_of_uint32( &info->unknown7);
2869 size+=size_of_uint32( &info->unknown8);
2870 size+=size_of_uint32( &info->unknown9);
2871 size+=size_of_uint32( &info->session_counter);
2872 size+=size_of_uint32( &info->unknown11);
2873 size+=size_of_uint32( &info->printer_errors);
2874 size+=size_of_uint32( &info->unknown13);
2875 size+=size_of_uint32( &info->unknown14);
2876 size+=size_of_uint32( &info->unknown15);
2877 size+=size_of_uint32( &info->unknown16);
2878 size+=size_of_uint32( &info->change_id);
2879 size+=size_of_uint32( &info->unknown18);
2880 size+=size_of_uint32( &info->status);
2881 size+=size_of_uint32( &info->unknown20);
2882 size+=size_of_uint32( &info->c_setprinter);
2884 size+=size_of_uint16( &info->unknown22);
2885 size+=size_of_uint16( &info->unknown23);
2886 size+=size_of_uint16( &info->unknown24);
2887 size+=size_of_uint16( &info->unknown25);
2888 size+=size_of_uint16( &info->unknown26);
2889 size+=size_of_uint16( &info->unknown27);
2890 size+=size_of_uint16( &info->unknown28);
2891 size+=size_of_uint16( &info->unknown29);
2896 /*******************************************************************
2897 return the size required by a struct in the stream
2898 ********************************************************************/
2900 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2904 size+=size_of_uint32( &info->flags );
2905 size+=size_of_relative_string( &info->description );
2906 size+=size_of_relative_string( &info->name );
2907 size+=size_of_relative_string( &info->comment );
2912 /*******************************************************************
2913 return the size required by a struct in the stream
2914 ********************************************************************/
2916 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2921 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2922 size += sec_desc_size( info->secdesc );
2924 size+=size_of_device_mode( info->devmode );
2926 size+=size_of_relative_string( &info->servername );
2927 size+=size_of_relative_string( &info->printername );
2928 size+=size_of_relative_string( &info->sharename );
2929 size+=size_of_relative_string( &info->portname );
2930 size+=size_of_relative_string( &info->drivername );
2931 size+=size_of_relative_string( &info->comment );
2932 size+=size_of_relative_string( &info->location );
2934 size+=size_of_relative_string( &info->sepfile );
2935 size+=size_of_relative_string( &info->printprocessor );
2936 size+=size_of_relative_string( &info->datatype );
2937 size+=size_of_relative_string( &info->parameters );
2939 size+=size_of_uint32( &info->attributes );
2940 size+=size_of_uint32( &info->priority );
2941 size+=size_of_uint32( &info->defaultpriority );
2942 size+=size_of_uint32( &info->starttime );
2943 size+=size_of_uint32( &info->untiltime );
2944 size+=size_of_uint32( &info->status );
2945 size+=size_of_uint32( &info->cjobs );
2946 size+=size_of_uint32( &info->averageppm );
2950 /*******************************************************************
2951 return the size required by a struct in the stream
2952 ********************************************************************/
2954 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
2956 /* The 4 is for the self relative pointer.. */
2957 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2958 return 4 + (uint32)sec_desc_size( info->secdesc );
2961 /*******************************************************************
2962 return the size required by a struct in the stream
2963 ********************************************************************/
2965 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2968 size+=size_of_relative_string( &info->name );
2973 /*******************************************************************
2974 return the size required by a struct in the stream
2975 ********************************************************************/
2977 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2980 size+=size_of_uint32( &info->version );
2981 size+=size_of_relative_string( &info->name );
2982 size+=size_of_relative_string( &info->architecture );
2983 size+=size_of_relative_string( &info->driverpath );
2984 size+=size_of_relative_string( &info->datafile );
2985 size+=size_of_relative_string( &info->configfile );
2990 /*******************************************************************
2991 return the size required by a string array.
2992 ********************************************************************/
2994 uint32 spoolss_size_string_array(uint16 *string)
2999 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
3001 i=i+2; /* to count all chars including the leading zero */
3002 i=2*i; /* because we need the value in bytes */
3003 i=i+4; /* the offset pointer size */
3008 /*******************************************************************
3009 return the size required by a struct in the stream
3010 ********************************************************************/
3012 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3016 size+=size_of_uint32( &info->version );
3017 size+=size_of_relative_string( &info->name );
3018 size+=size_of_relative_string( &info->architecture );
3019 size+=size_of_relative_string( &info->driverpath );
3020 size+=size_of_relative_string( &info->datafile );
3021 size+=size_of_relative_string( &info->configfile );
3022 size+=size_of_relative_string( &info->helpfile );
3023 size+=size_of_relative_string( &info->monitorname );
3024 size+=size_of_relative_string( &info->defaultdatatype );
3026 size+=spoolss_size_string_array(info->dependentfiles);
3031 /*******************************************************************
3032 return the size required by a struct in the stream
3033 ********************************************************************/
3035 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3039 size+=size_of_uint32( &info->version );
3040 size+=size_of_relative_string( &info->name );
3041 size+=size_of_relative_string( &info->architecture );
3042 size+=size_of_relative_string( &info->driverpath );
3043 size+=size_of_relative_string( &info->datafile );
3044 size+=size_of_relative_string( &info->configfile );
3045 size+=size_of_relative_string( &info->helpfile );
3047 size+=spoolss_size_string_array(info->dependentfiles);
3049 size+=size_of_relative_string( &info->monitorname );
3050 size+=size_of_relative_string( &info->defaultdatatype );
3052 size+=spoolss_size_string_array(info->previousdrivernames);
3054 size+=size_of_nttime(&info->driver_date);
3055 size+=size_of_uint32( &info->padding );
3056 size+=size_of_uint32( &info->driver_version_low );
3057 size+=size_of_uint32( &info->driver_version_high );
3058 size+=size_of_relative_string( &info->mfgname );
3059 size+=size_of_relative_string( &info->oem_url );
3060 size+=size_of_relative_string( &info->hardware_id );
3061 size+=size_of_relative_string( &info->provider );
3066 /*******************************************************************
3067 return the size required by a struct in the stream
3068 ********************************************************************/
3070 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3073 size+=size_of_uint32( &info->jobid );
3074 size+=size_of_relative_string( &info->printername );
3075 size+=size_of_relative_string( &info->machinename );
3076 size+=size_of_relative_string( &info->username );
3077 size+=size_of_relative_string( &info->document );
3078 size+=size_of_relative_string( &info->datatype );
3079 size+=size_of_relative_string( &info->text_status );
3080 size+=size_of_uint32( &info->status );
3081 size+=size_of_uint32( &info->priority );
3082 size+=size_of_uint32( &info->position );
3083 size+=size_of_uint32( &info->totalpages );
3084 size+=size_of_uint32( &info->pagesprinted );
3085 size+=size_of_systemtime( &info->submitted );
3090 /*******************************************************************
3091 return the size required by a struct in the stream
3092 ********************************************************************/
3094 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3098 size+=4; /* size of sec desc ptr */
3100 size+=size_of_uint32( &info->jobid );
3101 size+=size_of_relative_string( &info->printername );
3102 size+=size_of_relative_string( &info->machinename );
3103 size+=size_of_relative_string( &info->username );
3104 size+=size_of_relative_string( &info->document );
3105 size+=size_of_relative_string( &info->notifyname );
3106 size+=size_of_relative_string( &info->datatype );
3107 size+=size_of_relative_string( &info->printprocessor );
3108 size+=size_of_relative_string( &info->parameters );
3109 size+=size_of_relative_string( &info->drivername );
3110 size+=size_of_device_mode( info->devmode );
3111 size+=size_of_relative_string( &info->text_status );
3112 /* SEC_DESC sec_desc;*/
3113 size+=size_of_uint32( &info->status );
3114 size+=size_of_uint32( &info->priority );
3115 size+=size_of_uint32( &info->position );
3116 size+=size_of_uint32( &info->starttime );
3117 size+=size_of_uint32( &info->untiltime );
3118 size+=size_of_uint32( &info->totalpages );
3119 size+=size_of_uint32( &info->size );
3120 size+=size_of_systemtime( &info->submitted );
3121 size+=size_of_uint32( &info->timeelapsed );
3122 size+=size_of_uint32( &info->pagesprinted );
3127 /*******************************************************************
3128 return the size required by a struct in the stream
3129 ********************************************************************/
3131 uint32 spoolss_size_form_1(FORM_1 *info)
3135 size+=size_of_uint32( &info->flag );
3136 size+=size_of_relative_string( &info->name );
3137 size+=size_of_uint32( &info->width );
3138 size+=size_of_uint32( &info->length );
3139 size+=size_of_uint32( &info->left );
3140 size+=size_of_uint32( &info->top );
3141 size+=size_of_uint32( &info->right );
3142 size+=size_of_uint32( &info->bottom );
3147 /*******************************************************************
3148 return the size required by a struct in the stream
3149 ********************************************************************/
3151 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3155 size+=size_of_relative_string( &info->port_name );
3160 /*******************************************************************
3161 return the size required by a struct in the stream
3162 ********************************************************************/
3164 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3168 size=str_len_uni(&info->name); /* the string length */
3169 size=size+1; /* add the leading zero */
3170 size=size*2; /* convert in char */
3175 /*******************************************************************
3176 return the size required by a struct in the stream
3177 ********************************************************************/
3179 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3183 size=str_len_uni(&info->name); /* the string length */
3184 size=size+1; /* add the leading zero */
3185 size=size*2; /* convert in char */
3190 /*******************************************************************
3191 return the size required by a struct in the stream
3192 ********************************************************************/
3194 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3198 size+=size_of_relative_string( &info->port_name );
3199 size+=size_of_relative_string( &info->monitor_name );
3200 size+=size_of_relative_string( &info->description );
3202 size+=size_of_uint32( &info->port_type );
3203 size+=size_of_uint32( &info->reserved );
3208 /*******************************************************************
3209 return the size required by a struct in the stream
3210 ********************************************************************/
3212 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3215 size+=size_of_relative_string( &info->name );
3220 /*******************************************************************
3221 return the size required by a struct in the stream
3222 ********************************************************************/
3224 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3227 size+=size_of_relative_string( &info->name );
3232 /*******************************************************************
3233 return the size required by a struct in the stream
3234 ********************************************************************/
3235 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3242 /* uint32(offset) + uint32(length) + length) */
3243 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3244 size += (size_of_uint32(&p->data_len)*2) + p->data_len;
3246 size += size_of_uint32(&p->type);
3251 /*******************************************************************
3252 return the size required by a struct in the stream
3253 ********************************************************************/
3255 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3258 size+=size_of_relative_string( &info->name );
3263 /*******************************************************************
3264 return the size required by a struct in the stream
3265 ********************************************************************/
3267 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3270 size+=size_of_relative_string( &info->name);
3271 size+=size_of_relative_string( &info->environment);
3272 size+=size_of_relative_string( &info->dll_name);
3277 /*******************************************************************
3279 ********************************************************************/
3281 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3282 const POLICY_HND *hnd,
3283 const fstring architecture,
3284 uint32 level, uint32 clientmajor, uint32 clientminor,
3285 NEW_BUFFER *buffer, uint32 offered)
3290 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3292 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3295 q_u->clientmajorversion=clientmajor;
3296 q_u->clientminorversion=clientminor;
3299 q_u->offered=offered;
3304 /*******************************************************************
3306 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3307 ********************************************************************/
3309 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3311 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3317 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3319 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3321 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3326 if(!prs_uint32("level", ps, depth, &q_u->level))
3329 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3335 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3338 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3340 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3346 /*******************************************************************
3348 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3349 ********************************************************************/
3351 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3353 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3359 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3364 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3366 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3368 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3370 if (!prs_werror("status", ps, depth, &r_u->status))
3376 /*******************************************************************
3378 ********************************************************************/
3380 BOOL make_spoolss_q_enumprinters(
3381 SPOOL_Q_ENUMPRINTERS *q_u,
3391 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3392 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3396 q_u->offered=offered;
3401 /*******************************************************************
3403 ********************************************************************/
3405 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3406 fstring servername, uint32 level,
3407 NEW_BUFFER *buffer, uint32 offered)
3409 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3410 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3414 q_u->offered=offered;
3419 /*******************************************************************
3421 * called from spoolss_enumprinters (srv_spoolss.c)
3422 ********************************************************************/
3424 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3426 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3432 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3434 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3437 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3442 if (!prs_uint32("level", ps, depth, &q_u->level))
3445 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3450 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3456 /*******************************************************************
3457 Parse a SPOOL_R_ENUMPRINTERS structure.
3458 ********************************************************************/
3460 BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3462 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3468 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3474 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3477 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3480 if (!prs_werror("status", ps, depth, &r_u->status))
3486 /*******************************************************************
3487 * write a structure.
3488 * called from spoolss_r_enum_printers (srv_spoolss.c)
3490 ********************************************************************/
3492 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3494 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3500 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3506 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3509 if (!prs_werror("status", ps, depth, &r_u->status))
3515 /*******************************************************************
3517 * called from spoolss_getprinter (srv_spoolss.c)
3518 ********************************************************************/
3520 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3522 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3528 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3530 if (!prs_uint32("level", ps, depth, &q_u->level))
3533 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3538 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3544 /*******************************************************************
3546 ********************************************************************/
3548 BOOL make_spoolss_q_getprinter(
3549 TALLOC_CTX *mem_ctx,
3550 SPOOL_Q_GETPRINTER *q_u,
3551 const POLICY_HND *hnd,
3561 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3565 q_u->offered=offered;
3570 /*******************************************************************
3572 ********************************************************************/
3573 BOOL make_spoolss_q_setprinter(
3574 TALLOC_CTX *mem_ctx,
3575 SPOOL_Q_SETPRINTER *q_u,
3576 const POLICY_HND *hnd,
3578 PRINTER_INFO_CTR *info,
3583 DEVICEMODE *devmode;
3590 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3593 q_u->info.level = level;
3594 q_u->info.info_ptr = (info != NULL) ? 1 : 0;
3598 secdesc = info->printers_2->secdesc;
3599 devmode = info->printers_2->devmode;
3601 /* FIXMEE!! HACK ALERT!!! --jerry */
3602 info->printers_2->devmode = NULL;
3603 info->printers_2->secdesc = NULL;
3605 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3606 #if 0 /* JERRY TEST */
3607 q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
3608 if (!q_u->secdesc_ctr)
3610 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
3611 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3612 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3613 q_u->secdesc_ctr->sec = secdesc;
3615 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3616 q_u->devmode_ctr.size = sizeof(DEVICEMODE) + (3*sizeof(uint32));
3617 q_u->devmode_ctr.devmode = devmode;
3619 q_u->secdesc_ctr = NULL;
3621 q_u->devmode_ctr.devmode_ptr = 0;
3622 q_u->devmode_ctr.size = 0;
3623 q_u->devmode_ctr.devmode = NULL;
3627 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3632 q_u->command = command;
3638 /*******************************************************************
3639 ********************************************************************/
3641 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3643 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3649 if(!prs_werror("status", ps, depth, &r_u->status))
3655 /*******************************************************************
3656 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3657 ********************************************************************/
3659 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3661 uint32 ptr_sec_desc = 0;
3663 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3669 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3671 if(!prs_uint32("level", ps, depth, &q_u->level))
3674 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3677 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3684 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3689 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3695 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3700 /* Parse a NULL security descriptor. This should really
3701 happen inside the sec_io_desc_buf() function. */
3703 prs_debug(ps, depth, "", "sec_io_desc_buf");
3704 if (!prs_uint32("size", ps, depth + 1, &dummy)) return False;
3705 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
3709 if(!prs_uint32("command", ps, depth, &q_u->command))
3715 /*******************************************************************
3716 ********************************************************************/
3718 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3720 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3726 if(!prs_werror("status", ps, depth, &r_u->status))
3732 /*******************************************************************
3733 ********************************************************************/
3735 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3738 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3744 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3751 /*******************************************************************
3752 ********************************************************************/
3754 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3756 prs_debug(ps, depth, desc, "");
3762 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3768 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3771 if(!prs_werror("status", ps, depth, &r_u->status))
3777 /*******************************************************************
3778 ********************************************************************/
3780 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3782 prs_debug(ps, depth, desc, "");
3788 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3790 if(!prs_uint32("level", ps, depth, &q_u->level))
3793 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3799 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3805 /*******************************************************************
3806 ********************************************************************/
3808 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3810 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3816 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3822 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3825 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3828 if (!prs_werror("status", ps, depth, &r_u->status))
3834 /*******************************************************************
3835 ********************************************************************/
3837 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3848 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3849 q_u->firstjob = firstjob;
3850 q_u->numofjobs = numofjobs;
3852 q_u->buffer= buffer;
3853 q_u->offered = offered;
3857 /*******************************************************************
3858 ********************************************************************/
3860 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
3862 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
3868 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
3871 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
3873 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
3875 if (!prs_uint32("level", ps, depth, &q_u->level))
3878 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3881 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3887 /*******************************************************************
3888 ********************************************************************/
3890 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
3892 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
3898 if(!prs_werror("status", ps, depth, &r_u->status))
3904 /*******************************************************************
3905 ********************************************************************/
3907 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
3909 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
3915 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3917 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3923 /*******************************************************************
3924 ********************************************************************/
3926 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
3928 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
3934 if(!prs_werror("status", ps, depth, &r_u->status))
3940 /*******************************************************************
3941 ********************************************************************/
3943 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3945 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3951 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3953 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3956 * level is usually 0. If (level!=0) then I'm in trouble !
3957 * I will try to generate setjob command with level!=0, one day.
3959 if(!prs_uint32("level", ps, depth, &q_u->level))
3961 if(!prs_uint32("command", ps, depth, &q_u->command))
3967 /*******************************************************************
3968 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3969 ********************************************************************/
3971 BOOL spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3973 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
3979 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3985 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3988 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3991 if (!prs_werror("status", ps, depth, &r_u->status))
3997 /*******************************************************************
3999 ********************************************************************/
4001 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4003 const char *environment,
4005 NEW_BUFFER *buffer, uint32 offered)
4007 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4008 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4012 q_u->offered=offered;
4017 /*******************************************************************
4018 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4019 ********************************************************************/
4021 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4024 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4030 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4032 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4037 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4039 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4044 if (!prs_uint32("level", ps, depth, &q_u->level))
4047 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4053 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4059 /*******************************************************************
4060 ********************************************************************/
4062 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4065 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4070 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4072 if (!prs_uint32("level", ps, depth, &q_u->level))
4075 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4080 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4086 /*******************************************************************
4087 ********************************************************************/
4089 BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4091 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4097 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4103 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4106 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4109 if (!prs_werror("status", ps, depth, &r_u->status))
4115 /*******************************************************************
4116 ********************************************************************/
4118 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4121 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4126 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4128 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4134 if (!prs_uint32("level", ps, depth, &q_u->level))
4137 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4142 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4148 /*******************************************************************
4149 ********************************************************************/
4151 BOOL spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4153 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4159 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4165 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4168 if (!prs_werror("status", ps, depth, &r_u->status))
4174 /*******************************************************************
4175 Parse a SPOOL_R_ENUMPORTS structure.
4176 ********************************************************************/
4178 BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4180 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4186 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4192 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4195 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4198 if (!prs_werror("status", ps, depth, &r_u->status))
4204 /*******************************************************************
4205 ********************************************************************/
4207 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4209 prs_debug(ps, depth, desc, "");
4215 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4217 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4222 if (!prs_uint32("level", ps, depth, &q_u->level))
4225 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4230 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4236 /*******************************************************************
4237 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4238 ********************************************************************/
4240 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4242 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4248 if(!prs_uint32("flags", ps, depth, &il->flags))
4250 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4252 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4254 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4257 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4259 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4261 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4267 /*******************************************************************
4268 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4269 ********************************************************************/
4271 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4273 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4279 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4285 /*******************************************************************
4286 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4287 ********************************************************************/
4289 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4291 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4297 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4299 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4301 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4303 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4306 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4308 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4310 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4312 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4314 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4316 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4318 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4320 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4322 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4325 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4327 if(!prs_uint32("priority", ps, depth, &il->priority))
4329 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4331 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4333 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4335 if(!prs_uint32("status", ps, depth, &il->status))
4337 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4339 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4342 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4344 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4346 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4348 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4350 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4352 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4354 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4356 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4358 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4360 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4362 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4368 /*******************************************************************
4369 ********************************************************************/
4371 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4373 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4378 if(!prs_uint32("level", ps, depth, &il->level))
4380 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4383 /* if no struct inside just return */
4384 if (il->info_ptr==0) {
4385 if (UNMARSHALLING(ps)) {
4392 switch (il->level) {
4394 * level 0 is used by setprinter when managing the queue
4395 * (hold, stop, start a queue)
4399 /* DOCUMENT ME!!! What is level 1 used for? */
4402 if (UNMARSHALLING(ps)) {
4403 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4406 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4411 * level 2 is used by addprinter
4412 * and by setprinter when updating printer's info
4415 if (UNMARSHALLING(ps)) {
4416 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4419 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4422 /* DOCUMENT ME!!! What is level 3 used for? */
4425 if (UNMARSHALLING(ps)) {
4426 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4429 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4438 /*******************************************************************
4439 ********************************************************************/
4441 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4443 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4448 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4450 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4456 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4459 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4462 /* the 4 unknown are all 0 */
4465 * en fait ils sont pas inconnu
4466 * par recoupement avec rpcSetPrinter
4467 * c'est le devicemode
4468 * et le security descriptor.
4473 if(!prs_uint32("unk0", ps, depth, &q_u->unk0))
4475 if(!prs_uint32("unk1", ps, depth, &q_u->unk1))
4477 if(!prs_uint32("unk2", ps, depth, &q_u->unk2))
4479 if(!prs_uint32("unk3", ps, depth, &q_u->unk3))
4482 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4484 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4490 /*******************************************************************
4491 ********************************************************************/
4493 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4494 prs_struct *ps, int depth)
4496 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4499 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4502 if(!prs_werror("status", ps, depth, &r_u->status))
4508 /*******************************************************************
4509 ********************************************************************/
4511 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4512 prs_struct *ps, int depth)
4514 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4516 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4520 if (UNMARSHALLING(ps)) {
4521 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4533 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4535 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4537 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4539 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4541 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4543 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4545 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4547 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4549 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4551 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4553 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4559 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4561 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4563 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4565 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4567 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4569 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4571 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4573 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4579 if (il->dependentfiles_ptr)
4580 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4585 /*******************************************************************
4586 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4587 ********************************************************************/
4589 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4590 prs_struct *ps, int depth)
4592 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4594 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4598 if (UNMARSHALLING(ps)) {
4599 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
4612 /* parse the main elements the packet */
4614 if(!prs_uint32("version", ps, depth, &il->version))
4617 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4620 * If name_ptr is NULL then the next 4 bytes are the name_ptr. A driver
4621 * with a NULL name just isn't a driver For example: "HP LaserJet 4si"
4622 * from W2K CDROM (which uses unidriver). JohnR 010205
4624 if (!il->name_ptr) {
4625 DEBUG(5,("spool_io_printer_driver_info_level_6: name_ptr is NULL! Get next value\n"));
4626 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4630 if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr))
4632 if(!prs_uint32("driverpath_ptr", ps, depth, &il->driverpath_ptr))
4634 if(!prs_uint32("datafile_ptr", ps, depth, &il->datafile_ptr))
4636 if(!prs_uint32("configfile_ptr", ps, depth, &il->configfile_ptr))
4638 if(!prs_uint32("helpfile_ptr", ps, depth, &il->helpfile_ptr))
4640 if(!prs_uint32("monitorname_ptr", ps, depth, &il->monitorname_ptr))
4642 if(!prs_uint32("defaultdatatype_ptr", ps, depth, &il->defaultdatatype_ptr))
4644 if(!prs_uint32("dependentfiles_len", ps, depth, &il->dependentfiles_len))
4646 if(!prs_uint32("dependentfiles_ptr", ps, depth, &il->dependentfiles_ptr))
4648 if(!prs_uint32("previousnames_len", ps, depth, &il->previousnames_len))
4650 if(!prs_uint32("previousnames_ptr", ps, depth, &il->previousnames_ptr))
4652 if(!smb_io_time("driverdate", &il->driverdate, ps, depth))
4654 if(!prs_uint32("dummy4", ps, depth, &il->dummy4))
4656 if(!prs_uint64("driverversion", ps, depth, &il->driverversion))
4658 if(!prs_uint32("mfgname_ptr", ps, depth, &il->mfgname_ptr))
4660 if(!prs_uint32("oemurl_ptr", ps, depth, &il->oemurl_ptr))
4662 if(!prs_uint32("hardwareid_ptr", ps, depth, &il->hardwareid_ptr))
4664 if(!prs_uint32("provider_ptr", ps, depth, &il->provider_ptr))
4667 /* parse the structures in the packet */
4669 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4674 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4679 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4684 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4689 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4694 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4699 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4704 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4708 if (il->dependentfiles_ptr) {
4709 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4714 if (il->previousnames_ptr) {
4715 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4720 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4724 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4728 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4732 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4738 /*******************************************************************
4739 convert a buffer of UNICODE strings null terminated
4740 the buffer is terminated by a NULL
4742 convert to an dos codepage array (null terminated)
4744 dynamically allocate memory
4746 ********************************************************************/
4747 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4756 src = (char *)buf5->buffer;
4759 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4760 rpcstr_pull(f, src, sizeof(f)-1, -1, 0);
4761 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4762 tar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
4767 fstrcpy((*ar)[n], f);
4770 fstrcpy((*ar)[n], "");
4778 /*******************************************************************
4779 read a UNICODE array with null terminated strings
4780 and null terminated array
4781 and size of array at beginning
4782 ********************************************************************/
4784 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
4786 if (buffer==NULL) return False;
4789 buffer->uni_str_len=buffer->uni_max_len;
4791 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
4794 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
4800 /*******************************************************************
4801 ********************************************************************/
4803 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
4805 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
4810 if(!prs_uint32("level", ps, depth, &il->level))
4812 if(!prs_uint32("ptr", ps, depth, &il->ptr))
4818 switch (il->level) {
4820 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
4824 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
4834 /*******************************************************************
4835 init a SPOOL_Q_ADDPRINTERDRIVER struct
4836 ******************************************************************/
4838 BOOL make_spoolss_q_addprinterdriver(
4839 TALLOC_CTX *mem_ctx,
4840 SPOOL_Q_ADDPRINTERDRIVER *q_u,
4841 const char* srv_name,
4843 PRINTER_DRIVER_CTR *info)
4845 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
4847 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
4848 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
4852 q_u->info.level = level;
4853 q_u->info.ptr = (info!=NULL)?1:0;
4856 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
4858 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
4861 /* info level 6 is supported by WinME and Win2k */
4863 /* WRITEME!! will add later --jerry */
4867 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
4874 BOOL make_spoolss_driver_info_3(
4875 TALLOC_CTX *mem_ctx,
4876 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
4877 DRIVER_INFO_3 *info3
4881 uint16 *ptr = info3->dependentfiles;
4883 BOOL null_char = False;
4884 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
4886 if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3))))
4889 inf->cversion = info3->version;
4890 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
4891 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
4892 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
4893 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
4894 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
4895 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
4896 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
4897 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
4899 init_unistr2_from_unistr(&inf->name, &info3->name);
4900 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
4901 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
4902 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
4903 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
4904 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
4905 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
4906 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
4913 /* the null_char BOOL is used to help locate
4914 two '\0's back to back */
4929 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
4930 inf->dependentfilessize = len;
4931 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
4937 *spool_drv_info = inf;
4942 /*******************************************************************
4943 make a BUFFER5 struct from a uint16*
4944 ******************************************************************/
4945 BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
4948 buf5->buf_len = len;
4949 if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
4951 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
4958 /*******************************************************************
4959 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
4960 ********************************************************************/
4962 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4964 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
4970 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
4972 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4977 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4980 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
4986 /*******************************************************************
4987 ********************************************************************/
4989 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4991 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
4994 if(!prs_werror("status", ps, depth, &q_u->status))
5000 /*******************************************************************
5001 ********************************************************************/
5003 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5004 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5006 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5008 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5012 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
5020 d->cversion=uni->cversion;
5022 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5023 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5024 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5025 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5026 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5027 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5028 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5029 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5031 DEBUGADD(8,( "version: %d\n", d->cversion));
5032 DEBUGADD(8,( "name: %s\n", d->name));
5033 DEBUGADD(8,( "environment: %s\n", d->environment));
5034 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5035 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5036 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5037 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5038 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5039 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5041 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5048 /*******************************************************************
5049 ********************************************************************/
5050 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5051 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5053 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5055 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5059 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
5067 d->version=uni->version;
5069 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5070 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5071 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5072 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5073 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5074 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5075 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5076 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5078 DEBUGADD(8,( "version: %d\n", d->version));
5079 DEBUGADD(8,( "name: %s\n", d->name));
5080 DEBUGADD(8,( "environment: %s\n", d->environment));
5081 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5082 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5083 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5084 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5085 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5086 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5088 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5090 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5100 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5101 NT_PRINTER_INFO_LEVEL_2 **asc)
5103 NT_PRINTER_INFO_LEVEL_2 *d;
5106 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5107 time_unix=time(NULL);
5110 DEBUGADD(8,("allocating memory\n"));
5112 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
5117 /* we allocate memory iff called from
5118 * addprinter(ex) so we can do one time stuff here.
5120 (*asc)->setuptime=time_unix;
5123 DEBUGADD(8,("start converting\n"));
5127 d->attributes=uni->attributes;
5128 d->priority=uni->priority;
5129 d->default_priority=uni->default_priority;
5130 d->starttime=uni->starttime;
5131 d->untiltime=uni->untiltime;
5132 d->status=uni->status;
5133 d->cjobs=uni->cjobs;
5135 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5136 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5137 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5138 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5139 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5140 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5141 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5142 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5143 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5144 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5145 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5150 /*******************************************************************
5152 ********************************************************************/
5154 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5155 fstring servername, fstring env_name, uint32 level,
5156 NEW_BUFFER *buffer, uint32 offered)
5158 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5159 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5163 q_u->offered=offered;
5168 /*******************************************************************
5169 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5170 ********************************************************************/
5172 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5174 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5179 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5181 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5187 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5189 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5195 if(!prs_uint32("level", ps, depth, &q_u->level))
5198 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5204 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5210 /*******************************************************************
5211 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5212 ********************************************************************/
5214 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5216 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5222 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5228 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5231 if (!prs_werror("status", ps, depth, &r_u->status))
5237 /*******************************************************************
5238 ********************************************************************/
5240 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5242 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5248 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5254 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5257 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5260 if (!prs_werror("status", ps, depth, &r_u->status))
5266 /*******************************************************************
5267 ********************************************************************/
5269 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5271 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5277 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5279 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5285 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5287 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5293 if (!prs_uint32("level", ps, depth, &q_u->level))
5296 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5302 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5308 /*******************************************************************
5309 ********************************************************************/
5311 BOOL spoolss_io_q_addprintprocessor(char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5313 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5319 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5321 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5326 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5331 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5336 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5342 /*******************************************************************
5343 ********************************************************************/
5345 BOOL spoolss_io_r_addprintprocessor(char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5347 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5353 if (!prs_werror("status", ps, depth, &r_u->status))
5359 /*******************************************************************
5360 ********************************************************************/
5362 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5364 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5370 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5376 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5379 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5382 if (!prs_werror("status", ps, depth, &r_u->status))
5388 /*******************************************************************
5389 ********************************************************************/
5391 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5393 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5399 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5401 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5407 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5409 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5415 if (!prs_uint32("level", ps, depth, &q_u->level))
5418 if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
5424 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5430 /*******************************************************************
5431 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5432 ********************************************************************/
5434 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5436 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5442 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5444 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5450 if (!prs_uint32("level", ps, depth, &q_u->level))
5453 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5459 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5465 /*******************************************************************
5466 ********************************************************************/
5468 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5470 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5476 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5482 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5485 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5488 if (!prs_werror("status", ps, depth, &r_u->status))
5494 /*******************************************************************
5495 ********************************************************************/
5497 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5499 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5504 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5507 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5513 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5516 if(!prs_uint32("type", ps, depth, &r_u->type))
5519 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5521 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5526 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5528 if(!prs_werror("status", ps, depth, &r_u->status))
5534 /*******************************************************************
5535 ********************************************************************/
5537 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5539 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5544 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5546 if(!prs_uint32("index", ps, depth, &q_u->index))
5548 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5550 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5556 /*******************************************************************
5557 ********************************************************************/
5559 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5560 const POLICY_HND *hnd,
5561 uint32 idx, uint32 valuelen, uint32 datalen)
5563 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5565 q_u->valuesize=valuelen;
5566 q_u->datasize=datalen;
5571 /*******************************************************************
5572 ********************************************************************/
5574 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5576 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5581 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5583 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5589 if(!prs_uint32("type", ps, depth, &q_u->type))
5592 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5602 if (UNMARSHALLING(ps))
5603 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
5604 if(q_u->data == NULL)
5606 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5614 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5620 /*******************************************************************
5621 ********************************************************************/
5623 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5625 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5630 if(!prs_werror("status", ps, depth, &r_u->status))
5636 /*******************************************************************
5637 ********************************************************************/
5639 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
5640 uint32 type, const uint8 *data, uint32 len)
5642 DEBUG(5,("converting a specific param struct\n"));
5646 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
5649 memset((char *)*param, '\0', sizeof(NT_PRINTER_PARAM));
5650 DEBUGADD(6,("Allocated a new PARAM struct\n"));
5652 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
5653 (*param)->type = type;
5655 /* le champ data n'est pas NULL termine */
5656 /* on stocke donc la longueur */
5658 (*param)->data_len=len;
5661 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
5662 if((*param)->data == NULL)
5664 memcpy((*param)->data, data, len);
5667 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
5668 dump_data(10, (char *)(*param)->data, (*param)->data_len);
5673 /*******************************************************************
5674 ********************************************************************/
5676 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5678 prs_debug(ps, depth, desc, "spoolss_io_addform");
5685 if(!prs_uint32("flags", ps, depth, &f->flags))
5687 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
5689 if(!prs_uint32("size_x", ps, depth, &f->size_x))
5691 if(!prs_uint32("size_y", ps, depth, &f->size_y))
5693 if(!prs_uint32("left", ps, depth, &f->left))
5695 if(!prs_uint32("top", ps, depth, &f->top))
5697 if(!prs_uint32("right", ps, depth, &f->right))
5699 if(!prs_uint32("bottom", ps, depth, &f->bottom))
5702 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
5709 /*******************************************************************
5710 ********************************************************************/
5712 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
5714 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
5719 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5721 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
5727 /*******************************************************************
5728 ********************************************************************/
5730 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
5732 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
5737 if(!prs_werror("status", ps, depth, &r_u->status))
5743 /*******************************************************************
5744 ********************************************************************/
5746 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
5748 uint32 useless_ptr=0;
5749 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
5754 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5756 if(!prs_uint32("level", ps, depth, &q_u->level))
5758 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5763 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5765 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5772 /*******************************************************************
5773 ********************************************************************/
5775 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
5777 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
5782 if(!prs_werror("status", ps, depth, &r_u->status))
5788 /*******************************************************************
5789 ********************************************************************/
5791 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
5793 uint32 useless_ptr=0;
5794 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
5799 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5801 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
5807 if(!prs_uint32("level", ps, depth, &q_u->level))
5809 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5814 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5816 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5823 /*******************************************************************
5824 ********************************************************************/
5826 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
5828 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
5833 if(!prs_werror("status", ps, depth, &r_u->status))
5839 /*******************************************************************
5840 Parse a SPOOL_R_GETJOB structure.
5841 ********************************************************************/
5843 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
5845 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
5851 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5857 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5860 if (!prs_werror("status", ps, depth, &r_u->status))
5866 /*******************************************************************
5867 Parse a SPOOL_Q_GETJOB structure.
5868 ********************************************************************/
5870 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
5872 prs_debug(ps, depth, desc, "");
5878 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5880 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
5882 if(!prs_uint32("level", ps, depth, &q_u->level))
5885 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5891 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5897 void free_devmode(DEVICEMODE *devmode)
5899 if (devmode!=NULL) {
5900 SAFE_FREE(devmode->private);
5905 void free_printer_info_1(PRINTER_INFO_1 *printer)
5910 void free_printer_info_2(PRINTER_INFO_2 *printer)
5912 if (printer!=NULL) {
5913 free_devmode(printer->devmode);
5914 printer->devmode = NULL;
5919 void free_printer_info_3(PRINTER_INFO_3 *printer)
5924 void free_job_info_2(JOB_INFO_2 *job)
5927 free_devmode(job->devmode);
5930 /*******************************************************************
5932 ********************************************************************/
5934 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
5935 const fstring string, uint32 printer, uint32 type)
5940 init_unistr2(&q_u->string, string, strlen(string)+1);
5942 q_u->printer=printer;
5951 /*******************************************************************
5952 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
5953 ********************************************************************/
5955 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
5957 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
5963 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
5969 if(!prs_uint32("printer", ps, depth, &q_u->printer))
5971 if(!prs_uint32("type", ps, depth, &q_u->type))
5974 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
5976 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
5982 /*******************************************************************
5983 Parse a SPOOL_R_REPLYOPENPRINTER structure.
5984 ********************************************************************/
5986 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
5988 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
5994 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
5997 if (!prs_werror("status", ps, depth, &r_u->status))
6003 /*******************************************************************
6005 ********************************************************************/
6007 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6012 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6017 /*******************************************************************
6018 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6019 ********************************************************************/
6021 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6023 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6029 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6035 /*******************************************************************
6036 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6037 ********************************************************************/
6039 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6041 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6047 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6050 if (!prs_werror("status", ps, depth, &r_u->status))
6056 /*******************************************************************
6058 ********************************************************************/
6060 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6061 uint32 change_low, uint32 change_high)
6066 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6068 q_u->change_low=change_low;
6069 q_u->change_high=change_high;
6076 q_u->info.version=2;
6077 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6083 /*******************************************************************
6084 Parse a SPOOL_Q_REPLY_RRPCN structure.
6085 ********************************************************************/
6087 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6089 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6095 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6098 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6101 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6104 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6107 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6110 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6113 if(q_u->info_ptr!=0)
6114 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6120 /*******************************************************************
6121 Parse a SPOOL_R_REPLY_RRPCN structure.
6122 ********************************************************************/
6124 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6126 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6132 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6135 if (!prs_werror("status", ps, depth, &r_u->status))
6141 /*******************************************************************
6143 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6144 ********************************************************************/
6146 BOOL spoolss_io_q_getprinterdataex(char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6151 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6156 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6160 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6164 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6168 if (!prs_uint32("size", ps, depth, &q_u->size))
6174 /*******************************************************************
6175 * write a structure.
6176 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6177 ********************************************************************/
6179 BOOL spoolss_io_r_getprinterdataex(char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6184 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6189 if (!prs_uint32("type", ps, depth, &r_u->type))
6191 if (!prs_uint32("size", ps, depth, &r_u->size))
6194 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6200 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6202 if (!prs_werror("status", ps, depth, &r_u->status))
6208 /*******************************************************************
6210 ********************************************************************/
6212 BOOL spoolss_io_q_setprinterdataex(char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6214 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6219 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6221 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6227 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6233 if(!prs_uint32("type", ps, depth, &q_u->type))
6236 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6246 if (UNMARSHALLING(ps))
6247 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
6248 if(q_u->data == NULL)
6250 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6258 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6264 /*******************************************************************
6265 * write a structure.
6266 ********************************************************************/
6268 BOOL spoolss_io_r_setprinterdataex(char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6270 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6275 if(!prs_werror("status", ps, depth, &r_u->status))
6282 /*******************************************************************
6284 ********************************************************************/
6286 BOOL spoolss_io_q_enumprinterkey(char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6288 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
6293 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6296 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6302 if(!prs_uint32("size", ps, depth, &q_u->size))
6308 /*******************************************************************
6309 * write a structure.
6310 ********************************************************************/
6312 BOOL spoolss_io_r_enumprinterkey(char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
6314 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
6320 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
6326 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6329 if(!prs_werror("status", ps, depth, &r_u->status))
6336 /*******************************************************************
6338 ********************************************************************/
6340 BOOL spoolss_io_q_enumprinterdataex(char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6342 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
6347 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6350 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6356 if(!prs_uint32("size", ps, depth, &q_u->size))
6362 /*******************************************************************
6363 ********************************************************************/
6364 static BOOL spoolss_io_printer_enum_values_ctr(char *desc, prs_struct *ps,
6365 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
6368 uint32 valuename_offset,
6371 const uint32 basic_unit = 20; /* size of static portion of enum_values */
6373 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
6376 if (!prs_uint32("size", ps, depth, &ctr->size))
6379 /* offset data begins at 20 bytes per structure * size_of_array. */
6381 current_offset = basic_unit * ctr->size_of_array;
6383 /* first loop to write basic enum_value information */
6385 for (i=0; i<ctr->size_of_array; i++)
6387 valuename_offset = current_offset;
6388 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
6391 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
6394 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
6397 data_offset = ctr->values[i].value_len + valuename_offset;
6398 if (!prs_uint32("data_offset", ps, depth, &data_offset))
6401 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
6404 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
6408 /* loop #2 for writing the dynamically size objects
6409 while viewing conversations between Win2k -> Win2k,
6410 4-byte alignment does not seem to matter here --jerry */
6412 for (i=0; i<ctr->size_of_array; i++)
6415 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
6418 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
6428 /*******************************************************************
6429 * write a structure.
6430 ********************************************************************/
6432 BOOL spoolss_io_r_enumprinterdataex(char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6434 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
6440 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
6446 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6449 if(!prs_uint32("returned", ps, depth, &r_u->returned))
6452 if(!prs_werror("status", ps, depth, &r_u->status))
6459 /*******************************************************************
6460 * write a structure.
6461 ********************************************************************/
6464 uint32 GetPrintProcessorDirectory(
6466 [in] unistr2 *environment,
6468 [in,out] NEW_BUFFER buffer,
6469 [in] uint32 offered,
6470 [out] uint32 needed,
6471 [out] uint32 returned
6476 BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, NEW_BUFFER *buffer, uint32 offered)
6478 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
6480 init_unistr2(&q_u->name, name, strlen(name)+1);
6481 init_unistr2(&q_u->environment, environment, strlen(environment)+1);
6485 q_u->buffer = buffer;
6486 q_u->offered = offered;
6491 BOOL spoolss_io_q_getprintprocessordirectory(char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
6495 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
6501 if (!prs_uint32("ptr", ps, depth, &ptr))
6505 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
6512 if (!prs_uint32("ptr", ps, depth, &ptr))
6516 if(!smb_io_unistr2("environment", &q_u->environment, True,
6524 if(!prs_uint32("level", ps, depth, &q_u->level))
6527 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
6533 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6539 /*******************************************************************
6540 * write a structure.
6541 ********************************************************************/
6543 BOOL spoolss_io_r_getprintprocessordirectory(char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
6545 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
6551 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
6557 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6560 if(!prs_werror("status", ps, depth, &r_u->status))
6566 BOOL smb_io_printprocessordirectory_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
6568 prs_struct *ps=&buffer->prs;
6570 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
6573 buffer->struct_start=prs_offset(ps);
6575 if (!smb_io_unistr(desc, &info->name, ps, depth))