2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-2000,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
6 * Copyright (C) Jean François Micouleau 1998-2000,
7 * Copyright (C) Gerald Carter 2000-2002,
8 * Copyright (C) Tim Potter 2001-2002.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #define DBGC_CLASS DBGC_RPC_PARSE
30 /*******************************************************************
31 return the length of a UNISTR string.
32 ********************************************************************/
34 static uint32 str_len_uni(UNISTR *source)
41 while (source->buffer[i])
47 /*******************************************************************
48 This should be moved in a more generic lib.
49 ********************************************************************/
51 BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
53 if(!prs_uint16("year", ps, depth, &systime->year))
55 if(!prs_uint16("month", ps, depth, &systime->month))
57 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
59 if(!prs_uint16("day", ps, depth, &systime->day))
61 if(!prs_uint16("hour", ps, depth, &systime->hour))
63 if(!prs_uint16("minute", ps, depth, &systime->minute))
65 if(!prs_uint16("second", ps, depth, &systime->second))
67 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
73 /*******************************************************************
74 ********************************************************************/
76 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
78 systime->year=unixtime->tm_year+1900;
79 systime->month=unixtime->tm_mon+1;
80 systime->dayofweek=unixtime->tm_wday;
81 systime->day=unixtime->tm_mday;
82 systime->hour=unixtime->tm_hour;
83 systime->minute=unixtime->tm_min;
84 systime->second=unixtime->tm_sec;
85 systime->milliseconds=0;
90 /*******************************************************************
91 reads or writes an DOC_INFO structure.
92 ********************************************************************/
94 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
96 if (info_1 == NULL) return False;
98 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
104 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
106 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
108 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
111 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
113 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
115 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
121 /*******************************************************************
122 reads or writes an DOC_INFO structure.
123 ********************************************************************/
125 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
127 uint32 useless_ptr=0;
129 if (info == NULL) return False;
131 prs_debug(ps, depth, desc, "smb_io_doc_info");
137 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
140 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
143 switch (info->switch_value)
146 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
151 this is just a placeholder
153 MSDN July 1998 says doc_info_2 is only on
154 Windows 95, and as Win95 doesn't do RPC to print
155 this case is nearly impossible
157 Maybe one day with Windows for dishwasher 2037 ...
160 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
163 DEBUG(0,("Something is obviously wrong somewhere !\n"));
170 /*******************************************************************
171 reads or writes an DOC_INFO_CONTAINER structure.
172 ********************************************************************/
174 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
176 if (cont == NULL) return False;
178 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
184 if(!prs_uint32("level", ps, depth, &cont->level))
187 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
193 /*******************************************************************
194 reads or writes an NOTIFY OPTION TYPE structure.
195 ********************************************************************/
197 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
198 structure. The _TYPE structure is really the deferred referrants (i.e
199 the notify fields array) of the _TYPE structure. -tpot */
201 static BOOL smb_io_notify_option_type(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
203 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
209 if(!prs_uint16("type", ps, depth, &type->type))
211 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
213 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
215 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
217 if(!prs_uint32("count", ps, depth, &type->count))
219 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
225 /*******************************************************************
226 reads or writes an NOTIFY OPTION TYPE DATA.
227 ********************************************************************/
229 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
233 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
236 /* if there are no fields just return */
237 if (type->fields_ptr==0)
243 if(!prs_uint32("count2", ps, depth, &type->count2))
246 if (type->count2 != type->count)
247 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
249 /* parse the option type data */
250 for(i=0;i<type->count2;i++)
251 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
256 /*******************************************************************
257 reads or writes an NOTIFY OPTION structure.
258 ********************************************************************/
260 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
264 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
267 if(!prs_uint32("count", ps, depth, &ctr->count))
271 if (UNMARSHALLING(ps))
272 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)prs_alloc_mem(ps,ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
275 /* the option type struct */
276 for(i=0;i<ctr->count;i++)
277 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
280 /* the type associated with the option type struct */
281 for(i=0;i<ctr->count;i++)
282 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
288 /*******************************************************************
289 reads or writes an NOTIFY OPTION structure.
290 ********************************************************************/
292 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
294 prs_debug(ps, depth, desc, "smb_io_notify_option");
297 if(!prs_uint32("version", ps, depth, &option->version))
299 if(!prs_uint32("flags", ps, depth, &option->flags))
301 if(!prs_uint32("count", ps, depth, &option->count))
303 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
306 /* marshalling or unmarshalling, that would work */
307 if (option->option_type_ptr!=0) {
308 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
312 option->ctr.type=NULL;
319 /*******************************************************************
320 reads or writes an NOTIFY INFO DATA structure.
321 ********************************************************************/
323 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
325 uint32 useless_ptr=0x0FF0ADDE;
327 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
332 if(!prs_uint16("type", ps, depth, &data->type))
334 if(!prs_uint16("field", ps, depth, &data->field))
337 if(!prs_uint32("how many words", ps, depth, &data->size))
339 if(!prs_uint32("id", ps, depth, &data->id))
341 if(!prs_uint32("how many words", ps, depth, &data->size))
344 switch (data->enc_type) {
346 /* One and two value data has two uint32 values */
348 case NOTIFY_ONE_VALUE:
349 case NOTIFY_TWO_VALUE:
351 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
353 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
357 /* Pointers and strings have a string length and a
358 pointer. For a string the length is expressed as
359 the number of uint16 characters plus a trailing
364 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length ))
366 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
373 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
376 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
382 if( !prs_uint32( "sd size", ps, depth, &data->notify_data.sd.size ) )
384 if( !prs_uint32( "pointer", ps, depth, &useless_ptr ) )
390 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data\n",
398 /*******************************************************************
399 reads or writes an NOTIFY INFO DATA structure.
400 ********************************************************************/
402 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
403 prs_struct *ps, int depth)
405 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
411 switch(data->enc_type) {
413 /* No data for values */
415 case NOTIFY_ONE_VALUE:
416 case NOTIFY_TWO_VALUE:
420 /* Strings start with a length in uint16s */
424 if (UNMARSHALLING(ps)) {
425 data->notify_data.data.string =
426 (uint16 *)prs_alloc_mem(ps, data->notify_data.data.length);
428 if (!data->notify_data.data.string)
433 data->notify_data.data.length /= 2;
435 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
438 if (!prs_uint16uni(True, "string", ps, depth, data->notify_data.data.string,
439 data->notify_data.data.length))
443 data->notify_data.data.length *= 2;
449 if (UNMARSHALLING(ps)) {
450 data->notify_data.data.string =
451 (uint16 *)prs_alloc_mem(ps, data->notify_data.data.length);
453 if (!data->notify_data.data.string)
457 if(!prs_uint8s(True,"buffer",ps,depth,(uint8*)data->notify_data.data.string,data->notify_data.data.length))
463 if( !prs_uint32("secdesc size ", ps, depth, &data->notify_data.sd.size ) )
465 if ( !sec_io_desc( "sec_desc", &data->notify_data.sd.desc, ps, depth ) )
470 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",
476 if (isvalue==False) {
478 /* length of string in unicode include \0 */
479 x=data->notify_data.data.length+1;
481 if (data->field != 16)
482 if(!prs_uint32("string length", ps, depth, &x ))
485 if (MARSHALLING(ps)) {
486 /* These are already in little endian format. Don't byte swap. */
489 /* No memory allocated for this string
490 therefore following the data.string
491 pointer is a bad idea. Use a pointer to
492 the uint32 length union member to
493 provide a source for a unicode NULL */
495 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
499 if (data->field == 16)
502 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
507 /* Tallocate memory for string */
509 data->notify_data.data.string = (uint16 *)prs_alloc_mem(ps, x * 2);
510 if (!data->notify_data.data.string)
513 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
521 /* Win2k does not seem to put this parse align here */
529 /*******************************************************************
530 reads or writes an NOTIFY INFO structure.
531 ********************************************************************/
533 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
537 prs_debug(ps, depth, desc, "smb_io_notify_info");
543 if(!prs_uint32("count", ps, depth, &info->count))
545 if(!prs_uint32("version", ps, depth, &info->version))
547 if(!prs_uint32("flags", ps, depth, &info->flags))
549 if(!prs_uint32("count", ps, depth, &info->count))
552 for (i=0;i<info->count;i++) {
553 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
557 /* now do the strings at the end of the stream */
558 for (i=0;i<info->count;i++) {
559 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
566 /*******************************************************************
567 ********************************************************************/
569 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
571 prs_debug(ps, depth, desc, "");
575 if (UNMARSHALLING(ps))
580 if (!prs_uint32("size", ps, depth, &q_u->size))
582 if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
584 if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
586 if (!prs_uint32("build", ps, depth, &q_u->build))
588 if (!prs_uint32("major", ps, depth, &q_u->major))
590 if (!prs_uint32("minor", ps, depth, &q_u->minor))
592 if (!prs_uint32("processor", ps, depth, &q_u->processor))
595 if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
599 if (!smb_io_unistr2("", &q_u->user_name, q_u->user_name_ptr, ps, depth))
605 /*******************************************************************
606 ********************************************************************/
608 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
613 prs_debug(ps, depth, desc, "spool_io_user_level");
618 if (!prs_uint32("level", ps, depth, &q_u->level))
620 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
623 switch (q_u->level) {
625 if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
635 /*******************************************************************
636 * read or write a DEVICEMODE struct.
637 * on reading allocate memory for the private member
638 ********************************************************************/
640 #define DM_NUM_OPTIONAL_FIELDS 8
642 BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
644 uint32 available_space; /* size of the device mode left to parse */
645 /* only important on unmarshalling */
648 struct optional_fields {
651 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
652 { "icmmethod", NULL },
653 { "icmintent", NULL },
654 { "mediatype", NULL },
655 { "dithertype", NULL },
656 { "reserved1", NULL },
657 { "reserved2", NULL },
658 { "panningwidth", NULL },
659 { "panningheight", NULL }
662 /* assign at run time to keep non-gcc vompilers happy */
664 opt_fields[0].field = &devmode->icmmethod;
665 opt_fields[1].field = &devmode->icmintent;
666 opt_fields[2].field = &devmode->mediatype;
667 opt_fields[3].field = &devmode->dithertype;
668 opt_fields[4].field = &devmode->reserved1;
669 opt_fields[5].field = &devmode->reserved2;
670 opt_fields[6].field = &devmode->panningwidth;
671 opt_fields[7].field = &devmode->panningheight;
674 prs_debug(ps, depth, desc, "spoolss_io_devmode");
677 if (UNMARSHALLING(ps)) {
678 devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
679 if (devmode->devicename.buffer == NULL)
683 if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
686 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
689 /* Sanity Check - look for unknown specversions, but don't fail if we see one.
690 Let the size determine that */
692 switch (devmode->specversion) {
693 /* list of observed spec version's */
701 DEBUG(0,("spoolss_io_devmode: Unknown specversion in devicemode [0x%x]\n",
702 devmode->specversion));
703 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
708 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
710 if (!prs_uint16("size", ps, depth, &devmode->size))
712 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
714 if (!prs_uint32("fields", ps, depth, &devmode->fields))
716 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
718 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
720 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
722 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
724 if (!prs_uint16("scale", ps, depth, &devmode->scale))
726 if (!prs_uint16("copies", ps, depth, &devmode->copies))
728 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
730 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
732 if (!prs_uint16("color", ps, depth, &devmode->color))
734 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
736 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
738 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
740 if (!prs_uint16("collate", ps, depth, &devmode->collate))
743 if (UNMARSHALLING(ps)) {
744 devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
745 if (devmode->formname.buffer == NULL)
749 if (!prs_uint16uni(True, "formname", ps, depth, devmode->formname.buffer, 32))
751 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
753 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
755 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
757 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
759 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
761 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
764 * every device mode I've ever seen on the wire at least has up
765 * to the displayfrequency field. --jerry (05-09-2002)
768 /* add uint32's + uint16's + two UNICODE strings */
770 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
772 /* Sanity check - we only have uint32's left tp parse */
774 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
775 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
776 available_space, devmode->size));
777 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
782 * Conditional parsing. Assume that the DeviceMode has been
783 * zero'd by the caller.
786 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
788 DEBUG(10, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
789 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
791 available_space -= sizeof(uint32);
795 /* Sanity Check - we should no available space at this point unless
796 MS changes the device mode structure */
798 if (available_space) {
799 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
800 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
801 available_space, devmode->size));
802 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
807 if (devmode->driverextra!=0) {
808 if (UNMARSHALLING(ps)) {
809 devmode->private=(uint8 *)prs_alloc_mem(ps, devmode->driverextra*sizeof(uint8));
810 if(devmode->private == NULL)
812 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
815 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
816 if (!prs_uint8s(False, "private", ps, depth,
817 devmode->private, devmode->driverextra))
824 /*******************************************************************
825 Read or write a DEVICEMODE container
826 ********************************************************************/
828 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
833 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
839 if (!prs_uint32("size", ps, depth, &dm_c->size))
842 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
845 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
846 if (UNMARSHALLING(ps))
847 /* if while reading there is no DEVMODE ... */
852 /* so we have a DEVICEMODE to follow */
853 if (UNMARSHALLING(ps)) {
854 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
855 dm_c->devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE));
856 if(dm_c->devmode == NULL)
860 /* this is bad code, shouldn't be there */
861 if (!prs_uint32("size", ps, depth, &dm_c->size))
864 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
870 /*******************************************************************
871 ********************************************************************/
873 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
878 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
881 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
884 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
890 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
896 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
902 /*******************************************************************
904 ********************************************************************/
906 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
907 const fstring printername,
908 const fstring datatype,
909 uint32 access_required,
910 const fstring clientname,
911 const fstring user_name)
913 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
914 q_u->printername_ptr = (printername!=NULL)?1:0;
915 init_unistr2(&q_u->printername, printername, strlen(printername)+1);
917 q_u->printer_default.datatype_ptr = 0;
919 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
920 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
922 q_u->printer_default.devmode_cont.size=0;
923 q_u->printer_default.devmode_cont.devmode_ptr=0;
924 q_u->printer_default.devmode_cont.devmode=NULL;
925 q_u->printer_default.access_required=access_required;
927 q_u->user_ctr.level=1;
929 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
930 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
931 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
932 q_u->user_ctr.user1.build=1381;
933 q_u->user_ctr.user1.major=2;
934 q_u->user_ctr.user1.minor=0;
935 q_u->user_ctr.user1.processor=0;
936 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
937 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
942 /*******************************************************************
944 ********************************************************************/
946 BOOL make_spoolss_q_addprinterex(
948 SPOOL_Q_ADDPRINTEREX *q_u,
949 const char *srv_name,
950 const char* clientname,
951 const char* user_name,
953 PRINTER_INFO_CTR *ctr)
955 DEBUG(5,("make_spoolss_q_addprinterex\n"));
957 if (!ctr) return False;
961 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
962 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
966 q_u->info.level = level;
967 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
970 /* init q_u->info.info2 from *info */
971 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
972 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
982 q_u->user_ctr.level=1;
984 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
985 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
986 q_u->user_ctr.user1.build=1381;
987 q_u->user_ctr.user1.major=2;
988 q_u->user_ctr.user1.minor=0;
989 q_u->user_ctr.user1.processor=0;
990 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
991 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
992 q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
993 q_u->user_ctr.user1.client_name.uni_str_len + 2;
998 /*******************************************************************
999 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
1000 *******************************************************************/
1002 BOOL make_spoolss_printer_info_2(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
1003 PRINTER_INFO_2 *info)
1006 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
1008 /* allocate the necessary memory */
1009 if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2)))) {
1010 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
1014 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
1015 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
1016 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
1017 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
1018 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
1019 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
1020 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
1021 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
1022 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
1023 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
1024 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
1025 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
1026 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1027 inf->attributes = info->attributes;
1028 inf->priority = info->priority;
1029 inf->default_priority = info->defaultpriority;
1030 inf->starttime = info->starttime;
1031 inf->untiltime = info->untiltime;
1032 inf->cjobs = info->cjobs;
1033 inf->averageppm = info->averageppm;
1034 init_unistr2_from_unistr(&inf->servername, &info->servername);
1035 init_unistr2_from_unistr(&inf->printername, &info->printername);
1036 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
1037 init_unistr2_from_unistr(&inf->portname, &info->portname);
1038 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
1039 init_unistr2_from_unistr(&inf->comment, &info->comment);
1040 init_unistr2_from_unistr(&inf->location, &info->location);
1041 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
1042 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
1043 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
1044 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
1045 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
1053 /*******************************************************************
1055 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1056 ********************************************************************/
1058 BOOL spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
1063 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
1069 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
1071 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
1077 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1083 /*******************************************************************
1084 * write a structure.
1085 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1086 * called from spoolss_open_printer_ex (cli_spoolss.c)
1087 ********************************************************************/
1089 BOOL spoolss_io_r_open_printer(char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
1091 if (r_u == NULL) return False;
1093 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
1099 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1102 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1109 /*******************************************************************
1111 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1112 ********************************************************************/
1114 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
1119 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
1125 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
1127 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
1133 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1136 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
1138 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
1144 /*******************************************************************
1145 * write a structure.
1146 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1147 * called from spoolss_open_printer_ex (cli_spoolss.c)
1148 ********************************************************************/
1150 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
1152 if (r_u == NULL) return False;
1154 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
1160 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1163 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1169 /*******************************************************************
1171 ********************************************************************/
1172 BOOL make_spoolss_q_deleteprinterdriver(
1173 TALLOC_CTX *mem_ctx,
1174 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
1180 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1182 q_u->server_ptr = (server!=NULL)?1:0;
1184 /* these must be NULL terminated or else NT4 will
1185 complain about invalid parameters --jerry */
1186 init_unistr2(&q_u->server, server, strlen(server)+1);
1187 init_unistr2(&q_u->arch, arch, strlen(arch)+1);
1188 init_unistr2(&q_u->driver, driver, strlen(driver)+1);
1195 /*******************************************************************
1197 ********************************************************************/
1199 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
1200 const POLICY_HND *handle,
1201 char *valuename, uint32 size)
1203 if (q_u == NULL) return False;
1205 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1207 q_u->handle = *handle;
1208 init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
1214 /*******************************************************************
1216 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1217 ********************************************************************/
1219 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
1224 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
1229 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1233 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1237 if (!prs_uint32("size", ps, depth, &q_u->size))
1243 /*******************************************************************
1245 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1246 ********************************************************************/
1248 BOOL spoolss_io_q_deleteprinterdata(char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1253 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1258 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1262 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1268 /*******************************************************************
1269 * write a structure.
1270 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1271 ********************************************************************/
1273 BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1275 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1277 if(!prs_werror("status", ps, depth, &r_u->status))
1283 /*******************************************************************
1285 * called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
1286 ********************************************************************/
1288 BOOL spoolss_io_q_deleteprinterdataex(char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
1293 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdataex");
1298 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1301 if (!smb_io_unistr2("keyname ", &q_u->keyname, True, ps, depth))
1303 if (!smb_io_unistr2("valuename", &q_u->valuename, True, ps, depth))
1309 /*******************************************************************
1310 * write a structure.
1311 * called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
1312 ********************************************************************/
1314 BOOL spoolss_io_r_deleteprinterdataex(char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
1316 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdataex");
1319 if(!prs_werror("status", ps, depth, &r_u->status))
1325 /*******************************************************************
1326 * write a structure.
1327 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1328 ********************************************************************/
1330 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1335 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1340 if (!prs_uint32("type", ps, depth, &r_u->type))
1342 if (!prs_uint32("size", ps, depth, &r_u->size))
1345 if (UNMARSHALLING(ps) && r_u->size) {
1346 r_u->data = prs_alloc_mem(ps, r_u->size);
1351 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
1357 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1359 if (!prs_werror("status", ps, depth, &r_u->status))
1365 /*******************************************************************
1367 ********************************************************************/
1369 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1371 if (q_u == NULL) return False;
1373 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1375 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1380 /*******************************************************************
1382 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1383 * called from spoolss_abortprinter (cli_spoolss.c)
1384 ********************************************************************/
1386 BOOL spoolss_io_q_abortprinter(char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1388 if (q_u == NULL) return False;
1390 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1396 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1402 /*******************************************************************
1403 * write a structure.
1404 * called from spoolss_r_abortprinter (srv_spoolss.c)
1405 ********************************************************************/
1407 BOOL spoolss_io_r_abortprinter(char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1409 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1411 if(!prs_werror("status", ps, depth, &r_u->status))
1417 /*******************************************************************
1419 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1420 * called from spoolss_deleteprinter (cli_spoolss.c)
1421 ********************************************************************/
1423 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1425 if (q_u == NULL) return False;
1427 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1433 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1439 /*******************************************************************
1440 * write a structure.
1441 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1442 * called from spoolss_deleteprinter (cli_spoolss.c)
1443 ********************************************************************/
1445 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1447 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1453 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1455 if (!prs_werror("status", ps, depth, &r_u->status))
1462 /*******************************************************************
1464 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1465 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1466 ********************************************************************/
1468 BOOL spoolss_io_q_deleteprinterdriver(char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1470 if (q_u == NULL) return False;
1472 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1478 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1480 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1482 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1484 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1492 /*******************************************************************
1493 * write a structure.
1494 ********************************************************************/
1495 BOOL spoolss_io_r_deleteprinterdriver(char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1497 if (r_u == NULL) return False;
1499 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1505 if (!prs_werror("status", ps, depth, &r_u->status))
1512 /*******************************************************************
1514 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1515 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1516 ********************************************************************/
1518 BOOL spoolss_io_q_deleteprinterdriverex(char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
1520 if (q_u == NULL) return False;
1522 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriverex");
1528 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1530 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1532 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1534 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1540 if(!prs_uint32("delete_flags ", ps, depth, &q_u->delete_flags))
1542 if(!prs_uint32("version ", ps, depth, &q_u->version))
1550 /*******************************************************************
1551 * write a structure.
1552 ********************************************************************/
1553 BOOL spoolss_io_r_deleteprinterdriverex(char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
1555 if (r_u == NULL) return False;
1557 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriverex");
1563 if (!prs_werror("status", ps, depth, &r_u->status))
1571 /*******************************************************************
1573 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1574 * called from spoolss_closeprinter (cli_spoolss.c)
1575 ********************************************************************/
1577 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1579 if (q_u == NULL) return False;
1581 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1587 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1593 /*******************************************************************
1594 * write a structure.
1595 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1596 * called from spoolss_closeprinter (cli_spoolss.c)
1597 ********************************************************************/
1599 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1601 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1607 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1609 if (!prs_werror("status", ps, depth, &r_u->status))
1615 /*******************************************************************
1617 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1618 ********************************************************************/
1620 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1622 if (q_u == NULL) return False;
1624 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1630 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1633 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1639 /*******************************************************************
1640 * write a structure.
1641 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1642 ********************************************************************/
1644 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1646 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1648 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1650 if(!prs_werror("status", ps, depth, &r_u->status))
1656 /*******************************************************************
1658 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1659 ********************************************************************/
1661 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1663 if (q_u == NULL) return False;
1665 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1671 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1677 /*******************************************************************
1678 * write a structure.
1679 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1680 ********************************************************************/
1682 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1684 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1686 if(!prs_werror("status", ps, depth, &r_u->status))
1692 /*******************************************************************
1694 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1695 ********************************************************************/
1697 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1699 if (q_u == NULL) return False;
1701 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1707 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1713 /*******************************************************************
1714 * write a structure.
1715 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1716 ********************************************************************/
1718 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1720 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1722 if(!prs_werror("status", ps, depth, &r_u->status))
1728 /*******************************************************************
1730 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1731 ********************************************************************/
1733 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1735 if (q_u == NULL) return False;
1737 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1743 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1749 /*******************************************************************
1750 * write a structure.
1751 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1752 ********************************************************************/
1754 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1756 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1758 if(!prs_werror("status", ps, depth, &r_u->status))
1764 /*******************************************************************
1766 * called from spoolss_q_writeprinter (srv_spoolss.c)
1767 ********************************************************************/
1769 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1771 if (q_u == NULL) return False;
1773 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1779 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1781 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1784 if (q_u->buffer_size!=0)
1786 if (UNMARSHALLING(ps))
1787 q_u->buffer=(uint8 *)prs_alloc_mem(ps,q_u->buffer_size*sizeof(uint8));
1788 if(q_u->buffer == NULL)
1790 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1795 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1801 /*******************************************************************
1802 * write a structure.
1803 * called from spoolss_r_writeprinter (srv_spoolss.c)
1804 ********************************************************************/
1806 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1808 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1810 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1812 if(!prs_werror("status", ps, depth, &r_u->status))
1818 /*******************************************************************
1820 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1821 ********************************************************************/
1823 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1825 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1831 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1833 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1835 if(!prs_uint32("options", ps, depth, &q_u->options))
1837 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1839 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1845 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1848 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1851 if (q_u->option_ptr!=0) {
1853 if (UNMARSHALLING(ps))
1854 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1857 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1864 /*******************************************************************
1865 * write a structure.
1866 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1867 ********************************************************************/
1869 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1871 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1874 if(!prs_werror("status", ps, depth, &r_u->status))
1880 /*******************************************************************
1882 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1883 ********************************************************************/
1885 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1887 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1893 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1896 if(!prs_uint32("change", ps, depth, &q_u->change))
1899 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1902 if (q_u->option_ptr!=0) {
1904 if (UNMARSHALLING(ps))
1905 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1908 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1915 /*******************************************************************
1916 * write a structure.
1917 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1918 ********************************************************************/
1920 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1922 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1928 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1931 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1936 if(!prs_werror("status", ps, depth, &r_u->status))
1942 /*******************************************************************
1943 * return the length of a uint16 (obvious, but the code is clean)
1944 ********************************************************************/
1946 static uint32 size_of_uint16(uint16 *value)
1948 return (sizeof(*value));
1951 /*******************************************************************
1952 * return the length of a uint32 (obvious, but the code is clean)
1953 ********************************************************************/
1955 static uint32 size_of_uint32(uint32 *value)
1957 return (sizeof(*value));
1960 /*******************************************************************
1961 * return the length of a NTTIME (obvious, but the code is clean)
1962 ********************************************************************/
1964 static uint32 size_of_nttime(NTTIME *value)
1966 return (sizeof(*value));
1969 /*******************************************************************
1970 * return the length of a UNICODE string in number of char, includes:
1971 * - the leading zero
1972 * - the relative pointer size
1973 ********************************************************************/
1975 static uint32 size_of_relative_string(UNISTR *string)
1979 size=str_len_uni(string); /* the string length */
1980 size=size+1; /* add the trailing zero */
1981 size=size*2; /* convert in char */
1982 size=size+4; /* add the size of the ptr */
1986 * Do not include alignment as Win2k does not align relative
1987 * strings within a buffer --jerry
1989 /* Ensure size is 4 byte multiple (prs_align is being called...). */
1990 /* size += ((4 - (size & 3)) & 3); */
1996 /*******************************************************************
1997 * return the length of a uint32 (obvious, but the code is clean)
1998 ********************************************************************/
2000 static uint32 size_of_device_mode(DEVICEMODE *devmode)
2005 return (4+devmode->size+devmode->driverextra);
2008 /*******************************************************************
2009 * return the length of a uint32 (obvious, but the code is clean)
2010 ********************************************************************/
2012 static uint32 size_of_systemtime(SYSTEMTIME *systime)
2017 return (sizeof(SYSTEMTIME) +4);
2020 /*******************************************************************
2021 * write a UNICODE string and its relative pointer.
2022 * used by all the RPC structs passing a buffer
2024 * As I'm a nice guy, I'm forcing myself to explain this code.
2025 * MS did a good job in the overall spoolss code except in some
2026 * functions where they are passing the API buffer directly in the
2027 * RPC request/reply. That's to maintain compatiility at the API level.
2028 * They could have done it the good way the first time.
2030 * So what happen is: the strings are written at the buffer's end,
2031 * in the reverse order of the original structure. Some pointers to
2032 * the strings are also in the buffer. Those are relative to the
2035 * If you don't understand or want to change that function,
2036 * first get in touch with me: jfm@samba.org
2038 ********************************************************************/
2040 static BOOL smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
2042 prs_struct *ps=&buffer->prs;
2044 if (MARSHALLING(ps)) {
2045 uint32 struct_offset = prs_offset(ps);
2046 uint32 relative_offset;
2048 buffer->string_at_end -= (size_of_relative_string(string) - 4);
2049 if(!prs_set_offset(ps, buffer->string_at_end))
2053 * Win2k does not align strings in a buffer
2054 * Tested against WinNT 4.0 SP 6a & 2k SP2 --jerry
2059 buffer->string_at_end = prs_offset(ps);
2061 /* write the string */
2062 if (!smb_io_unistr(desc, string, ps, depth))
2065 if(!prs_set_offset(ps, struct_offset))
2068 relative_offset=buffer->string_at_end - buffer->struct_start;
2069 /* write its offset */
2070 if (!prs_uint32("offset", ps, depth, &relative_offset))
2076 /* read the offset */
2077 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
2080 old_offset = prs_offset(ps);
2081 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
2084 /* read the string */
2085 if (!smb_io_unistr(desc, string, ps, depth))
2088 if(!prs_set_offset(ps, old_offset))
2094 /*******************************************************************
2095 * write a array of UNICODE strings and its relative pointer.
2096 * used by 2 RPC structs
2097 ********************************************************************/
2099 static BOOL smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
2103 prs_struct *ps=&buffer->prs;
2105 if (MARSHALLING(ps)) {
2106 uint32 struct_offset = prs_offset(ps);
2107 uint32 relative_offset;
2114 /* first write the last 0 */
2115 buffer->string_at_end -= 2;
2116 if(!prs_set_offset(ps, buffer->string_at_end))
2119 if(!prs_uint16("leading zero", ps, depth, &zero))
2122 while (p && (*p!=0)) {
2126 /* Yes this should be malloc not talloc. Don't change. */
2128 chaine.buffer = malloc((q-p+1)*sizeof(uint16));
2129 if (chaine.buffer == NULL)
2132 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
2134 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
2136 if(!prs_set_offset(ps, buffer->string_at_end)) {
2137 SAFE_FREE(chaine.buffer);
2141 /* write the string */
2142 if (!smb_io_unistr(desc, &chaine, ps, depth)) {
2143 SAFE_FREE(chaine.buffer);
2149 SAFE_FREE(chaine.buffer);
2152 if(!prs_set_offset(ps, struct_offset))
2155 relative_offset=buffer->string_at_end - buffer->struct_start;
2156 /* write its offset */
2157 if (!prs_uint32("offset", ps, depth, &relative_offset))
2165 uint16 *chaine2=NULL;
2168 size_t realloc_size = 0;
2172 /* read the offset */
2173 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2176 old_offset = prs_offset(ps);
2177 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2181 if (!smb_io_unistr(desc, &chaine, ps, depth))
2184 l_chaine=str_len_uni(&chaine);
2186 /* we're going to add two more bytes here in case this
2187 is the last string in the array and we need to add
2188 an extra NULL for termination */
2193 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
2195 /* Yes this should be realloc - it's freed below. JRA */
2197 if((tc2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL) {
2202 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
2203 l_chaine2+=l_chaine+1;
2206 } while(l_chaine!=0);
2208 /* the end should be bould NULL terminated so add
2209 the second one here */
2212 chaine2[l_chaine2] = '\0';
2213 *string=(uint16 *)talloc_memdup(prs_get_mem_context(ps),chaine2,realloc_size);
2217 if(!prs_set_offset(ps, old_offset))
2223 /*******************************************************************
2224 Parse a DEVMODE structure and its relative pointer.
2225 ********************************************************************/
2227 static BOOL smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
2229 prs_struct *ps= &buffer->prs;
2231 prs_debug(ps, depth, desc, "smb_io_relsecdesc");
2234 if (MARSHALLING(ps)) {
2235 uint32 struct_offset = prs_offset(ps);
2236 uint32 relative_offset;
2239 relative_offset = 0;
2240 if (!prs_uint32("offset", ps, depth, &relative_offset))
2245 if (*secdesc != NULL) {
2246 buffer->string_at_end -= sec_desc_size(*secdesc);
2248 if(!prs_set_offset(ps, buffer->string_at_end))
2250 /* write the secdesc */
2251 if (!sec_io_desc(desc, secdesc, ps, depth))
2254 if(!prs_set_offset(ps, struct_offset))
2258 relative_offset=buffer->string_at_end - buffer->struct_start;
2259 /* write its offset */
2261 if (!prs_uint32("offset", ps, depth, &relative_offset))
2266 /* read the offset */
2267 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2270 old_offset = prs_offset(ps);
2271 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2275 if (!sec_io_desc(desc, secdesc, ps, depth))
2278 if(!prs_set_offset(ps, old_offset))
2284 /*******************************************************************
2285 Parse a DEVMODE structure and its relative pointer.
2286 ********************************************************************/
2288 static BOOL smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
2290 prs_struct *ps=&buffer->prs;
2292 prs_debug(ps, depth, desc, "smb_io_reldevmode");
2295 if (MARSHALLING(ps)) {
2296 uint32 struct_offset = prs_offset(ps);
2297 uint32 relative_offset;
2299 if (*devmode == NULL) {
2301 if (!prs_uint32("offset", ps, depth, &relative_offset))
2303 DEBUG(8, ("boing, the devmode was NULL\n"));
2308 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
2310 if(!prs_set_offset(ps, buffer->string_at_end))
2313 /* write the DEVMODE */
2314 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2317 if(!prs_set_offset(ps, struct_offset))
2320 relative_offset=buffer->string_at_end - buffer->struct_start;
2321 /* write its offset */
2322 if (!prs_uint32("offset", ps, depth, &relative_offset))
2328 /* read the offset */
2329 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2331 if (buffer->string_at_end == 0) {
2336 old_offset = prs_offset(ps);
2337 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2340 /* read the string */
2341 if((*devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE))) == NULL)
2343 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2346 if(!prs_set_offset(ps, old_offset))
2352 /*******************************************************************
2353 Parse a PRINTER_INFO_0 structure.
2354 ********************************************************************/
2356 BOOL smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2358 prs_struct *ps=&buffer->prs;
2360 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2363 buffer->struct_start=prs_offset(ps);
2365 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2367 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2370 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2372 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2374 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2377 if(!prs_uint16("year", ps, depth, &info->year))
2379 if(!prs_uint16("month", ps, depth, &info->month))
2381 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2383 if(!prs_uint16("day", ps, depth, &info->day))
2385 if(!prs_uint16("hour", ps, depth, &info->hour))
2387 if(!prs_uint16("minute", ps, depth, &info->minute))
2389 if(!prs_uint16("second", ps, depth, &info->second))
2391 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2394 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2396 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2399 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2401 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2403 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2405 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2407 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2409 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2411 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2413 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2415 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2417 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2419 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2421 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2423 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2425 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2427 if(!prs_uint32("status" , ps, depth, &info->status))
2429 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2431 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2433 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2435 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2437 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2439 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2441 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2443 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2445 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2447 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2453 /*******************************************************************
2454 Parse a PRINTER_INFO_1 structure.
2455 ********************************************************************/
2457 BOOL smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2459 prs_struct *ps=&buffer->prs;
2461 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2464 buffer->struct_start=prs_offset(ps);
2466 if (!prs_uint32("flags", ps, depth, &info->flags))
2468 if (!smb_io_relstr("description", buffer, depth, &info->description))
2470 if (!smb_io_relstr("name", buffer, depth, &info->name))
2472 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2478 /*******************************************************************
2479 Parse a PRINTER_INFO_2 structure.
2480 ********************************************************************/
2482 BOOL smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2484 prs_struct *ps=&buffer->prs;
2485 uint32 dm_offset, sd_offset, current_offset;
2486 uint32 dummy_value = 0;
2488 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2491 buffer->struct_start=prs_offset(ps);
2493 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2495 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2497 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2499 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2501 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2503 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2505 if (!smb_io_relstr("location", buffer, depth, &info->location))
2508 /* save current offset and wind forwared by a uint32 */
2509 dm_offset = prs_offset(ps);
2510 if (!prs_uint32("devmode", ps, depth, &dummy_value))
2513 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2515 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2517 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2519 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2522 /* save current offset for the sec_desc */
2523 sd_offset = prs_offset(ps);
2524 if (!prs_uint32("sec_desc", ps, depth, &dummy_value))
2528 /* save current location so we can pick back up here */
2529 current_offset = prs_offset(ps);
2531 /* parse the devmode */
2532 if (!prs_set_offset(ps, dm_offset))
2534 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2537 /* parse the sec_desc */
2538 if (!prs_set_offset(ps, sd_offset))
2540 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2543 /* pick up where we left off */
2544 if (!prs_set_offset(ps, current_offset))
2547 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2549 if (!prs_uint32("priority", ps, depth, &info->priority))
2551 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2553 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2555 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2557 if (!prs_uint32("status", ps, depth, &info->status))
2559 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2561 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2567 /*******************************************************************
2568 Parse a PRINTER_INFO_3 structure.
2569 ********************************************************************/
2571 BOOL smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2573 prs_struct *ps=&buffer->prs;
2575 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2578 buffer->struct_start=prs_offset(ps);
2580 if (!prs_uint32("flags", ps, depth, &info->flags))
2582 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2588 /*******************************************************************
2589 Parse a PRINTER_INFO_4 structure.
2590 ********************************************************************/
2592 BOOL smb_io_printer_info_4(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
2594 prs_struct *ps=&buffer->prs;
2596 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
2599 buffer->struct_start=prs_offset(ps);
2601 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2603 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2605 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2610 /*******************************************************************
2611 Parse a PRINTER_INFO_5 structure.
2612 ********************************************************************/
2614 BOOL smb_io_printer_info_5(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
2616 prs_struct *ps=&buffer->prs;
2618 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
2621 buffer->struct_start=prs_offset(ps);
2623 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2625 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2627 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2629 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
2631 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
2636 /*******************************************************************
2637 Parse a PORT_INFO_1 structure.
2638 ********************************************************************/
2640 BOOL smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2642 prs_struct *ps=&buffer->prs;
2644 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2647 buffer->struct_start=prs_offset(ps);
2649 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2655 /*******************************************************************
2656 Parse a PORT_INFO_2 structure.
2657 ********************************************************************/
2659 BOOL smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2661 prs_struct *ps=&buffer->prs;
2663 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2666 buffer->struct_start=prs_offset(ps);
2668 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2670 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2672 if (!smb_io_relstr("description", buffer, depth, &info->description))
2674 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2676 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2682 /*******************************************************************
2683 Parse a DRIVER_INFO_1 structure.
2684 ********************************************************************/
2686 BOOL smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2688 prs_struct *ps=&buffer->prs;
2690 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2693 buffer->struct_start=prs_offset(ps);
2695 if (!smb_io_relstr("name", buffer, depth, &info->name))
2701 /*******************************************************************
2702 Parse a DRIVER_INFO_2 structure.
2703 ********************************************************************/
2705 BOOL smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2707 prs_struct *ps=&buffer->prs;
2709 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2712 buffer->struct_start=prs_offset(ps);
2714 if (!prs_uint32("version", ps, depth, &info->version))
2716 if (!smb_io_relstr("name", buffer, depth, &info->name))
2718 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2720 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2722 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2724 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2730 /*******************************************************************
2731 Parse a DRIVER_INFO_3 structure.
2732 ********************************************************************/
2734 BOOL smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2736 prs_struct *ps=&buffer->prs;
2738 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2741 buffer->struct_start=prs_offset(ps);
2743 if (!prs_uint32("version", ps, depth, &info->version))
2745 if (!smb_io_relstr("name", buffer, depth, &info->name))
2747 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2749 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2751 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2753 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2755 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2758 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2761 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2763 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2769 /*******************************************************************
2770 Parse a DRIVER_INFO_6 structure.
2771 ********************************************************************/
2773 BOOL smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2775 prs_struct *ps=&buffer->prs;
2777 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2780 buffer->struct_start=prs_offset(ps);
2782 if (!prs_uint32("version", ps, depth, &info->version))
2784 if (!smb_io_relstr("name", buffer, depth, &info->name))
2786 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2788 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2790 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2792 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2794 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2797 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2800 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2802 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2805 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2808 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2810 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2813 if (!prs_uint32("padding", ps, depth, &info->padding))
2816 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2819 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2822 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2824 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2826 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2828 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2834 /*******************************************************************
2835 Parse a JOB_INFO_1 structure.
2836 ********************************************************************/
2838 BOOL smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2840 prs_struct *ps=&buffer->prs;
2842 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2845 buffer->struct_start=prs_offset(ps);
2847 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2849 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2851 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2853 if (!smb_io_relstr("username", buffer, depth, &info->username))
2855 if (!smb_io_relstr("document", buffer, depth, &info->document))
2857 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2859 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2861 if (!prs_uint32("status", ps, depth, &info->status))
2863 if (!prs_uint32("priority", ps, depth, &info->priority))
2865 if (!prs_uint32("position", ps, depth, &info->position))
2867 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2869 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2871 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2877 /*******************************************************************
2878 Parse a JOB_INFO_2 structure.
2879 ********************************************************************/
2881 BOOL smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2884 prs_struct *ps=&buffer->prs;
2886 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2889 buffer->struct_start=prs_offset(ps);
2891 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2893 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2895 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2897 if (!smb_io_relstr("username", buffer, depth, &info->username))
2899 if (!smb_io_relstr("document", buffer, depth, &info->document))
2901 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2903 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2906 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2908 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2910 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2912 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2914 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2917 /* SEC_DESC sec_desc;*/
2918 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2921 if (!prs_uint32("status",ps, depth, &info->status))
2923 if (!prs_uint32("priority",ps, depth, &info->priority))
2925 if (!prs_uint32("position",ps, depth, &info->position))
2927 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2929 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2931 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2933 if (!prs_uint32("size",ps, depth, &info->size))
2935 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2937 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2939 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2945 /*******************************************************************
2946 ********************************************************************/
2948 BOOL smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2950 prs_struct *ps=&buffer->prs;
2952 prs_debug(ps, depth, desc, "smb_io_form_1");
2955 buffer->struct_start=prs_offset(ps);
2957 if (!prs_uint32("flag", ps, depth, &info->flag))
2960 if (!smb_io_relstr("name", buffer, depth, &info->name))
2963 if (!prs_uint32("width", ps, depth, &info->width))
2965 if (!prs_uint32("length", ps, depth, &info->length))
2967 if (!prs_uint32("left", ps, depth, &info->left))
2969 if (!prs_uint32("top", ps, depth, &info->top))
2971 if (!prs_uint32("right", ps, depth, &info->right))
2973 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2979 /*******************************************************************
2980 Read/write a BUFFER struct.
2981 ********************************************************************/
2983 static BOOL spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
2985 NEW_BUFFER *buffer = *pp_buffer;
2987 prs_debug(ps, depth, desc, "spoolss_io_buffer");
2990 if (UNMARSHALLING(ps))
2991 buffer = *pp_buffer = (NEW_BUFFER *)prs_alloc_mem(ps, sizeof(NEW_BUFFER));
2996 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
3000 if (UNMARSHALLING(ps)) {
3002 buffer->string_at_end=0;
3004 if (buffer->ptr==0) {
3006 * JRA. I'm not sure if the data in here is in big-endian format if
3007 * the client is big-endian. Leave as default (little endian) for now.
3010 if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
3015 if (!prs_uint32("size", ps, depth, &buffer->size))
3019 * JRA. I'm not sure if the data in here is in big-endian format if
3020 * the client is big-endian. Leave as default (little endian) for now.
3023 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
3026 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
3029 if (!prs_set_offset(&buffer->prs, 0))
3032 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
3035 buffer->string_at_end=buffer->size;
3043 if (buffer->ptr==0) {
3044 /* We have finished with the data in buffer->prs - free it. */
3045 prs_mem_free(&buffer->prs);
3049 if (!prs_uint32("size", ps, depth, &buffer->size))
3052 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
3058 /* We have finished with the data in buffer->prs - free it. */
3059 prs_mem_free(&buffer->prs);
3065 /*******************************************************************
3066 move a BUFFER from the query to the reply.
3067 As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
3068 this is ok. This is an OPTIMIZATION and is not strictly neccessary.
3069 Clears the memory to zero also.
3070 ********************************************************************/
3072 void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
3074 prs_switch_type(&src->prs, MARSHALL);
3075 if(!prs_set_offset(&src->prs, 0))
3077 prs_force_dynamic(&src->prs);
3078 prs_mem_clear(&src->prs);
3082 /*******************************************************************
3083 Get the size of a BUFFER struct.
3084 ********************************************************************/
3086 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
3088 return (buffer->size);
3091 /*******************************************************************
3092 Parse a DRIVER_DIRECTORY_1 structure.
3093 ********************************************************************/
3095 BOOL smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
3097 prs_struct *ps=&buffer->prs;
3099 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
3102 buffer->struct_start=prs_offset(ps);
3104 if (!smb_io_unistr(desc, &info->name, ps, depth))
3110 /*******************************************************************
3111 Parse a PORT_INFO_1 structure.
3112 ********************************************************************/
3114 BOOL smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
3116 prs_struct *ps=&buffer->prs;
3118 prs_debug(ps, depth, desc, "smb_io_port_1");
3121 buffer->struct_start=prs_offset(ps);
3123 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
3129 /*******************************************************************
3130 Parse a PORT_INFO_2 structure.
3131 ********************************************************************/
3133 BOOL smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
3135 prs_struct *ps=&buffer->prs;
3137 prs_debug(ps, depth, desc, "smb_io_port_2");
3140 buffer->struct_start=prs_offset(ps);
3142 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
3144 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
3146 if(!smb_io_relstr("description", buffer, depth, &info->description))
3148 if(!prs_uint32("port_type", ps, depth, &info->port_type))
3150 if(!prs_uint32("reserved", ps, depth, &info->reserved))
3156 /*******************************************************************
3157 ********************************************************************/
3159 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
3161 prs_struct *ps=&buffer->prs;
3163 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
3166 buffer->struct_start=prs_offset(ps);
3168 if (smb_io_relstr("name", buffer, depth, &info->name))
3174 /*******************************************************************
3175 ********************************************************************/
3177 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
3179 prs_struct *ps=&buffer->prs;
3181 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
3184 buffer->struct_start=prs_offset(ps);
3186 if (smb_io_relstr("name", buffer, depth, &info->name))
3192 /*******************************************************************
3193 ********************************************************************/
3195 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
3197 prs_struct *ps=&buffer->prs;
3199 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
3202 buffer->struct_start=prs_offset(ps);
3204 if (!smb_io_relstr("name", buffer, depth, &info->name))
3210 /*******************************************************************
3211 ********************************************************************/
3213 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
3215 prs_struct *ps=&buffer->prs;
3217 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
3220 buffer->struct_start=prs_offset(ps);
3222 if (!smb_io_relstr("name", buffer, depth, &info->name))
3224 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
3226 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
3232 /*******************************************************************
3233 return the size required by a struct in the stream
3234 ********************************************************************/
3236 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
3240 size+=size_of_relative_string( &info->printername );
3241 size+=size_of_relative_string( &info->servername );
3243 size+=size_of_uint32( &info->cjobs);
3244 size+=size_of_uint32( &info->total_jobs);
3245 size+=size_of_uint32( &info->total_bytes);
3247 size+=size_of_uint16( &info->year);
3248 size+=size_of_uint16( &info->month);
3249 size+=size_of_uint16( &info->dayofweek);
3250 size+=size_of_uint16( &info->day);
3251 size+=size_of_uint16( &info->hour);
3252 size+=size_of_uint16( &info->minute);
3253 size+=size_of_uint16( &info->second);
3254 size+=size_of_uint16( &info->milliseconds);
3256 size+=size_of_uint32( &info->global_counter);
3257 size+=size_of_uint32( &info->total_pages);
3259 size+=size_of_uint16( &info->major_version);
3260 size+=size_of_uint16( &info->build_version);
3262 size+=size_of_uint32( &info->unknown7);
3263 size+=size_of_uint32( &info->unknown8);
3264 size+=size_of_uint32( &info->unknown9);
3265 size+=size_of_uint32( &info->session_counter);
3266 size+=size_of_uint32( &info->unknown11);
3267 size+=size_of_uint32( &info->printer_errors);
3268 size+=size_of_uint32( &info->unknown13);
3269 size+=size_of_uint32( &info->unknown14);
3270 size+=size_of_uint32( &info->unknown15);
3271 size+=size_of_uint32( &info->unknown16);
3272 size+=size_of_uint32( &info->change_id);
3273 size+=size_of_uint32( &info->unknown18);
3274 size+=size_of_uint32( &info->status);
3275 size+=size_of_uint32( &info->unknown20);
3276 size+=size_of_uint32( &info->c_setprinter);
3278 size+=size_of_uint16( &info->unknown22);
3279 size+=size_of_uint16( &info->unknown23);
3280 size+=size_of_uint16( &info->unknown24);
3281 size+=size_of_uint16( &info->unknown25);
3282 size+=size_of_uint16( &info->unknown26);
3283 size+=size_of_uint16( &info->unknown27);
3284 size+=size_of_uint16( &info->unknown28);
3285 size+=size_of_uint16( &info->unknown29);
3290 /*******************************************************************
3291 return the size required by a struct in the stream
3292 ********************************************************************/
3294 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
3298 size+=size_of_uint32( &info->flags );
3299 size+=size_of_relative_string( &info->description );
3300 size+=size_of_relative_string( &info->name );
3301 size+=size_of_relative_string( &info->comment );
3306 /*******************************************************************
3307 return the size required by a struct in the stream
3308 ********************************************************************/
3310 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
3316 size += sec_desc_size( info->secdesc );
3318 size+=size_of_device_mode( info->devmode );
3320 size+=size_of_relative_string( &info->servername );
3321 size+=size_of_relative_string( &info->printername );
3322 size+=size_of_relative_string( &info->sharename );
3323 size+=size_of_relative_string( &info->portname );
3324 size+=size_of_relative_string( &info->drivername );
3325 size+=size_of_relative_string( &info->comment );
3326 size+=size_of_relative_string( &info->location );
3328 size+=size_of_relative_string( &info->sepfile );
3329 size+=size_of_relative_string( &info->printprocessor );
3330 size+=size_of_relative_string( &info->datatype );
3331 size+=size_of_relative_string( &info->parameters );
3333 size+=size_of_uint32( &info->attributes );
3334 size+=size_of_uint32( &info->priority );
3335 size+=size_of_uint32( &info->defaultpriority );
3336 size+=size_of_uint32( &info->starttime );
3337 size+=size_of_uint32( &info->untiltime );
3338 size+=size_of_uint32( &info->status );
3339 size+=size_of_uint32( &info->cjobs );
3340 size+=size_of_uint32( &info->averageppm );
3343 * add any adjustments for alignment. This is
3344 * not optimal since we could be calling this
3345 * function from a loop (e.g. enumprinters), but
3346 * it is easier to maintain the calculation here and
3347 * not place the burden on the caller to remember. --jerry
3354 /*******************************************************************
3355 return the size required by a struct in the stream
3356 ********************************************************************/
3358 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
3362 size+=size_of_relative_string( &info->printername );
3363 size+=size_of_relative_string( &info->servername );
3365 size+=size_of_uint32( &info->attributes );
3369 /*******************************************************************
3370 return the size required by a struct in the stream
3371 ********************************************************************/
3373 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
3377 size+=size_of_relative_string( &info->printername );
3378 size+=size_of_relative_string( &info->portname );
3380 size+=size_of_uint32( &info->attributes );
3381 size+=size_of_uint32( &info->device_not_selected_timeout );
3382 size+=size_of_uint32( &info->transmission_retry_timeout );
3387 /*******************************************************************
3388 return the size required by a struct in the stream
3389 ********************************************************************/
3391 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
3393 /* The 4 is for the self relative pointer.. */
3394 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
3395 return 4 + (uint32)sec_desc_size( info->secdesc );
3398 /*******************************************************************
3399 return the size required by a struct in the stream
3400 ********************************************************************/
3402 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
3405 size+=size_of_relative_string( &info->name );
3410 /*******************************************************************
3411 return the size required by a struct in the stream
3412 ********************************************************************/
3414 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
3417 size+=size_of_uint32( &info->version );
3418 size+=size_of_relative_string( &info->name );
3419 size+=size_of_relative_string( &info->architecture );
3420 size+=size_of_relative_string( &info->driverpath );
3421 size+=size_of_relative_string( &info->datafile );
3422 size+=size_of_relative_string( &info->configfile );
3427 /*******************************************************************
3428 return the size required by a string array.
3429 ********************************************************************/
3431 uint32 spoolss_size_string_array(uint16 *string)
3436 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
3438 i=i+2; /* to count all chars including the leading zero */
3439 i=2*i; /* because we need the value in bytes */
3440 i=i+4; /* the offset pointer size */
3445 /*******************************************************************
3446 return the size required by a struct in the stream
3447 ********************************************************************/
3449 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3453 size+=size_of_uint32( &info->version );
3454 size+=size_of_relative_string( &info->name );
3455 size+=size_of_relative_string( &info->architecture );
3456 size+=size_of_relative_string( &info->driverpath );
3457 size+=size_of_relative_string( &info->datafile );
3458 size+=size_of_relative_string( &info->configfile );
3459 size+=size_of_relative_string( &info->helpfile );
3460 size+=size_of_relative_string( &info->monitorname );
3461 size+=size_of_relative_string( &info->defaultdatatype );
3463 size+=spoolss_size_string_array(info->dependentfiles);
3468 /*******************************************************************
3469 return the size required by a struct in the stream
3470 ********************************************************************/
3472 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3476 size+=size_of_uint32( &info->version );
3477 size+=size_of_relative_string( &info->name );
3478 size+=size_of_relative_string( &info->architecture );
3479 size+=size_of_relative_string( &info->driverpath );
3480 size+=size_of_relative_string( &info->datafile );
3481 size+=size_of_relative_string( &info->configfile );
3482 size+=size_of_relative_string( &info->helpfile );
3484 size+=spoolss_size_string_array(info->dependentfiles);
3486 size+=size_of_relative_string( &info->monitorname );
3487 size+=size_of_relative_string( &info->defaultdatatype );
3489 size+=spoolss_size_string_array(info->previousdrivernames);
3491 size+=size_of_nttime(&info->driver_date);
3492 size+=size_of_uint32( &info->padding );
3493 size+=size_of_uint32( &info->driver_version_low );
3494 size+=size_of_uint32( &info->driver_version_high );
3495 size+=size_of_relative_string( &info->mfgname );
3496 size+=size_of_relative_string( &info->oem_url );
3497 size+=size_of_relative_string( &info->hardware_id );
3498 size+=size_of_relative_string( &info->provider );
3503 /*******************************************************************
3504 return the size required by a struct in the stream
3505 ********************************************************************/
3507 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3510 size+=size_of_uint32( &info->jobid );
3511 size+=size_of_relative_string( &info->printername );
3512 size+=size_of_relative_string( &info->machinename );
3513 size+=size_of_relative_string( &info->username );
3514 size+=size_of_relative_string( &info->document );
3515 size+=size_of_relative_string( &info->datatype );
3516 size+=size_of_relative_string( &info->text_status );
3517 size+=size_of_uint32( &info->status );
3518 size+=size_of_uint32( &info->priority );
3519 size+=size_of_uint32( &info->position );
3520 size+=size_of_uint32( &info->totalpages );
3521 size+=size_of_uint32( &info->pagesprinted );
3522 size+=size_of_systemtime( &info->submitted );
3527 /*******************************************************************
3528 return the size required by a struct in the stream
3529 ********************************************************************/
3531 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3535 size+=4; /* size of sec desc ptr */
3537 size+=size_of_uint32( &info->jobid );
3538 size+=size_of_relative_string( &info->printername );
3539 size+=size_of_relative_string( &info->machinename );
3540 size+=size_of_relative_string( &info->username );
3541 size+=size_of_relative_string( &info->document );
3542 size+=size_of_relative_string( &info->notifyname );
3543 size+=size_of_relative_string( &info->datatype );
3544 size+=size_of_relative_string( &info->printprocessor );
3545 size+=size_of_relative_string( &info->parameters );
3546 size+=size_of_relative_string( &info->drivername );
3547 size+=size_of_device_mode( info->devmode );
3548 size+=size_of_relative_string( &info->text_status );
3549 /* SEC_DESC sec_desc;*/
3550 size+=size_of_uint32( &info->status );
3551 size+=size_of_uint32( &info->priority );
3552 size+=size_of_uint32( &info->position );
3553 size+=size_of_uint32( &info->starttime );
3554 size+=size_of_uint32( &info->untiltime );
3555 size+=size_of_uint32( &info->totalpages );
3556 size+=size_of_uint32( &info->size );
3557 size+=size_of_systemtime( &info->submitted );
3558 size+=size_of_uint32( &info->timeelapsed );
3559 size+=size_of_uint32( &info->pagesprinted );
3564 /*******************************************************************
3565 return the size required by a struct in the stream
3566 ********************************************************************/
3568 uint32 spoolss_size_form_1(FORM_1 *info)
3572 size+=size_of_uint32( &info->flag );
3573 size+=size_of_relative_string( &info->name );
3574 size+=size_of_uint32( &info->width );
3575 size+=size_of_uint32( &info->length );
3576 size+=size_of_uint32( &info->left );
3577 size+=size_of_uint32( &info->top );
3578 size+=size_of_uint32( &info->right );
3579 size+=size_of_uint32( &info->bottom );
3584 /*******************************************************************
3585 return the size required by a struct in the stream
3586 ********************************************************************/
3588 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3592 size+=size_of_relative_string( &info->port_name );
3597 /*******************************************************************
3598 return the size required by a struct in the stream
3599 ********************************************************************/
3601 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3605 size=str_len_uni(&info->name); /* the string length */
3606 size=size+1; /* add the leading zero */
3607 size=size*2; /* convert in char */
3612 /*******************************************************************
3613 return the size required by a struct in the stream
3614 ********************************************************************/
3616 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3620 size=str_len_uni(&info->name); /* the string length */
3621 size=size+1; /* add the leading zero */
3622 size=size*2; /* convert in char */
3627 /*******************************************************************
3628 return the size required by a struct in the stream
3629 ********************************************************************/
3631 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3635 size+=size_of_relative_string( &info->port_name );
3636 size+=size_of_relative_string( &info->monitor_name );
3637 size+=size_of_relative_string( &info->description );
3639 size+=size_of_uint32( &info->port_type );
3640 size+=size_of_uint32( &info->reserved );
3645 /*******************************************************************
3646 return the size required by a struct in the stream
3647 ********************************************************************/
3649 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3652 size+=size_of_relative_string( &info->name );
3657 /*******************************************************************
3658 return the size required by a struct in the stream
3659 ********************************************************************/
3661 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3664 size+=size_of_relative_string( &info->name );
3669 /*******************************************************************
3670 return the size required by a struct in the stream
3671 ********************************************************************/
3672 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3679 /* uint32(offset) + uint32(length) + length) */
3680 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3681 size += (size_of_uint32(&p->data_len)*2) + p->data_len;
3683 size += size_of_uint32(&p->type);
3688 /*******************************************************************
3689 return the size required by a struct in the stream
3690 ********************************************************************/
3692 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3695 size+=size_of_relative_string( &info->name );
3700 /*******************************************************************
3701 return the size required by a struct in the stream
3702 ********************************************************************/
3704 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3707 size+=size_of_relative_string( &info->name);
3708 size+=size_of_relative_string( &info->environment);
3709 size+=size_of_relative_string( &info->dll_name);
3714 /*******************************************************************
3716 ********************************************************************/
3718 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3719 const POLICY_HND *hnd,
3720 const fstring architecture,
3721 uint32 level, uint32 clientmajor, uint32 clientminor,
3722 NEW_BUFFER *buffer, uint32 offered)
3727 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3729 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3732 q_u->clientmajorversion=clientmajor;
3733 q_u->clientminorversion=clientminor;
3736 q_u->offered=offered;
3741 /*******************************************************************
3743 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3744 ********************************************************************/
3746 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3748 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3754 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3756 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3758 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3763 if(!prs_uint32("level", ps, depth, &q_u->level))
3766 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3772 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3775 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3777 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3783 /*******************************************************************
3785 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3786 ********************************************************************/
3788 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3790 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3796 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3801 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3803 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3805 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3807 if (!prs_werror("status", ps, depth, &r_u->status))
3813 /*******************************************************************
3815 ********************************************************************/
3817 BOOL make_spoolss_q_enumprinters(
3818 SPOOL_Q_ENUMPRINTERS *q_u,
3828 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3829 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3833 q_u->offered=offered;
3838 /*******************************************************************
3840 ********************************************************************/
3842 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3843 fstring servername, uint32 level,
3844 NEW_BUFFER *buffer, uint32 offered)
3846 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3847 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3851 q_u->offered=offered;
3856 /*******************************************************************
3858 * called from spoolss_enumprinters (srv_spoolss.c)
3859 ********************************************************************/
3861 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3863 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3869 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3871 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3874 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3879 if (!prs_uint32("level", ps, depth, &q_u->level))
3882 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3887 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3893 /*******************************************************************
3894 Parse a SPOOL_R_ENUMPRINTERS structure.
3895 ********************************************************************/
3897 BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3899 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3905 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3911 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3914 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3917 if (!prs_werror("status", ps, depth, &r_u->status))
3923 /*******************************************************************
3924 * write a structure.
3925 * called from spoolss_r_enum_printers (srv_spoolss.c)
3927 ********************************************************************/
3929 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3931 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3937 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3943 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3946 if (!prs_werror("status", ps, depth, &r_u->status))
3952 /*******************************************************************
3954 * called from spoolss_getprinter (srv_spoolss.c)
3955 ********************************************************************/
3957 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3959 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3965 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3967 if (!prs_uint32("level", ps, depth, &q_u->level))
3970 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3975 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3981 /*******************************************************************
3983 ********************************************************************/
3985 BOOL make_spoolss_q_getprinter(
3986 TALLOC_CTX *mem_ctx,
3987 SPOOL_Q_GETPRINTER *q_u,
3988 const POLICY_HND *hnd,
3998 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4002 q_u->offered=offered;
4007 /*******************************************************************
4009 ********************************************************************/
4010 BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
4011 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
4015 DEVICEMODE *devmode;
4020 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4023 q_u->info.level = level;
4024 q_u->info.info_ptr = (info != NULL) ? 1 : 0;
4027 /* There's no such thing as a setprinter level 1 */
4030 secdesc = info->printers_2->secdesc;
4031 devmode = info->printers_2->devmode;
4033 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
4034 #if 1 /* JERRY TEST */
4035 q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
4036 if (!q_u->secdesc_ctr)
4038 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
4039 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
4040 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
4041 q_u->secdesc_ctr->sec = secdesc;
4043 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
4044 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
4045 q_u->devmode_ctr.devmode = devmode;
4047 q_u->secdesc_ctr = NULL;
4049 q_u->devmode_ctr.devmode_ptr = 0;
4050 q_u->devmode_ctr.size = 0;
4051 q_u->devmode_ctr.devmode = NULL;
4055 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
4060 q_u->command = command;
4066 /*******************************************************************
4067 ********************************************************************/
4069 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
4071 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
4077 if(!prs_werror("status", ps, depth, &r_u->status))
4083 /*******************************************************************
4084 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
4085 ********************************************************************/
4087 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
4089 uint32 ptr_sec_desc = 0;
4091 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
4097 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
4099 if(!prs_uint32("level", ps, depth, &q_u->level))
4102 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4105 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4115 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4120 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4126 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4131 /* Parse a NULL security descriptor. This should really
4132 happen inside the sec_io_desc_buf() function. */
4134 prs_debug(ps, depth, "", "sec_io_desc_buf");
4135 if (!prs_uint32("size", ps, depth + 1, &dummy))
4137 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
4141 if(!prs_uint32("command", ps, depth, &q_u->command))
4147 /*******************************************************************
4148 ********************************************************************/
4150 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
4152 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
4158 if(!prs_werror("status", ps, depth, &r_u->status))
4164 /*******************************************************************
4165 ********************************************************************/
4167 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
4170 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
4176 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4183 /*******************************************************************
4184 ********************************************************************/
4186 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
4188 prs_debug(ps, depth, desc, "");
4194 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4200 if(!prs_uint32("needed", ps, depth, &r_u->needed))
4203 if(!prs_werror("status", ps, depth, &r_u->status))
4209 /*******************************************************************
4210 ********************************************************************/
4212 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
4214 prs_debug(ps, depth, desc, "");
4220 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
4222 if(!prs_uint32("level", ps, depth, &q_u->level))
4225 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4231 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4237 /*******************************************************************
4238 ********************************************************************/
4240 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
4242 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
4248 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4254 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4257 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4260 if (!prs_werror("status", ps, depth, &r_u->status))
4266 /*******************************************************************
4267 ********************************************************************/
4269 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
4280 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4281 q_u->firstjob = firstjob;
4282 q_u->numofjobs = numofjobs;
4284 q_u->buffer= buffer;
4285 q_u->offered = offered;
4289 /*******************************************************************
4290 ********************************************************************/
4292 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
4294 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
4300 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
4303 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
4305 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
4307 if (!prs_uint32("level", ps, depth, &q_u->level))
4310 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4316 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4322 /*******************************************************************
4323 ********************************************************************/
4325 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
4327 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
4333 if(!prs_werror("status", ps, depth, &r_u->status))
4339 /*******************************************************************
4340 ********************************************************************/
4342 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
4344 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
4350 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4352 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4358 /*******************************************************************
4359 ********************************************************************/
4361 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
4363 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
4369 if(!prs_werror("status", ps, depth, &r_u->status))
4375 /*******************************************************************
4376 ********************************************************************/
4378 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
4380 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
4386 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4388 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4391 * level is usually 0. If (level!=0) then I'm in trouble !
4392 * I will try to generate setjob command with level!=0, one day.
4394 if(!prs_uint32("level", ps, depth, &q_u->level))
4396 if(!prs_uint32("command", ps, depth, &q_u->command))
4402 /*******************************************************************
4403 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4404 ********************************************************************/
4406 BOOL spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
4408 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
4414 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4420 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4423 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4426 if (!prs_werror("status", ps, depth, &r_u->status))
4432 /*******************************************************************
4434 ********************************************************************/
4436 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4438 const char *environment,
4440 NEW_BUFFER *buffer, uint32 offered)
4442 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4443 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4447 q_u->offered=offered;
4452 /*******************************************************************
4453 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4454 ********************************************************************/
4456 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4459 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4465 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4467 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4472 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4474 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4479 if (!prs_uint32("level", ps, depth, &q_u->level))
4482 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4488 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4494 /*******************************************************************
4495 ********************************************************************/
4497 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4500 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4505 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4507 if (!prs_uint32("level", ps, depth, &q_u->level))
4510 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4515 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4521 /*******************************************************************
4522 ********************************************************************/
4524 BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4526 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4532 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4538 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4541 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4544 if (!prs_werror("status", ps, depth, &r_u->status))
4550 /*******************************************************************
4551 ********************************************************************/
4553 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4556 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4561 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4563 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4569 if (!prs_uint32("level", ps, depth, &q_u->level))
4572 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4577 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4583 /*******************************************************************
4584 ********************************************************************/
4586 BOOL spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4588 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4594 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4600 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4603 if (!prs_werror("status", ps, depth, &r_u->status))
4609 /*******************************************************************
4610 Parse a SPOOL_R_ENUMPORTS structure.
4611 ********************************************************************/
4613 BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4615 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4621 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4627 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4630 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4633 if (!prs_werror("status", ps, depth, &r_u->status))
4639 /*******************************************************************
4640 ********************************************************************/
4642 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4644 prs_debug(ps, depth, desc, "");
4650 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4652 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4657 if (!prs_uint32("level", ps, depth, &q_u->level))
4660 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4665 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4671 /*******************************************************************
4672 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4673 ********************************************************************/
4675 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4677 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4683 if(!prs_uint32("flags", ps, depth, &il->flags))
4685 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4687 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4689 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4692 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4694 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4696 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4702 /*******************************************************************
4703 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4704 ********************************************************************/
4706 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4708 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4714 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4720 /*******************************************************************
4721 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4722 ********************************************************************/
4724 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4726 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4732 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4734 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4736 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4738 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4741 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4743 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4745 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4747 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4749 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4751 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4753 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4755 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4757 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4760 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4762 if(!prs_uint32("priority", ps, depth, &il->priority))
4764 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4766 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4768 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4770 if(!prs_uint32("status", ps, depth, &il->status))
4772 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4774 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4777 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4779 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4781 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4783 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4785 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4787 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4789 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4791 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4793 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4795 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4797 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4803 /*******************************************************************
4804 ********************************************************************/
4806 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4808 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4813 if(!prs_uint32("level", ps, depth, &il->level))
4815 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4818 /* if no struct inside just return */
4819 if (il->info_ptr==0) {
4820 if (UNMARSHALLING(ps)) {
4827 switch (il->level) {
4829 * level 0 is used by setprinter when managing the queue
4830 * (hold, stop, start a queue)
4834 /* DOCUMENT ME!!! What is level 1 used for? */
4837 if (UNMARSHALLING(ps)) {
4838 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4841 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4846 * level 2 is used by addprinter
4847 * and by setprinter when updating printer's info
4850 if (UNMARSHALLING(ps)) {
4851 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4854 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4857 /* DOCUMENT ME!!! What is level 3 used for? */
4860 if (UNMARSHALLING(ps)) {
4861 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4864 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4873 /*******************************************************************
4874 ********************************************************************/
4876 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4878 uint32 ptr_sec_desc = 0;
4880 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4885 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4887 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4893 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4896 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4899 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4905 switch (q_u->level) {
4907 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4910 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4914 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4919 /* Parse a NULL security descriptor. This should really
4920 happen inside the sec_io_desc_buf() function. */
4922 prs_debug(ps, depth, "", "sec_io_desc_buf");
4923 if (!prs_uint32("size", ps, depth + 1, &dummy))
4925 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
4929 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4931 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4937 /*******************************************************************
4938 ********************************************************************/
4940 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4941 prs_struct *ps, int depth)
4943 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4946 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4949 if(!prs_werror("status", ps, depth, &r_u->status))
4955 /*******************************************************************
4956 ********************************************************************/
4958 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4959 prs_struct *ps, int depth)
4961 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4963 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4967 if (UNMARSHALLING(ps)) {
4968 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4980 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4982 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4984 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4986 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4988 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4990 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4992 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4994 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4996 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4998 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
5000 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
5006 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
5008 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
5010 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
5012 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
5014 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
5016 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
5018 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
5020 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
5026 if (il->dependentfiles_ptr)
5027 smb_io_buffer5("", &il->dependentfiles, ps, depth);
5032 /*******************************************************************
5033 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
5034 ********************************************************************/
5036 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
5037 prs_struct *ps, int depth)
5039 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
5041 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
5045 if (UNMARSHALLING(ps)) {
5046 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
5059 * I know this seems weird, but I have no other explanation.
5060 * This is observed behavior on both NT4 and 2K servers.
5064 if (!prs_align_uint64(ps))
5067 /* parse the main elements the packet */
5069 if(!prs_uint32("cversion ", ps, depth, &il->version))
5071 if(!prs_uint32("name ", ps, depth, &il->name_ptr))
5073 if(!prs_uint32("environment ", ps, depth, &il->environment_ptr))
5075 if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
5077 if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
5079 if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
5081 if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
5083 if(!prs_uint32("monitorname ", ps, depth, &il->monitorname_ptr))
5085 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
5087 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_len))
5089 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_ptr))
5091 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_len))
5093 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_ptr))
5095 if(!smb_io_time("driverdate ", &il->driverdate, ps, depth))
5097 if(!prs_uint32("dummy4 ", ps, depth, &il->dummy4))
5099 if(!prs_uint64("driverversion ", ps, depth, &il->driverversion))
5101 if(!prs_uint32("mfgname ", ps, depth, &il->mfgname_ptr))
5103 if(!prs_uint32("oemurl ", ps, depth, &il->oemurl_ptr))
5105 if(!prs_uint32("hardwareid ", ps, depth, &il->hardwareid_ptr))
5107 if(!prs_uint32("provider ", ps, depth, &il->provider_ptr))
5110 /* parse the structures in the packet */
5112 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
5117 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
5122 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
5127 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
5132 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
5137 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
5142 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
5147 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
5151 if (il->dependentfiles_ptr) {
5152 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
5157 if (il->previousnames_ptr) {
5158 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
5163 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
5167 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
5171 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
5175 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
5181 /*******************************************************************
5182 convert a buffer of UNICODE strings null terminated
5183 the buffer is terminated by a NULL
5185 convert to an dos codepage array (null terminated)
5187 dynamically allocate memory
5189 ********************************************************************/
5190 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
5199 src = (char *)buf5->buffer;
5202 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
5203 rpcstr_pull(f, src, sizeof(f)-1, 0, 0);
5204 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
5205 tar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
5210 fstrcpy((*ar)[n], f);
5213 fstrcpy((*ar)[n], "");
5221 /*******************************************************************
5222 read a UNICODE array with null terminated strings
5223 and null terminated array
5224 and size of array at beginning
5225 ********************************************************************/
5227 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
5229 if (buffer==NULL) return False;
5232 buffer->uni_str_len=buffer->uni_max_len;
5234 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
5237 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
5243 /*******************************************************************
5244 ********************************************************************/
5246 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
5248 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
5253 if(!prs_uint32("level", ps, depth, &il->level))
5255 if(!prs_uint32("ptr", ps, depth, &il->ptr))
5261 switch (il->level) {
5263 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
5267 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
5277 /*******************************************************************
5278 init a SPOOL_Q_ADDPRINTERDRIVER struct
5279 ******************************************************************/
5281 BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
5282 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
5283 uint32 level, PRINTER_DRIVER_CTR *info)
5285 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
5287 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
5288 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
5292 q_u->info.level = level;
5293 q_u->info.ptr = (info!=NULL)?1:0;
5296 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
5298 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
5302 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
5309 BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
5310 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
5311 DRIVER_INFO_3 *info3)
5314 uint16 *ptr = info3->dependentfiles;
5316 BOOL null_char = False;
5317 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
5319 if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3))))
5322 inf->cversion = info3->version;
5323 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
5324 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
5325 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
5326 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
5327 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
5328 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
5329 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
5330 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
5332 init_unistr2_from_unistr(&inf->name, &info3->name);
5333 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
5334 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
5335 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
5336 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
5337 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
5338 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
5339 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
5346 /* the null_char BOOL is used to help locate
5347 two '\0's back to back */
5362 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
5363 inf->dependentfilessize = len;
5364 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
5370 *spool_drv_info = inf;
5375 /*******************************************************************
5376 make a BUFFER5 struct from a uint16*
5377 ******************************************************************/
5378 BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
5381 buf5->buf_len = len;
5382 if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
5384 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5391 /*******************************************************************
5392 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5393 ********************************************************************/
5395 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5397 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
5403 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5405 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5410 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5413 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5419 /*******************************************************************
5420 ********************************************************************/
5422 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5424 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
5427 if(!prs_werror("status", ps, depth, &q_u->status))
5433 /*******************************************************************
5434 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5435 ********************************************************************/
5437 BOOL spoolss_io_q_addprinterdriverex(char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5439 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
5445 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5447 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5452 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5455 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5460 if(!prs_uint32("copy flags", ps, depth, &q_u->copy_flags))
5466 /*******************************************************************
5467 ********************************************************************/
5469 BOOL spoolss_io_r_addprinterdriverex(char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5471 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
5474 if(!prs_werror("status", ps, depth, &q_u->status))
5480 /*******************************************************************
5481 ********************************************************************/
5483 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5484 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5486 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5488 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5492 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
5500 d->cversion=uni->cversion;
5502 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5503 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5504 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5505 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5506 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5507 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5508 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5509 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5511 DEBUGADD(8,( "version: %d\n", d->cversion));
5512 DEBUGADD(8,( "name: %s\n", d->name));
5513 DEBUGADD(8,( "environment: %s\n", d->environment));
5514 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5515 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5516 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5517 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5518 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5519 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5521 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5528 /*******************************************************************
5529 ********************************************************************/
5530 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5531 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5533 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5535 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5539 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
5547 d->version=uni->version;
5549 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5550 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5551 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5552 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5553 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5554 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5555 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5556 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5558 DEBUGADD(8,( "version: %d\n", d->version));
5559 DEBUGADD(8,( "name: %s\n", d->name));
5560 DEBUGADD(8,( "environment: %s\n", d->environment));
5561 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5562 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5563 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5564 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5565 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5566 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5568 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5570 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5580 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5581 NT_PRINTER_INFO_LEVEL_2 **asc)
5583 NT_PRINTER_INFO_LEVEL_2 *d;
5586 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5587 time_unix=time(NULL);
5590 DEBUGADD(8,("allocating memory\n"));
5592 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
5597 /* we allocate memory iff called from
5598 * addprinter(ex) so we can do one time stuff here.
5600 (*asc)->setuptime=time_unix;
5603 DEBUGADD(8,("start converting\n"));
5607 d->attributes=uni->attributes;
5608 d->priority=uni->priority;
5609 d->default_priority=uni->default_priority;
5610 d->starttime=uni->starttime;
5611 d->untiltime=uni->untiltime;
5612 d->status=uni->status;
5613 d->cjobs=uni->cjobs;
5615 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5616 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5617 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5618 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5619 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5620 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5621 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5622 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5623 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5624 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5625 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5630 /*******************************************************************
5632 ********************************************************************/
5634 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5635 fstring servername, fstring env_name, uint32 level,
5636 NEW_BUFFER *buffer, uint32 offered)
5638 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5639 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5643 q_u->offered=offered;
5648 /*******************************************************************
5649 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5650 ********************************************************************/
5652 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5654 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5659 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5661 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5667 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5669 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5675 if(!prs_uint32("level", ps, depth, &q_u->level))
5678 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5684 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5690 /*******************************************************************
5691 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5692 ********************************************************************/
5694 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5696 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5702 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5708 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5711 if (!prs_werror("status", ps, depth, &r_u->status))
5717 /*******************************************************************
5718 ********************************************************************/
5720 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5722 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5728 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5734 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5737 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5740 if (!prs_werror("status", ps, depth, &r_u->status))
5746 /*******************************************************************
5747 ********************************************************************/
5749 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5751 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5757 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5759 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5765 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5767 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5773 if (!prs_uint32("level", ps, depth, &q_u->level))
5776 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5782 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5788 /*******************************************************************
5789 ********************************************************************/
5791 BOOL spoolss_io_q_addprintprocessor(char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5793 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5799 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5801 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5806 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5811 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5816 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5822 /*******************************************************************
5823 ********************************************************************/
5825 BOOL spoolss_io_r_addprintprocessor(char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5827 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5833 if (!prs_werror("status", ps, depth, &r_u->status))
5839 /*******************************************************************
5840 ********************************************************************/
5842 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5844 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5850 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5856 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5859 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5862 if (!prs_werror("status", ps, depth, &r_u->status))
5868 /*******************************************************************
5869 ********************************************************************/
5871 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5873 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5879 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5881 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5887 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5889 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5895 if (!prs_uint32("level", ps, depth, &q_u->level))
5898 if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
5904 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5910 /*******************************************************************
5911 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5912 ********************************************************************/
5914 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5916 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5922 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5924 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5930 if (!prs_uint32("level", ps, depth, &q_u->level))
5933 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5939 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5945 /*******************************************************************
5946 ********************************************************************/
5948 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5950 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5956 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5962 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5965 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5968 if (!prs_werror("status", ps, depth, &r_u->status))
5974 /*******************************************************************
5975 ********************************************************************/
5977 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5979 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5984 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5987 if (UNMARSHALLING(ps) && r_u->valuesize) {
5988 r_u->value = (uint16 *)prs_alloc_mem(ps, r_u->valuesize * 2);
5990 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
5995 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
6001 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
6004 if(!prs_uint32("type", ps, depth, &r_u->type))
6007 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
6010 if (UNMARSHALLING(ps) && r_u->datasize) {
6011 r_u->data = (uint8 *)prs_alloc_mem(ps, r_u->datasize);
6013 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
6018 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
6023 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
6025 if(!prs_werror("status", ps, depth, &r_u->status))
6031 /*******************************************************************
6032 ********************************************************************/
6034 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
6036 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
6041 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6043 if(!prs_uint32("index", ps, depth, &q_u->index))
6045 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
6047 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
6053 /*******************************************************************
6054 ********************************************************************/
6056 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
6057 const POLICY_HND *hnd,
6058 uint32 idx, uint32 valuelen, uint32 datalen)
6060 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6062 q_u->valuesize=valuelen;
6063 q_u->datasize=datalen;
6068 /*******************************************************************
6069 ********************************************************************/
6070 BOOL make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
6071 char* value, char* data, uint32 data_size)
6073 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6075 init_unistr2(&q_u->value, value, strlen(value)+1);
6077 q_u->max_len = q_u->real_len = data_size;
6082 /*******************************************************************
6083 ********************************************************************/
6085 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
6087 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
6092 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6094 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6100 if(!prs_uint32("type", ps, depth, &q_u->type))
6103 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6113 if (UNMARSHALLING(ps))
6114 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
6115 if(q_u->data == NULL)
6117 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6125 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6131 /*******************************************************************
6132 ********************************************************************/
6134 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
6136 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
6141 if(!prs_werror("status", ps, depth, &r_u->status))
6147 /*******************************************************************
6148 ********************************************************************/
6149 BOOL spoolss_io_q_resetprinter(char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
6151 prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
6156 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6159 if (!prs_uint32("datatype_ptr", ps, depth, &q_u->datatype_ptr))
6162 if (q_u->datatype_ptr) {
6163 if (!smb_io_unistr2("datatype", &q_u->datatype, q_u->datatype_ptr?True:False, ps, depth))
6167 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
6174 /*******************************************************************
6175 ********************************************************************/
6176 BOOL spoolss_io_r_resetprinter(char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
6178 prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
6183 if(!prs_werror("status", ps, depth, &r_u->status))
6189 /*******************************************************************
6190 ********************************************************************/
6191 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
6192 uint32 type, const uint8 *data, uint32 len)
6194 DEBUG(5,("converting a specific param struct\n"));
6198 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
6201 memset((char *)*param, '\0', sizeof(NT_PRINTER_PARAM));
6202 DEBUGADD(6,("Allocated a new PARAM struct\n"));
6204 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
6205 (*param)->type = type;
6207 /* le champ data n'est pas NULL termine */
6208 /* on stocke donc la longueur */
6210 (*param)->data_len=len;
6213 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
6214 if((*param)->data == NULL)
6216 memcpy((*param)->data, data, len);
6219 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
6220 dump_data(10, (char *)(*param)->data, (*param)->data_len);
6225 /*******************************************************************
6226 ********************************************************************/
6228 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
6230 prs_debug(ps, depth, desc, "spoolss_io_addform");
6237 if(!prs_uint32("flags", ps, depth, &f->flags))
6239 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
6241 if(!prs_uint32("size_x", ps, depth, &f->size_x))
6243 if(!prs_uint32("size_y", ps, depth, &f->size_y))
6245 if(!prs_uint32("left", ps, depth, &f->left))
6247 if(!prs_uint32("top", ps, depth, &f->top))
6249 if(!prs_uint32("right", ps, depth, &f->right))
6251 if(!prs_uint32("bottom", ps, depth, &f->bottom))
6254 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
6261 /*******************************************************************
6262 ********************************************************************/
6264 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
6266 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
6271 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6273 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
6279 /*******************************************************************
6280 ********************************************************************/
6282 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
6284 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
6289 if(!prs_werror("status", ps, depth, &r_u->status))
6295 /*******************************************************************
6296 ********************************************************************/
6298 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
6300 uint32 useless_ptr=1;
6301 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
6306 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6308 if(!prs_uint32("level", ps, depth, &q_u->level))
6310 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6315 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6317 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6324 /*******************************************************************
6325 ********************************************************************/
6327 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
6329 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
6334 if(!prs_werror("status", ps, depth, &r_u->status))
6340 /*******************************************************************
6341 ********************************************************************/
6343 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
6345 uint32 useless_ptr=1;
6346 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
6351 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6353 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
6359 if(!prs_uint32("level", ps, depth, &q_u->level))
6361 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6366 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6368 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6375 /*******************************************************************
6376 ********************************************************************/
6378 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
6380 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
6385 if(!prs_werror("status", ps, depth, &r_u->status))
6391 /*******************************************************************
6392 Parse a SPOOL_R_GETJOB structure.
6393 ********************************************************************/
6395 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
6397 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
6403 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
6409 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6412 if (!prs_werror("status", ps, depth, &r_u->status))
6418 /*******************************************************************
6419 Parse a SPOOL_Q_GETJOB structure.
6420 ********************************************************************/
6422 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
6424 prs_debug(ps, depth, desc, "");
6430 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6432 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
6434 if(!prs_uint32("level", ps, depth, &q_u->level))
6437 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
6443 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6449 void free_devmode(DEVICEMODE *devmode)
6451 if (devmode!=NULL) {
6452 SAFE_FREE(devmode->private);
6457 void free_printer_info_1(PRINTER_INFO_1 *printer)
6462 void free_printer_info_2(PRINTER_INFO_2 *printer)
6464 if (printer!=NULL) {
6465 free_devmode(printer->devmode);
6466 printer->devmode = NULL;
6471 void free_printer_info_3(PRINTER_INFO_3 *printer)
6476 void free_printer_info_4(PRINTER_INFO_4 *printer)
6481 void free_printer_info_5(PRINTER_INFO_5 *printer)
6486 void free_job_info_2(JOB_INFO_2 *job)
6489 free_devmode(job->devmode);
6492 /*******************************************************************
6494 ********************************************************************/
6496 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
6497 const fstring string, uint32 printer, uint32 type)
6502 init_unistr2(&q_u->string, string, strlen(string)+1);
6504 q_u->printer=printer;
6513 /*******************************************************************
6514 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6515 ********************************************************************/
6517 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
6519 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
6525 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
6531 if(!prs_uint32("printer", ps, depth, &q_u->printer))
6533 if(!prs_uint32("type", ps, depth, &q_u->type))
6536 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6538 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6544 /*******************************************************************
6545 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6546 ********************************************************************/
6548 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
6550 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
6556 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6559 if (!prs_werror("status", ps, depth, &r_u->status))
6565 /*******************************************************************
6567 ********************************************************************/
6568 BOOL make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd,
6569 uint32 condition, uint32 change_id)
6572 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6574 q_u->condition = condition;
6575 q_u->change_id = change_id;
6578 q_u->unknown1 = 0x1;
6579 memset(q_u->unknown2, 0x0, 5);
6580 q_u->unknown2[0] = 0x1;
6585 /*******************************************************************
6586 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6587 ********************************************************************/
6588 BOOL spoolss_io_q_routerreplyprinter (char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
6591 prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
6597 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6600 if (!prs_uint32("condition", ps, depth, &q_u->condition))
6603 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6606 if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
6609 if (!prs_uint8s(False, "private", ps, depth, q_u->unknown2, 5))
6615 /*******************************************************************
6616 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6617 ********************************************************************/
6618 BOOL spoolss_io_r_routerreplyprinter (char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
6620 prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
6626 if (!prs_werror("status", ps, depth, &r_u->status))
6632 /*******************************************************************
6634 ********************************************************************/
6636 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6641 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6646 /*******************************************************************
6647 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6648 ********************************************************************/
6650 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6652 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6658 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6664 /*******************************************************************
6665 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6666 ********************************************************************/
6668 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6670 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6676 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6679 if (!prs_werror("status", ps, depth, &r_u->status))
6685 #if 0 /* JERRY - not currently used but could be :-) */
6687 /*******************************************************************
6688 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6689 ******************************************************************/
6690 static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
6691 SPOOL_NOTIFY_INFO_DATA *src, int n)
6695 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
6697 for (i=0; i<n; i++) {
6701 if (src->size != POINTER)
6703 len = src->notify_data.data.length;
6704 s = malloc(sizeof(uint16)*len);
6706 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6710 memcpy(s, src->notify_data.data.string, len*2);
6711 dst->notify_data.data.string = s;
6717 /*******************************************************************
6718 Deep copy a SPOOL_NOTIFY_INFO structure
6719 ******************************************************************/
6720 static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
6723 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6727 dst->version = src->version;
6728 dst->flags = src->flags;
6729 dst->count = src->count;
6733 dst->data = malloc(dst->count * sizeof(SPOOL_NOTIFY_INFO_DATA));
6735 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6738 if (dst->data == NULL) {
6739 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6744 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
6751 /*******************************************************************
6753 ********************************************************************/
6755 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6756 uint32 change_low, uint32 change_high,
6757 SPOOL_NOTIFY_INFO *info)
6762 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6764 q_u->change_low=change_low;
6765 q_u->change_high=change_high;
6770 q_u->info_ptr=0x0FF0ADDE;
6772 q_u->info.version=2;
6775 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6777 q_u->info.version = info->version;
6778 q_u->info.flags = info->flags;
6779 q_u->info.count = info->count;
6780 /* pointer field - be careful! */
6781 q_u->info.data = info->data;
6784 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6791 /*******************************************************************
6792 Parse a SPOOL_Q_REPLY_RRPCN structure.
6793 ********************************************************************/
6795 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6797 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6803 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6806 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6809 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6812 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6815 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6818 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6821 if(q_u->info_ptr!=0)
6822 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6828 /*******************************************************************
6829 Parse a SPOOL_R_REPLY_RRPCN structure.
6830 ********************************************************************/
6832 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6834 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
6840 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6843 if (!prs_werror("status", ps, depth, &r_u->status))
6849 /*******************************************************************
6851 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6852 ********************************************************************/
6854 BOOL spoolss_io_q_getprinterdataex(char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6859 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6864 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6868 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6872 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6876 if (!prs_uint32("size", ps, depth, &q_u->size))
6882 /*******************************************************************
6883 * write a structure.
6884 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6885 ********************************************************************/
6887 BOOL spoolss_io_r_getprinterdataex(char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6892 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6897 if (!prs_uint32("type", ps, depth, &r_u->type))
6899 if (!prs_uint32("size", ps, depth, &r_u->size))
6902 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6908 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6910 if (!prs_werror("status", ps, depth, &r_u->status))
6916 /*******************************************************************
6918 ********************************************************************/
6920 BOOL spoolss_io_q_setprinterdataex(char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6922 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6927 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6929 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6935 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6941 if(!prs_uint32("type", ps, depth, &q_u->type))
6944 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6954 if (UNMARSHALLING(ps))
6955 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
6956 if(q_u->data == NULL)
6958 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6966 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6972 /*******************************************************************
6973 * write a structure.
6974 ********************************************************************/
6976 BOOL spoolss_io_r_setprinterdataex(char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6978 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6983 if(!prs_werror("status", ps, depth, &r_u->status))
6990 /*******************************************************************
6992 ********************************************************************/
6994 BOOL spoolss_io_q_enumprinterkey(char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6996 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
7001 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
7004 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
7010 if(!prs_uint32("size", ps, depth, &q_u->size))
7016 /*******************************************************************
7017 * write a structure.
7018 ********************************************************************/
7020 BOOL spoolss_io_r_enumprinterkey(char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
7022 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
7028 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
7034 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7037 if(!prs_werror("status", ps, depth, &r_u->status))
7043 /*******************************************************************
7045 ********************************************************************/
7047 BOOL spoolss_io_q_deleteprinterkey(char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
7049 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterkey");
7054 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
7057 if(!smb_io_unistr2("", &q_u->keyname, True, ps, depth))
7063 /*******************************************************************
7064 * write a structure.
7065 ********************************************************************/
7067 BOOL spoolss_io_r_deleteprinterkey(char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
7069 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterkey");
7075 if(!prs_werror("status", ps, depth, &r_u->status))
7082 /*******************************************************************
7084 ********************************************************************/
7086 BOOL spoolss_io_q_enumprinterdataex(char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
7088 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
7093 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
7096 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
7102 if(!prs_uint32("size", ps, depth, &q_u->size))
7108 /*******************************************************************
7109 ********************************************************************/
7110 static BOOL spoolss_io_printer_enum_values_ctr(char *desc, prs_struct *ps,
7111 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
7114 uint32 valuename_offset,
7117 const uint32 basic_unit = 20; /* size of static portion of enum_values */
7119 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
7122 if (!prs_uint32("size", ps, depth, &ctr->size))
7125 /* offset data begins at 20 bytes per structure * size_of_array.
7126 Don't forget the uint32 at the beginning */
7128 current_offset = basic_unit * ctr->size_of_array;
7130 /* first loop to write basic enum_value information */
7132 for (i=0; i<ctr->size_of_array; i++)
7134 valuename_offset = current_offset;
7135 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
7138 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
7141 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
7144 data_offset = ctr->values[i].value_len + valuename_offset;
7145 if (!prs_uint32("data_offset", ps, depth, &data_offset))
7148 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
7151 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
7154 /* loop #2 for writing the dynamically size objects
7155 while viewing conversations between Win2k -> Win2k,
7156 4-byte alignment does not seem to matter here --jerry */
7158 for (i=0; i<ctr->size_of_array; i++)
7161 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
7164 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
7174 /*******************************************************************
7175 * write a structure.
7176 ********************************************************************/
7178 BOOL spoolss_io_r_enumprinterdataex(char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
7180 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
7186 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
7192 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7195 if(!prs_uint32("returned", ps, depth, &r_u->returned))
7198 if(!prs_werror("status", ps, depth, &r_u->status))
7205 /*******************************************************************
7206 * write a structure.
7207 ********************************************************************/
7210 uint32 GetPrintProcessorDirectory(
7212 [in] unistr2 *environment,
7214 [in,out] NEW_BUFFER buffer,
7215 [in] uint32 offered,
7216 [out] uint32 needed,
7217 [out] uint32 returned
7222 BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, NEW_BUFFER *buffer, uint32 offered)
7224 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
7226 init_unistr2(&q_u->name, name, strlen(name)+1);
7227 init_unistr2(&q_u->environment, environment, strlen(environment)+1);
7231 q_u->buffer = buffer;
7232 q_u->offered = offered;
7237 BOOL spoolss_io_q_getprintprocessordirectory(char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
7241 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
7247 if (!prs_uint32("ptr", ps, depth, &ptr))
7251 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
7258 if (!prs_uint32("ptr", ps, depth, &ptr))
7262 if(!smb_io_unistr2("environment", &q_u->environment, True,
7270 if(!prs_uint32("level", ps, depth, &q_u->level))
7273 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
7279 if(!prs_uint32("offered", ps, depth, &q_u->offered))
7285 /*******************************************************************
7286 * write a structure.
7287 ********************************************************************/
7289 BOOL spoolss_io_r_getprintprocessordirectory(char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
7291 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
7297 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
7303 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7306 if(!prs_werror("status", ps, depth, &r_u->status))
7312 BOOL smb_io_printprocessordirectory_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
7314 prs_struct *ps=&buffer->prs;
7316 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
7319 buffer->struct_start=prs_offset(ps);
7321 if (!smb_io_unistr(desc, &info->name, ps, depth))
7327 /*******************************************************************
7329 ********************************************************************/
7331 BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
7332 int level, FORM *form)
7334 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7336 q_u->level2 = level;
7337 memcpy(&q_u->form, form, sizeof(FORM));
7342 /*******************************************************************
7344 ********************************************************************/
7346 BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
7347 int level, char *form_name, FORM *form)
7349 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7351 q_u->level2 = level;
7352 memcpy(&q_u->form, form, sizeof(FORM));
7353 init_unistr2(&q_u->name, form_name, strlen(form_name) + 1);
7358 /*******************************************************************
7360 ********************************************************************/
7362 BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, char *form)
7364 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7365 init_unistr2(&q_u->name, form, strlen(form) + 1);
7369 /*******************************************************************
7371 ********************************************************************/
7373 BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
7374 char *formname, uint32 level, NEW_BUFFER *buffer,
7377 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7379 init_unistr2(&q_u->formname, formname, strlen(formname) + 1);
7381 q_u->offered=offered;
7386 /*******************************************************************
7388 ********************************************************************/
7390 BOOL make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
7391 uint32 level, NEW_BUFFER *buffer,
7394 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7397 q_u->offered=offered;
7402 /*******************************************************************
7404 ********************************************************************/
7406 BOOL make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
7407 uint32 jobid, uint32 level, uint32 command)
7409 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7413 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7414 the server side code has it marked as unused. */
7416 q_u->command = command;
7421 /*******************************************************************
7423 ********************************************************************/
7425 BOOL make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
7426 uint32 jobid, uint32 level, NEW_BUFFER *buffer,
7429 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7432 q_u->buffer = buffer;
7433 q_u->offered = offered;
7438 /*******************************************************************
7440 ********************************************************************/
7442 BOOL make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u,
7445 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7450 /*******************************************************************
7452 ********************************************************************/
7454 BOOL make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u,
7457 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7462 /*******************************************************************
7464 ********************************************************************/
7466 BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
7467 POLICY_HND *handle, uint32 level,
7468 char *docname, char *outputfile,
7471 DOC_INFO_CONTAINER *ctr = &q_u->doc_info_container;
7473 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7479 ctr->docinfo.switch_value = level;
7481 ctr->docinfo.doc_info_1.p_docname = docname ? 1 : 0;
7482 ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
7483 ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
7486 init_unistr2(&ctr->docinfo.doc_info_1.docname, docname,
7487 strlen(docname) + 1);
7490 init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile,
7491 strlen(outputfile) + 1);
7494 init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype,
7495 strlen(datatype) + 1);
7499 /* DOC_INFO_2 is only used by Windows 9x and since it
7500 doesn't do printing over RPC we don't have to worry
7503 DEBUG(3, ("unsupported info level %d\n", level));
7510 /*******************************************************************
7512 ********************************************************************/
7514 BOOL make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u,
7517 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7522 /*******************************************************************
7524 ********************************************************************/
7526 BOOL make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u,
7527 POLICY_HND *handle, uint32 data_size,
7530 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7531 q_u->buffer_size = q_u->buffer_size2 = data_size;
7536 /*******************************************************************
7538 ********************************************************************/
7540 BOOL make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
7541 POLICY_HND *handle, char *valuename)
7543 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7544 init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
7549 /*******************************************************************
7551 ********************************************************************/
7553 BOOL make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
7554 uint32 flags, uint32 options, char *localmachine,
7555 uint32 printerlocal, SPOOL_NOTIFY_OPTION *option)
7557 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7560 q_u->options = options;
7562 q_u->localmachine_ptr = 1;
7564 init_unistr2(&q_u->localmachine, localmachine,
7565 strlen(localmachine) + 1);
7567 q_u->printerlocal = printerlocal;
7570 q_u->option_ptr = 1;
7572 q_u->option = option;