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 3 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, see <http://www.gnu.org/licenses/>.
27 #define DBGC_CLASS DBGC_RPC_PARSE
30 /*******************************************************************
31 This should be moved in a more generic lib.
32 ********************************************************************/
34 bool spoolss_io_system_time(const char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
36 if(!prs_uint16("year", ps, depth, &systime->year))
38 if(!prs_uint16("month", ps, depth, &systime->month))
40 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
42 if(!prs_uint16("day", ps, depth, &systime->day))
44 if(!prs_uint16("hour", ps, depth, &systime->hour))
46 if(!prs_uint16("minute", ps, depth, &systime->minute))
48 if(!prs_uint16("second", ps, depth, &systime->second))
50 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
56 /*******************************************************************
57 ********************************************************************/
59 bool make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
61 systime->year=unixtime->tm_year+1900;
62 systime->month=unixtime->tm_mon+1;
63 systime->dayofweek=unixtime->tm_wday;
64 systime->day=unixtime->tm_mday;
65 systime->hour=unixtime->tm_hour;
66 systime->minute=unixtime->tm_min;
67 systime->second=unixtime->tm_sec;
68 systime->milliseconds=0;
73 /*******************************************************************
74 reads or writes an DOC_INFO structure.
75 ********************************************************************/
77 static bool smb_io_doc_info_1(const char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
79 if (info_1 == NULL) return False;
81 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
87 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
89 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
91 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
94 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
96 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
98 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
104 /*******************************************************************
105 reads or writes an DOC_INFO structure.
106 ********************************************************************/
108 static bool smb_io_doc_info(const char *desc, DOC_INFO *info, prs_struct *ps, int depth)
110 uint32 useless_ptr=0;
112 if (info == NULL) return False;
114 prs_debug(ps, depth, desc, "smb_io_doc_info");
120 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
123 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
126 switch (info->switch_value)
129 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
134 this is just a placeholder
136 MSDN July 1998 says doc_info_2 is only on
137 Windows 95, and as Win95 doesn't do RPC to print
138 this case is nearly impossible
140 Maybe one day with Windows for dishwasher 2037 ...
143 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
146 DEBUG(0,("Something is obviously wrong somewhere !\n"));
153 /*******************************************************************
154 reads or writes an DOC_INFO_CONTAINER structure.
155 ********************************************************************/
157 static bool smb_io_doc_info_container(const char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
159 if (cont == NULL) return False;
161 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
167 if(!prs_uint32("level", ps, depth, &cont->level))
170 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
176 /*******************************************************************
177 reads or writes an NOTIFY OPTION TYPE structure.
178 ********************************************************************/
180 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
181 structure. The _TYPE structure is really the deferred referrants (i.e
182 the notify fields array) of the _TYPE structure. -tpot */
184 static bool smb_io_notify_option_type(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
186 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
192 if(!prs_uint16("type", ps, depth, &type->type))
194 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
196 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
198 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
200 if(!prs_uint32("count", ps, depth, &type->count))
202 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
208 /*******************************************************************
209 reads or writes an NOTIFY OPTION TYPE DATA.
210 ********************************************************************/
212 static bool smb_io_notify_option_type_data(const char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
216 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
219 /* if there are no fields just return */
220 if (type->fields_ptr==0)
226 if(!prs_uint32("count2", ps, depth, &type->count2))
229 if (type->count2 != type->count)
230 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
232 if (type->count2 > MAX_NOTIFY_TYPE_FOR_NOW) {
236 /* parse the option type data */
237 for(i=0;i<type->count2;i++)
238 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
243 /*******************************************************************
244 reads or writes an NOTIFY OPTION structure.
245 ********************************************************************/
247 static bool smb_io_notify_option_type_ctr(const char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
251 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
254 if(!prs_uint32("count", ps, depth, &ctr->count))
258 if (UNMARSHALLING(ps) && ctr->count)
259 if((ctr->type=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION_TYPE,ctr->count)) == NULL)
262 /* the option type struct */
263 for(i=0;i<ctr->count;i++)
264 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
267 /* the type associated with the option type struct */
268 for(i=0;i<ctr->count;i++)
269 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
275 /*******************************************************************
276 reads or writes an NOTIFY OPTION structure.
277 ********************************************************************/
279 static bool smb_io_notify_option(const char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
281 prs_debug(ps, depth, desc, "smb_io_notify_option");
284 if(!prs_uint32("version", ps, depth, &option->version))
286 if(!prs_uint32("flags", ps, depth, &option->flags))
288 if(!prs_uint32("count", ps, depth, &option->count))
290 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
293 /* marshalling or unmarshalling, that would work */
294 if (option->option_type_ptr!=0) {
295 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
299 option->ctr.type=NULL;
306 /*******************************************************************
307 reads or writes an NOTIFY INFO DATA structure.
308 ********************************************************************/
310 static bool smb_io_notify_info_data(const char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
312 uint32 useless_ptr=0x0FF0ADDE;
314 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
319 if(!prs_uint16("type", ps, depth, &data->type))
321 if(!prs_uint16("field", ps, depth, &data->field))
324 if(!prs_uint32("how many words", ps, depth, &data->size))
326 if(!prs_uint32("id", ps, depth, &data->id))
328 if(!prs_uint32("how many words", ps, depth, &data->size))
331 switch (data->enc_type) {
333 /* One and two value data has two uint32 values */
335 case NOTIFY_ONE_VALUE:
336 case NOTIFY_TWO_VALUE:
338 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
340 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
344 /* Pointers and strings have a string length and a
345 pointer. For a string the length is expressed as
346 the number of uint16 characters plus a trailing
351 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length ))
353 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
360 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
363 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
369 if( !prs_uint32( "sd size", ps, depth, &data->notify_data.sd.size ) )
371 if( !prs_uint32( "pointer", ps, depth, &useless_ptr ) )
377 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data\n",
385 /*******************************************************************
386 reads or writes an NOTIFY INFO DATA structure.
387 ********************************************************************/
389 bool smb_io_notify_info_data_strings(const char *desc,SPOOL_NOTIFY_INFO_DATA *data,
390 prs_struct *ps, int depth)
392 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
398 switch(data->enc_type) {
400 /* No data for values */
402 case NOTIFY_ONE_VALUE:
403 case NOTIFY_TWO_VALUE:
407 /* Strings start with a length in uint16s */
412 data->notify_data.data.length /= 2;
414 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
417 if (UNMARSHALLING(ps) && data->notify_data.data.length) {
418 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
419 data->notify_data.data.length);
421 if (!data->notify_data.data.string)
425 if (!prs_uint16uni(True, "string", ps, depth, data->notify_data.data.string,
426 data->notify_data.data.length))
430 data->notify_data.data.length *= 2;
436 if (UNMARSHALLING(ps) && data->notify_data.data.length) {
437 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16,
438 data->notify_data.data.length);
440 if (!data->notify_data.data.string)
444 if(!prs_uint8s(True,"buffer",ps,depth,(uint8*)data->notify_data.data.string,data->notify_data.data.length))
450 if( !prs_uint32("secdesc size ", ps, depth, &data->notify_data.sd.size ) )
452 if ( !sec_io_desc( "sec_desc", &data->notify_data.sd.desc, ps, depth ) )
457 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",
463 if (isvalue==False) {
465 /* length of string in unicode include \0 */
466 x=data->notify_data.data.length+1;
468 if (data->field != 16)
469 if(!prs_uint32("string length", ps, depth, &x ))
472 if (MARSHALLING(ps)) {
473 /* These are already in little endian format. Don't byte swap. */
476 /* No memory allocated for this string
477 therefore following the data.string
478 pointer is a bad idea. Use a pointer to
479 the uint32 length union member to
480 provide a source for a unicode NULL */
482 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
486 if (data->field == 16)
489 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
494 /* Tallocate memory for string */
497 data->notify_data.data.string = PRS_ALLOC_MEM(ps, uint16, x * 2);
498 if (!data->notify_data.data.string)
501 data->notify_data.data.string = NULL;
504 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
512 /* Win2k does not seem to put this parse align here */
520 /*******************************************************************
521 reads or writes an NOTIFY INFO structure.
522 ********************************************************************/
524 static bool smb_io_notify_info(const char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
528 prs_debug(ps, depth, desc, "smb_io_notify_info");
534 if(!prs_uint32("count", ps, depth, &info->count))
536 if(!prs_uint32("version", ps, depth, &info->version))
538 if(!prs_uint32("flags", ps, depth, &info->flags))
540 if(!prs_uint32("count", ps, depth, &info->count))
543 for (i=0;i<info->count;i++) {
544 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
548 /* now do the strings at the end of the stream */
549 for (i=0;i<info->count;i++) {
550 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
557 /*******************************************************************
558 ********************************************************************/
560 bool spool_io_user_level_1( const char *desc, prs_struct *ps, int depth, SPOOL_USER_1 *q_u )
562 prs_debug(ps, depth, desc, "");
568 if (!prs_uint32("size", ps, depth, &q_u->size))
571 if (!prs_io_unistr2_p("", ps, depth, &q_u->client_name))
573 if (!prs_io_unistr2_p("", ps, depth, &q_u->user_name))
576 if (!prs_uint32("build", ps, depth, &q_u->build))
578 if (!prs_uint32("major", ps, depth, &q_u->major))
580 if (!prs_uint32("minor", ps, depth, &q_u->minor))
582 if (!prs_uint32("processor", ps, depth, &q_u->processor))
585 if (!prs_io_unistr2("", ps, depth, q_u->client_name))
590 if (!prs_io_unistr2("", ps, depth, q_u->user_name))
596 /*******************************************************************
597 ********************************************************************/
599 static bool spool_io_user_level(const char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
604 prs_debug(ps, depth, desc, "spool_io_user_level");
610 if (!prs_uint32("level", ps, depth, &q_u->level))
613 switch ( q_u->level )
616 if ( !prs_pointer( "" , ps, depth, (void*)&q_u->user.user1,
617 sizeof(SPOOL_USER_1), (PRS_POINTER_CAST)spool_io_user_level_1 ))
629 /*******************************************************************
630 * read or write a DEVICEMODE struct.
631 * on reading allocate memory for the private member
632 ********************************************************************/
634 #define DM_NUM_OPTIONAL_FIELDS 8
636 bool spoolss_io_devmode(const char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
638 int available_space; /* size of the device mode left to parse */
639 /* only important on unmarshalling */
641 uint16 *unistr_buffer;
644 struct optional_fields {
647 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
648 { "icmmethod", NULL },
649 { "icmintent", NULL },
650 { "mediatype", NULL },
651 { "dithertype", NULL },
652 { "reserved1", NULL },
653 { "reserved2", NULL },
654 { "panningwidth", NULL },
655 { "panningheight", NULL }
658 /* assign at run time to keep non-gcc compilers happy */
660 opt_fields[0].field = &devmode->icmmethod;
661 opt_fields[1].field = &devmode->icmintent;
662 opt_fields[2].field = &devmode->mediatype;
663 opt_fields[3].field = &devmode->dithertype;
664 opt_fields[4].field = &devmode->reserved1;
665 opt_fields[5].field = &devmode->reserved2;
666 opt_fields[6].field = &devmode->panningwidth;
667 opt_fields[7].field = &devmode->panningheight;
670 prs_debug(ps, depth, desc, "spoolss_io_devmode");
673 if (UNMARSHALLING(ps)) {
674 devmode->devicename.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
675 if (devmode->devicename.buffer == NULL)
677 unistr_buffer = devmode->devicename.buffer;
680 /* devicename is a static sized string but the buffer we set is not */
681 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
682 memset( unistr_buffer, 0x0, MAXDEVICENAME );
683 for ( j=0; devmode->devicename.buffer[j]; j++ )
684 unistr_buffer[j] = devmode->devicename.buffer[j];
687 if (!prs_uint16uni(True,"devicename", ps, depth, unistr_buffer, MAXDEVICENAME))
690 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
693 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
695 if (!prs_uint16("size", ps, depth, &devmode->size))
697 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
699 if (!prs_uint32("fields", ps, depth, &devmode->fields))
701 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
703 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
705 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
707 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
709 if (!prs_uint16("scale", ps, depth, &devmode->scale))
711 if (!prs_uint16("copies", ps, depth, &devmode->copies))
713 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
715 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
717 if (!prs_uint16("color", ps, depth, &devmode->color))
719 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
721 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
723 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
725 if (!prs_uint16("collate", ps, depth, &devmode->collate))
728 if (UNMARSHALLING(ps)) {
729 devmode->formname.buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
730 if (devmode->formname.buffer == NULL)
732 unistr_buffer = devmode->formname.buffer;
735 /* devicename is a static sized string but the buffer we set is not */
736 unistr_buffer = PRS_ALLOC_MEM(ps, uint16, MAXDEVICENAME);
737 memset( unistr_buffer, 0x0, MAXDEVICENAME );
738 for ( j=0; devmode->formname.buffer[j]; j++ )
739 unistr_buffer[j] = devmode->formname.buffer[j];
742 if (!prs_uint16uni(True, "formname", ps, depth, unistr_buffer, MAXDEVICENAME))
744 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
746 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
748 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
750 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
752 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
754 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
757 * every device mode I've ever seen on the wire at least has up
758 * to the displayfrequency field. --jerry (05-09-2002)
761 /* add uint32's + uint16's + two UNICODE strings */
763 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
765 /* Sanity check - we only have uint32's left tp parse */
767 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
768 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
769 available_space, devmode->size));
770 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
775 * Conditional parsing. Assume that the DeviceMode has been
776 * zero'd by the caller.
779 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
781 DEBUG(11, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
782 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
784 available_space -= sizeof(uint32);
788 /* Sanity Check - we should no available space at this point unless
789 MS changes the device mode structure */
791 if (available_space) {
792 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
793 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
794 available_space, devmode->size));
795 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
800 if (devmode->driverextra!=0) {
801 if (UNMARSHALLING(ps)) {
802 devmode->dev_private=PRS_ALLOC_MEM(ps, uint8, devmode->driverextra);
803 if(devmode->dev_private == NULL)
805 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for dev_private\n",devmode->driverextra));
808 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of dev_private\n",devmode->driverextra));
809 if (!prs_uint8s(False, "dev_private", ps, depth,
810 devmode->dev_private, devmode->driverextra))
817 /*******************************************************************
818 Read or write a DEVICEMODE container
819 ********************************************************************/
821 static bool spoolss_io_devmode_cont(const char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
826 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
832 if (!prs_uint32("size", ps, depth, &dm_c->size))
835 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
838 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
839 if (UNMARSHALLING(ps))
840 /* if while reading there is no DEVMODE ... */
845 /* so we have a DEVICEMODE to follow */
846 if (UNMARSHALLING(ps)) {
847 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
848 dm_c->devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1);
849 if(dm_c->devmode == NULL)
853 /* this is bad code, shouldn't be there */
854 if (!prs_uint32("size", ps, depth, &dm_c->size))
857 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
863 /*******************************************************************
864 ********************************************************************/
866 static bool spoolss_io_printer_default(const char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
871 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
874 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
877 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
883 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
889 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
895 /*******************************************************************
897 ********************************************************************/
899 bool make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
900 const fstring printername,
901 const fstring datatype,
902 uint32 access_required,
903 const fstring clientname,
904 const fstring user_name)
906 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
908 q_u->printername = TALLOC_P( talloc_tos(), UNISTR2 );
909 if (!q_u->printername) {
912 init_unistr2(q_u->printername, printername, UNI_STR_TERMINATE);
914 q_u->printer_default.datatype_ptr = 0;
916 q_u->printer_default.devmode_cont.size=0;
917 q_u->printer_default.devmode_cont.devmode_ptr=0;
918 q_u->printer_default.devmode_cont.devmode=NULL;
919 q_u->printer_default.access_required=access_required;
921 q_u->user_switch = 1;
923 q_u->user_ctr.level = 1;
924 q_u->user_ctr.user.user1 = TALLOC_P( talloc_tos(), SPOOL_USER_1 );
925 if (!q_u->user_ctr.user.user1) {
928 q_u->user_ctr.user.user1->size = strlen(clientname) + strlen(user_name) + 10;
929 q_u->user_ctr.user.user1->build = 1381;
930 q_u->user_ctr.user.user1->major = 2;
931 q_u->user_ctr.user.user1->minor = 0;
932 q_u->user_ctr.user.user1->processor = 0;
934 q_u->user_ctr.user.user1->client_name = TALLOC_P( talloc_tos(), UNISTR2 );
935 if (!q_u->user_ctr.user.user1->client_name) {
938 q_u->user_ctr.user.user1->user_name = TALLOC_P( talloc_tos(), UNISTR2 );
939 if (!q_u->user_ctr.user.user1->user_name) {
943 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
944 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
949 /*******************************************************************
951 ********************************************************************/
953 bool make_spoolss_q_addprinterex( TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTEREX *q_u,
954 const char *srv_name, const char* clientname, const char* user_name,
955 uint32 level, PRINTER_INFO_CTR *ctr)
957 DEBUG(5,("make_spoolss_q_addprinterex\n"));
959 if (!ctr || !ctr->printers_2)
964 q_u->server_name = TALLOC_P( mem_ctx, UNISTR2 );
965 if (!q_u->server_name) {
968 init_unistr2(q_u->server_name, srv_name, UNI_FLAGS_NONE);
972 q_u->info.level = level;
973 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
976 /* init q_u->info.info2 from *info */
977 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
978 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
988 q_u->user_ctr.level = 1;
989 q_u->user_ctr.user.user1 = TALLOC_P( talloc_tos(), SPOOL_USER_1 );
990 if (!q_u->user_ctr.user.user1) {
993 q_u->user_ctr.user.user1->build = 1381;
994 q_u->user_ctr.user.user1->major = 2;
995 q_u->user_ctr.user.user1->minor = 0;
996 q_u->user_ctr.user.user1->processor = 0;
998 q_u->user_ctr.user.user1->client_name = TALLOC_P( mem_ctx, UNISTR2 );
999 if (!q_u->user_ctr.user.user1->client_name) {
1002 q_u->user_ctr.user.user1->user_name = TALLOC_P( mem_ctx, UNISTR2 );
1003 if (!q_u->user_ctr.user.user1->user_name) {
1006 init_unistr2(q_u->user_ctr.user.user1->client_name, clientname, UNI_STR_TERMINATE);
1007 init_unistr2(q_u->user_ctr.user.user1->user_name, user_name, UNI_STR_TERMINATE);
1009 q_u->user_ctr.user.user1->size = q_u->user_ctr.user.user1->user_name->uni_str_len +
1010 q_u->user_ctr.user.user1->client_name->uni_str_len + 2;
1015 /*******************************************************************
1016 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
1017 *******************************************************************/
1019 bool make_spoolss_printer_info_2(TALLOC_CTX *ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
1020 PRINTER_INFO_2 *info)
1023 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
1025 /* allocate the necessary memory */
1026 if (!(inf=TALLOC_P(ctx, SPOOL_PRINTER_INFO_LEVEL_2))) {
1027 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
1031 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
1032 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
1033 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
1034 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
1035 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
1036 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
1037 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
1038 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
1039 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
1040 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
1041 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
1042 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
1043 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1044 inf->attributes = info->attributes;
1045 inf->priority = info->priority;
1046 inf->default_priority = info->defaultpriority;
1047 inf->starttime = info->starttime;
1048 inf->untiltime = info->untiltime;
1049 inf->cjobs = info->cjobs;
1050 inf->averageppm = info->averageppm;
1051 init_unistr2_from_unistr(inf, &inf->servername, &info->servername);
1052 init_unistr2_from_unistr(inf, &inf->printername, &info->printername);
1053 init_unistr2_from_unistr(inf, &inf->sharename, &info->sharename);
1054 init_unistr2_from_unistr(inf, &inf->portname, &info->portname);
1055 init_unistr2_from_unistr(inf, &inf->drivername, &info->drivername);
1056 init_unistr2_from_unistr(inf, &inf->comment, &info->comment);
1057 init_unistr2_from_unistr(inf, &inf->location, &info->location);
1058 init_unistr2_from_unistr(inf, &inf->sepfile, &info->sepfile);
1059 init_unistr2_from_unistr(inf, &inf->printprocessor, &info->printprocessor);
1060 init_unistr2_from_unistr(inf, &inf->datatype, &info->datatype);
1061 init_unistr2_from_unistr(inf, &inf->parameters, &info->parameters);
1062 init_unistr2_from_unistr(inf, &inf->datatype, &info->datatype);
1069 /*******************************************************************
1070 create a SPOOL_PRINTER_INFO_3 struct from a PRINTER_INFO_3 struct
1071 *******************************************************************/
1073 bool make_spoolss_printer_info_3(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3 **spool_info3,
1074 PRINTER_INFO_3 *info)
1077 SPOOL_PRINTER_INFO_LEVEL_3 *inf;
1079 /* allocate the necessary memory */
1080 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3))) {
1081 DEBUG(0,("make_spoolss_printer_info_3: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_3 sruct!\n"));
1085 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1092 /*******************************************************************
1093 create a SPOOL_PRINTER_INFO_7 struct from a PRINTER_INFO_7 struct
1094 *******************************************************************/
1096 bool make_spoolss_printer_info_7(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7 **spool_info7,
1097 PRINTER_INFO_7 *info)
1100 SPOOL_PRINTER_INFO_LEVEL_7 *inf;
1102 /* allocate the necessary memory */
1103 if (!(inf=TALLOC_P(mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7))) {
1104 DEBUG(0,("make_spoolss_printer_info_7: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_7 struct!\n"));
1108 inf->guid_ptr = (info->guid.buffer!=NULL)?1:0;
1109 inf->action = info->action;
1110 init_unistr2_from_unistr(inf, &inf->guid, &info->guid);
1118 /*******************************************************************
1120 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1121 ********************************************************************/
1123 bool spoolss_io_q_open_printer(const char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
1128 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
1134 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
1136 if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
1142 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1148 /*******************************************************************
1149 * write a structure.
1150 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1151 * called from spoolss_open_printer_ex (cli_spoolss.c)
1152 ********************************************************************/
1154 bool spoolss_io_r_open_printer(const char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
1156 if (r_u == NULL) return False;
1158 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
1164 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1167 if (!prs_werror("status", ps, depth, &(r_u->status)))
1174 /*******************************************************************
1176 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1177 ********************************************************************/
1179 bool spoolss_io_q_open_printer_ex(const char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
1184 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
1190 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->printername))
1192 if (!prs_io_unistr2("printername", ps, depth, q_u->printername))
1198 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1201 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
1203 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
1209 /*******************************************************************
1210 * write a structure.
1211 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1212 * called from spoolss_open_printer_ex (cli_spoolss.c)
1213 ********************************************************************/
1215 bool spoolss_io_r_open_printer_ex(const char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
1217 if (r_u == NULL) return False;
1219 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
1225 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1228 if (!prs_werror("status", ps, depth, &(r_u->status)))
1234 /*******************************************************************
1236 ********************************************************************/
1237 bool make_spoolss_q_deleteprinterdriverex( TALLOC_CTX *mem_ctx,
1238 SPOOL_Q_DELETEPRINTERDRIVEREX *q_u,
1244 DEBUG(5,("make_spoolss_q_deleteprinterdriverex\n"));
1246 q_u->server_ptr = (server!=NULL)?1:0;
1247 q_u->delete_flags = DPD_DELETE_UNUSED_FILES;
1249 /* these must be NULL terminated or else NT4 will
1250 complain about invalid parameters --jerry */
1251 init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
1252 init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
1253 init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
1256 q_u->delete_flags |= DPD_DELETE_SPECIFIC_VERSION;
1257 q_u->version = version;
1264 /*******************************************************************
1266 ********************************************************************/
1267 bool make_spoolss_q_deleteprinterdriver(
1268 TALLOC_CTX *mem_ctx,
1269 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
1275 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1277 q_u->server_ptr = (server!=NULL)?1:0;
1279 /* these must be NULL terminated or else NT4 will
1280 complain about invalid parameters --jerry */
1281 init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
1282 init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
1283 init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
1288 /*******************************************************************
1290 ********************************************************************/
1292 bool make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
1293 const POLICY_HND *handle,
1294 const char *valuename, uint32 size)
1296 if (q_u == NULL) return False;
1298 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1300 q_u->handle = *handle;
1301 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
1307 /*******************************************************************
1309 ********************************************************************/
1311 bool make_spoolss_q_getprinterdataex(SPOOL_Q_GETPRINTERDATAEX *q_u,
1312 const POLICY_HND *handle,
1313 const char *keyname,
1314 const char *valuename, uint32 size)
1316 if (q_u == NULL) return False;
1318 DEBUG(5,("make_spoolss_q_getprinterdataex\n"));
1320 q_u->handle = *handle;
1321 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
1322 init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
1328 /*******************************************************************
1330 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1331 ********************************************************************/
1333 bool spoolss_io_q_getprinterdata(const char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
1338 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
1343 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1347 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1351 if (!prs_uint32("size", ps, depth, &q_u->size))
1357 /*******************************************************************
1359 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1360 ********************************************************************/
1362 bool spoolss_io_q_deleteprinterdata(const char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1367 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1372 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1376 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1382 /*******************************************************************
1383 * write a structure.
1384 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1385 ********************************************************************/
1387 bool spoolss_io_r_deleteprinterdata(const char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1389 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1391 if(!prs_werror("status", ps, depth, &r_u->status))
1397 /*******************************************************************
1399 * called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
1400 ********************************************************************/
1402 bool spoolss_io_q_deleteprinterdataex(const char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
1407 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdataex");
1412 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1415 if (!smb_io_unistr2("keyname ", &q_u->keyname, True, ps, depth))
1417 if (!smb_io_unistr2("valuename", &q_u->valuename, True, ps, depth))
1423 /*******************************************************************
1424 * write a structure.
1425 * called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
1426 ********************************************************************/
1428 bool spoolss_io_r_deleteprinterdataex(const char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
1430 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdataex");
1433 if(!prs_werror("status", ps, depth, &r_u->status))
1439 /*******************************************************************
1440 * write a structure.
1441 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1442 ********************************************************************/
1444 bool spoolss_io_r_getprinterdata(const char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1449 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1454 if (!prs_uint32("type", ps, depth, &r_u->type))
1456 if (!prs_uint32("size", ps, depth, &r_u->size))
1459 if (UNMARSHALLING(ps) && r_u->size) {
1460 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
1465 if (!prs_uint8s( False, "data", ps, depth, r_u->data, r_u->size ))
1471 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1473 if (!prs_werror("status", ps, depth, &r_u->status))
1479 /*******************************************************************
1481 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1482 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1483 ********************************************************************/
1485 bool spoolss_io_q_deleteprinterdriver(const char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1487 if (q_u == NULL) return False;
1489 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1495 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1497 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1499 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1501 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1509 /*******************************************************************
1510 * write a structure.
1511 ********************************************************************/
1512 bool spoolss_io_r_deleteprinterdriver(const char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1514 if (r_u == NULL) return False;
1516 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1522 if (!prs_werror("status", ps, depth, &r_u->status))
1529 /*******************************************************************
1531 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1532 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1533 ********************************************************************/
1535 bool spoolss_io_q_deleteprinterdriverex(const char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
1537 if (q_u == NULL) return False;
1539 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriverex");
1545 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1547 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1549 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1551 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1557 if(!prs_uint32("delete_flags ", ps, depth, &q_u->delete_flags))
1559 if(!prs_uint32("version ", ps, depth, &q_u->version))
1567 /*******************************************************************
1568 * write a structure.
1569 ********************************************************************/
1570 bool spoolss_io_r_deleteprinterdriverex(const char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
1572 if (r_u == NULL) return False;
1574 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriverex");
1580 if (!prs_werror("status", ps, depth, &r_u->status))
1587 /*******************************************************************
1589 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1590 ********************************************************************/
1592 bool spoolss_io_q_startdocprinter(const char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1594 if (q_u == NULL) return False;
1596 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1602 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1605 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1611 /*******************************************************************
1612 * write a structure.
1613 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1614 ********************************************************************/
1616 bool spoolss_io_r_startdocprinter(const char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1618 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1620 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1622 if(!prs_werror("status", ps, depth, &r_u->status))
1628 /*******************************************************************
1630 * called from spoolss_q_writeprinter (srv_spoolss.c)
1631 ********************************************************************/
1633 bool spoolss_io_q_writeprinter(const char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1635 if (q_u == NULL) return False;
1637 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1643 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1645 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1648 if (q_u->buffer_size!=0)
1650 if (UNMARSHALLING(ps))
1651 q_u->buffer=PRS_ALLOC_MEM(ps, uint8, q_u->buffer_size);
1652 if(q_u->buffer == NULL)
1654 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1659 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1665 /*******************************************************************
1666 * write a structure.
1667 * called from spoolss_r_writeprinter (srv_spoolss.c)
1668 ********************************************************************/
1670 bool spoolss_io_r_writeprinter(const char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1672 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1674 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1676 if(!prs_werror("status", ps, depth, &r_u->status))
1682 /*******************************************************************
1684 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1685 ********************************************************************/
1687 bool spoolss_io_q_rffpcnex(const char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1689 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1695 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1697 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1699 if(!prs_uint32("options", ps, depth, &q_u->options))
1701 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1703 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1709 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1712 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1715 if (q_u->option_ptr!=0) {
1717 if (UNMARSHALLING(ps))
1718 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1721 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1728 /*******************************************************************
1729 * write a structure.
1730 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1731 ********************************************************************/
1733 bool spoolss_io_r_rffpcnex(const char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1735 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1738 if(!prs_werror("status", ps, depth, &r_u->status))
1744 /*******************************************************************
1746 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1747 ********************************************************************/
1749 bool spoolss_io_q_rfnpcnex(const char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1751 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1757 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1760 if(!prs_uint32("change", ps, depth, &q_u->change))
1763 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1766 if (q_u->option_ptr!=0) {
1768 if (UNMARSHALLING(ps))
1769 if((q_u->option=PRS_ALLOC_MEM(ps,SPOOL_NOTIFY_OPTION,1)) == NULL)
1772 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1779 /*******************************************************************
1780 * write a structure.
1781 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1782 ********************************************************************/
1784 bool spoolss_io_r_rfnpcnex(const char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1786 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1792 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1795 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1800 if(!prs_werror("status", ps, depth, &r_u->status))
1806 /*******************************************************************
1807 * return the length of a uint16 (obvious, but the code is clean)
1808 ********************************************************************/
1810 static uint32 size_of_uint16(uint16 *value)
1812 return (sizeof(*value));
1815 /*******************************************************************
1816 * return the length of a uint32 (obvious, but the code is clean)
1817 ********************************************************************/
1819 static uint32 size_of_uint32(uint32 *value)
1821 return (sizeof(*value));
1824 /*******************************************************************
1825 * return the length of a NTTIME (obvious, but the code is clean)
1826 ********************************************************************/
1828 static uint32 size_of_nttime(NTTIME *value)
1830 return (sizeof(*value));
1833 /*******************************************************************
1834 * return the length of a uint32 (obvious, but the code is clean)
1835 ********************************************************************/
1837 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1842 return (4+devmode->size+devmode->driverextra);
1845 /*******************************************************************
1846 * return the length of a uint32 (obvious, but the code is clean)
1847 ********************************************************************/
1849 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1854 return (sizeof(SYSTEMTIME) +4);
1857 /*******************************************************************
1858 Parse a DEVMODE structure and its relative pointer.
1859 ********************************************************************/
1861 static bool smb_io_reldevmode(const char *desc, RPC_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1863 prs_struct *ps=&buffer->prs;
1865 prs_debug(ps, depth, desc, "smb_io_reldevmode");
1868 if (MARSHALLING(ps)) {
1869 uint32 struct_offset = prs_offset(ps);
1870 uint32 relative_offset;
1872 if (*devmode == NULL) {
1874 if (!prs_uint32("offset", ps, depth, &relative_offset))
1876 DEBUG(8, ("boing, the devmode was NULL\n"));
1881 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1883 /* mz: we have to align the device mode for VISTA */
1884 if (buffer->string_at_end % 4) {
1885 buffer->string_at_end += 4 - (buffer->string_at_end % 4);
1888 if(!prs_set_offset(ps, buffer->string_at_end))
1891 /* write the DEVMODE */
1892 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1895 if(!prs_set_offset(ps, struct_offset))
1898 relative_offset=buffer->string_at_end - buffer->struct_start;
1899 /* write its offset */
1900 if (!prs_uint32("offset", ps, depth, &relative_offset))
1906 /* read the offset */
1907 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1909 if (buffer->string_at_end == 0) {
1914 old_offset = prs_offset(ps);
1915 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1918 /* read the string */
1919 if((*devmode=PRS_ALLOC_MEM(ps,DEVICEMODE,1)) == NULL)
1921 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1924 if(!prs_set_offset(ps, old_offset))
1930 /*******************************************************************
1931 Parse a PRINTER_INFO_0 structure.
1932 ********************************************************************/
1934 bool smb_io_printer_info_0(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
1936 prs_struct *ps=&buffer->prs;
1938 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
1941 buffer->struct_start=prs_offset(ps);
1943 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
1945 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
1948 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
1950 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
1952 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
1955 if(!prs_uint16("year", ps, depth, &info->year))
1957 if(!prs_uint16("month", ps, depth, &info->month))
1959 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
1961 if(!prs_uint16("day", ps, depth, &info->day))
1963 if(!prs_uint16("hour", ps, depth, &info->hour))
1965 if(!prs_uint16("minute", ps, depth, &info->minute))
1967 if(!prs_uint16("second", ps, depth, &info->second))
1969 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
1972 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
1974 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
1977 if(!prs_uint16("major_version", ps, depth, &info->major_version))
1979 if(!prs_uint16("build_version", ps, depth, &info->build_version))
1981 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
1983 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
1985 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
1987 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
1989 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
1991 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
1993 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
1995 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
1997 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
1999 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2001 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2003 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2005 if(!prs_uint32("status" , ps, depth, &info->status))
2007 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2009 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2011 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2013 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2015 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2017 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2019 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2021 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2023 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2025 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2031 /*******************************************************************
2032 Parse a PRINTER_INFO_1 structure.
2033 ********************************************************************/
2035 bool smb_io_printer_info_1(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2037 prs_struct *ps=&buffer->prs;
2039 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2042 buffer->struct_start=prs_offset(ps);
2044 if (!prs_uint32("flags", ps, depth, &info->flags))
2046 if (!smb_io_relstr("description", buffer, depth, &info->description))
2048 if (!smb_io_relstr("name", buffer, depth, &info->name))
2050 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2056 /*******************************************************************
2057 Parse a PRINTER_INFO_2 structure.
2058 ********************************************************************/
2060 bool smb_io_printer_info_2(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2062 prs_struct *ps=&buffer->prs;
2063 uint32 dm_offset, sd_offset, current_offset;
2064 uint32 dummy_value = 0, has_secdesc = 0;
2066 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2069 buffer->struct_start=prs_offset(ps);
2071 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2073 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2075 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2077 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2079 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2081 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2083 if (!smb_io_relstr("location", buffer, depth, &info->location))
2086 /* save current offset and wind forwared by a uint32 */
2087 dm_offset = prs_offset(ps);
2088 if (!prs_uint32("devmode", ps, depth, &dummy_value))
2091 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2093 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2095 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2097 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2100 /* save current offset for the sec_desc */
2101 sd_offset = prs_offset(ps);
2102 if (!prs_uint32("sec_desc", ps, depth, &has_secdesc))
2106 /* save current location so we can pick back up here */
2107 current_offset = prs_offset(ps);
2109 /* parse the devmode */
2110 if (!prs_set_offset(ps, dm_offset))
2112 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2115 /* parse the sec_desc */
2116 if (info->secdesc) {
2117 if (!prs_set_offset(ps, sd_offset))
2119 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2123 /* pick up where we left off */
2124 if (!prs_set_offset(ps, current_offset))
2127 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2129 if (!prs_uint32("priority", ps, depth, &info->priority))
2131 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2133 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2135 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2137 if (!prs_uint32("status", ps, depth, &info->status))
2139 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2141 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2147 /*******************************************************************
2148 Parse a PRINTER_INFO_3 structure.
2149 ********************************************************************/
2151 bool smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2154 prs_struct *ps=&buffer->prs;
2156 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2159 buffer->struct_start=prs_offset(ps);
2161 if (MARSHALLING(ps)) {
2162 /* Ensure the SD is 8 byte aligned in the buffer. */
2163 uint32 start = prs_offset(ps); /* Remember the start position. */
2166 /* Write a dummy value. */
2167 if (!prs_uint32("offset", ps, depth, &off_val))
2171 if (!prs_align_uint64(ps))
2174 /* Remember where we must seek back to write the SD. */
2175 offset = prs_offset(ps);
2177 /* Calculate the real offset for the SD. */
2179 off_val = offset - start;
2181 /* Seek back to where we store the SD offset & store. */
2182 prs_set_offset(ps, start);
2183 if (!prs_uint32("offset", ps, depth, &off_val))
2186 /* Return to after the 8 byte align. */
2187 prs_set_offset(ps, offset);
2190 if (!prs_uint32("offset", ps, depth, &offset))
2192 /* Seek within the buffer. */
2193 if (!prs_set_offset(ps, offset))
2196 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2202 /*******************************************************************
2203 Parse a PRINTER_INFO_4 structure.
2204 ********************************************************************/
2206 bool smb_io_printer_info_4(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
2208 prs_struct *ps=&buffer->prs;
2210 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
2213 buffer->struct_start=prs_offset(ps);
2215 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2217 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2219 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2224 /*******************************************************************
2225 Parse a PRINTER_INFO_5 structure.
2226 ********************************************************************/
2228 bool smb_io_printer_info_5(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
2230 prs_struct *ps=&buffer->prs;
2232 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
2235 buffer->struct_start=prs_offset(ps);
2237 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2239 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2241 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2243 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
2245 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
2250 /*******************************************************************
2251 Parse a PRINTER_INFO_6 structure.
2252 ********************************************************************/
2254 bool smb_io_printer_info_6(const char *desc, RPC_BUFFER *buffer,
2255 PRINTER_INFO_6 *info, int depth)
2257 prs_struct *ps=&buffer->prs;
2259 prs_debug(ps, depth, desc, "smb_io_printer_info_6");
2262 if (!prs_uint32("status", ps, depth, &info->status))
2268 /*******************************************************************
2269 Parse a PRINTER_INFO_7 structure.
2270 ********************************************************************/
2272 bool smb_io_printer_info_7(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_7 *info, int depth)
2274 prs_struct *ps=&buffer->prs;
2276 prs_debug(ps, depth, desc, "smb_io_printer_info_7");
2279 buffer->struct_start=prs_offset(ps);
2281 if (!smb_io_relstr("guid", buffer, depth, &info->guid))
2283 if (!prs_uint32("action", ps, depth, &info->action))
2288 /*******************************************************************
2289 Parse a PORT_INFO_1 structure.
2290 ********************************************************************/
2292 bool smb_io_port_info_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2294 prs_struct *ps=&buffer->prs;
2296 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2299 buffer->struct_start=prs_offset(ps);
2301 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2307 /*******************************************************************
2308 Parse a PORT_INFO_2 structure.
2309 ********************************************************************/
2311 bool smb_io_port_info_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2313 prs_struct *ps=&buffer->prs;
2315 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2318 buffer->struct_start=prs_offset(ps);
2320 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2322 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2324 if (!smb_io_relstr("description", buffer, depth, &info->description))
2326 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2328 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2334 /*******************************************************************
2335 Parse a DRIVER_INFO_1 structure.
2336 ********************************************************************/
2338 bool smb_io_printer_driver_info_1(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2340 prs_struct *ps=&buffer->prs;
2342 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2345 buffer->struct_start=prs_offset(ps);
2347 if (!smb_io_relstr("name", buffer, depth, &info->name))
2353 /*******************************************************************
2354 Parse a DRIVER_INFO_2 structure.
2355 ********************************************************************/
2357 bool smb_io_printer_driver_info_2(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2359 prs_struct *ps=&buffer->prs;
2361 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2364 buffer->struct_start=prs_offset(ps);
2366 if (!prs_uint32("version", ps, depth, &info->version))
2368 if (!smb_io_relstr("name", buffer, depth, &info->name))
2370 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2372 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2374 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2376 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2382 /*******************************************************************
2383 Parse a DRIVER_INFO_3 structure.
2384 ********************************************************************/
2386 bool smb_io_printer_driver_info_3(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2388 prs_struct *ps=&buffer->prs;
2390 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2393 buffer->struct_start=prs_offset(ps);
2395 if (!prs_uint32("version", ps, depth, &info->version))
2397 if (!smb_io_relstr("name", buffer, depth, &info->name))
2399 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2401 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2403 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2405 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2407 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2410 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2413 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2415 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2421 /*******************************************************************
2422 Parse a DRIVER_INFO_6 structure.
2423 ********************************************************************/
2425 bool smb_io_printer_driver_info_6(const char *desc, RPC_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2427 prs_struct *ps=&buffer->prs;
2429 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2432 buffer->struct_start=prs_offset(ps);
2434 if (!prs_uint32("version", ps, depth, &info->version))
2436 if (!smb_io_relstr("name", buffer, depth, &info->name))
2438 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2440 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2442 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2444 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2446 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2449 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2452 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2454 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2457 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2460 if (!prs_uint64("date", ps, depth, &info->driver_date))
2463 if (!prs_uint32("padding", ps, depth, &info->padding))
2466 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2469 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2472 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2474 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2476 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2478 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2484 /*******************************************************************
2485 Parse a JOB_INFO_1 structure.
2486 ********************************************************************/
2488 bool smb_io_job_info_1(const char *desc, RPC_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2490 prs_struct *ps=&buffer->prs;
2492 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2495 buffer->struct_start=prs_offset(ps);
2497 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2499 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2501 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2503 if (!smb_io_relstr("username", buffer, depth, &info->username))
2505 if (!smb_io_relstr("document", buffer, depth, &info->document))
2507 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2509 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2511 if (!prs_uint32("status", ps, depth, &info->status))
2513 if (!prs_uint32("priority", ps, depth, &info->priority))
2515 if (!prs_uint32("position", ps, depth, &info->position))
2517 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2519 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2521 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2527 /*******************************************************************
2528 Parse a JOB_INFO_2 structure.
2529 ********************************************************************/
2531 bool smb_io_job_info_2(const char *desc, RPC_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2534 prs_struct *ps=&buffer->prs;
2536 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2539 buffer->struct_start=prs_offset(ps);
2541 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2543 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2545 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2547 if (!smb_io_relstr("username", buffer, depth, &info->username))
2549 if (!smb_io_relstr("document", buffer, depth, &info->document))
2551 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2553 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2556 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2558 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2560 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2562 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2564 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2567 /* SEC_DESC sec_desc;*/
2568 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2571 if (!prs_uint32("status",ps, depth, &info->status))
2573 if (!prs_uint32("priority",ps, depth, &info->priority))
2575 if (!prs_uint32("position",ps, depth, &info->position))
2577 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2579 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2581 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2583 if (!prs_uint32("size",ps, depth, &info->size))
2585 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2587 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2589 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2595 /*******************************************************************
2596 ********************************************************************/
2598 bool smb_io_form_1(const char *desc, RPC_BUFFER *buffer, FORM_1 *info, int depth)
2600 prs_struct *ps=&buffer->prs;
2602 prs_debug(ps, depth, desc, "smb_io_form_1");
2605 buffer->struct_start=prs_offset(ps);
2607 if (!prs_uint32("flag", ps, depth, &info->flag))
2610 if (!smb_io_relstr("name", buffer, depth, &info->name))
2613 if (!prs_uint32("width", ps, depth, &info->width))
2615 if (!prs_uint32("length", ps, depth, &info->length))
2617 if (!prs_uint32("left", ps, depth, &info->left))
2619 if (!prs_uint32("top", ps, depth, &info->top))
2621 if (!prs_uint32("right", ps, depth, &info->right))
2623 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2631 /*******************************************************************
2632 Parse a DRIVER_DIRECTORY_1 structure.
2633 ********************************************************************/
2635 bool smb_io_driverdir_1(const char *desc, RPC_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2637 prs_struct *ps=&buffer->prs;
2639 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2642 buffer->struct_start=prs_offset(ps);
2644 if (!smb_io_unistr(desc, &info->name, ps, depth))
2650 /*******************************************************************
2651 Parse a PORT_INFO_1 structure.
2652 ********************************************************************/
2654 bool smb_io_port_1(const char *desc, RPC_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2656 prs_struct *ps=&buffer->prs;
2658 prs_debug(ps, depth, desc, "smb_io_port_1");
2661 buffer->struct_start=prs_offset(ps);
2663 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2669 /*******************************************************************
2670 Parse a PORT_INFO_2 structure.
2671 ********************************************************************/
2673 bool smb_io_port_2(const char *desc, RPC_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2675 prs_struct *ps=&buffer->prs;
2677 prs_debug(ps, depth, desc, "smb_io_port_2");
2680 buffer->struct_start=prs_offset(ps);
2682 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2684 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2686 if(!smb_io_relstr("description", buffer, depth, &info->description))
2688 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2690 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2696 /*******************************************************************
2697 ********************************************************************/
2699 bool smb_io_printprocessor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2701 prs_struct *ps=&buffer->prs;
2703 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2706 buffer->struct_start=prs_offset(ps);
2708 if (smb_io_relstr("name", buffer, depth, &info->name))
2714 /*******************************************************************
2715 ********************************************************************/
2717 bool smb_io_printprocdatatype_info_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2719 prs_struct *ps=&buffer->prs;
2721 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2724 buffer->struct_start=prs_offset(ps);
2726 if (smb_io_relstr("name", buffer, depth, &info->name))
2732 /*******************************************************************
2733 ********************************************************************/
2735 bool smb_io_printmonitor_info_1(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2737 prs_struct *ps=&buffer->prs;
2739 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2742 buffer->struct_start=prs_offset(ps);
2744 if (!smb_io_relstr("name", buffer, depth, &info->name))
2750 /*******************************************************************
2751 ********************************************************************/
2753 bool smb_io_printmonitor_info_2(const char *desc, RPC_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2755 prs_struct *ps=&buffer->prs;
2757 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2760 buffer->struct_start=prs_offset(ps);
2762 if (!smb_io_relstr("name", buffer, depth, &info->name))
2764 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
2766 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2772 /*******************************************************************
2773 return the size required by a struct in the stream
2774 ********************************************************************/
2776 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2780 size+=size_of_relative_string( &info->printername );
2781 size+=size_of_relative_string( &info->servername );
2783 size+=size_of_uint32( &info->cjobs);
2784 size+=size_of_uint32( &info->total_jobs);
2785 size+=size_of_uint32( &info->total_bytes);
2787 size+=size_of_uint16( &info->year);
2788 size+=size_of_uint16( &info->month);
2789 size+=size_of_uint16( &info->dayofweek);
2790 size+=size_of_uint16( &info->day);
2791 size+=size_of_uint16( &info->hour);
2792 size+=size_of_uint16( &info->minute);
2793 size+=size_of_uint16( &info->second);
2794 size+=size_of_uint16( &info->milliseconds);
2796 size+=size_of_uint32( &info->global_counter);
2797 size+=size_of_uint32( &info->total_pages);
2799 size+=size_of_uint16( &info->major_version);
2800 size+=size_of_uint16( &info->build_version);
2802 size+=size_of_uint32( &info->unknown7);
2803 size+=size_of_uint32( &info->unknown8);
2804 size+=size_of_uint32( &info->unknown9);
2805 size+=size_of_uint32( &info->session_counter);
2806 size+=size_of_uint32( &info->unknown11);
2807 size+=size_of_uint32( &info->printer_errors);
2808 size+=size_of_uint32( &info->unknown13);
2809 size+=size_of_uint32( &info->unknown14);
2810 size+=size_of_uint32( &info->unknown15);
2811 size+=size_of_uint32( &info->unknown16);
2812 size+=size_of_uint32( &info->change_id);
2813 size+=size_of_uint32( &info->unknown18);
2814 size+=size_of_uint32( &info->status);
2815 size+=size_of_uint32( &info->unknown20);
2816 size+=size_of_uint32( &info->c_setprinter);
2818 size+=size_of_uint16( &info->unknown22);
2819 size+=size_of_uint16( &info->unknown23);
2820 size+=size_of_uint16( &info->unknown24);
2821 size+=size_of_uint16( &info->unknown25);
2822 size+=size_of_uint16( &info->unknown26);
2823 size+=size_of_uint16( &info->unknown27);
2824 size+=size_of_uint16( &info->unknown28);
2825 size+=size_of_uint16( &info->unknown29);
2830 /*******************************************************************
2831 return the size required by a struct in the stream
2832 ********************************************************************/
2834 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2838 size+=size_of_uint32( &info->flags );
2839 size+=size_of_relative_string( &info->description );
2840 size+=size_of_relative_string( &info->name );
2841 size+=size_of_relative_string( &info->comment );
2846 /*******************************************************************
2847 return the size required by a struct in the stream
2848 ********************************************************************/
2850 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2856 size += ndr_size_security_descriptor( info->secdesc, NULL, 0 );
2858 size+=size_of_device_mode( info->devmode );
2860 size+=size_of_relative_string( &info->servername );
2861 size+=size_of_relative_string( &info->printername );
2862 size+=size_of_relative_string( &info->sharename );
2863 size+=size_of_relative_string( &info->portname );
2864 size+=size_of_relative_string( &info->drivername );
2865 size+=size_of_relative_string( &info->comment );
2866 size+=size_of_relative_string( &info->location );
2868 size+=size_of_relative_string( &info->sepfile );
2869 size+=size_of_relative_string( &info->printprocessor );
2870 size+=size_of_relative_string( &info->datatype );
2871 size+=size_of_relative_string( &info->parameters );
2873 size+=size_of_uint32( &info->attributes );
2874 size+=size_of_uint32( &info->priority );
2875 size+=size_of_uint32( &info->defaultpriority );
2876 size+=size_of_uint32( &info->starttime );
2877 size+=size_of_uint32( &info->untiltime );
2878 size+=size_of_uint32( &info->status );
2879 size+=size_of_uint32( &info->cjobs );
2880 size+=size_of_uint32( &info->averageppm );
2883 * add any adjustments for alignment. This is
2884 * not optimal since we could be calling this
2885 * function from a loop (e.g. enumprinters), but
2886 * it is easier to maintain the calculation here and
2887 * not place the burden on the caller to remember. --jerry
2889 if ((size % 4) != 0)
2890 size += 4 - (size % 4);
2895 /*******************************************************************
2896 return the size required by a struct in the stream
2897 ********************************************************************/
2899 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
2903 size+=size_of_relative_string( &info->printername );
2904 size+=size_of_relative_string( &info->servername );
2906 size+=size_of_uint32( &info->attributes );
2910 /*******************************************************************
2911 return the size required by a struct in the stream
2912 ********************************************************************/
2914 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
2918 size+=size_of_relative_string( &info->printername );
2919 size+=size_of_relative_string( &info->portname );
2921 size+=size_of_uint32( &info->attributes );
2922 size+=size_of_uint32( &info->device_not_selected_timeout );
2923 size+=size_of_uint32( &info->transmission_retry_timeout );
2927 /*******************************************************************
2928 return the size required by a struct in the stream
2929 ********************************************************************/
2931 uint32 spoolss_size_printer_info_6(PRINTER_INFO_6 *info)
2933 return sizeof(uint32);
2936 /*******************************************************************
2937 return the size required by a struct in the stream
2938 ********************************************************************/
2940 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
2942 /* The 8 is for the self relative pointer - 8 byte aligned.. */
2943 return 8 + (uint32)ndr_size_security_descriptor( info->secdesc, NULL, 0 );
2946 /*******************************************************************
2947 return the size required by a struct in the stream
2948 ********************************************************************/
2950 uint32 spoolss_size_printer_info_7(PRINTER_INFO_7 *info)
2954 size+=size_of_relative_string( &info->guid );
2955 size+=size_of_uint32( &info->action );
2959 /*******************************************************************
2960 return the size required by a struct in the stream
2961 ********************************************************************/
2963 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2966 size+=size_of_relative_string( &info->name );
2971 /*******************************************************************
2972 return the size required by a struct in the stream
2973 ********************************************************************/
2975 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2978 size+=size_of_uint32( &info->version );
2979 size+=size_of_relative_string( &info->name );
2980 size+=size_of_relative_string( &info->architecture );
2981 size+=size_of_relative_string( &info->driverpath );
2982 size+=size_of_relative_string( &info->datafile );
2983 size+=size_of_relative_string( &info->configfile );
2988 /*******************************************************************
2989 return the size required by a string array.
2990 ********************************************************************/
2992 uint32 spoolss_size_string_array(uint16 *string)
2997 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2999 i=i+2; /* to count all chars including the leading zero */
3000 i=2*i; /* because we need the value in bytes */
3001 i=i+4; /* the offset pointer size */
3006 /*******************************************************************
3007 return the size required by a struct in the stream
3008 ********************************************************************/
3010 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3014 size+=size_of_uint32( &info->version );
3015 size+=size_of_relative_string( &info->name );
3016 size+=size_of_relative_string( &info->architecture );
3017 size+=size_of_relative_string( &info->driverpath );
3018 size+=size_of_relative_string( &info->datafile );
3019 size+=size_of_relative_string( &info->configfile );
3020 size+=size_of_relative_string( &info->helpfile );
3021 size+=size_of_relative_string( &info->monitorname );
3022 size+=size_of_relative_string( &info->defaultdatatype );
3024 size+=spoolss_size_string_array(info->dependentfiles);
3029 /*******************************************************************
3030 return the size required by a struct in the stream
3031 ********************************************************************/
3033 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3037 size+=size_of_uint32( &info->version );
3038 size+=size_of_relative_string( &info->name );
3039 size+=size_of_relative_string( &info->architecture );
3040 size+=size_of_relative_string( &info->driverpath );
3041 size+=size_of_relative_string( &info->datafile );
3042 size+=size_of_relative_string( &info->configfile );
3043 size+=size_of_relative_string( &info->helpfile );
3045 size+=spoolss_size_string_array(info->dependentfiles);
3047 size+=size_of_relative_string( &info->monitorname );
3048 size+=size_of_relative_string( &info->defaultdatatype );
3050 size+=spoolss_size_string_array(info->previousdrivernames);
3052 size+=size_of_nttime(&info->driver_date);
3053 size+=size_of_uint32( &info->padding );
3054 size+=size_of_uint32( &info->driver_version_low );
3055 size+=size_of_uint32( &info->driver_version_high );
3056 size+=size_of_relative_string( &info->mfgname );
3057 size+=size_of_relative_string( &info->oem_url );
3058 size+=size_of_relative_string( &info->hardware_id );
3059 size+=size_of_relative_string( &info->provider );
3064 /*******************************************************************
3065 return the size required by a struct in the stream
3066 ********************************************************************/
3068 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3071 size+=size_of_uint32( &info->jobid );
3072 size+=size_of_relative_string( &info->printername );
3073 size+=size_of_relative_string( &info->machinename );
3074 size+=size_of_relative_string( &info->username );
3075 size+=size_of_relative_string( &info->document );
3076 size+=size_of_relative_string( &info->datatype );
3077 size+=size_of_relative_string( &info->text_status );
3078 size+=size_of_uint32( &info->status );
3079 size+=size_of_uint32( &info->priority );
3080 size+=size_of_uint32( &info->position );
3081 size+=size_of_uint32( &info->totalpages );
3082 size+=size_of_uint32( &info->pagesprinted );
3083 size+=size_of_systemtime( &info->submitted );
3088 /*******************************************************************
3089 return the size required by a struct in the stream
3090 ********************************************************************/
3092 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3096 size+=4; /* size of sec desc ptr */
3098 size+=size_of_uint32( &info->jobid );
3099 size+=size_of_relative_string( &info->printername );
3100 size+=size_of_relative_string( &info->machinename );
3101 size+=size_of_relative_string( &info->username );
3102 size+=size_of_relative_string( &info->document );
3103 size+=size_of_relative_string( &info->notifyname );
3104 size+=size_of_relative_string( &info->datatype );
3105 size+=size_of_relative_string( &info->printprocessor );
3106 size+=size_of_relative_string( &info->parameters );
3107 size+=size_of_relative_string( &info->drivername );
3108 size+=size_of_device_mode( info->devmode );
3109 size+=size_of_relative_string( &info->text_status );
3110 /* SEC_DESC sec_desc;*/
3111 size+=size_of_uint32( &info->status );
3112 size+=size_of_uint32( &info->priority );
3113 size+=size_of_uint32( &info->position );
3114 size+=size_of_uint32( &info->starttime );
3115 size+=size_of_uint32( &info->untiltime );
3116 size+=size_of_uint32( &info->totalpages );
3117 size+=size_of_uint32( &info->size );
3118 size+=size_of_systemtime( &info->submitted );
3119 size+=size_of_uint32( &info->timeelapsed );
3120 size+=size_of_uint32( &info->pagesprinted );
3125 /*******************************************************************
3126 return the size required by a struct in the stream
3127 ********************************************************************/
3129 uint32 spoolss_size_form_1(FORM_1 *info)
3133 size+=size_of_uint32( &info->flag );
3134 size+=size_of_relative_string( &info->name );
3135 size+=size_of_uint32( &info->width );
3136 size+=size_of_uint32( &info->length );
3137 size+=size_of_uint32( &info->left );
3138 size+=size_of_uint32( &info->top );
3139 size+=size_of_uint32( &info->right );
3140 size+=size_of_uint32( &info->bottom );
3145 /*******************************************************************
3146 return the size required by a struct in the stream
3147 ********************************************************************/
3149 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3153 size+=size_of_relative_string( &info->port_name );
3158 /*******************************************************************
3159 return the size required by a struct in the stream
3160 ********************************************************************/
3162 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3166 size=str_len_uni(&info->name); /* the string length */
3167 size=size+1; /* add the leading zero */
3168 size=size*2; /* convert in char */
3173 /*******************************************************************
3174 return the size required by a struct in the stream
3175 ********************************************************************/
3177 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3181 size=str_len_uni(&info->name); /* the string length */
3182 size=size+1; /* add the leading zero */
3183 size=size*2; /* convert in char */
3188 /*******************************************************************
3189 return the size required by a struct in the stream
3190 ********************************************************************/
3192 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3196 size+=size_of_relative_string( &info->port_name );
3197 size+=size_of_relative_string( &info->monitor_name );
3198 size+=size_of_relative_string( &info->description );
3200 size+=size_of_uint32( &info->port_type );
3201 size+=size_of_uint32( &info->reserved );
3206 /*******************************************************************
3207 return the size required by a struct in the stream
3208 ********************************************************************/
3210 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3213 size+=size_of_relative_string( &info->name );
3218 /*******************************************************************
3219 return the size required by a struct in the stream
3220 ********************************************************************/
3222 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3225 size+=size_of_relative_string( &info->name );
3230 /*******************************************************************
3231 return the size required by a struct in the stream
3232 ********************************************************************/
3233 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3240 /* uint32(offset) + uint32(length) + length) */
3241 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3242 size += (size_of_uint32(&p->data_len)*2) + p->data_len + (p->data_len%2) ;
3244 size += size_of_uint32(&p->type);
3249 /*******************************************************************
3250 return the size required by a struct in the stream
3251 ********************************************************************/
3253 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3256 size+=size_of_relative_string( &info->name );
3261 /*******************************************************************
3262 return the size required by a struct in the stream
3263 ********************************************************************/
3265 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3268 size+=size_of_relative_string( &info->name);
3269 size+=size_of_relative_string( &info->environment);
3270 size+=size_of_relative_string( &info->dll_name);
3275 /*******************************************************************
3277 ********************************************************************/
3279 bool make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3280 const POLICY_HND *hnd,
3281 const fstring architecture,
3282 uint32 level, uint32 clientmajor, uint32 clientminor,
3283 RPC_BUFFER *buffer, uint32 offered)
3288 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3290 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3293 q_u->clientmajorversion=clientmajor;
3294 q_u->clientminorversion=clientminor;
3297 q_u->offered=offered;
3302 /*******************************************************************
3304 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3305 ********************************************************************/
3307 bool spoolss_io_q_getprinterdriver2(const char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3309 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3315 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3317 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3319 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3324 if(!prs_uint32("level", ps, depth, &q_u->level))
3327 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3333 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3336 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3338 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3344 /*******************************************************************
3346 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3347 ********************************************************************/
3349 bool spoolss_io_r_getprinterdriver2(const char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3351 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3357 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3362 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3364 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3366 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3368 if (!prs_werror("status", ps, depth, &r_u->status))
3374 /*******************************************************************
3376 ********************************************************************/
3378 bool make_spoolss_q_enumprinters(
3379 SPOOL_Q_ENUMPRINTERS *q_u,
3389 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3390 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3394 q_u->offered=offered;
3399 /*******************************************************************
3401 ********************************************************************/
3403 bool make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3404 fstring servername, uint32 level,
3405 RPC_BUFFER *buffer, uint32 offered)
3407 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3408 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3412 q_u->offered=offered;
3417 /*******************************************************************
3419 * called from spoolss_enumprinters (srv_spoolss.c)
3420 ********************************************************************/
3422 bool spoolss_io_q_enumprinters(const char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3424 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3430 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3432 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3435 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3440 if (!prs_uint32("level", ps, depth, &q_u->level))
3443 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3448 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3454 /*******************************************************************
3455 Parse a SPOOL_R_ENUMPRINTERS structure.
3456 ********************************************************************/
3458 bool spoolss_io_r_enumprinters(const char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3460 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3466 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3472 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3475 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3478 if (!prs_werror("status", ps, depth, &r_u->status))
3484 /*******************************************************************
3485 * write a structure.
3486 * called from spoolss_r_enum_printers (srv_spoolss.c)
3488 ********************************************************************/
3490 bool spoolss_io_r_getprinter(const char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3492 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3498 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3504 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3507 if (!prs_werror("status", ps, depth, &r_u->status))
3513 /*******************************************************************
3515 * called from spoolss_getprinter (srv_spoolss.c)
3516 ********************************************************************/
3518 bool spoolss_io_q_getprinter(const char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3520 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3526 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3528 if (!prs_uint32("level", ps, depth, &q_u->level))
3531 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3536 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3542 /*******************************************************************
3544 ********************************************************************/
3546 bool make_spoolss_q_getprinter(
3547 TALLOC_CTX *mem_ctx,
3548 SPOOL_Q_GETPRINTER *q_u,
3549 const POLICY_HND *hnd,
3559 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3563 q_u->offered=offered;
3568 /*******************************************************************
3570 ********************************************************************/
3571 bool make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
3572 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
3576 DEVICEMODE *devmode;
3581 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3584 q_u->info.level = level;
3585 q_u->info.info_ptr = 1; /* Info is != NULL, see above */
3588 /* There's no such thing as a setprinter level 1 */
3591 secdesc = info->printers_2->secdesc;
3592 devmode = info->printers_2->devmode;
3594 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3595 #if 1 /* JERRY TEST */
3596 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
3597 if (!q_u->secdesc_ctr)
3599 q_u->secdesc_ctr->sd = secdesc;
3600 q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3602 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3603 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
3604 q_u->devmode_ctr.devmode = devmode;
3606 q_u->secdesc_ctr = NULL;
3608 q_u->devmode_ctr.devmode_ptr = 0;
3609 q_u->devmode_ctr.size = 0;
3610 q_u->devmode_ctr.devmode = NULL;
3614 secdesc = info->printers_3->secdesc;
3616 make_spoolss_printer_info_3 (mem_ctx, &q_u->info.info_3, info->printers_3);
3618 q_u->secdesc_ctr = SMB_MALLOC_P(SEC_DESC_BUF);
3619 if (!q_u->secdesc_ctr)
3621 q_u->secdesc_ctr->sd_size = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3622 q_u->secdesc_ctr->sd = secdesc;
3626 make_spoolss_printer_info_7 (mem_ctx, &q_u->info.info_7, info->printers_7);
3630 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3635 q_u->command = command;
3641 /*******************************************************************
3642 ********************************************************************/
3644 bool spoolss_io_r_setprinter(const char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3646 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3652 if(!prs_werror("status", ps, depth, &r_u->status))
3658 /*******************************************************************
3659 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3660 ********************************************************************/
3662 bool spoolss_io_q_setprinter(const char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3664 uint32 ptr_sec_desc = 0;
3666 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3672 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3674 if(!prs_uint32("level", ps, depth, &q_u->level))
3677 /* check for supported levels and structures we know about */
3679 switch ( q_u->level ) {
3684 /* supported levels */
3687 DEBUG(0,("spoolss_io_q_setprinter: unsupported printer info level [%d]\n",
3693 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3696 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3706 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3711 /* FIXME ! Our parsing here is wrong I think,
3712 * but for a level3 it makes no sense for
3713 * ptr_sec_desc to be NULL. JRA. Based on
3714 * a Vista sniff from Martin Zielinski <mz@seh.de>.
3716 if (UNMARSHALLING(ps)) {
3719 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3726 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3731 /* Parse a NULL security descriptor. This should really
3732 happen inside the sec_io_desc_buf() function. */
3734 prs_debug(ps, depth, "", "sec_io_desc_buf");
3735 if (!prs_uint32("size", ps, depth + 1, &dummy))
3737 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
3741 if(!prs_uint32("command", ps, depth, &q_u->command))
3747 /*******************************************************************
3748 ********************************************************************/
3750 bool spoolss_io_r_fcpn(const char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3752 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3758 if(!prs_werror("status", ps, depth, &r_u->status))
3764 /*******************************************************************
3765 ********************************************************************/
3767 bool spoolss_io_q_fcpn(const char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3770 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3776 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3783 /*******************************************************************
3784 ********************************************************************/
3786 bool spoolss_io_r_addjob(const char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3788 prs_debug(ps, depth, desc, "");
3794 if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3800 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3803 if(!prs_werror("status", ps, depth, &r_u->status))
3809 /*******************************************************************
3810 ********************************************************************/
3812 bool spoolss_io_q_addjob(const char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3814 prs_debug(ps, depth, desc, "");
3820 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3822 if(!prs_uint32("level", ps, depth, &q_u->level))
3825 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3831 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3837 /*******************************************************************
3838 ********************************************************************/
3840 bool spoolss_io_r_enumjobs(const char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3842 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3848 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
3854 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3857 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3860 if (!prs_werror("status", ps, depth, &r_u->status))
3866 /*******************************************************************
3867 ********************************************************************/
3869 bool make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3880 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3881 q_u->firstjob = firstjob;
3882 q_u->numofjobs = numofjobs;
3884 q_u->buffer= buffer;
3885 q_u->offered = offered;
3889 /*******************************************************************
3890 ********************************************************************/
3892 bool spoolss_io_q_enumjobs(const char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
3894 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
3900 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
3903 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
3905 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
3907 if (!prs_uint32("level", ps, depth, &q_u->level))
3910 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
3916 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3922 /*******************************************************************
3923 ********************************************************************/
3925 bool spoolss_io_r_schedulejob(const char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
3927 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
3933 if(!prs_werror("status", ps, depth, &r_u->status))
3939 /*******************************************************************
3940 ********************************************************************/
3942 bool spoolss_io_q_schedulejob(const char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
3944 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
3950 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3952 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3958 /*******************************************************************
3959 ********************************************************************/
3961 bool spoolss_io_r_setjob(const char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
3963 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
3969 if(!prs_werror("status", ps, depth, &r_u->status))
3975 /*******************************************************************
3976 ********************************************************************/
3978 bool spoolss_io_q_setjob(const char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3980 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3986 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3988 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3991 * level is usually 0. If (level!=0) then I'm in trouble !
3992 * I will try to generate setjob command with level!=0, one day.
3994 if(!prs_uint32("level", ps, depth, &q_u->level))
3996 if(!prs_uint32("command", ps, depth, &q_u->command))
4002 /*******************************************************************
4003 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4004 ********************************************************************/
4006 bool spoolss_io_r_enumprinterdrivers(const char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
4008 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
4014 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4020 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4023 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4026 if (!prs_werror("status", ps, depth, &r_u->status))
4032 /*******************************************************************
4034 ********************************************************************/
4036 bool make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4038 const char *environment,
4040 RPC_BUFFER *buffer, uint32 offered)
4042 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4043 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4047 q_u->offered=offered;
4052 /*******************************************************************
4053 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4054 ********************************************************************/
4056 bool spoolss_io_q_enumprinterdrivers(const char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4059 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4065 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4067 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4072 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4074 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4079 if (!prs_uint32("level", ps, depth, &q_u->level))
4082 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4088 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4094 /*******************************************************************
4095 ********************************************************************/
4097 bool spoolss_io_q_enumforms(const char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4100 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4105 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4107 if (!prs_uint32("level", ps, depth, &q_u->level))
4110 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4115 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4121 /*******************************************************************
4122 ********************************************************************/
4124 bool spoolss_io_r_enumforms(const char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4126 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4132 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4138 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4141 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4144 if (!prs_werror("status", ps, depth, &r_u->status))
4150 /*******************************************************************
4151 ********************************************************************/
4153 bool spoolss_io_q_getform(const char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4156 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4161 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4163 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4169 if (!prs_uint32("level", ps, depth, &q_u->level))
4172 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4177 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4183 /*******************************************************************
4184 ********************************************************************/
4186 bool spoolss_io_r_getform(const char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4188 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4194 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4200 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4203 if (!prs_werror("status", ps, depth, &r_u->status))
4209 /*******************************************************************
4210 Parse a SPOOL_R_ENUMPORTS structure.
4211 ********************************************************************/
4213 bool spoolss_io_r_enumports(const char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4215 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4221 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
4227 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4230 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4233 if (!prs_werror("status", ps, depth, &r_u->status))
4239 /*******************************************************************
4240 ********************************************************************/
4242 bool spoolss_io_q_enumports(const char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4244 prs_debug(ps, depth, desc, "");
4250 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4252 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4257 if (!prs_uint32("level", ps, depth, &q_u->level))
4260 if (!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
4265 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4271 /*******************************************************************
4272 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4273 ********************************************************************/
4275 bool spool_io_printer_info_level_1(const char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4277 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4283 if(!prs_uint32("flags", ps, depth, &il->flags))
4285 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4287 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4289 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4292 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4294 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4296 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4302 /*******************************************************************
4303 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4304 ********************************************************************/
4306 bool spool_io_printer_info_level_3(const char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4308 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4314 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4320 /*******************************************************************
4321 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4322 ********************************************************************/
4324 bool spool_io_printer_info_level_2(const char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4326 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4332 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4334 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4336 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4338 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4341 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4343 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4345 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4347 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4349 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4351 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4353 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4355 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4357 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4360 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4362 if(!prs_uint32("priority", ps, depth, &il->priority))
4364 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4366 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4368 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4370 if(!prs_uint32("status", ps, depth, &il->status))
4372 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4374 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4377 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4379 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4381 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4383 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4385 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4387 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4389 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4391 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4393 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4395 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4397 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4403 bool spool_io_printer_info_level_7(const char *desc, SPOOL_PRINTER_INFO_LEVEL_7 *il, prs_struct *ps, int depth)
4405 prs_debug(ps, depth, desc, "spool_io_printer_info_level_7");
4411 if(!prs_uint32("guid_ptr", ps, depth, &il->guid_ptr))
4413 if(!prs_uint32("action", ps, depth, &il->action))
4416 if(!smb_io_unistr2("servername", &il->guid, il->guid_ptr, ps, depth))
4421 /*******************************************************************
4422 ********************************************************************/
4424 bool spool_io_printer_info_level(const char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4426 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4431 if(!prs_uint32("level", ps, depth, &il->level))
4433 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4436 /* if no struct inside just return */
4437 if (il->info_ptr==0) {
4438 if (UNMARSHALLING(ps)) {
4445 switch (il->level) {
4447 * level 0 is used by setprinter when managing the queue
4448 * (hold, stop, start a queue)
4452 /* DOCUMENT ME!!! What is level 1 used for? */
4455 if (UNMARSHALLING(ps)) {
4456 if ((il->info_1=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_1,1)) == NULL)
4459 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4464 * level 2 is used by addprinter
4465 * and by setprinter when updating printer's info
4468 if (UNMARSHALLING(ps)) {
4469 if ((il->info_2=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_2,1)) == NULL)
4472 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4475 /* DOCUMENT ME!!! What is level 3 used for? */
4478 if (UNMARSHALLING(ps)) {
4479 if ((il->info_3=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_3,1)) == NULL)
4482 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4487 if (UNMARSHALLING(ps))
4488 if ((il->info_7=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_INFO_LEVEL_7,1)) == NULL)
4490 if (!spool_io_printer_info_level_7("", il->info_7, ps, depth))
4498 /*******************************************************************
4499 ********************************************************************/
4501 bool spoolss_io_q_addprinterex(const char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4503 uint32 ptr_sec_desc = 0;
4505 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4511 if (!prs_io_unistr2_p("ptr", ps, depth, &q_u->server_name))
4513 if (!prs_io_unistr2("servername", ps, depth, q_u->server_name))
4519 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4522 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4525 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4531 switch (q_u->level) {
4533 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4536 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4540 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4545 /* Parse a NULL security descriptor. This should really
4546 happen inside the sec_io_desc_buf() function. */
4548 prs_debug(ps, depth, "", "sec_io_desc_buf");
4549 if (!prs_uint32("size", ps, depth + 1, &dummy))
4551 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
4555 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4557 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4563 /*******************************************************************
4564 ********************************************************************/
4566 bool spoolss_io_r_addprinterex(const char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4567 prs_struct *ps, int depth)
4569 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4572 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4575 if(!prs_werror("status", ps, depth, &r_u->status))
4581 /*******************************************************************
4582 ********************************************************************/
4584 bool spool_io_printer_driver_info_level_3(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4585 prs_struct *ps, int depth)
4587 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4589 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4593 if (UNMARSHALLING(ps)) {
4594 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_3,1);
4606 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4608 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4610 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4612 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4614 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4616 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4618 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4620 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4622 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4624 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4626 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4632 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4634 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4636 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4638 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4640 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4642 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4644 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4646 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4652 if (il->dependentfiles_ptr)
4653 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4658 /*******************************************************************
4659 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4660 ********************************************************************/
4662 bool spool_io_printer_driver_info_level_6(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4663 prs_struct *ps, int depth)
4665 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4667 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4671 if (UNMARSHALLING(ps)) {
4672 il=PRS_ALLOC_MEM(ps,SPOOL_PRINTER_DRIVER_INFO_LEVEL_6,1);
4685 * I know this seems weird, but I have no other explanation.
4686 * This is observed behavior on both NT4 and 2K servers.
4690 if (!prs_align_uint64(ps))
4693 /* parse the main elements the packet */
4695 if(!prs_uint32("cversion ", ps, depth, &il->version))
4697 if(!prs_uint32("name ", ps, depth, &il->name_ptr))
4699 if(!prs_uint32("environment ", ps, depth, &il->environment_ptr))
4701 if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
4703 if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
4705 if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
4707 if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
4709 if(!prs_uint32("monitorname ", ps, depth, &il->monitorname_ptr))
4711 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4713 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_len))
4715 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_ptr))
4717 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_len))
4719 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_ptr))
4721 if(!smb_io_time("driverdate ", &il->driverdate, ps, depth))
4723 if(!prs_uint32("dummy4 ", ps, depth, &il->dummy4))
4725 if(!prs_uint64("driverversion ", ps, depth, &il->driverversion))
4727 if(!prs_uint32("mfgname ", ps, depth, &il->mfgname_ptr))
4729 if(!prs_uint32("oemurl ", ps, depth, &il->oemurl_ptr))
4731 if(!prs_uint32("hardwareid ", ps, depth, &il->hardwareid_ptr))
4733 if(!prs_uint32("provider ", ps, depth, &il->provider_ptr))
4736 /* parse the structures in the packet */
4738 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4743 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4748 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4753 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4758 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4763 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4768 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4773 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4777 if (il->dependentfiles_ptr) {
4778 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4783 if (il->previousnames_ptr) {
4784 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4789 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4793 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4797 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4801 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4807 /*******************************************************************
4808 convert a buffer of UNICODE strings null terminated
4809 the buffer is terminated by a NULL
4811 convert to an dos codepage array (null terminated)
4813 dynamically allocate memory
4815 ********************************************************************/
4817 static bool uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4826 src = (char *)buf5->buffer;
4827 *ar = SMB_MALLOC_ARRAY(fstring, 1);
4832 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4833 rpcstr_pull(f, src, sizeof(f)-1, -1, STR_TERMINATE);
4834 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4835 *ar = SMB_REALLOC_ARRAY(*ar, fstring, n+2);
4839 fstrcpy((*ar)[n], f);
4843 fstrcpy((*ar)[n], "");
4848 /*******************************************************************
4849 read a UNICODE array with null terminated strings
4850 and null terminated array
4851 and size of array at beginning
4852 ********************************************************************/
4854 bool smb_io_unibuffer(const char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
4856 if (buffer==NULL) return False;
4859 buffer->uni_str_len=buffer->uni_max_len;
4861 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
4864 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
4870 /*******************************************************************
4871 ********************************************************************/
4873 bool spool_io_printer_driver_info_level(const char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
4875 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
4880 if(!prs_uint32("level", ps, depth, &il->level))
4882 if(!prs_uint32("ptr", ps, depth, &il->ptr))
4888 switch (il->level) {
4890 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
4894 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
4904 /*******************************************************************
4905 init a SPOOL_Q_ADDPRINTERDRIVER struct
4906 ******************************************************************/
4908 bool make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
4909 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
4910 uint32 level, PRINTER_DRIVER_CTR *info)
4912 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
4914 if (!srv_name || !info) {
4918 q_u->server_name_ptr = 1; /* srv_name is != NULL, see above */
4919 init_unistr2(&q_u->server_name, srv_name, UNI_STR_TERMINATE);
4923 q_u->info.level = level;
4924 q_u->info.ptr = 1; /* Info is != NULL, see above */
4927 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
4929 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
4933 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
4940 bool make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
4941 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
4942 DRIVER_INFO_3 *info3)
4945 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
4947 if (!(inf=TALLOC_ZERO_P(mem_ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)))
4950 inf->cversion = info3->version;
4951 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
4952 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
4953 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
4954 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
4955 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
4956 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
4957 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
4958 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
4960 init_unistr2_from_unistr(inf, &inf->name, &info3->name);
4961 init_unistr2_from_unistr(inf, &inf->environment, &info3->architecture);
4962 init_unistr2_from_unistr(inf, &inf->driverpath, &info3->driverpath);
4963 init_unistr2_from_unistr(inf, &inf->datafile, &info3->datafile);
4964 init_unistr2_from_unistr(inf, &inf->configfile, &info3->configfile);
4965 init_unistr2_from_unistr(inf, &inf->helpfile, &info3->helpfile);
4966 init_unistr2_from_unistr(inf, &inf->monitorname, &info3->monitorname);
4967 init_unistr2_from_unistr(inf, &inf->defaultdatatype, &info3->defaultdatatype);
4969 if (info3->dependentfiles) {
4971 bool null_char = False;
4972 uint16 *ptr = info3->dependentfiles;
4977 /* the null_char bool is used to help locate
4978 two '\0's back to back */
4995 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
4996 inf->dependentfilessize = (info3->dependentfiles != NULL) ? len : 0;
4997 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles)) {
5002 *spool_drv_info = inf;
5007 /*******************************************************************
5008 make a BUFFER5 struct from a uint16*
5009 ******************************************************************/
5011 bool make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
5014 buf5->buf_len = len;
5017 if((buf5->buffer=(uint16*)TALLOC_MEMDUP(mem_ctx, src, sizeof(uint16)*len)) == NULL) {
5018 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5022 buf5->buffer = NULL;
5031 /*******************************************************************
5032 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5033 ********************************************************************/
5035 bool spoolss_io_q_addprinterdriver(const char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5037 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
5043 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5045 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5050 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5053 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5059 /*******************************************************************
5060 ********************************************************************/
5062 bool spoolss_io_r_addprinterdriver(const char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5064 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
5067 if(!prs_werror("status", ps, depth, &q_u->status))
5073 /*******************************************************************
5074 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5075 ********************************************************************/
5077 bool spoolss_io_q_addprinterdriverex(const char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5079 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
5085 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5087 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5092 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5095 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5100 if(!prs_uint32("copy flags", ps, depth, &q_u->copy_flags))
5106 /*******************************************************************
5107 ********************************************************************/
5109 bool spoolss_io_r_addprinterdriverex(const char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5111 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
5114 if(!prs_werror("status", ps, depth, &q_u->status))
5120 /*******************************************************************
5121 ********************************************************************/
5123 bool uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5124 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5126 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5128 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5132 *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_3);
5140 d->cversion=uni->cversion;
5142 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name));
5143 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment));
5144 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath));
5145 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile));
5146 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile));
5147 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile));
5148 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname));
5149 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype));
5151 DEBUGADD(8,( "version: %d\n", d->cversion));
5152 DEBUGADD(8,( "name: %s\n", d->name));
5153 DEBUGADD(8,( "environment: %s\n", d->environment));
5154 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5155 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5156 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5157 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5158 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5159 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5161 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5168 /*******************************************************************
5169 ********************************************************************/
5170 bool uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5171 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5173 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5175 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5179 *asc=SMB_MALLOC_P(NT_PRINTER_DRIVER_INFO_LEVEL_6);
5187 d->version=uni->version;
5189 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name));
5190 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment));
5191 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath));
5192 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile));
5193 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile));
5194 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile));
5195 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname));
5196 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype));
5198 DEBUGADD(8,( "version: %d\n", d->version));
5199 DEBUGADD(8,( "name: %s\n", d->name));
5200 DEBUGADD(8,( "environment: %s\n", d->environment));
5201 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5202 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5203 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5204 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5205 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5206 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5208 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5210 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5220 bool uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5221 NT_PRINTER_INFO_LEVEL_2 *d)
5223 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5225 d->attributes=uni->attributes;
5226 d->priority=uni->priority;
5227 d->default_priority=uni->default_priority;
5228 d->starttime=uni->starttime;
5229 d->untiltime=uni->untiltime;
5230 d->status=uni->status;
5231 d->cjobs=uni->cjobs;
5233 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername));
5234 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername));
5235 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename));
5236 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname));
5237 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername));
5238 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment));
5239 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location));
5240 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile));
5241 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor));
5242 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype));
5243 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters));
5248 /*******************************************************************
5250 ********************************************************************/
5252 bool make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5253 fstring servername, fstring env_name, uint32 level,
5254 RPC_BUFFER *buffer, uint32 offered)
5256 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5257 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5261 q_u->offered=offered;
5266 /*******************************************************************
5267 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5268 ********************************************************************/
5270 bool spoolss_io_q_getprinterdriverdir(const char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5272 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5277 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5279 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5285 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5287 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5293 if(!prs_uint32("level", ps, depth, &q_u->level))
5296 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5302 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5308 /*******************************************************************
5309 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5310 ********************************************************************/
5312 bool spoolss_io_r_getprinterdriverdir(const char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5314 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5320 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5326 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5329 if (!prs_werror("status", ps, depth, &r_u->status))
5335 /*******************************************************************
5336 ********************************************************************/
5338 bool spoolss_io_r_enumprintprocessors(const char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5340 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5346 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5352 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5355 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5358 if (!prs_werror("status", ps, depth, &r_u->status))
5364 /*******************************************************************
5365 ********************************************************************/
5367 bool spoolss_io_q_enumprintprocessors(const char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5369 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5375 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5377 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5383 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5385 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5391 if (!prs_uint32("level", ps, depth, &q_u->level))
5394 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5400 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5406 /*******************************************************************
5407 ********************************************************************/
5409 bool spoolss_io_q_addprintprocessor(const char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5411 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5417 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5419 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5424 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5429 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5434 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5440 /*******************************************************************
5441 ********************************************************************/
5443 bool spoolss_io_r_addprintprocessor(const char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5445 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5451 if (!prs_werror("status", ps, depth, &r_u->status))
5457 /*******************************************************************
5458 ********************************************************************/
5460 bool spoolss_io_r_enumprintprocdatatypes(const char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5462 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5468 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5474 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5477 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5480 if (!prs_werror("status", ps, depth, &r_u->status))
5486 /*******************************************************************
5487 ********************************************************************/
5489 bool spoolss_io_q_enumprintprocdatatypes(const char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5491 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5497 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5499 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5505 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5507 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5513 if (!prs_uint32("level", ps, depth, &q_u->level))
5516 if(!prs_rpcbuffer_p("buffer", ps, depth, &q_u->buffer))
5522 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5528 /*******************************************************************
5529 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5530 ********************************************************************/
5532 bool spoolss_io_q_enumprintmonitors(const char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5534 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5540 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5542 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5548 if (!prs_uint32("level", ps, depth, &q_u->level))
5551 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
5557 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5563 /*******************************************************************
5564 ********************************************************************/
5566 bool spoolss_io_r_enumprintmonitors(const char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5568 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5574 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
5580 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5583 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5586 if (!prs_werror("status", ps, depth, &r_u->status))
5592 /*******************************************************************
5593 ********************************************************************/
5595 bool spoolss_io_r_enumprinterdata(const char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5597 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5602 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5605 if (UNMARSHALLING(ps) && r_u->valuesize) {
5606 r_u->value = PRS_ALLOC_MEM(ps, uint16, r_u->valuesize);
5608 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
5613 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5619 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5622 if(!prs_uint32("type", ps, depth, &r_u->type))
5625 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5628 if (UNMARSHALLING(ps) && r_u->datasize) {
5629 r_u->data = PRS_ALLOC_MEM(ps, uint8, r_u->datasize);
5631 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
5636 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5641 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5643 if(!prs_werror("status", ps, depth, &r_u->status))
5649 /*******************************************************************
5650 ********************************************************************/
5652 bool spoolss_io_q_enumprinterdata(const char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5654 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5659 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5661 if(!prs_uint32("index", ps, depth, &q_u->index))
5663 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5665 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5671 /*******************************************************************
5672 ********************************************************************/
5674 bool make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5675 const POLICY_HND *hnd,
5676 uint32 idx, uint32 valuelen, uint32 datalen)
5678 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5680 q_u->valuesize=valuelen;
5681 q_u->datasize=datalen;
5686 /*******************************************************************
5687 ********************************************************************/
5689 bool make_spoolss_q_enumprinterdataex(SPOOL_Q_ENUMPRINTERDATAEX *q_u,
5690 const POLICY_HND *hnd, const char *key,
5693 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5694 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
5700 /*******************************************************************
5701 ********************************************************************/
5702 bool make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
5703 char* value, uint32 data_type, char* data, uint32 data_size)
5705 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5706 q_u->type = data_type;
5707 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
5709 q_u->max_len = q_u->real_len = data_size;
5710 q_u->data = (unsigned char *)data;
5715 /*******************************************************************
5716 ********************************************************************/
5717 bool make_spoolss_q_setprinterdataex(SPOOL_Q_SETPRINTERDATAEX *q_u, const POLICY_HND *hnd,
5718 char *key, char* value, uint32 data_type, char* data,
5721 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5722 q_u->type = data_type;
5723 init_unistr2(&q_u->value, value, UNI_STR_TERMINATE);
5724 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
5726 q_u->max_len = q_u->real_len = data_size;
5727 q_u->data = (unsigned char *)data;
5732 /*******************************************************************
5733 ********************************************************************/
5735 bool spoolss_io_q_setprinterdata(const char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5737 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5742 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5744 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5750 if(!prs_uint32("type", ps, depth, &q_u->type))
5753 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5763 if (UNMARSHALLING(ps))
5764 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
5765 if(q_u->data == NULL)
5767 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5775 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5781 /*******************************************************************
5782 ********************************************************************/
5784 bool spoolss_io_r_setprinterdata(const char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5786 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5791 if(!prs_werror("status", ps, depth, &r_u->status))
5797 /*******************************************************************
5798 ********************************************************************/
5799 bool spoolss_io_q_resetprinter(const char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
5801 prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
5806 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5809 if (!prs_uint32("datatype_ptr", ps, depth, &q_u->datatype_ptr))
5812 if (q_u->datatype_ptr) {
5813 if (!smb_io_unistr2("datatype", &q_u->datatype, q_u->datatype_ptr?True:False, ps, depth))
5817 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
5824 /*******************************************************************
5825 ********************************************************************/
5826 bool spoolss_io_r_resetprinter(const char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
5828 prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
5833 if(!prs_werror("status", ps, depth, &r_u->status))
5839 /*******************************************************************
5840 ********************************************************************/
5842 static bool spoolss_io_addform(const char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5844 prs_debug(ps, depth, desc, "spoolss_io_addform");
5851 if(!prs_uint32("flags", ps, depth, &f->flags))
5853 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
5855 if(!prs_uint32("size_x", ps, depth, &f->size_x))
5857 if(!prs_uint32("size_y", ps, depth, &f->size_y))
5859 if(!prs_uint32("left", ps, depth, &f->left))
5861 if(!prs_uint32("top", ps, depth, &f->top))
5863 if(!prs_uint32("right", ps, depth, &f->right))
5865 if(!prs_uint32("bottom", ps, depth, &f->bottom))
5868 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
5875 /*******************************************************************
5876 ********************************************************************/
5878 bool spoolss_io_q_deleteform(const char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
5880 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
5885 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5887 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
5893 /*******************************************************************
5894 ********************************************************************/
5896 bool spoolss_io_r_deleteform(const char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
5898 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
5903 if(!prs_werror("status", ps, depth, &r_u->status))
5909 /*******************************************************************
5910 ********************************************************************/
5912 bool spoolss_io_q_addform(const char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
5914 uint32 useless_ptr=1;
5915 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
5920 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5922 if(!prs_uint32("level", ps, depth, &q_u->level))
5924 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5929 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5931 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5938 /*******************************************************************
5939 ********************************************************************/
5941 bool spoolss_io_r_addform(const char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
5943 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
5948 if(!prs_werror("status", ps, depth, &r_u->status))
5954 /*******************************************************************
5955 ********************************************************************/
5957 bool spoolss_io_q_setform(const char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
5959 uint32 useless_ptr=1;
5960 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
5965 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5967 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
5973 if(!prs_uint32("level", ps, depth, &q_u->level))
5975 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5980 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5982 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5989 /*******************************************************************
5990 ********************************************************************/
5992 bool spoolss_io_r_setform(const char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
5994 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
5999 if(!prs_werror("status", ps, depth, &r_u->status))
6005 /*******************************************************************
6006 Parse a SPOOL_R_GETJOB structure.
6007 ********************************************************************/
6009 bool spoolss_io_r_getjob(const char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
6011 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
6017 if (!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
6023 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6026 if (!prs_werror("status", ps, depth, &r_u->status))
6032 /*******************************************************************
6033 Parse a SPOOL_Q_GETJOB structure.
6034 ********************************************************************/
6036 bool spoolss_io_q_getjob(const char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
6038 prs_debug(ps, depth, desc, "");
6044 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6046 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
6048 if(!prs_uint32("level", ps, depth, &q_u->level))
6051 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
6057 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6063 void free_devmode(DEVICEMODE *devmode)
6065 if (devmode!=NULL) {
6066 SAFE_FREE(devmode->dev_private);
6071 void free_printer_info_1(PRINTER_INFO_1 *printer)
6076 void free_printer_info_2(PRINTER_INFO_2 *printer)
6078 if (printer!=NULL) {
6079 free_devmode(printer->devmode);
6080 printer->devmode = NULL;
6085 void free_printer_info_3(PRINTER_INFO_3 *printer)
6090 void free_printer_info_4(PRINTER_INFO_4 *printer)
6095 void free_printer_info_5(PRINTER_INFO_5 *printer)
6100 void free_printer_info_6(PRINTER_INFO_6 *printer)
6105 void free_printer_info_7(PRINTER_INFO_7 *printer)
6110 void free_job_info_2(JOB_INFO_2 *job)
6113 free_devmode(job->devmode);
6116 /*******************************************************************
6118 ********************************************************************/
6120 bool make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
6121 const fstring string, uint32 printer, uint32 type)
6126 init_unistr2(&q_u->string, string, UNI_STR_TERMINATE);
6128 q_u->printer=printer;
6137 /*******************************************************************
6138 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6139 ********************************************************************/
6141 bool spoolss_io_q_replyopenprinter(const char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
6143 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
6149 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
6155 if(!prs_uint32("printer", ps, depth, &q_u->printer))
6157 if(!prs_uint32("type", ps, depth, &q_u->type))
6160 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6162 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6168 /*******************************************************************
6169 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6170 ********************************************************************/
6172 bool spoolss_io_r_replyopenprinter(const char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
6174 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
6180 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6183 if (!prs_werror("status", ps, depth, &r_u->status))
6189 /*******************************************************************
6191 ********************************************************************/
6192 bool make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd,
6193 uint32 condition, uint32 change_id)
6196 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6198 q_u->condition = condition;
6199 q_u->change_id = change_id;
6202 q_u->unknown1 = 0x1;
6203 memset(q_u->unknown2, 0x0, 5);
6204 q_u->unknown2[0] = 0x1;
6209 /*******************************************************************
6210 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6211 ********************************************************************/
6212 bool spoolss_io_q_routerreplyprinter (const char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
6215 prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
6221 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6224 if (!prs_uint32("condition", ps, depth, &q_u->condition))
6227 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6230 if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
6233 if (!prs_uint8s(False, "dev_private", ps, depth, q_u->unknown2, 5))
6239 /*******************************************************************
6240 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6241 ********************************************************************/
6242 bool spoolss_io_r_routerreplyprinter (const char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
6244 prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
6250 if (!prs_werror("status", ps, depth, &r_u->status))
6256 /*******************************************************************
6258 ********************************************************************/
6260 bool make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6265 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6270 /*******************************************************************
6271 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6272 ********************************************************************/
6274 bool spoolss_io_q_replycloseprinter(const char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6276 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6282 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6288 /*******************************************************************
6289 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6290 ********************************************************************/
6292 bool spoolss_io_r_replycloseprinter(const char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6294 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6300 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6303 if (!prs_werror("status", ps, depth, &r_u->status))
6309 #if 0 /* JERRY - not currently used but could be :-) */
6311 /*******************************************************************
6312 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6313 ******************************************************************/
6314 static bool copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
6315 SPOOL_NOTIFY_INFO_DATA *src, int n)
6319 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
6321 for (i=0; i<n; i++) {
6325 if (src->size != POINTER)
6327 len = src->notify_data.data.length;
6328 s = SMB_MALLOC_ARRAY(uint16, len);
6330 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6334 memcpy(s, src->notify_data.data.string, len*2);
6335 dst->notify_data.data.string = s;
6341 /*******************************************************************
6342 Deep copy a SPOOL_NOTIFY_INFO structure
6343 ******************************************************************/
6344 static bool copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
6347 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6351 dst->version = src->version;
6352 dst->flags = src->flags;
6353 dst->count = src->count;
6357 dst->data = SMB_MALLOC_ARRAY(SPOOL_NOTIFY_INFO_DATA, dst->count);
6359 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6362 if (dst->data == NULL) {
6363 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6368 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
6375 /*******************************************************************
6377 ********************************************************************/
6379 bool make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6380 uint32 change_low, uint32 change_high,
6381 SPOOL_NOTIFY_INFO *info)
6386 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6388 q_u->change_low=change_low;
6389 q_u->change_high=change_high;
6394 q_u->info_ptr=0x0FF0ADDE;
6396 q_u->info.version=2;
6399 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6401 q_u->info.version = info->version;
6402 q_u->info.flags = info->flags;
6403 q_u->info.count = info->count;
6404 /* pointer field - be careful! */
6405 q_u->info.data = info->data;
6408 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6415 /*******************************************************************
6416 Parse a SPOOL_Q_REPLY_RRPCN structure.
6417 ********************************************************************/
6419 bool spoolss_io_q_reply_rrpcn(const char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6421 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6427 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6430 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6433 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6436 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6439 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6442 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6445 if(q_u->info_ptr!=0)
6446 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6452 /*******************************************************************
6453 Parse a SPOOL_R_REPLY_RRPCN structure.
6454 ********************************************************************/
6456 bool spoolss_io_r_reply_rrpcn(const char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6458 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
6464 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6467 if (!prs_werror("status", ps, depth, &r_u->status))
6473 /*******************************************************************
6475 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6476 ********************************************************************/
6478 bool spoolss_io_q_getprinterdataex(const char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6483 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6488 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6492 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6496 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6500 if (!prs_uint32("size", ps, depth, &q_u->size))
6506 /*******************************************************************
6507 * write a structure.
6508 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6509 ********************************************************************/
6511 bool spoolss_io_r_getprinterdataex(const char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6516 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6521 if (!prs_uint32("type", ps, depth, &r_u->type))
6523 if (!prs_uint32("size", ps, depth, &r_u->size))
6526 if (UNMARSHALLING(ps) && r_u->size) {
6527 r_u->data = PRS_ALLOC_MEM(ps, unsigned char, r_u->size);
6532 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6538 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6540 if (!prs_werror("status", ps, depth, &r_u->status))
6546 /*******************************************************************
6548 ********************************************************************/
6550 bool spoolss_io_q_setprinterdataex(const char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6552 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6557 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6559 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6565 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6571 if(!prs_uint32("type", ps, depth, &q_u->type))
6574 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6584 if (UNMARSHALLING(ps))
6585 q_u->data=PRS_ALLOC_MEM(ps, uint8, q_u->max_len);
6586 if(q_u->data == NULL)
6588 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6596 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6602 /*******************************************************************
6603 * write a structure.
6604 ********************************************************************/
6606 bool spoolss_io_r_setprinterdataex(const char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6608 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6613 if(!prs_werror("status", ps, depth, &r_u->status))
6619 /*******************************************************************
6621 ********************************************************************/
6622 bool make_spoolss_q_enumprinterkey(SPOOL_Q_ENUMPRINTERKEY *q_u,
6623 POLICY_HND *hnd, const char *key,
6626 DEBUG(5,("make_spoolss_q_enumprinterkey\n"));
6628 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6629 init_unistr2(&q_u->key, key, UNI_STR_TERMINATE);
6635 /*******************************************************************
6637 ********************************************************************/
6639 bool spoolss_io_q_enumprinterkey(const char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6641 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
6646 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6649 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6655 if(!prs_uint32("size", ps, depth, &q_u->size))
6661 /*******************************************************************
6662 * write a structure.
6663 ********************************************************************/
6665 bool spoolss_io_r_enumprinterkey(const char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
6667 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
6673 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
6679 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6682 if(!prs_werror("status", ps, depth, &r_u->status))
6688 /*******************************************************************
6690 ********************************************************************/
6692 bool make_spoolss_q_deleteprinterkey(SPOOL_Q_DELETEPRINTERKEY *q_u,
6693 POLICY_HND *hnd, char *keyname)
6695 DEBUG(5,("make_spoolss_q_deleteprinterkey\n"));
6697 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6698 init_unistr2(&q_u->keyname, keyname, UNI_STR_TERMINATE);
6703 /*******************************************************************
6705 ********************************************************************/
6707 bool spoolss_io_q_deleteprinterkey(const char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
6709 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterkey");
6714 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6717 if(!smb_io_unistr2("", &q_u->keyname, True, ps, depth))
6723 /*******************************************************************
6724 * write a structure.
6725 ********************************************************************/
6727 bool spoolss_io_r_deleteprinterkey(const char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
6729 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterkey");
6735 if(!prs_werror("status", ps, depth, &r_u->status))
6742 /*******************************************************************
6744 ********************************************************************/
6746 bool spoolss_io_q_enumprinterdataex(const char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6748 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
6753 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6756 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6762 if(!prs_uint32("size", ps, depth, &q_u->size))
6768 /*******************************************************************
6769 ********************************************************************/
6771 static bool spoolss_io_printer_enum_values_ctr(const char *desc, prs_struct *ps,
6772 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
6775 uint32 valuename_offset,
6778 const uint32 basic_unit = 20; /* size of static portion of enum_values */
6780 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
6784 * offset data begins at 20 bytes per structure * size_of_array.
6785 * Don't forget the uint32 at the beginning
6788 current_offset = basic_unit * ctr->size_of_array;
6790 /* first loop to write basic enum_value information */
6792 if (UNMARSHALLING(ps) && ctr->size_of_array) {
6793 ctr->values = PRS_ALLOC_MEM(ps, PRINTER_ENUM_VALUES, ctr->size_of_array);
6798 for (i=0; i<ctr->size_of_array; i++) {
6799 uint32 base_offset, return_offset;
6801 base_offset = prs_offset(ps);
6803 valuename_offset = current_offset;
6804 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
6807 /* Read or write the value. */
6809 return_offset = prs_offset(ps);
6811 if (!prs_set_offset(ps, base_offset + valuename_offset)) {
6815 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
6819 if (!prs_set_offset(ps, return_offset))
6822 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
6825 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
6828 data_offset = ctr->values[i].value_len + valuename_offset;
6830 if (!prs_uint32("data_offset", ps, depth, &data_offset))
6833 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
6836 /* Read or write the data. */
6838 return_offset = prs_offset(ps);
6840 if (!prs_set_offset(ps, base_offset + data_offset)) {
6844 if ( ctr->values[i].data_len ) {
6845 if ( UNMARSHALLING(ps) ) {
6846 ctr->values[i].data = PRS_ALLOC_MEM(ps, uint8, ctr->values[i].data_len);
6847 if (!ctr->values[i].data)
6850 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
6854 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
6855 /* account for 2 byte alignment */
6856 current_offset += (current_offset % 2);
6858 /* Remember how far we got. */
6859 data_offset = prs_offset(ps);
6862 if (!prs_set_offset(ps, return_offset))
6867 /* Go to the last data offset we got to. */
6869 if (!prs_set_offset(ps, data_offset))
6872 /* And ensure we're 2 byte aligned. */
6874 if ( !prs_align_uint16(ps) )
6880 /*******************************************************************
6881 * write a structure.
6882 ********************************************************************/
6884 bool spoolss_io_r_enumprinterdataex(const char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6886 uint32 data_offset, end_offset;
6887 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
6893 if (!prs_uint32("size", ps, depth, &r_u->ctr.size))
6896 data_offset = prs_offset(ps);
6898 if (!prs_set_offset(ps, data_offset + r_u->ctr.size))
6904 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6907 if(!prs_uint32("returned", ps, depth, &r_u->returned))
6910 if(!prs_werror("status", ps, depth, &r_u->status))
6913 r_u->ctr.size_of_array = r_u->returned;
6915 end_offset = prs_offset(ps);
6917 if (!prs_set_offset(ps, data_offset))
6921 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
6924 if (!prs_set_offset(ps, end_offset))
6929 /*******************************************************************
6930 * write a structure.
6931 ********************************************************************/
6934 uint32 GetPrintProcessorDirectory(
6936 [in] unistr2 *environment,
6938 [in,out] RPC_BUFFER buffer,
6939 [in] uint32 offered,
6940 [out] uint32 needed,
6941 [out] uint32 returned
6946 bool make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, RPC_BUFFER *buffer, uint32 offered)
6948 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
6950 init_unistr2(&q_u->name, name, UNI_STR_TERMINATE);
6951 init_unistr2(&q_u->environment, environment, UNI_STR_TERMINATE);
6955 q_u->buffer = buffer;
6956 q_u->offered = offered;
6961 bool spoolss_io_q_getprintprocessordirectory(const char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
6965 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
6971 if (!prs_uint32("ptr", ps, depth, &ptr))
6975 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
6982 if (!prs_uint32("ptr", ps, depth, &ptr))
6986 if(!smb_io_unistr2("environment", &q_u->environment, True,
6994 if(!prs_uint32("level", ps, depth, &q_u->level))
6997 if(!prs_rpcbuffer_p("", ps, depth, &q_u->buffer))
7003 if(!prs_uint32("offered", ps, depth, &q_u->offered))
7009 /*******************************************************************
7010 * write a structure.
7011 ********************************************************************/
7013 bool spoolss_io_r_getprintprocessordirectory(const char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
7015 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
7021 if(!prs_rpcbuffer_p("", ps, depth, &r_u->buffer))
7027 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7030 if(!prs_werror("status", ps, depth, &r_u->status))
7036 bool smb_io_printprocessordirectory_1(const char *desc, RPC_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
7038 prs_struct *ps=&buffer->prs;
7040 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
7043 buffer->struct_start=prs_offset(ps);
7045 if (!smb_io_unistr(desc, &info->name, ps, depth))
7051 /*******************************************************************
7053 ********************************************************************/
7055 bool make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
7056 int level, FORM *form)
7058 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7060 q_u->level2 = level;
7061 memcpy(&q_u->form, form, sizeof(FORM));
7066 /*******************************************************************
7068 ********************************************************************/
7070 bool make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
7071 int level, const char *form_name, FORM *form)
7073 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7075 q_u->level2 = level;
7076 memcpy(&q_u->form, form, sizeof(FORM));
7077 init_unistr2(&q_u->name, form_name, UNI_STR_TERMINATE);
7082 /*******************************************************************
7084 ********************************************************************/
7086 bool make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle,
7089 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7090 init_unistr2(&q_u->name, form, UNI_STR_TERMINATE);
7094 /*******************************************************************
7096 ********************************************************************/
7098 bool make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
7099 const char *formname, uint32 level,
7100 RPC_BUFFER *buffer, uint32 offered)
7102 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7104 init_unistr2(&q_u->formname, formname, UNI_STR_TERMINATE);
7106 q_u->offered=offered;
7111 /*******************************************************************
7113 ********************************************************************/
7115 bool make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
7116 uint32 level, RPC_BUFFER *buffer,
7119 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7122 q_u->offered=offered;
7127 /*******************************************************************
7129 ********************************************************************/
7131 bool make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
7132 uint32 jobid, uint32 level, uint32 command)
7134 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7138 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7139 the server side code has it marked as unused. */
7141 q_u->command = command;
7146 /*******************************************************************
7148 ********************************************************************/
7150 bool make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
7151 uint32 jobid, uint32 level, RPC_BUFFER *buffer,
7154 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7157 q_u->buffer = buffer;
7158 q_u->offered = offered;
7163 /*******************************************************************
7165 ********************************************************************/
7167 bool make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
7168 POLICY_HND *handle, uint32 level,
7169 char *docname, char *outputfile,
7172 DOC_INFO_CONTAINER *ctr = &q_u->doc_info_container;
7174 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7180 ctr->docinfo.switch_value = level;
7182 ctr->docinfo.doc_info_1.p_docname = docname ? 1 : 0;
7183 ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
7184 ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
7186 init_unistr2(&ctr->docinfo.doc_info_1.docname, docname, UNI_STR_TERMINATE);
7187 init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile, UNI_STR_TERMINATE);
7188 init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype, UNI_STR_TERMINATE);
7192 /* DOC_INFO_2 is only used by Windows 9x and since it
7193 doesn't do printing over RPC we don't have to worry
7196 DEBUG(3, ("unsupported info level %d\n", level));
7203 /*******************************************************************
7205 ********************************************************************/
7207 bool make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u,
7208 POLICY_HND *handle, uint32 data_size,
7211 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7212 q_u->buffer_size = q_u->buffer_size2 = data_size;
7213 q_u->buffer = (unsigned char *)data;
7217 /*******************************************************************
7219 ********************************************************************/
7221 bool make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
7222 POLICY_HND *handle, char *valuename)
7224 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7225 init_unistr2(&q_u->valuename, valuename, UNI_STR_TERMINATE);
7230 /*******************************************************************
7232 ********************************************************************/
7234 bool make_spoolss_q_deleteprinterdataex(SPOOL_Q_DELETEPRINTERDATAEX *q_u,
7235 POLICY_HND *handle, char *key,
7238 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7239 init_unistr2(&q_u->valuename, value, UNI_STR_TERMINATE);
7240 init_unistr2(&q_u->keyname, key, UNI_STR_TERMINATE);
7245 /*******************************************************************
7247 ********************************************************************/
7249 bool make_spoolss_q_rffpcnex(SPOOL_Q_RFFPCNEX *q_u, POLICY_HND *handle,
7250 uint32 flags, uint32 options, const char *localmachine,
7251 uint32 printerlocal, SPOOL_NOTIFY_OPTION *option)
7253 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7256 q_u->options = options;
7258 q_u->localmachine_ptr = 1;
7260 init_unistr2(&q_u->localmachine, localmachine, UNI_STR_TERMINATE);
7262 q_u->printerlocal = printerlocal;
7265 q_u->option_ptr = 1;
7267 q_u->option = option;
7273 /*******************************************************************
7274 ********************************************************************/
7276 bool spoolss_io_q_xcvdataport(const char *desc, SPOOL_Q_XCVDATAPORT *q_u, prs_struct *ps, int depth)
7278 prs_debug(ps, depth, desc, "spoolss_io_q_xcvdataport");
7284 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
7287 if(!smb_io_unistr2("", &q_u->dataname, True, ps, depth))
7293 if(!prs_rpcbuffer("", ps, depth, &q_u->indata))
7299 if (!prs_uint32("indata_len", ps, depth, &q_u->indata_len))
7301 if (!prs_uint32("offered", ps, depth, &q_u->offered))
7303 if (!prs_uint32("unknown", ps, depth, &q_u->unknown))
7309 /*******************************************************************
7310 ********************************************************************/
7312 bool spoolss_io_r_xcvdataport(const char *desc, SPOOL_R_XCVDATAPORT *r_u, prs_struct *ps, int depth)
7314 prs_debug(ps, depth, desc, "spoolss_io_r_xcvdataport");
7319 if(!prs_rpcbuffer("", ps, depth, &r_u->outdata))
7325 if (!prs_uint32("needed", ps, depth, &r_u->needed))
7327 if (!prs_uint32("unknown", ps, depth, &r_u->unknown))
7330 if(!prs_werror("status", ps, depth, &r_u->status))
7336 /*******************************************************************
7337 ********************************************************************/
7339 bool make_monitorui_buf( RPC_BUFFER *buf, const char *dllname )
7346 init_unistr( &string, dllname );
7348 if ( !prs_unistr( "ui_dll", &buf->prs, 0, &string ) )
7354 /*******************************************************************
7355 ********************************************************************/
7357 #define PORT_DATA_1_PAD 540
7359 static bool smb_io_port_data_1( const char *desc, RPC_BUFFER *buf, int depth, SPOOL_PORT_DATA_1 *p1 )
7361 prs_struct *ps = &buf->prs;
7362 uint8 padding[PORT_DATA_1_PAD];
7364 prs_debug(ps, depth, desc, "smb_io_port_data_1");
7370 if( !prs_uint16s(True, "portname", ps, depth, p1->portname, MAX_PORTNAME))
7373 if (!prs_uint32("version", ps, depth, &p1->version))
7375 if (!prs_uint32("protocol", ps, depth, &p1->protocol))
7377 if (!prs_uint32("size", ps, depth, &p1->size))
7379 if (!prs_uint32("reserved", ps, depth, &p1->reserved))
7382 if( !prs_uint16s(True, "hostaddress", ps, depth, p1->hostaddress, MAX_NETWORK_NAME))
7384 if( !prs_uint16s(True, "snmpcommunity", ps, depth, p1->snmpcommunity, MAX_SNMP_COMM_NAME))
7387 if (!prs_uint32("dblspool", ps, depth, &p1->dblspool))
7390 if( !prs_uint16s(True, "queue", ps, depth, p1->queue, MAX_QUEUE_NAME))
7392 if( !prs_uint16s(True, "ipaddress", ps, depth, p1->ipaddress, MAX_IPADDR_STRING))
7395 if( !prs_uint8s(False, "", ps, depth, padding, PORT_DATA_1_PAD))
7398 if (!prs_uint32("port", ps, depth, &p1->port))
7400 if (!prs_uint32("snmpenabled", ps, depth, &p1->snmpenabled))
7402 if (!prs_uint32("snmpdevindex", ps, depth, &p1->snmpdevindex))
7408 /*******************************************************************
7409 ********************************************************************/
7411 bool convert_port_data_1( NT_PORT_DATA_1 *port1, RPC_BUFFER *buf )
7413 SPOOL_PORT_DATA_1 spdata_1;
7415 ZERO_STRUCT( spdata_1 );
7417 if ( !smb_io_port_data_1( "port_data_1", buf, 0, &spdata_1 ) )
7420 rpcstr_pull(port1->name, spdata_1.portname, sizeof(port1->name), -1, 0);
7421 rpcstr_pull(port1->queue, spdata_1.queue, sizeof(port1->queue), -1, 0);
7422 rpcstr_pull(port1->hostaddr, spdata_1.hostaddress, sizeof(port1->hostaddr), -1, 0);
7424 port1->port = spdata_1.port;
7426 switch ( spdata_1.protocol ) {
7428 port1->protocol = PORT_PROTOCOL_DIRECT;
7431 port1->protocol = PORT_PROTOCOL_LPR;
7434 DEBUG(3,("convert_port_data_1: unknown protocol [%d]!\n",
7435 spdata_1.protocol));