2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-2000,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
6 * Copyright (C) Jean François Micouleau 1998-2000,
7 * Copyright (C) Gerald Carter 2000-2002,
8 * Copyright (C) Tim Potter 2001-2002.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #define DBGC_CLASS DBGC_RPC_PARSE
30 /*******************************************************************
31 return the length of a UNISTR string.
32 ********************************************************************/
34 static uint32 str_len_uni(UNISTR *source)
41 while (source->buffer[i])
47 /*******************************************************************
48 This should be moved in a more generic lib.
49 ********************************************************************/
51 BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
53 if(!prs_uint16("year", ps, depth, &systime->year))
55 if(!prs_uint16("month", ps, depth, &systime->month))
57 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
59 if(!prs_uint16("day", ps, depth, &systime->day))
61 if(!prs_uint16("hour", ps, depth, &systime->hour))
63 if(!prs_uint16("minute", ps, depth, &systime->minute))
65 if(!prs_uint16("second", ps, depth, &systime->second))
67 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
73 /*******************************************************************
74 ********************************************************************/
76 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
78 systime->year=unixtime->tm_year+1900;
79 systime->month=unixtime->tm_mon+1;
80 systime->dayofweek=unixtime->tm_wday;
81 systime->day=unixtime->tm_mday;
82 systime->hour=unixtime->tm_hour;
83 systime->minute=unixtime->tm_min;
84 systime->second=unixtime->tm_sec;
85 systime->milliseconds=0;
90 /*******************************************************************
91 reads or writes an DOC_INFO structure.
92 ********************************************************************/
94 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
96 if (info_1 == NULL) return False;
98 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
104 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
106 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
108 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
111 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
113 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
115 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
121 /*******************************************************************
122 reads or writes an DOC_INFO structure.
123 ********************************************************************/
125 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
127 uint32 useless_ptr=0;
129 if (info == NULL) return False;
131 prs_debug(ps, depth, desc, "smb_io_doc_info");
137 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
140 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
143 switch (info->switch_value)
146 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
151 this is just a placeholder
153 MSDN July 1998 says doc_info_2 is only on
154 Windows 95, and as Win95 doesn't do RPC to print
155 this case is nearly impossible
157 Maybe one day with Windows for dishwasher 2037 ...
160 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
163 DEBUG(0,("Something is obviously wrong somewhere !\n"));
170 /*******************************************************************
171 reads or writes an DOC_INFO_CONTAINER structure.
172 ********************************************************************/
174 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
176 if (cont == NULL) return False;
178 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
184 if(!prs_uint32("level", ps, depth, &cont->level))
187 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
193 /*******************************************************************
194 reads or writes an NOTIFY OPTION TYPE structure.
195 ********************************************************************/
197 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
198 structure. The _TYPE structure is really the deferred referrants (i.e
199 the notify fields array) of the _TYPE structure. -tpot */
201 static BOOL smb_io_notify_option_type(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
203 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
209 if(!prs_uint16("type", ps, depth, &type->type))
211 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
213 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
215 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
217 if(!prs_uint32("count", ps, depth, &type->count))
219 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
225 /*******************************************************************
226 reads or writes an NOTIFY OPTION TYPE DATA.
227 ********************************************************************/
229 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
233 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
236 /* if there are no fields just return */
237 if (type->fields_ptr==0)
243 if(!prs_uint32("count2", ps, depth, &type->count2))
246 if (type->count2 != type->count)
247 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
249 /* parse the option type data */
250 for(i=0;i<type->count2;i++)
251 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
256 /*******************************************************************
257 reads or writes an NOTIFY OPTION structure.
258 ********************************************************************/
260 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
264 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
267 if(!prs_uint32("count", ps, depth, &ctr->count))
271 if (UNMARSHALLING(ps))
272 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)prs_alloc_mem(ps,ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
275 /* the option type struct */
276 for(i=0;i<ctr->count;i++)
277 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
280 /* the type associated with the option type struct */
281 for(i=0;i<ctr->count;i++)
282 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
288 /*******************************************************************
289 reads or writes an NOTIFY OPTION structure.
290 ********************************************************************/
292 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
294 prs_debug(ps, depth, desc, "smb_io_notify_option");
297 if(!prs_uint32("version", ps, depth, &option->version))
299 if(!prs_uint32("flags", ps, depth, &option->flags))
301 if(!prs_uint32("count", ps, depth, &option->count))
303 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
306 /* marshalling or unmarshalling, that would work */
307 if (option->option_type_ptr!=0) {
308 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
312 option->ctr.type=NULL;
319 /*******************************************************************
320 reads or writes an NOTIFY INFO DATA structure.
321 ********************************************************************/
323 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
325 uint32 useless_ptr=0xADDE0FF0;
327 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
332 if(!prs_uint16("type", ps, depth, &data->type))
334 if(!prs_uint16("field", ps, depth, &data->field))
337 if(!prs_uint32("how many words", ps, depth, &data->size))
339 if(!prs_uint32("id", ps, depth, &data->id))
341 if(!prs_uint32("how many words", ps, depth, &data->size))
344 switch (data->enc_type) {
346 /* One and two value data has two uint32 values */
348 case NOTIFY_ONE_VALUE:
349 case NOTIFY_TWO_VALUE:
351 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
353 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
357 /* Pointers and strings have a string length and a
358 pointer. For a string the length is expressed as
359 the number of uint16 characters plus a trailing
364 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length ))
366 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
373 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
376 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
382 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data\n",
390 /*******************************************************************
391 reads or writes an NOTIFY INFO DATA structure.
392 ********************************************************************/
394 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
395 prs_struct *ps, int depth)
397 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
403 switch(data->enc_type) {
405 /* No data for values */
407 case NOTIFY_ONE_VALUE:
408 case NOTIFY_TWO_VALUE:
412 /* Strings start with a length in uint16s */
416 if (UNMARSHALLING(ps)) {
417 data->notify_data.data.string =
418 (uint16 *)prs_alloc_mem(ps, data->notify_data.data.length);
420 if (!data->notify_data.data.string)
425 data->notify_data.data.length /= 2;
427 if(!prs_uint32("string length", ps, depth, &data->notify_data.data.length))
430 if (!prs_uint16uni(True, "string", ps, depth, data->notify_data.data.string,
431 data->notify_data.data.length))
435 data->notify_data.data.length *= 2;
441 if (UNMARSHALLING(ps)) {
442 data->notify_data.data.string =
443 (uint16 *)prs_alloc_mem(ps, data->notify_data.data.length);
445 if (!data->notify_data.data.string)
449 if(!prs_uint8s(True,"buffer",ps,depth,(uint8*)data->notify_data.data.string,data->notify_data.data.length))
455 DEBUG(3, ("invalid enc_type %d for smb_io_notify_info_data_strings\n",
461 if (isvalue==False) {
463 /* length of string in unicode include \0 */
464 x=data->notify_data.data.length+1;
466 if (data->field != 16)
467 if(!prs_uint32("string length", ps, depth, &x ))
470 if (MARSHALLING(ps)) {
471 /* These are already in little endian format. Don't byte swap. */
474 /* No memory allocated for this string
475 therefore following the data.string
476 pointer is a bad idea. Use a pointer to
477 the uint32 length union member to
478 provide a source for a unicode NULL */
480 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
484 if (data->field == 16)
487 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
492 /* Tallocate memory for string */
494 data->notify_data.data.string = (uint16 *)prs_alloc_mem(ps, x * 2);
495 if (!data->notify_data.data.string)
498 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
506 /* Win2k does not seem to put this parse align here */
514 /*******************************************************************
515 reads or writes an NOTIFY INFO structure.
516 ********************************************************************/
518 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
522 prs_debug(ps, depth, desc, "smb_io_notify_info");
528 if(!prs_uint32("count", ps, depth, &info->count))
530 if(!prs_uint32("version", ps, depth, &info->version))
532 if(!prs_uint32("flags", ps, depth, &info->flags))
534 if(!prs_uint32("count", ps, depth, &info->count))
537 for (i=0;i<info->count;i++) {
538 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
542 /* now do the strings at the end of the stream */
543 for (i=0;i<info->count;i++) {
544 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
551 /*******************************************************************
552 ********************************************************************/
554 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
556 prs_debug(ps, depth, desc, "");
560 if (UNMARSHALLING(ps))
565 if (!prs_uint32("size", ps, depth, &q_u->size))
567 if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
569 if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
571 if (!prs_uint32("build", ps, depth, &q_u->build))
573 if (!prs_uint32("major", ps, depth, &q_u->major))
575 if (!prs_uint32("minor", ps, depth, &q_u->minor))
577 if (!prs_uint32("processor", ps, depth, &q_u->processor))
580 if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
584 if (!smb_io_unistr2("", &q_u->user_name, q_u->user_name_ptr, ps, depth))
590 /*******************************************************************
591 ********************************************************************/
593 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
598 prs_debug(ps, depth, desc, "spool_io_user_level");
603 if (!prs_uint32("level", ps, depth, &q_u->level))
605 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
608 switch (q_u->level) {
610 if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
620 /*******************************************************************
621 * read or write a DEVICEMODE struct.
622 * on reading allocate memory for the private member
623 ********************************************************************/
625 #define DM_NUM_OPTIONAL_FIELDS 8
627 BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
629 uint32 available_space; /* size of the device mode left to parse */
630 /* only important on unmarshalling */
633 struct optional_fields {
636 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
637 { "icmmethod", NULL },
638 { "icmintent", NULL },
639 { "mediatype", NULL },
640 { "dithertype", NULL },
641 { "reserved1", NULL },
642 { "reserved2", NULL },
643 { "panningwidth", NULL },
644 { "panningheight", NULL }
647 /* assign at run time to keep non-gcc vompilers happy */
649 opt_fields[0].field = &devmode->icmmethod;
650 opt_fields[1].field = &devmode->icmintent;
651 opt_fields[2].field = &devmode->mediatype;
652 opt_fields[3].field = &devmode->dithertype;
653 opt_fields[4].field = &devmode->reserved1;
654 opt_fields[5].field = &devmode->reserved2;
655 opt_fields[6].field = &devmode->panningwidth;
656 opt_fields[7].field = &devmode->panningheight;
659 prs_debug(ps, depth, desc, "spoolss_io_devmode");
662 if (UNMARSHALLING(ps)) {
663 devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
664 if (devmode->devicename.buffer == NULL)
668 if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
671 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
674 /* Sanity Check - look for unknown specversions, but don't fail if we see one.
675 Let the size determine that */
677 switch (devmode->specversion) {
684 DEBUG(0,("spoolss_io_devmode: Unknown specversion in devicemode [0x%x]\n",
685 devmode->specversion));
686 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
691 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
693 if (!prs_uint16("size", ps, depth, &devmode->size))
695 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
697 if (!prs_uint32("fields", ps, depth, &devmode->fields))
699 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
701 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
703 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
705 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
707 if (!prs_uint16("scale", ps, depth, &devmode->scale))
709 if (!prs_uint16("copies", ps, depth, &devmode->copies))
711 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
713 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
715 if (!prs_uint16("color", ps, depth, &devmode->color))
717 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
719 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
721 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
723 if (!prs_uint16("collate", ps, depth, &devmode->collate))
726 if (UNMARSHALLING(ps)) {
727 devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
728 if (devmode->formname.buffer == NULL)
732 if (!prs_uint16uni(True, "formname", ps, depth, devmode->formname.buffer, 32))
734 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
736 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
738 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
740 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
742 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
744 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
747 * every device mode I've ever seen on the wire at least has up
748 * to the displayfrequency field. --jerry (05-09-2002)
751 /* add uint32's + uint16's + two UNICODE strings */
753 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
755 /* Sanity check - we only have uint32's left tp parse */
757 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
758 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
759 available_space, devmode->size));
760 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
765 * Conditional parsing. Assume that the DeviceMode has been
766 * zero'd by the caller.
769 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
771 DEBUG(10, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
772 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
774 available_space -= sizeof(uint32);
778 /* Sanity Check - we should no available space at this point unless
779 MS changes the device mode structure */
781 if (available_space) {
782 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
783 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
784 available_space, devmode->size));
785 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
790 if (devmode->driverextra!=0) {
791 if (UNMARSHALLING(ps)) {
792 devmode->private=(uint8 *)prs_alloc_mem(ps, devmode->driverextra*sizeof(uint8));
793 if(devmode->private == NULL)
795 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
798 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
799 if (!prs_uint8s(False, "private", ps, depth,
800 devmode->private, devmode->driverextra))
807 /*******************************************************************
808 Read or write a DEVICEMODE container
809 ********************************************************************/
811 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
816 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
822 if (!prs_uint32("size", ps, depth, &dm_c->size))
825 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
828 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
829 if (UNMARSHALLING(ps))
830 /* if while reading there is no DEVMODE ... */
835 /* so we have a DEVICEMODE to follow */
836 if (UNMARSHALLING(ps)) {
837 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
838 dm_c->devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE));
839 if(dm_c->devmode == NULL)
843 /* this is bad code, shouldn't be there */
844 if (!prs_uint32("size", ps, depth, &dm_c->size))
847 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
853 /*******************************************************************
854 ********************************************************************/
856 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
861 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
864 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
867 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
873 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
879 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
885 /*******************************************************************
887 ********************************************************************/
889 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
890 const fstring printername,
891 const fstring datatype,
892 uint32 access_required,
893 const fstring clientname,
894 const fstring user_name)
896 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
897 q_u->printername_ptr = (printername!=NULL)?1:0;
898 init_unistr2(&q_u->printername, printername, strlen(printername)+1);
900 q_u->printer_default.datatype_ptr = 0;
902 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
903 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
905 q_u->printer_default.devmode_cont.size=0;
906 q_u->printer_default.devmode_cont.devmode_ptr=0;
907 q_u->printer_default.devmode_cont.devmode=NULL;
908 q_u->printer_default.access_required=access_required;
910 q_u->user_ctr.level=1;
912 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
913 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
914 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
915 q_u->user_ctr.user1.build=1381;
916 q_u->user_ctr.user1.major=2;
917 q_u->user_ctr.user1.minor=0;
918 q_u->user_ctr.user1.processor=0;
919 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
920 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
925 /*******************************************************************
927 ********************************************************************/
929 BOOL make_spoolss_q_addprinterex(
931 SPOOL_Q_ADDPRINTEREX *q_u,
932 const char *srv_name,
933 const char* clientname,
934 const char* user_name,
936 PRINTER_INFO_CTR *ctr)
938 DEBUG(5,("make_spoolss_q_addprinterex\n"));
940 if (!ctr) return False;
944 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
945 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
949 q_u->info.level = level;
950 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
953 /* init q_u->info.info2 from *info */
954 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
955 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
965 q_u->user_ctr.level=1;
967 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
968 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
969 q_u->user_ctr.user1.build=1381;
970 q_u->user_ctr.user1.major=2;
971 q_u->user_ctr.user1.minor=0;
972 q_u->user_ctr.user1.processor=0;
973 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
974 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
975 q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
976 q_u->user_ctr.user1.client_name.uni_str_len + 2;
981 /*******************************************************************
982 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
983 *******************************************************************/
985 BOOL make_spoolss_printer_info_2(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
986 PRINTER_INFO_2 *info)
989 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
991 /* allocate the necessary memory */
992 if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2)))) {
993 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
997 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
998 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
999 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
1000 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
1001 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
1002 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
1003 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
1004 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
1005 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
1006 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
1007 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
1008 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
1009 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
1010 inf->attributes = info->attributes;
1011 inf->priority = info->priority;
1012 inf->default_priority = info->defaultpriority;
1013 inf->starttime = info->starttime;
1014 inf->untiltime = info->untiltime;
1015 inf->cjobs = info->cjobs;
1016 inf->averageppm = info->averageppm;
1017 init_unistr2_from_unistr(&inf->servername, &info->servername);
1018 init_unistr2_from_unistr(&inf->printername, &info->printername);
1019 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
1020 init_unistr2_from_unistr(&inf->portname, &info->portname);
1021 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
1022 init_unistr2_from_unistr(&inf->comment, &info->comment);
1023 init_unistr2_from_unistr(&inf->location, &info->location);
1024 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
1025 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
1026 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
1027 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
1028 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
1036 /*******************************************************************
1038 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1039 ********************************************************************/
1041 BOOL spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
1046 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
1052 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
1054 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
1060 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1066 /*******************************************************************
1067 * write a structure.
1068 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1069 * called from spoolss_open_printer_ex (cli_spoolss.c)
1070 ********************************************************************/
1072 BOOL spoolss_io_r_open_printer(char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
1074 if (r_u == NULL) return False;
1076 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
1082 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1085 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1092 /*******************************************************************
1094 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1095 ********************************************************************/
1097 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
1102 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
1108 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
1110 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
1116 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1119 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
1121 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
1127 /*******************************************************************
1128 * write a structure.
1129 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1130 * called from spoolss_open_printer_ex (cli_spoolss.c)
1131 ********************************************************************/
1133 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
1135 if (r_u == NULL) return False;
1137 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
1143 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1146 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1152 /*******************************************************************
1154 ********************************************************************/
1155 BOOL make_spoolss_q_deleteprinterdriver(
1156 TALLOC_CTX *mem_ctx,
1157 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
1163 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1165 q_u->server_ptr = (server!=NULL)?1:0;
1167 /* these must be NULL terminated or else NT4 will
1168 complain about invalid parameters --jerry */
1169 init_unistr2(&q_u->server, server, strlen(server)+1);
1170 init_unistr2(&q_u->arch, arch, strlen(arch)+1);
1171 init_unistr2(&q_u->driver, driver, strlen(driver)+1);
1178 /*******************************************************************
1180 ********************************************************************/
1182 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
1183 const POLICY_HND *handle,
1184 char *valuename, uint32 size)
1186 if (q_u == NULL) return False;
1188 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1190 q_u->handle = *handle;
1191 init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
1197 /*******************************************************************
1199 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1200 ********************************************************************/
1202 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
1207 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
1212 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1216 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1220 if (!prs_uint32("size", ps, depth, &q_u->size))
1226 /*******************************************************************
1228 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1229 ********************************************************************/
1231 BOOL spoolss_io_q_deleteprinterdata(char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1236 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1241 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1245 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1251 /*******************************************************************
1252 * write a structure.
1253 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1254 ********************************************************************/
1256 BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1258 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1260 if(!prs_werror("status", ps, depth, &r_u->status))
1266 /*******************************************************************
1268 * called from spoolss_q_deleteprinterdataex (srv_spoolss.c)
1269 ********************************************************************/
1271 BOOL spoolss_io_q_deleteprinterdataex(char *desc, SPOOL_Q_DELETEPRINTERDATAEX *q_u, prs_struct *ps, int depth)
1276 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdataex");
1281 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1284 if (!smb_io_unistr2("keyname ", &q_u->keyname, True, ps, depth))
1286 if (!smb_io_unistr2("valuename", &q_u->valuename, True, ps, depth))
1292 /*******************************************************************
1293 * write a structure.
1294 * called from spoolss_r_deleteprinterdataex (srv_spoolss.c)
1295 ********************************************************************/
1297 BOOL spoolss_io_r_deleteprinterdataex(char *desc, SPOOL_R_DELETEPRINTERDATAEX *r_u, prs_struct *ps, int depth)
1299 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdataex");
1302 if(!prs_werror("status", ps, depth, &r_u->status))
1308 /*******************************************************************
1309 * write a structure.
1310 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1311 ********************************************************************/
1313 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1318 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1323 if (!prs_uint32("type", ps, depth, &r_u->type))
1325 if (!prs_uint32("size", ps, depth, &r_u->size))
1328 if (UNMARSHALLING(ps) && r_u->size) {
1329 r_u->data = prs_alloc_mem(ps, r_u->size);
1334 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
1340 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1342 if (!prs_werror("status", ps, depth, &r_u->status))
1348 /*******************************************************************
1350 ********************************************************************/
1352 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1354 if (q_u == NULL) return False;
1356 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1358 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1363 /*******************************************************************
1365 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1366 * called from spoolss_abortprinter (cli_spoolss.c)
1367 ********************************************************************/
1369 BOOL spoolss_io_q_abortprinter(char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1371 if (q_u == NULL) return False;
1373 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1379 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1385 /*******************************************************************
1386 * write a structure.
1387 * called from spoolss_r_abortprinter (srv_spoolss.c)
1388 ********************************************************************/
1390 BOOL spoolss_io_r_abortprinter(char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1392 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1394 if(!prs_werror("status", ps, depth, &r_u->status))
1400 /*******************************************************************
1402 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1403 * called from spoolss_deleteprinter (cli_spoolss.c)
1404 ********************************************************************/
1406 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1408 if (q_u == NULL) return False;
1410 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1416 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1422 /*******************************************************************
1423 * write a structure.
1424 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1425 * called from spoolss_deleteprinter (cli_spoolss.c)
1426 ********************************************************************/
1428 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1430 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1436 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1438 if (!prs_werror("status", ps, depth, &r_u->status))
1445 /*******************************************************************
1447 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1448 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1449 ********************************************************************/
1451 BOOL spoolss_io_q_deleteprinterdriver(char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1453 if (q_u == NULL) return False;
1455 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1461 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1463 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1465 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1467 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1475 /*******************************************************************
1476 * write a structure.
1477 ********************************************************************/
1478 BOOL spoolss_io_r_deleteprinterdriver(char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1480 if (r_u == NULL) return False;
1482 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1488 if (!prs_werror("status", ps, depth, &r_u->status))
1495 /*******************************************************************
1497 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1498 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1499 ********************************************************************/
1501 BOOL spoolss_io_q_deleteprinterdriverex(char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
1503 if (q_u == NULL) return False;
1505 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriverex");
1511 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1513 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1515 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1517 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1523 if(!prs_uint32("delete_flags ", ps, depth, &q_u->delete_flags))
1525 if(!prs_uint32("version ", ps, depth, &q_u->version))
1533 /*******************************************************************
1534 * write a structure.
1535 ********************************************************************/
1536 BOOL spoolss_io_r_deleteprinterdriverex(char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
1538 if (r_u == NULL) return False;
1540 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriverex");
1546 if (!prs_werror("status", ps, depth, &r_u->status))
1554 /*******************************************************************
1556 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1557 * called from spoolss_closeprinter (cli_spoolss.c)
1558 ********************************************************************/
1560 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1562 if (q_u == NULL) return False;
1564 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1570 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1576 /*******************************************************************
1577 * write a structure.
1578 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1579 * called from spoolss_closeprinter (cli_spoolss.c)
1580 ********************************************************************/
1582 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1584 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1590 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1592 if (!prs_werror("status", ps, depth, &r_u->status))
1598 /*******************************************************************
1600 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1601 ********************************************************************/
1603 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1605 if (q_u == NULL) return False;
1607 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1613 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1616 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1622 /*******************************************************************
1623 * write a structure.
1624 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1625 ********************************************************************/
1627 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1629 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1631 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1633 if(!prs_werror("status", ps, depth, &r_u->status))
1639 /*******************************************************************
1641 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1642 ********************************************************************/
1644 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1646 if (q_u == NULL) return False;
1648 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1654 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1660 /*******************************************************************
1661 * write a structure.
1662 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1663 ********************************************************************/
1665 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1667 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1669 if(!prs_werror("status", ps, depth, &r_u->status))
1675 /*******************************************************************
1677 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1678 ********************************************************************/
1680 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1682 if (q_u == NULL) return False;
1684 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1690 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1696 /*******************************************************************
1697 * write a structure.
1698 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1699 ********************************************************************/
1701 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1703 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1705 if(!prs_werror("status", ps, depth, &r_u->status))
1711 /*******************************************************************
1713 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1714 ********************************************************************/
1716 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1718 if (q_u == NULL) return False;
1720 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1726 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1732 /*******************************************************************
1733 * write a structure.
1734 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1735 ********************************************************************/
1737 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1739 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1741 if(!prs_werror("status", ps, depth, &r_u->status))
1747 /*******************************************************************
1749 * called from spoolss_q_writeprinter (srv_spoolss.c)
1750 ********************************************************************/
1752 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1754 if (q_u == NULL) return False;
1756 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1762 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1764 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1767 if (q_u->buffer_size!=0)
1769 if (UNMARSHALLING(ps))
1770 q_u->buffer=(uint8 *)prs_alloc_mem(ps,q_u->buffer_size*sizeof(uint8));
1771 if(q_u->buffer == NULL)
1773 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1778 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1784 /*******************************************************************
1785 * write a structure.
1786 * called from spoolss_r_writeprinter (srv_spoolss.c)
1787 ********************************************************************/
1789 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1791 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1793 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1795 if(!prs_werror("status", ps, depth, &r_u->status))
1801 /*******************************************************************
1803 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1804 ********************************************************************/
1806 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1808 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1814 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1816 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1818 if(!prs_uint32("options", ps, depth, &q_u->options))
1820 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1822 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1828 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1831 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1834 if (q_u->option_ptr!=0) {
1836 if (UNMARSHALLING(ps))
1837 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1840 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1847 /*******************************************************************
1848 * write a structure.
1849 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1850 ********************************************************************/
1852 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1854 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1857 if(!prs_werror("status", ps, depth, &r_u->status))
1863 /*******************************************************************
1865 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1866 ********************************************************************/
1868 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1870 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1876 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1879 if(!prs_uint32("change", ps, depth, &q_u->change))
1882 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1885 if (q_u->option_ptr!=0) {
1887 if (UNMARSHALLING(ps))
1888 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1891 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1898 /*******************************************************************
1899 * write a structure.
1900 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1901 ********************************************************************/
1903 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1905 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1911 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1914 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1919 if(!prs_werror("status", ps, depth, &r_u->status))
1925 /*******************************************************************
1926 * return the length of a uint16 (obvious, but the code is clean)
1927 ********************************************************************/
1929 static uint32 size_of_uint16(uint16 *value)
1931 return (sizeof(*value));
1934 /*******************************************************************
1935 * return the length of a uint32 (obvious, but the code is clean)
1936 ********************************************************************/
1938 static uint32 size_of_uint32(uint32 *value)
1940 return (sizeof(*value));
1943 /*******************************************************************
1944 * return the length of a NTTIME (obvious, but the code is clean)
1945 ********************************************************************/
1947 static uint32 size_of_nttime(NTTIME *value)
1949 return (sizeof(*value));
1952 /*******************************************************************
1953 * return the length of a UNICODE string in number of char, includes:
1954 * - the leading zero
1955 * - the relative pointer size
1956 ********************************************************************/
1958 static uint32 size_of_relative_string(UNISTR *string)
1962 size=str_len_uni(string); /* the string length */
1963 size=size+1; /* add the trailing zero */
1964 size=size*2; /* convert in char */
1965 size=size+4; /* add the size of the ptr */
1969 * Do not include alignment as Win2k does not align relative
1970 * strings within a buffer --jerry
1972 /* Ensure size is 4 byte multiple (prs_align is being called...). */
1973 /* size += ((4 - (size & 3)) & 3); */
1979 /*******************************************************************
1980 * return the length of a uint32 (obvious, but the code is clean)
1981 ********************************************************************/
1983 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1988 return (4+devmode->size+devmode->driverextra);
1991 /*******************************************************************
1992 * return the length of a uint32 (obvious, but the code is clean)
1993 ********************************************************************/
1995 static uint32 size_of_systemtime(SYSTEMTIME *systime)
2000 return (sizeof(SYSTEMTIME) +4);
2003 /*******************************************************************
2004 * write a UNICODE string and its relative pointer.
2005 * used by all the RPC structs passing a buffer
2007 * As I'm a nice guy, I'm forcing myself to explain this code.
2008 * MS did a good job in the overall spoolss code except in some
2009 * functions where they are passing the API buffer directly in the
2010 * RPC request/reply. That's to maintain compatiility at the API level.
2011 * They could have done it the good way the first time.
2013 * So what happen is: the strings are written at the buffer's end,
2014 * in the reverse order of the original structure. Some pointers to
2015 * the strings are also in the buffer. Those are relative to the
2018 * If you don't understand or want to change that function,
2019 * first get in touch with me: jfm@samba.org
2021 ********************************************************************/
2023 static BOOL smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
2025 prs_struct *ps=&buffer->prs;
2027 if (MARSHALLING(ps)) {
2028 uint32 struct_offset = prs_offset(ps);
2029 uint32 relative_offset;
2031 buffer->string_at_end -= (size_of_relative_string(string) - 4);
2032 if(!prs_set_offset(ps, buffer->string_at_end))
2036 * Win2k does not align strings in a buffer
2037 * Tested against WinNT 4.0 SP 6a & 2k SP2 --jerry
2042 buffer->string_at_end = prs_offset(ps);
2044 /* write the string */
2045 if (!smb_io_unistr(desc, string, ps, depth))
2048 if(!prs_set_offset(ps, struct_offset))
2051 relative_offset=buffer->string_at_end - buffer->struct_start;
2052 /* write its offset */
2053 if (!prs_uint32("offset", ps, depth, &relative_offset))
2059 /* read the offset */
2060 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
2063 old_offset = prs_offset(ps);
2064 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
2067 /* read the string */
2068 if (!smb_io_unistr(desc, string, ps, depth))
2071 if(!prs_set_offset(ps, old_offset))
2077 /*******************************************************************
2078 * write a array of UNICODE strings and its relative pointer.
2079 * used by 2 RPC structs
2080 ********************************************************************/
2082 static BOOL smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
2086 prs_struct *ps=&buffer->prs;
2088 if (MARSHALLING(ps)) {
2089 uint32 struct_offset = prs_offset(ps);
2090 uint32 relative_offset;
2097 /* first write the last 0 */
2098 buffer->string_at_end -= 2;
2099 if(!prs_set_offset(ps, buffer->string_at_end))
2102 if(!prs_uint16("leading zero", ps, depth, &zero))
2105 while (p && (*p!=0)) {
2109 /* Yes this should be malloc not talloc. Don't change. */
2111 chaine.buffer = malloc((q-p+1)*sizeof(uint16));
2112 if (chaine.buffer == NULL)
2115 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
2117 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
2119 if(!prs_set_offset(ps, buffer->string_at_end)) {
2120 SAFE_FREE(chaine.buffer);
2124 /* write the string */
2125 if (!smb_io_unistr(desc, &chaine, ps, depth)) {
2126 SAFE_FREE(chaine.buffer);
2132 SAFE_FREE(chaine.buffer);
2135 if(!prs_set_offset(ps, struct_offset))
2138 relative_offset=buffer->string_at_end - buffer->struct_start;
2139 /* write its offset */
2140 if (!prs_uint32("offset", ps, depth, &relative_offset))
2148 uint16 *chaine2=NULL;
2151 size_t realloc_size = 0;
2155 /* read the offset */
2156 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2159 old_offset = prs_offset(ps);
2160 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2164 if (!smb_io_unistr(desc, &chaine, ps, depth))
2167 l_chaine=str_len_uni(&chaine);
2169 /* we're going to add two more bytes here in case this
2170 is the last string in the array and we need to add
2171 an extra NULL for termination */
2176 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
2178 /* Yes this should be realloc - it's freed below. JRA */
2180 if((tc2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL) {
2185 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
2186 l_chaine2+=l_chaine+1;
2189 } while(l_chaine!=0);
2191 /* the end should be bould NULL terminated so add
2192 the second one here */
2195 chaine2[l_chaine2] = '\0';
2196 *string=(uint16 *)talloc_memdup(prs_get_mem_context(ps),chaine2,realloc_size);
2200 if(!prs_set_offset(ps, old_offset))
2206 /*******************************************************************
2207 Parse a DEVMODE structure and its relative pointer.
2208 ********************************************************************/
2210 static BOOL smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
2212 prs_struct *ps= &buffer->prs;
2214 prs_debug(ps, depth, desc, "smb_io_relsecdesc");
2217 if (MARSHALLING(ps)) {
2218 uint32 struct_offset = prs_offset(ps);
2219 uint32 relative_offset;
2222 relative_offset = 0;
2223 if (!prs_uint32("offset", ps, depth, &relative_offset))
2228 if (*secdesc != NULL) {
2229 buffer->string_at_end -= sec_desc_size(*secdesc);
2231 if(!prs_set_offset(ps, buffer->string_at_end))
2233 /* write the secdesc */
2234 if (!sec_io_desc(desc, secdesc, ps, depth))
2237 if(!prs_set_offset(ps, struct_offset))
2241 relative_offset=buffer->string_at_end - buffer->struct_start;
2242 /* write its offset */
2244 if (!prs_uint32("offset", ps, depth, &relative_offset))
2249 /* read the offset */
2250 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2253 old_offset = prs_offset(ps);
2254 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2258 if (!sec_io_desc(desc, secdesc, ps, depth))
2261 if(!prs_set_offset(ps, old_offset))
2267 /*******************************************************************
2268 Parse a DEVMODE structure and its relative pointer.
2269 ********************************************************************/
2271 static BOOL smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
2273 prs_struct *ps=&buffer->prs;
2275 prs_debug(ps, depth, desc, "smb_io_reldevmode");
2278 if (MARSHALLING(ps)) {
2279 uint32 struct_offset = prs_offset(ps);
2280 uint32 relative_offset;
2282 if (*devmode == NULL) {
2284 if (!prs_uint32("offset", ps, depth, &relative_offset))
2286 DEBUG(8, ("boing, the devmode was NULL\n"));
2291 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
2293 if(!prs_set_offset(ps, buffer->string_at_end))
2296 /* write the DEVMODE */
2297 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2300 if(!prs_set_offset(ps, struct_offset))
2303 relative_offset=buffer->string_at_end - buffer->struct_start;
2304 /* write its offset */
2305 if (!prs_uint32("offset", ps, depth, &relative_offset))
2311 /* read the offset */
2312 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2314 if (buffer->string_at_end == 0) {
2319 old_offset = prs_offset(ps);
2320 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2323 /* read the string */
2324 if((*devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE))) == NULL)
2326 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2329 if(!prs_set_offset(ps, old_offset))
2335 /*******************************************************************
2336 Parse a PRINTER_INFO_0 structure.
2337 ********************************************************************/
2339 BOOL smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2341 prs_struct *ps=&buffer->prs;
2343 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2346 buffer->struct_start=prs_offset(ps);
2348 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2350 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2353 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2355 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2357 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2360 if(!prs_uint16("year", ps, depth, &info->year))
2362 if(!prs_uint16("month", ps, depth, &info->month))
2364 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2366 if(!prs_uint16("day", ps, depth, &info->day))
2368 if(!prs_uint16("hour", ps, depth, &info->hour))
2370 if(!prs_uint16("minute", ps, depth, &info->minute))
2372 if(!prs_uint16("second", ps, depth, &info->second))
2374 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2377 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2379 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2382 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2384 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2386 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2388 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2390 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2392 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2394 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2396 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2398 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2400 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2402 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2404 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2406 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2408 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2410 if(!prs_uint32("status" , ps, depth, &info->status))
2412 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2414 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2416 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2418 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2420 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2422 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2424 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2426 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2428 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2430 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2436 /*******************************************************************
2437 Parse a PRINTER_INFO_1 structure.
2438 ********************************************************************/
2440 BOOL smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2442 prs_struct *ps=&buffer->prs;
2444 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2447 buffer->struct_start=prs_offset(ps);
2449 if (!prs_uint32("flags", ps, depth, &info->flags))
2451 if (!smb_io_relstr("description", buffer, depth, &info->description))
2453 if (!smb_io_relstr("name", buffer, depth, &info->name))
2455 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2461 /*******************************************************************
2462 Parse a PRINTER_INFO_2 structure.
2463 ********************************************************************/
2465 BOOL smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2467 prs_struct *ps=&buffer->prs;
2468 uint32 dm_offset, sd_offset, current_offset;
2469 uint32 dummy_value = 0;
2471 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2474 buffer->struct_start=prs_offset(ps);
2476 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2478 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2480 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2482 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2484 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2486 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2488 if (!smb_io_relstr("location", buffer, depth, &info->location))
2491 /* save current offset and wind forwared by a uint32 */
2492 dm_offset = prs_offset(ps);
2493 if (!prs_uint32("devmode", ps, depth, &dummy_value))
2496 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2498 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2500 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2502 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2505 /* save current offset for the sec_desc */
2506 sd_offset = prs_offset(ps);
2507 if (!prs_uint32("sec_desc", ps, depth, &dummy_value))
2511 /* save current location so we can pick back up here */
2512 current_offset = prs_offset(ps);
2514 /* parse the devmode */
2515 if (!prs_set_offset(ps, dm_offset))
2517 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2520 /* parse the sec_desc */
2521 if (!prs_set_offset(ps, sd_offset))
2523 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2526 /* pick up where we left off */
2527 if (!prs_set_offset(ps, current_offset))
2530 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2532 if (!prs_uint32("priority", ps, depth, &info->priority))
2534 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2536 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2538 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2540 if (!prs_uint32("status", ps, depth, &info->status))
2542 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2544 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2550 /*******************************************************************
2551 Parse a PRINTER_INFO_3 structure.
2552 ********************************************************************/
2554 BOOL smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2556 prs_struct *ps=&buffer->prs;
2558 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2561 buffer->struct_start=prs_offset(ps);
2563 if (!prs_uint32("flags", ps, depth, &info->flags))
2565 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2571 /*******************************************************************
2572 Parse a PRINTER_INFO_4 structure.
2573 ********************************************************************/
2575 BOOL smb_io_printer_info_4(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
2577 prs_struct *ps=&buffer->prs;
2579 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
2582 buffer->struct_start=prs_offset(ps);
2584 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2586 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2588 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2593 /*******************************************************************
2594 Parse a PRINTER_INFO_5 structure.
2595 ********************************************************************/
2597 BOOL smb_io_printer_info_5(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
2599 prs_struct *ps=&buffer->prs;
2601 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
2604 buffer->struct_start=prs_offset(ps);
2606 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2608 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2610 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2612 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
2614 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
2619 /*******************************************************************
2620 Parse a PORT_INFO_1 structure.
2621 ********************************************************************/
2623 BOOL smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2625 prs_struct *ps=&buffer->prs;
2627 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2630 buffer->struct_start=prs_offset(ps);
2632 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2638 /*******************************************************************
2639 Parse a PORT_INFO_2 structure.
2640 ********************************************************************/
2642 BOOL smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2644 prs_struct *ps=&buffer->prs;
2646 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2649 buffer->struct_start=prs_offset(ps);
2651 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2653 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2655 if (!smb_io_relstr("description", buffer, depth, &info->description))
2657 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2659 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2665 /*******************************************************************
2666 Parse a DRIVER_INFO_1 structure.
2667 ********************************************************************/
2669 BOOL smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2671 prs_struct *ps=&buffer->prs;
2673 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2676 buffer->struct_start=prs_offset(ps);
2678 if (!smb_io_relstr("name", buffer, depth, &info->name))
2684 /*******************************************************************
2685 Parse a DRIVER_INFO_2 structure.
2686 ********************************************************************/
2688 BOOL smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2690 prs_struct *ps=&buffer->prs;
2692 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2695 buffer->struct_start=prs_offset(ps);
2697 if (!prs_uint32("version", ps, depth, &info->version))
2699 if (!smb_io_relstr("name", buffer, depth, &info->name))
2701 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2703 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2705 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2707 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2713 /*******************************************************************
2714 Parse a DRIVER_INFO_3 structure.
2715 ********************************************************************/
2717 BOOL smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2719 prs_struct *ps=&buffer->prs;
2721 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2724 buffer->struct_start=prs_offset(ps);
2726 if (!prs_uint32("version", ps, depth, &info->version))
2728 if (!smb_io_relstr("name", buffer, depth, &info->name))
2730 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2732 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2734 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2736 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2738 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2741 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2744 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2746 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2752 /*******************************************************************
2753 Parse a DRIVER_INFO_6 structure.
2754 ********************************************************************/
2756 BOOL smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2758 prs_struct *ps=&buffer->prs;
2760 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2763 buffer->struct_start=prs_offset(ps);
2765 if (!prs_uint32("version", ps, depth, &info->version))
2767 if (!smb_io_relstr("name", buffer, depth, &info->name))
2769 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2771 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2773 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2775 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2777 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2780 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2783 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2785 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2788 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2791 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2793 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2796 if (!prs_uint32("padding", ps, depth, &info->padding))
2799 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2802 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2805 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2807 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2809 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2811 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2817 /*******************************************************************
2818 Parse a JOB_INFO_1 structure.
2819 ********************************************************************/
2821 BOOL smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2823 prs_struct *ps=&buffer->prs;
2825 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2828 buffer->struct_start=prs_offset(ps);
2830 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2832 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2834 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2836 if (!smb_io_relstr("username", buffer, depth, &info->username))
2838 if (!smb_io_relstr("document", buffer, depth, &info->document))
2840 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2842 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2844 if (!prs_uint32("status", ps, depth, &info->status))
2846 if (!prs_uint32("priority", ps, depth, &info->priority))
2848 if (!prs_uint32("position", ps, depth, &info->position))
2850 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2852 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2854 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2860 /*******************************************************************
2861 Parse a JOB_INFO_2 structure.
2862 ********************************************************************/
2864 BOOL smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2867 prs_struct *ps=&buffer->prs;
2869 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2872 buffer->struct_start=prs_offset(ps);
2874 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2876 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2878 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2880 if (!smb_io_relstr("username", buffer, depth, &info->username))
2882 if (!smb_io_relstr("document", buffer, depth, &info->document))
2884 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2886 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2889 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2891 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2893 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2895 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2897 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2900 /* SEC_DESC sec_desc;*/
2901 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2904 if (!prs_uint32("status",ps, depth, &info->status))
2906 if (!prs_uint32("priority",ps, depth, &info->priority))
2908 if (!prs_uint32("position",ps, depth, &info->position))
2910 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2912 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2914 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2916 if (!prs_uint32("size",ps, depth, &info->size))
2918 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2920 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2922 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2928 /*******************************************************************
2929 ********************************************************************/
2931 BOOL smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2933 prs_struct *ps=&buffer->prs;
2935 prs_debug(ps, depth, desc, "smb_io_form_1");
2938 buffer->struct_start=prs_offset(ps);
2940 if (!prs_uint32("flag", ps, depth, &info->flag))
2943 if (!smb_io_relstr("name", buffer, depth, &info->name))
2946 if (!prs_uint32("width", ps, depth, &info->width))
2948 if (!prs_uint32("length", ps, depth, &info->length))
2950 if (!prs_uint32("left", ps, depth, &info->left))
2952 if (!prs_uint32("top", ps, depth, &info->top))
2954 if (!prs_uint32("right", ps, depth, &info->right))
2956 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2962 /*******************************************************************
2963 Read/write a BUFFER struct.
2964 ********************************************************************/
2966 static BOOL spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
2968 NEW_BUFFER *buffer = *pp_buffer;
2970 prs_debug(ps, depth, desc, "spoolss_io_buffer");
2973 if (UNMARSHALLING(ps))
2974 buffer = *pp_buffer = (NEW_BUFFER *)prs_alloc_mem(ps, sizeof(NEW_BUFFER));
2979 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2983 if (UNMARSHALLING(ps)) {
2985 buffer->string_at_end=0;
2987 if (buffer->ptr==0) {
2989 * JRA. I'm not sure if the data in here is in big-endian format if
2990 * the client is big-endian. Leave as default (little endian) for now.
2993 if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
2998 if (!prs_uint32("size", ps, depth, &buffer->size))
3002 * JRA. I'm not sure if the data in here is in big-endian format if
3003 * the client is big-endian. Leave as default (little endian) for now.
3006 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
3009 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
3012 if (!prs_set_offset(&buffer->prs, 0))
3015 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
3018 buffer->string_at_end=buffer->size;
3026 if (buffer->ptr==0) {
3027 /* We have finished with the data in buffer->prs - free it. */
3028 prs_mem_free(&buffer->prs);
3032 if (!prs_uint32("size", ps, depth, &buffer->size))
3035 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
3041 /* We have finished with the data in buffer->prs - free it. */
3042 prs_mem_free(&buffer->prs);
3048 /*******************************************************************
3049 move a BUFFER from the query to the reply.
3050 As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
3051 this is ok. This is an OPTIMIZATION and is not strictly neccessary.
3052 Clears the memory to zero also.
3053 ********************************************************************/
3055 void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
3057 prs_switch_type(&src->prs, MARSHALL);
3058 if(!prs_set_offset(&src->prs, 0))
3060 prs_force_dynamic(&src->prs);
3061 prs_mem_clear(&src->prs);
3065 /*******************************************************************
3066 Get the size of a BUFFER struct.
3067 ********************************************************************/
3069 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
3071 return (buffer->size);
3074 /*******************************************************************
3075 Parse a DRIVER_DIRECTORY_1 structure.
3076 ********************************************************************/
3078 BOOL smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
3080 prs_struct *ps=&buffer->prs;
3082 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
3085 buffer->struct_start=prs_offset(ps);
3087 if (!smb_io_unistr(desc, &info->name, ps, depth))
3093 /*******************************************************************
3094 Parse a PORT_INFO_1 structure.
3095 ********************************************************************/
3097 BOOL smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
3099 prs_struct *ps=&buffer->prs;
3101 prs_debug(ps, depth, desc, "smb_io_port_1");
3104 buffer->struct_start=prs_offset(ps);
3106 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
3112 /*******************************************************************
3113 Parse a PORT_INFO_2 structure.
3114 ********************************************************************/
3116 BOOL smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
3118 prs_struct *ps=&buffer->prs;
3120 prs_debug(ps, depth, desc, "smb_io_port_2");
3123 buffer->struct_start=prs_offset(ps);
3125 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
3127 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
3129 if(!smb_io_relstr("description", buffer, depth, &info->description))
3131 if(!prs_uint32("port_type", ps, depth, &info->port_type))
3133 if(!prs_uint32("reserved", ps, depth, &info->reserved))
3139 /*******************************************************************
3140 ********************************************************************/
3142 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
3144 prs_struct *ps=&buffer->prs;
3146 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
3149 buffer->struct_start=prs_offset(ps);
3151 if (smb_io_relstr("name", buffer, depth, &info->name))
3157 /*******************************************************************
3158 ********************************************************************/
3160 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
3162 prs_struct *ps=&buffer->prs;
3164 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
3167 buffer->struct_start=prs_offset(ps);
3169 if (smb_io_relstr("name", buffer, depth, &info->name))
3175 /*******************************************************************
3176 ********************************************************************/
3178 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
3180 prs_struct *ps=&buffer->prs;
3182 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
3185 buffer->struct_start=prs_offset(ps);
3187 if (!smb_io_relstr("name", buffer, depth, &info->name))
3193 /*******************************************************************
3194 ********************************************************************/
3196 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
3198 prs_struct *ps=&buffer->prs;
3200 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
3203 buffer->struct_start=prs_offset(ps);
3205 if (!smb_io_relstr("name", buffer, depth, &info->name))
3207 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
3209 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
3215 /*******************************************************************
3216 return the size required by a struct in the stream
3217 ********************************************************************/
3219 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
3223 size+=size_of_relative_string( &info->printername );
3224 size+=size_of_relative_string( &info->servername );
3226 size+=size_of_uint32( &info->cjobs);
3227 size+=size_of_uint32( &info->total_jobs);
3228 size+=size_of_uint32( &info->total_bytes);
3230 size+=size_of_uint16( &info->year);
3231 size+=size_of_uint16( &info->month);
3232 size+=size_of_uint16( &info->dayofweek);
3233 size+=size_of_uint16( &info->day);
3234 size+=size_of_uint16( &info->hour);
3235 size+=size_of_uint16( &info->minute);
3236 size+=size_of_uint16( &info->second);
3237 size+=size_of_uint16( &info->milliseconds);
3239 size+=size_of_uint32( &info->global_counter);
3240 size+=size_of_uint32( &info->total_pages);
3242 size+=size_of_uint16( &info->major_version);
3243 size+=size_of_uint16( &info->build_version);
3245 size+=size_of_uint32( &info->unknown7);
3246 size+=size_of_uint32( &info->unknown8);
3247 size+=size_of_uint32( &info->unknown9);
3248 size+=size_of_uint32( &info->session_counter);
3249 size+=size_of_uint32( &info->unknown11);
3250 size+=size_of_uint32( &info->printer_errors);
3251 size+=size_of_uint32( &info->unknown13);
3252 size+=size_of_uint32( &info->unknown14);
3253 size+=size_of_uint32( &info->unknown15);
3254 size+=size_of_uint32( &info->unknown16);
3255 size+=size_of_uint32( &info->change_id);
3256 size+=size_of_uint32( &info->unknown18);
3257 size+=size_of_uint32( &info->status);
3258 size+=size_of_uint32( &info->unknown20);
3259 size+=size_of_uint32( &info->c_setprinter);
3261 size+=size_of_uint16( &info->unknown22);
3262 size+=size_of_uint16( &info->unknown23);
3263 size+=size_of_uint16( &info->unknown24);
3264 size+=size_of_uint16( &info->unknown25);
3265 size+=size_of_uint16( &info->unknown26);
3266 size+=size_of_uint16( &info->unknown27);
3267 size+=size_of_uint16( &info->unknown28);
3268 size+=size_of_uint16( &info->unknown29);
3273 /*******************************************************************
3274 return the size required by a struct in the stream
3275 ********************************************************************/
3277 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
3281 size+=size_of_uint32( &info->flags );
3282 size+=size_of_relative_string( &info->description );
3283 size+=size_of_relative_string( &info->name );
3284 size+=size_of_relative_string( &info->comment );
3289 /*******************************************************************
3290 return the size required by a struct in the stream
3291 ********************************************************************/
3293 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
3299 size += sec_desc_size( info->secdesc );
3301 size+=size_of_device_mode( info->devmode );
3303 size+=size_of_relative_string( &info->servername );
3304 size+=size_of_relative_string( &info->printername );
3305 size+=size_of_relative_string( &info->sharename );
3306 size+=size_of_relative_string( &info->portname );
3307 size+=size_of_relative_string( &info->drivername );
3308 size+=size_of_relative_string( &info->comment );
3309 size+=size_of_relative_string( &info->location );
3311 size+=size_of_relative_string( &info->sepfile );
3312 size+=size_of_relative_string( &info->printprocessor );
3313 size+=size_of_relative_string( &info->datatype );
3314 size+=size_of_relative_string( &info->parameters );
3316 size+=size_of_uint32( &info->attributes );
3317 size+=size_of_uint32( &info->priority );
3318 size+=size_of_uint32( &info->defaultpriority );
3319 size+=size_of_uint32( &info->starttime );
3320 size+=size_of_uint32( &info->untiltime );
3321 size+=size_of_uint32( &info->status );
3322 size+=size_of_uint32( &info->cjobs );
3323 size+=size_of_uint32( &info->averageppm );
3326 * add any adjustments for alignment. This is
3327 * not optimal since we could be calling this
3328 * function from a loop (e.g. enumprinters), but
3329 * it is easier to maintain the calculation here and
3330 * not place the burden on the caller to remember. --jerry
3337 /*******************************************************************
3338 return the size required by a struct in the stream
3339 ********************************************************************/
3341 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
3345 size+=size_of_relative_string( &info->printername );
3346 size+=size_of_relative_string( &info->servername );
3348 size+=size_of_uint32( &info->attributes );
3352 /*******************************************************************
3353 return the size required by a struct in the stream
3354 ********************************************************************/
3356 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
3360 size+=size_of_relative_string( &info->printername );
3361 size+=size_of_relative_string( &info->portname );
3363 size+=size_of_uint32( &info->attributes );
3364 size+=size_of_uint32( &info->device_not_selected_timeout );
3365 size+=size_of_uint32( &info->transmission_retry_timeout );
3370 /*******************************************************************
3371 return the size required by a struct in the stream
3372 ********************************************************************/
3374 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
3376 /* The 4 is for the self relative pointer.. */
3377 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
3378 return 4 + (uint32)sec_desc_size( info->secdesc );
3381 /*******************************************************************
3382 return the size required by a struct in the stream
3383 ********************************************************************/
3385 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
3388 size+=size_of_relative_string( &info->name );
3393 /*******************************************************************
3394 return the size required by a struct in the stream
3395 ********************************************************************/
3397 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
3400 size+=size_of_uint32( &info->version );
3401 size+=size_of_relative_string( &info->name );
3402 size+=size_of_relative_string( &info->architecture );
3403 size+=size_of_relative_string( &info->driverpath );
3404 size+=size_of_relative_string( &info->datafile );
3405 size+=size_of_relative_string( &info->configfile );
3410 /*******************************************************************
3411 return the size required by a string array.
3412 ********************************************************************/
3414 uint32 spoolss_size_string_array(uint16 *string)
3419 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
3421 i=i+2; /* to count all chars including the leading zero */
3422 i=2*i; /* because we need the value in bytes */
3423 i=i+4; /* the offset pointer size */
3428 /*******************************************************************
3429 return the size required by a struct in the stream
3430 ********************************************************************/
3432 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3436 size+=size_of_uint32( &info->version );
3437 size+=size_of_relative_string( &info->name );
3438 size+=size_of_relative_string( &info->architecture );
3439 size+=size_of_relative_string( &info->driverpath );
3440 size+=size_of_relative_string( &info->datafile );
3441 size+=size_of_relative_string( &info->configfile );
3442 size+=size_of_relative_string( &info->helpfile );
3443 size+=size_of_relative_string( &info->monitorname );
3444 size+=size_of_relative_string( &info->defaultdatatype );
3446 size+=spoolss_size_string_array(info->dependentfiles);
3451 /*******************************************************************
3452 return the size required by a struct in the stream
3453 ********************************************************************/
3455 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3459 size+=size_of_uint32( &info->version );
3460 size+=size_of_relative_string( &info->name );
3461 size+=size_of_relative_string( &info->architecture );
3462 size+=size_of_relative_string( &info->driverpath );
3463 size+=size_of_relative_string( &info->datafile );
3464 size+=size_of_relative_string( &info->configfile );
3465 size+=size_of_relative_string( &info->helpfile );
3467 size+=spoolss_size_string_array(info->dependentfiles);
3469 size+=size_of_relative_string( &info->monitorname );
3470 size+=size_of_relative_string( &info->defaultdatatype );
3472 size+=spoolss_size_string_array(info->previousdrivernames);
3474 size+=size_of_nttime(&info->driver_date);
3475 size+=size_of_uint32( &info->padding );
3476 size+=size_of_uint32( &info->driver_version_low );
3477 size+=size_of_uint32( &info->driver_version_high );
3478 size+=size_of_relative_string( &info->mfgname );
3479 size+=size_of_relative_string( &info->oem_url );
3480 size+=size_of_relative_string( &info->hardware_id );
3481 size+=size_of_relative_string( &info->provider );
3486 /*******************************************************************
3487 return the size required by a struct in the stream
3488 ********************************************************************/
3490 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3493 size+=size_of_uint32( &info->jobid );
3494 size+=size_of_relative_string( &info->printername );
3495 size+=size_of_relative_string( &info->machinename );
3496 size+=size_of_relative_string( &info->username );
3497 size+=size_of_relative_string( &info->document );
3498 size+=size_of_relative_string( &info->datatype );
3499 size+=size_of_relative_string( &info->text_status );
3500 size+=size_of_uint32( &info->status );
3501 size+=size_of_uint32( &info->priority );
3502 size+=size_of_uint32( &info->position );
3503 size+=size_of_uint32( &info->totalpages );
3504 size+=size_of_uint32( &info->pagesprinted );
3505 size+=size_of_systemtime( &info->submitted );
3510 /*******************************************************************
3511 return the size required by a struct in the stream
3512 ********************************************************************/
3514 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3518 size+=4; /* size of sec desc ptr */
3520 size+=size_of_uint32( &info->jobid );
3521 size+=size_of_relative_string( &info->printername );
3522 size+=size_of_relative_string( &info->machinename );
3523 size+=size_of_relative_string( &info->username );
3524 size+=size_of_relative_string( &info->document );
3525 size+=size_of_relative_string( &info->notifyname );
3526 size+=size_of_relative_string( &info->datatype );
3527 size+=size_of_relative_string( &info->printprocessor );
3528 size+=size_of_relative_string( &info->parameters );
3529 size+=size_of_relative_string( &info->drivername );
3530 size+=size_of_device_mode( info->devmode );
3531 size+=size_of_relative_string( &info->text_status );
3532 /* SEC_DESC sec_desc;*/
3533 size+=size_of_uint32( &info->status );
3534 size+=size_of_uint32( &info->priority );
3535 size+=size_of_uint32( &info->position );
3536 size+=size_of_uint32( &info->starttime );
3537 size+=size_of_uint32( &info->untiltime );
3538 size+=size_of_uint32( &info->totalpages );
3539 size+=size_of_uint32( &info->size );
3540 size+=size_of_systemtime( &info->submitted );
3541 size+=size_of_uint32( &info->timeelapsed );
3542 size+=size_of_uint32( &info->pagesprinted );
3547 /*******************************************************************
3548 return the size required by a struct in the stream
3549 ********************************************************************/
3551 uint32 spoolss_size_form_1(FORM_1 *info)
3555 size+=size_of_uint32( &info->flag );
3556 size+=size_of_relative_string( &info->name );
3557 size+=size_of_uint32( &info->width );
3558 size+=size_of_uint32( &info->length );
3559 size+=size_of_uint32( &info->left );
3560 size+=size_of_uint32( &info->top );
3561 size+=size_of_uint32( &info->right );
3562 size+=size_of_uint32( &info->bottom );
3567 /*******************************************************************
3568 return the size required by a struct in the stream
3569 ********************************************************************/
3571 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3575 size+=size_of_relative_string( &info->port_name );
3580 /*******************************************************************
3581 return the size required by a struct in the stream
3582 ********************************************************************/
3584 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3588 size=str_len_uni(&info->name); /* the string length */
3589 size=size+1; /* add the leading zero */
3590 size=size*2; /* convert in char */
3595 /*******************************************************************
3596 return the size required by a struct in the stream
3597 ********************************************************************/
3599 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3603 size=str_len_uni(&info->name); /* the string length */
3604 size=size+1; /* add the leading zero */
3605 size=size*2; /* convert in char */
3610 /*******************************************************************
3611 return the size required by a struct in the stream
3612 ********************************************************************/
3614 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3618 size+=size_of_relative_string( &info->port_name );
3619 size+=size_of_relative_string( &info->monitor_name );
3620 size+=size_of_relative_string( &info->description );
3622 size+=size_of_uint32( &info->port_type );
3623 size+=size_of_uint32( &info->reserved );
3628 /*******************************************************************
3629 return the size required by a struct in the stream
3630 ********************************************************************/
3632 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3635 size+=size_of_relative_string( &info->name );
3640 /*******************************************************************
3641 return the size required by a struct in the stream
3642 ********************************************************************/
3644 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3647 size+=size_of_relative_string( &info->name );
3652 /*******************************************************************
3653 return the size required by a struct in the stream
3654 ********************************************************************/
3655 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3662 /* uint32(offset) + uint32(length) + length) */
3663 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3664 size += (size_of_uint32(&p->data_len)*2) + p->data_len;
3666 size += size_of_uint32(&p->type);
3671 /*******************************************************************
3672 return the size required by a struct in the stream
3673 ********************************************************************/
3675 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3678 size+=size_of_relative_string( &info->name );
3683 /*******************************************************************
3684 return the size required by a struct in the stream
3685 ********************************************************************/
3687 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3690 size+=size_of_relative_string( &info->name);
3691 size+=size_of_relative_string( &info->environment);
3692 size+=size_of_relative_string( &info->dll_name);
3697 /*******************************************************************
3699 ********************************************************************/
3701 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3702 const POLICY_HND *hnd,
3703 const fstring architecture,
3704 uint32 level, uint32 clientmajor, uint32 clientminor,
3705 NEW_BUFFER *buffer, uint32 offered)
3710 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3712 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3715 q_u->clientmajorversion=clientmajor;
3716 q_u->clientminorversion=clientminor;
3719 q_u->offered=offered;
3724 /*******************************************************************
3726 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3727 ********************************************************************/
3729 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3731 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3737 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3739 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3741 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3746 if(!prs_uint32("level", ps, depth, &q_u->level))
3749 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3755 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3758 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3760 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3766 /*******************************************************************
3768 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3769 ********************************************************************/
3771 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3773 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3779 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3784 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3786 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3788 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3790 if (!prs_werror("status", ps, depth, &r_u->status))
3796 /*******************************************************************
3798 ********************************************************************/
3800 BOOL make_spoolss_q_enumprinters(
3801 SPOOL_Q_ENUMPRINTERS *q_u,
3811 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3812 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3816 q_u->offered=offered;
3821 /*******************************************************************
3823 ********************************************************************/
3825 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3826 fstring servername, uint32 level,
3827 NEW_BUFFER *buffer, uint32 offered)
3829 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3830 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3834 q_u->offered=offered;
3839 /*******************************************************************
3841 * called from spoolss_enumprinters (srv_spoolss.c)
3842 ********************************************************************/
3844 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3846 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3852 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3854 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3857 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3862 if (!prs_uint32("level", ps, depth, &q_u->level))
3865 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3870 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3876 /*******************************************************************
3877 Parse a SPOOL_R_ENUMPRINTERS structure.
3878 ********************************************************************/
3880 BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3882 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3888 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3894 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3897 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3900 if (!prs_werror("status", ps, depth, &r_u->status))
3906 /*******************************************************************
3907 * write a structure.
3908 * called from spoolss_r_enum_printers (srv_spoolss.c)
3910 ********************************************************************/
3912 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3914 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3920 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3926 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3929 if (!prs_werror("status", ps, depth, &r_u->status))
3935 /*******************************************************************
3937 * called from spoolss_getprinter (srv_spoolss.c)
3938 ********************************************************************/
3940 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3942 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3948 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3950 if (!prs_uint32("level", ps, depth, &q_u->level))
3953 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3958 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3964 /*******************************************************************
3966 ********************************************************************/
3968 BOOL make_spoolss_q_getprinter(
3969 TALLOC_CTX *mem_ctx,
3970 SPOOL_Q_GETPRINTER *q_u,
3971 const POLICY_HND *hnd,
3981 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3985 q_u->offered=offered;
3990 /*******************************************************************
3992 ********************************************************************/
3993 BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
3994 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
3998 DEVICEMODE *devmode;
4003 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4006 q_u->info.level = level;
4007 q_u->info.info_ptr = (info != NULL) ? 1 : 0;
4010 /* There's no such thing as a setprinter level 1 */
4013 secdesc = info->printers_2->secdesc;
4014 devmode = info->printers_2->devmode;
4016 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
4017 #if 1 /* JERRY TEST */
4018 q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
4019 if (!q_u->secdesc_ctr)
4021 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
4022 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
4023 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
4024 q_u->secdesc_ctr->sec = secdesc;
4026 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
4027 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
4028 q_u->devmode_ctr.devmode = devmode;
4030 q_u->secdesc_ctr = NULL;
4032 q_u->devmode_ctr.devmode_ptr = 0;
4033 q_u->devmode_ctr.size = 0;
4034 q_u->devmode_ctr.devmode = NULL;
4038 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
4043 q_u->command = command;
4049 /*******************************************************************
4050 ********************************************************************/
4052 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
4054 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
4060 if(!prs_werror("status", ps, depth, &r_u->status))
4066 /*******************************************************************
4067 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
4068 ********************************************************************/
4070 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
4072 uint32 ptr_sec_desc = 0;
4074 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
4080 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
4082 if(!prs_uint32("level", ps, depth, &q_u->level))
4085 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4088 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4098 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4103 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4109 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4114 /* Parse a NULL security descriptor. This should really
4115 happen inside the sec_io_desc_buf() function. */
4117 prs_debug(ps, depth, "", "sec_io_desc_buf");
4118 if (!prs_uint32("size", ps, depth + 1, &dummy))
4120 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
4124 if(!prs_uint32("command", ps, depth, &q_u->command))
4130 /*******************************************************************
4131 ********************************************************************/
4133 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
4135 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
4141 if(!prs_werror("status", ps, depth, &r_u->status))
4147 /*******************************************************************
4148 ********************************************************************/
4150 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
4153 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
4159 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4166 /*******************************************************************
4167 ********************************************************************/
4169 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
4171 prs_debug(ps, depth, desc, "");
4177 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4183 if(!prs_uint32("needed", ps, depth, &r_u->needed))
4186 if(!prs_werror("status", ps, depth, &r_u->status))
4192 /*******************************************************************
4193 ********************************************************************/
4195 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
4197 prs_debug(ps, depth, desc, "");
4203 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
4205 if(!prs_uint32("level", ps, depth, &q_u->level))
4208 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4214 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4220 /*******************************************************************
4221 ********************************************************************/
4223 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
4225 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
4231 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4237 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4240 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4243 if (!prs_werror("status", ps, depth, &r_u->status))
4249 /*******************************************************************
4250 ********************************************************************/
4252 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
4263 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4264 q_u->firstjob = firstjob;
4265 q_u->numofjobs = numofjobs;
4267 q_u->buffer= buffer;
4268 q_u->offered = offered;
4272 /*******************************************************************
4273 ********************************************************************/
4275 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
4277 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
4283 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
4286 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
4288 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
4290 if (!prs_uint32("level", ps, depth, &q_u->level))
4293 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4299 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4305 /*******************************************************************
4306 ********************************************************************/
4308 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
4310 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
4316 if(!prs_werror("status", ps, depth, &r_u->status))
4322 /*******************************************************************
4323 ********************************************************************/
4325 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
4327 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
4333 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4335 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4341 /*******************************************************************
4342 ********************************************************************/
4344 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
4346 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
4352 if(!prs_werror("status", ps, depth, &r_u->status))
4358 /*******************************************************************
4359 ********************************************************************/
4361 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
4363 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
4369 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4371 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4374 * level is usually 0. If (level!=0) then I'm in trouble !
4375 * I will try to generate setjob command with level!=0, one day.
4377 if(!prs_uint32("level", ps, depth, &q_u->level))
4379 if(!prs_uint32("command", ps, depth, &q_u->command))
4385 /*******************************************************************
4386 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4387 ********************************************************************/
4389 BOOL spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
4391 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
4397 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4403 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4406 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4409 if (!prs_werror("status", ps, depth, &r_u->status))
4415 /*******************************************************************
4417 ********************************************************************/
4419 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4421 const char *environment,
4423 NEW_BUFFER *buffer, uint32 offered)
4425 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4426 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4430 q_u->offered=offered;
4435 /*******************************************************************
4436 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4437 ********************************************************************/
4439 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4442 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4448 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4450 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4455 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4457 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4462 if (!prs_uint32("level", ps, depth, &q_u->level))
4465 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4471 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4477 /*******************************************************************
4478 ********************************************************************/
4480 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4483 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4488 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4490 if (!prs_uint32("level", ps, depth, &q_u->level))
4493 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4498 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4504 /*******************************************************************
4505 ********************************************************************/
4507 BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4509 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4515 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4521 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4524 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4527 if (!prs_werror("status", ps, depth, &r_u->status))
4533 /*******************************************************************
4534 ********************************************************************/
4536 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4539 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4544 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4546 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4552 if (!prs_uint32("level", ps, depth, &q_u->level))
4555 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4560 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4566 /*******************************************************************
4567 ********************************************************************/
4569 BOOL spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4571 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4577 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4583 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4586 if (!prs_werror("status", ps, depth, &r_u->status))
4592 /*******************************************************************
4593 Parse a SPOOL_R_ENUMPORTS structure.
4594 ********************************************************************/
4596 BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4598 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4604 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4610 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4613 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4616 if (!prs_werror("status", ps, depth, &r_u->status))
4622 /*******************************************************************
4623 ********************************************************************/
4625 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4627 prs_debug(ps, depth, desc, "");
4633 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4635 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4640 if (!prs_uint32("level", ps, depth, &q_u->level))
4643 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4648 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4654 /*******************************************************************
4655 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4656 ********************************************************************/
4658 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4660 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4666 if(!prs_uint32("flags", ps, depth, &il->flags))
4668 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4670 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4672 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4675 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4677 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4679 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4685 /*******************************************************************
4686 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4687 ********************************************************************/
4689 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4691 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4697 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4703 /*******************************************************************
4704 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4705 ********************************************************************/
4707 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4709 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4715 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4717 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4719 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4721 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4724 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4726 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4728 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4730 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4732 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4734 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4736 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4738 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4740 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4743 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4745 if(!prs_uint32("priority", ps, depth, &il->priority))
4747 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4749 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4751 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4753 if(!prs_uint32("status", ps, depth, &il->status))
4755 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4757 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4760 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4762 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4764 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4766 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4768 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4770 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4772 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4774 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4776 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4778 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4780 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4786 /*******************************************************************
4787 ********************************************************************/
4789 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4791 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4796 if(!prs_uint32("level", ps, depth, &il->level))
4798 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4801 /* if no struct inside just return */
4802 if (il->info_ptr==0) {
4803 if (UNMARSHALLING(ps)) {
4810 switch (il->level) {
4812 * level 0 is used by setprinter when managing the queue
4813 * (hold, stop, start a queue)
4817 /* DOCUMENT ME!!! What is level 1 used for? */
4820 if (UNMARSHALLING(ps)) {
4821 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4824 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4829 * level 2 is used by addprinter
4830 * and by setprinter when updating printer's info
4833 if (UNMARSHALLING(ps)) {
4834 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4837 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4840 /* DOCUMENT ME!!! What is level 3 used for? */
4843 if (UNMARSHALLING(ps)) {
4844 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4847 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4856 /*******************************************************************
4857 ********************************************************************/
4859 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4861 uint32 ptr_sec_desc = 0;
4863 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4868 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4870 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4876 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4879 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4882 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4888 switch (q_u->level) {
4890 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4893 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4897 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4902 /* Parse a NULL security descriptor. This should really
4903 happen inside the sec_io_desc_buf() function. */
4905 prs_debug(ps, depth, "", "sec_io_desc_buf");
4906 if (!prs_uint32("size", ps, depth + 1, &dummy))
4908 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
4912 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4914 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4920 /*******************************************************************
4921 ********************************************************************/
4923 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4924 prs_struct *ps, int depth)
4926 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4929 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4932 if(!prs_werror("status", ps, depth, &r_u->status))
4938 /*******************************************************************
4939 ********************************************************************/
4941 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4942 prs_struct *ps, int depth)
4944 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4946 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4950 if (UNMARSHALLING(ps)) {
4951 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4963 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4965 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4967 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4969 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4971 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4973 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4975 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4977 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4979 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4981 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4983 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4989 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4991 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4993 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4995 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4997 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4999 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
5001 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
5003 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
5009 if (il->dependentfiles_ptr)
5010 smb_io_buffer5("", &il->dependentfiles, ps, depth);
5015 /*******************************************************************
5016 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
5017 ********************************************************************/
5019 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
5020 prs_struct *ps, int depth)
5022 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
5024 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
5028 if (UNMARSHALLING(ps)) {
5029 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
5042 * I know this seems weird, but I have no other explanation.
5043 * This is observed behavior on both NT4 and 2K servers.
5047 if (!prs_align_uint64(ps))
5050 /* parse the main elements the packet */
5052 if(!prs_uint32("cversion ", ps, depth, &il->version))
5054 if(!prs_uint32("name ", ps, depth, &il->name_ptr))
5056 if(!prs_uint32("environment ", ps, depth, &il->environment_ptr))
5058 if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
5060 if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
5062 if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
5064 if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
5066 if(!prs_uint32("monitorname ", ps, depth, &il->monitorname_ptr))
5068 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
5070 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_len))
5072 if(!prs_uint32("dependentfiles ", ps, depth, &il->dependentfiles_ptr))
5074 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_len))
5076 if(!prs_uint32("previousnames ", ps, depth, &il->previousnames_ptr))
5078 if(!smb_io_time("driverdate ", &il->driverdate, ps, depth))
5080 if(!prs_uint32("dummy4 ", ps, depth, &il->dummy4))
5082 if(!prs_uint64("driverversion ", ps, depth, &il->driverversion))
5084 if(!prs_uint32("mfgname ", ps, depth, &il->mfgname_ptr))
5086 if(!prs_uint32("oemurl ", ps, depth, &il->oemurl_ptr))
5088 if(!prs_uint32("hardwareid ", ps, depth, &il->hardwareid_ptr))
5090 if(!prs_uint32("provider ", ps, depth, &il->provider_ptr))
5093 /* parse the structures in the packet */
5095 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
5100 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
5105 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
5110 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
5115 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
5120 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
5125 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
5130 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
5134 if (il->dependentfiles_ptr) {
5135 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
5140 if (il->previousnames_ptr) {
5141 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
5146 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
5150 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
5154 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
5158 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
5164 /*******************************************************************
5165 convert a buffer of UNICODE strings null terminated
5166 the buffer is terminated by a NULL
5168 convert to an dos codepage array (null terminated)
5170 dynamically allocate memory
5172 ********************************************************************/
5173 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
5182 src = (char *)buf5->buffer;
5185 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
5186 rpcstr_pull(f, src, sizeof(f)-1, -1, 0);
5187 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
5188 tar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
5193 fstrcpy((*ar)[n], f);
5196 fstrcpy((*ar)[n], "");
5204 /*******************************************************************
5205 read a UNICODE array with null terminated strings
5206 and null terminated array
5207 and size of array at beginning
5208 ********************************************************************/
5210 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
5212 if (buffer==NULL) return False;
5215 buffer->uni_str_len=buffer->uni_max_len;
5217 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
5220 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
5226 /*******************************************************************
5227 ********************************************************************/
5229 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
5231 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
5236 if(!prs_uint32("level", ps, depth, &il->level))
5238 if(!prs_uint32("ptr", ps, depth, &il->ptr))
5244 switch (il->level) {
5246 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
5250 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
5260 /*******************************************************************
5261 init a SPOOL_Q_ADDPRINTERDRIVER struct
5262 ******************************************************************/
5264 BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
5265 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
5266 uint32 level, PRINTER_DRIVER_CTR *info)
5268 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
5270 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
5271 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
5275 q_u->info.level = level;
5276 q_u->info.ptr = (info!=NULL)?1:0;
5279 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
5281 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
5285 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
5292 BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
5293 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
5294 DRIVER_INFO_3 *info3)
5297 uint16 *ptr = info3->dependentfiles;
5299 BOOL null_char = False;
5300 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
5302 if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3))))
5305 inf->cversion = info3->version;
5306 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
5307 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
5308 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
5309 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
5310 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
5311 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
5312 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
5313 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
5315 init_unistr2_from_unistr(&inf->name, &info3->name);
5316 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
5317 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
5318 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
5319 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
5320 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
5321 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
5322 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
5329 /* the null_char BOOL is used to help locate
5330 two '\0's back to back */
5345 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
5346 inf->dependentfilessize = len;
5347 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
5353 *spool_drv_info = inf;
5358 /*******************************************************************
5359 make a BUFFER5 struct from a uint16*
5360 ******************************************************************/
5361 BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
5364 buf5->buf_len = len;
5365 if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
5367 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5374 /*******************************************************************
5375 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5376 ********************************************************************/
5378 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5380 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
5386 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5388 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5393 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5396 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5402 /*******************************************************************
5403 ********************************************************************/
5405 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5407 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
5410 if(!prs_werror("status", ps, depth, &q_u->status))
5416 /*******************************************************************
5417 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5418 ********************************************************************/
5420 BOOL spoolss_io_q_addprinterdriverex(char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5422 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
5428 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5430 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5435 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5438 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5443 if(!prs_uint32("copy flags", ps, depth, &q_u->copy_flags))
5449 /*******************************************************************
5450 ********************************************************************/
5452 BOOL spoolss_io_r_addprinterdriverex(char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
5454 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
5457 if(!prs_werror("status", ps, depth, &q_u->status))
5463 /*******************************************************************
5464 ********************************************************************/
5466 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5467 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5469 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5471 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5475 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
5483 d->cversion=uni->cversion;
5485 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5486 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5487 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5488 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5489 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5490 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5491 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5492 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5494 DEBUGADD(8,( "version: %d\n", d->cversion));
5495 DEBUGADD(8,( "name: %s\n", d->name));
5496 DEBUGADD(8,( "environment: %s\n", d->environment));
5497 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5498 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5499 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5500 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5501 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5502 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5504 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5511 /*******************************************************************
5512 ********************************************************************/
5513 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5514 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5516 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5518 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5522 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
5530 d->version=uni->version;
5532 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5533 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5534 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5535 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5536 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5537 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5538 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5539 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5541 DEBUGADD(8,( "version: %d\n", d->version));
5542 DEBUGADD(8,( "name: %s\n", d->name));
5543 DEBUGADD(8,( "environment: %s\n", d->environment));
5544 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5545 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5546 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5547 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5548 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5549 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5551 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5553 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5563 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5564 NT_PRINTER_INFO_LEVEL_2 **asc)
5566 NT_PRINTER_INFO_LEVEL_2 *d;
5569 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5570 time_unix=time(NULL);
5573 DEBUGADD(8,("allocating memory\n"));
5575 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
5580 /* we allocate memory iff called from
5581 * addprinter(ex) so we can do one time stuff here.
5583 (*asc)->setuptime=time_unix;
5586 DEBUGADD(8,("start converting\n"));
5590 d->attributes=uni->attributes;
5591 d->priority=uni->priority;
5592 d->default_priority=uni->default_priority;
5593 d->starttime=uni->starttime;
5594 d->untiltime=uni->untiltime;
5595 d->status=uni->status;
5596 d->cjobs=uni->cjobs;
5598 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5599 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5600 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5601 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5602 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5603 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5604 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5605 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5606 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5607 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5608 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5613 /*******************************************************************
5615 ********************************************************************/
5617 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5618 fstring servername, fstring env_name, uint32 level,
5619 NEW_BUFFER *buffer, uint32 offered)
5621 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5622 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5626 q_u->offered=offered;
5631 /*******************************************************************
5632 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5633 ********************************************************************/
5635 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5637 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5642 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5644 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5650 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5652 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5658 if(!prs_uint32("level", ps, depth, &q_u->level))
5661 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5667 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5673 /*******************************************************************
5674 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5675 ********************************************************************/
5677 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5679 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5685 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5691 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5694 if (!prs_werror("status", ps, depth, &r_u->status))
5700 /*******************************************************************
5701 ********************************************************************/
5703 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5705 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5711 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5717 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5720 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5723 if (!prs_werror("status", ps, depth, &r_u->status))
5729 /*******************************************************************
5730 ********************************************************************/
5732 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5734 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5740 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5742 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5748 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5750 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5756 if (!prs_uint32("level", ps, depth, &q_u->level))
5759 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5765 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5771 /*******************************************************************
5772 ********************************************************************/
5774 BOOL spoolss_io_q_addprintprocessor(char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5776 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5782 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5784 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5789 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5794 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5799 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5805 /*******************************************************************
5806 ********************************************************************/
5808 BOOL spoolss_io_r_addprintprocessor(char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5810 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5816 if (!prs_werror("status", ps, depth, &r_u->status))
5822 /*******************************************************************
5823 ********************************************************************/
5825 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5827 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5833 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5839 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5842 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5845 if (!prs_werror("status", ps, depth, &r_u->status))
5851 /*******************************************************************
5852 ********************************************************************/
5854 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5856 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5862 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5864 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5870 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5872 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5878 if (!prs_uint32("level", ps, depth, &q_u->level))
5881 if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
5887 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5893 /*******************************************************************
5894 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5895 ********************************************************************/
5897 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5899 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5905 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5907 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5913 if (!prs_uint32("level", ps, depth, &q_u->level))
5916 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5922 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5928 /*******************************************************************
5929 ********************************************************************/
5931 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5933 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5939 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5945 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5948 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5951 if (!prs_werror("status", ps, depth, &r_u->status))
5957 /*******************************************************************
5958 ********************************************************************/
5960 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5962 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5967 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5970 if (UNMARSHALLING(ps) && r_u->valuesize) {
5971 r_u->value = (uint16 *)prs_alloc_mem(ps, r_u->valuesize * 2);
5973 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
5978 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5984 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5987 if(!prs_uint32("type", ps, depth, &r_u->type))
5990 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5993 if (UNMARSHALLING(ps) && r_u->datasize) {
5994 r_u->data = (uint8 *)prs_alloc_mem(ps, r_u->datasize);
5996 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
6001 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
6006 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
6008 if(!prs_werror("status", ps, depth, &r_u->status))
6014 /*******************************************************************
6015 ********************************************************************/
6017 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
6019 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
6024 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6026 if(!prs_uint32("index", ps, depth, &q_u->index))
6028 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
6030 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
6036 /*******************************************************************
6037 ********************************************************************/
6039 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
6040 const POLICY_HND *hnd,
6041 uint32 idx, uint32 valuelen, uint32 datalen)
6043 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6045 q_u->valuesize=valuelen;
6046 q_u->datasize=datalen;
6051 /*******************************************************************
6052 ********************************************************************/
6053 BOOL make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
6054 char* value, char* data, uint32 data_size)
6056 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6058 init_unistr2(&q_u->value, value, strlen(value)+1);
6060 q_u->max_len = q_u->real_len = data_size;
6065 /*******************************************************************
6066 ********************************************************************/
6068 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
6070 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
6075 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6077 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6083 if(!prs_uint32("type", ps, depth, &q_u->type))
6086 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6096 if (UNMARSHALLING(ps))
6097 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
6098 if(q_u->data == NULL)
6100 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6108 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6114 /*******************************************************************
6115 ********************************************************************/
6117 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
6119 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
6124 if(!prs_werror("status", ps, depth, &r_u->status))
6130 /*******************************************************************
6131 ********************************************************************/
6132 BOOL spoolss_io_q_resetprinter(char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
6134 prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
6139 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6142 if (!prs_uint32("datatype_ptr", ps, depth, &q_u->datatype_ptr))
6145 if (q_u->datatype_ptr) {
6146 if (!smb_io_unistr2("datatype", &q_u->datatype, q_u->datatype_ptr?True:False, ps, depth))
6150 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
6157 /*******************************************************************
6158 ********************************************************************/
6159 BOOL spoolss_io_r_resetprinter(char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
6161 prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
6166 if(!prs_werror("status", ps, depth, &r_u->status))
6172 /*******************************************************************
6173 ********************************************************************/
6174 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
6175 uint32 type, const uint8 *data, uint32 len)
6177 DEBUG(5,("converting a specific param struct\n"));
6181 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
6184 memset((char *)*param, '\0', sizeof(NT_PRINTER_PARAM));
6185 DEBUGADD(6,("Allocated a new PARAM struct\n"));
6187 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
6188 (*param)->type = type;
6190 /* le champ data n'est pas NULL termine */
6191 /* on stocke donc la longueur */
6193 (*param)->data_len=len;
6196 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
6197 if((*param)->data == NULL)
6199 memcpy((*param)->data, data, len);
6202 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
6203 dump_data(10, (char *)(*param)->data, (*param)->data_len);
6208 /*******************************************************************
6209 ********************************************************************/
6211 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
6213 prs_debug(ps, depth, desc, "spoolss_io_addform");
6220 if(!prs_uint32("flags", ps, depth, &f->flags))
6222 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
6224 if(!prs_uint32("size_x", ps, depth, &f->size_x))
6226 if(!prs_uint32("size_y", ps, depth, &f->size_y))
6228 if(!prs_uint32("left", ps, depth, &f->left))
6230 if(!prs_uint32("top", ps, depth, &f->top))
6232 if(!prs_uint32("right", ps, depth, &f->right))
6234 if(!prs_uint32("bottom", ps, depth, &f->bottom))
6237 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
6244 /*******************************************************************
6245 ********************************************************************/
6247 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
6249 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
6254 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6256 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
6262 /*******************************************************************
6263 ********************************************************************/
6265 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
6267 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
6272 if(!prs_werror("status", ps, depth, &r_u->status))
6278 /*******************************************************************
6279 ********************************************************************/
6281 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
6283 uint32 useless_ptr=1;
6284 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
6289 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6291 if(!prs_uint32("level", ps, depth, &q_u->level))
6293 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6298 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6300 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6307 /*******************************************************************
6308 ********************************************************************/
6310 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
6312 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
6317 if(!prs_werror("status", ps, depth, &r_u->status))
6323 /*******************************************************************
6324 ********************************************************************/
6326 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
6328 uint32 useless_ptr=1;
6329 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
6334 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6336 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
6342 if(!prs_uint32("level", ps, depth, &q_u->level))
6344 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6349 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6351 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6358 /*******************************************************************
6359 ********************************************************************/
6361 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
6363 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
6368 if(!prs_werror("status", ps, depth, &r_u->status))
6374 /*******************************************************************
6375 Parse a SPOOL_R_GETJOB structure.
6376 ********************************************************************/
6378 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
6380 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
6386 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
6392 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6395 if (!prs_werror("status", ps, depth, &r_u->status))
6401 /*******************************************************************
6402 Parse a SPOOL_Q_GETJOB structure.
6403 ********************************************************************/
6405 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
6407 prs_debug(ps, depth, desc, "");
6413 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6415 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
6417 if(!prs_uint32("level", ps, depth, &q_u->level))
6420 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
6426 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6432 void free_devmode(DEVICEMODE *devmode)
6434 if (devmode!=NULL) {
6435 SAFE_FREE(devmode->private);
6440 void free_printer_info_1(PRINTER_INFO_1 *printer)
6445 void free_printer_info_2(PRINTER_INFO_2 *printer)
6447 if (printer!=NULL) {
6448 free_devmode(printer->devmode);
6449 printer->devmode = NULL;
6454 void free_printer_info_3(PRINTER_INFO_3 *printer)
6459 void free_printer_info_4(PRINTER_INFO_4 *printer)
6464 void free_printer_info_5(PRINTER_INFO_5 *printer)
6469 void free_job_info_2(JOB_INFO_2 *job)
6472 free_devmode(job->devmode);
6475 /*******************************************************************
6477 ********************************************************************/
6479 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
6480 const fstring string, uint32 printer, uint32 type)
6485 init_unistr2(&q_u->string, string, strlen(string)+1);
6487 q_u->printer=printer;
6496 /*******************************************************************
6497 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6498 ********************************************************************/
6500 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
6502 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
6508 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
6514 if(!prs_uint32("printer", ps, depth, &q_u->printer))
6516 if(!prs_uint32("type", ps, depth, &q_u->type))
6519 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6521 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6527 /*******************************************************************
6528 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6529 ********************************************************************/
6531 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
6533 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
6539 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6542 if (!prs_werror("status", ps, depth, &r_u->status))
6548 /*******************************************************************
6550 ********************************************************************/
6551 BOOL make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd,
6552 uint32 condition, uint32 change_id)
6555 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6557 q_u->condition = condition;
6558 q_u->change_id = change_id;
6561 q_u->unknown1 = 0x1;
6562 memset(q_u->unknown2, 0x0, 5);
6563 q_u->unknown2[0] = 0x1;
6568 /*******************************************************************
6569 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6570 ********************************************************************/
6571 BOOL spoolss_io_q_routerreplyprinter (char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
6574 prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
6580 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6583 if (!prs_uint32("condition", ps, depth, &q_u->condition))
6586 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6589 if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
6592 if (!prs_uint8s(False, "private", ps, depth, q_u->unknown2, 5))
6598 /*******************************************************************
6599 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6600 ********************************************************************/
6601 BOOL spoolss_io_r_routerreplyprinter (char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
6603 prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
6609 if (!prs_werror("status", ps, depth, &r_u->status))
6615 /*******************************************************************
6617 ********************************************************************/
6619 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6624 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6629 /*******************************************************************
6630 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6631 ********************************************************************/
6633 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6635 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6641 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6647 /*******************************************************************
6648 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6649 ********************************************************************/
6651 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6653 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6659 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6662 if (!prs_werror("status", ps, depth, &r_u->status))
6668 #if 0 /* JERRY - not currently used but could be :-) */
6670 /*******************************************************************
6671 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6672 ******************************************************************/
6673 static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
6674 SPOOL_NOTIFY_INFO_DATA *src, int n)
6678 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
6680 for (i=0; i<n; i++) {
6684 if (src->size != POINTER)
6686 len = src->notify_data.data.length;
6687 s = malloc(sizeof(uint16)*len);
6689 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6693 memcpy(s, src->notify_data.data.string, len*2);
6694 dst->notify_data.data.string = s;
6700 /*******************************************************************
6701 Deep copy a SPOOL_NOTIFY_INFO structure
6702 ******************************************************************/
6703 static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
6706 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6710 dst->version = src->version;
6711 dst->flags = src->flags;
6712 dst->count = src->count;
6716 dst->data = malloc(dst->count * sizeof(SPOOL_NOTIFY_INFO_DATA));
6718 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6721 if (dst->data == NULL) {
6722 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6727 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
6734 /*******************************************************************
6736 ********************************************************************/
6738 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6739 uint32 change_low, uint32 change_high,
6740 SPOOL_NOTIFY_INFO *info)
6745 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6747 q_u->change_low=change_low;
6748 q_u->change_high=change_high;
6753 q_u->info_ptr=0xaddee11e;
6755 q_u->info.version=2;
6758 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6760 q_u->info.version = info->version;
6761 q_u->info.flags = info->flags;
6762 q_u->info.count = info->count;
6763 /* pointer field - be careful! */
6764 q_u->info.data = info->data;
6767 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6774 /*******************************************************************
6775 Parse a SPOOL_Q_REPLY_RRPCN structure.
6776 ********************************************************************/
6778 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6780 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6786 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6789 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6792 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6795 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6798 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6801 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6804 if(q_u->info_ptr!=0)
6805 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6811 /*******************************************************************
6812 Parse a SPOOL_R_REPLY_RRPCN structure.
6813 ********************************************************************/
6815 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6817 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
6823 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6826 if (!prs_werror("status", ps, depth, &r_u->status))
6832 /*******************************************************************
6834 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6835 ********************************************************************/
6837 BOOL spoolss_io_q_getprinterdataex(char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6842 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6847 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6851 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6855 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6859 if (!prs_uint32("size", ps, depth, &q_u->size))
6865 /*******************************************************************
6866 * write a structure.
6867 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6868 ********************************************************************/
6870 BOOL spoolss_io_r_getprinterdataex(char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6875 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6880 if (!prs_uint32("type", ps, depth, &r_u->type))
6882 if (!prs_uint32("size", ps, depth, &r_u->size))
6885 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6891 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6893 if (!prs_werror("status", ps, depth, &r_u->status))
6899 /*******************************************************************
6901 ********************************************************************/
6903 BOOL spoolss_io_q_setprinterdataex(char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6905 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6910 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6912 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6918 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6924 if(!prs_uint32("type", ps, depth, &q_u->type))
6927 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6937 if (UNMARSHALLING(ps))
6938 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
6939 if(q_u->data == NULL)
6941 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6949 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6955 /*******************************************************************
6956 * write a structure.
6957 ********************************************************************/
6959 BOOL spoolss_io_r_setprinterdataex(char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6961 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6966 if(!prs_werror("status", ps, depth, &r_u->status))
6973 /*******************************************************************
6975 ********************************************************************/
6977 BOOL spoolss_io_q_enumprinterkey(char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6979 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
6984 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6987 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6993 if(!prs_uint32("size", ps, depth, &q_u->size))
6999 /*******************************************************************
7000 * write a structure.
7001 ********************************************************************/
7003 BOOL spoolss_io_r_enumprinterkey(char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
7005 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
7011 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
7017 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7020 if(!prs_werror("status", ps, depth, &r_u->status))
7026 /*******************************************************************
7028 ********************************************************************/
7030 BOOL spoolss_io_q_deleteprinterkey(char *desc, SPOOL_Q_DELETEPRINTERKEY *q_u, prs_struct *ps, int depth)
7032 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterkey");
7037 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
7040 if(!smb_io_unistr2("", &q_u->keyname, True, ps, depth))
7046 /*******************************************************************
7047 * write a structure.
7048 ********************************************************************/
7050 BOOL spoolss_io_r_deleteprinterkey(char *desc, SPOOL_R_DELETEPRINTERKEY *r_u, prs_struct *ps, int depth)
7052 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterkey");
7058 if(!prs_werror("status", ps, depth, &r_u->status))
7065 /*******************************************************************
7067 ********************************************************************/
7069 BOOL spoolss_io_q_enumprinterdataex(char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
7071 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
7076 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
7079 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
7085 if(!prs_uint32("size", ps, depth, &q_u->size))
7091 /*******************************************************************
7092 ********************************************************************/
7093 static BOOL spoolss_io_printer_enum_values_ctr(char *desc, prs_struct *ps,
7094 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
7097 uint32 valuename_offset,
7100 const uint32 basic_unit = 20; /* size of static portion of enum_values */
7102 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
7105 if (!prs_uint32("size", ps, depth, &ctr->size))
7108 /* offset data begins at 20 bytes per structure * size_of_array.
7109 Don't forget the uint32 at the beginning */
7111 current_offset = basic_unit * ctr->size_of_array;
7113 /* first loop to write basic enum_value information */
7115 for (i=0; i<ctr->size_of_array; i++)
7117 valuename_offset = current_offset;
7118 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
7121 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
7124 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
7127 data_offset = ctr->values[i].value_len + valuename_offset;
7128 if (!prs_uint32("data_offset", ps, depth, &data_offset))
7131 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
7134 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
7137 /* loop #2 for writing the dynamically size objects
7138 while viewing conversations between Win2k -> Win2k,
7139 4-byte alignment does not seem to matter here --jerry */
7141 for (i=0; i<ctr->size_of_array; i++)
7144 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
7147 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
7157 /*******************************************************************
7158 * write a structure.
7159 ********************************************************************/
7161 BOOL spoolss_io_r_enumprinterdataex(char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
7163 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
7169 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
7175 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7178 if(!prs_uint32("returned", ps, depth, &r_u->returned))
7181 if(!prs_werror("status", ps, depth, &r_u->status))
7188 /*******************************************************************
7189 * write a structure.
7190 ********************************************************************/
7193 uint32 GetPrintProcessorDirectory(
7195 [in] unistr2 *environment,
7197 [in,out] NEW_BUFFER buffer,
7198 [in] uint32 offered,
7199 [out] uint32 needed,
7200 [out] uint32 returned
7205 BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, NEW_BUFFER *buffer, uint32 offered)
7207 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
7209 init_unistr2(&q_u->name, name, strlen(name)+1);
7210 init_unistr2(&q_u->environment, environment, strlen(environment)+1);
7214 q_u->buffer = buffer;
7215 q_u->offered = offered;
7220 BOOL spoolss_io_q_getprintprocessordirectory(char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
7224 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
7230 if (!prs_uint32("ptr", ps, depth, &ptr))
7234 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
7241 if (!prs_uint32("ptr", ps, depth, &ptr))
7245 if(!smb_io_unistr2("environment", &q_u->environment, True,
7253 if(!prs_uint32("level", ps, depth, &q_u->level))
7256 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
7262 if(!prs_uint32("offered", ps, depth, &q_u->offered))
7268 /*******************************************************************
7269 * write a structure.
7270 ********************************************************************/
7272 BOOL spoolss_io_r_getprintprocessordirectory(char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
7274 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
7280 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
7286 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7289 if(!prs_werror("status", ps, depth, &r_u->status))
7295 BOOL smb_io_printprocessordirectory_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
7297 prs_struct *ps=&buffer->prs;
7299 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
7302 buffer->struct_start=prs_offset(ps);
7304 if (!smb_io_unistr(desc, &info->name, ps, depth))
7310 /*******************************************************************
7312 ********************************************************************/
7314 BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
7315 int level, FORM *form)
7317 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7319 q_u->level2 = level;
7320 memcpy(&q_u->form, form, sizeof(FORM));
7325 /*******************************************************************
7327 ********************************************************************/
7329 BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
7330 int level, char *form_name, FORM *form)
7332 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7334 q_u->level2 = level;
7335 memcpy(&q_u->form, form, sizeof(FORM));
7336 init_unistr2(&q_u->name, form_name, strlen(form_name) + 1);
7341 /*******************************************************************
7343 ********************************************************************/
7345 BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, char *form)
7347 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7348 init_unistr2(&q_u->name, form, strlen(form) + 1);
7352 /*******************************************************************
7354 ********************************************************************/
7356 BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
7357 char *formname, uint32 level, NEW_BUFFER *buffer,
7360 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7362 init_unistr2(&q_u->formname, formname, strlen(formname) + 1);
7364 q_u->offered=offered;
7369 /*******************************************************************
7371 ********************************************************************/
7373 BOOL make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
7374 uint32 level, NEW_BUFFER *buffer,
7377 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7380 q_u->offered=offered;
7385 /*******************************************************************
7387 ********************************************************************/
7389 BOOL make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
7390 uint32 jobid, uint32 level, uint32 command)
7392 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7396 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7397 the server side code has it marked as unused. */
7399 q_u->command = command;
7404 /*******************************************************************
7406 ********************************************************************/
7408 BOOL make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
7409 uint32 jobid, uint32 level, NEW_BUFFER *buffer,
7412 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7415 q_u->buffer = buffer;
7416 q_u->offered = offered;
7421 /*******************************************************************
7423 ********************************************************************/
7425 BOOL make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u,
7428 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7433 /*******************************************************************
7435 ********************************************************************/
7437 BOOL make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u,
7440 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7445 /*******************************************************************
7447 ********************************************************************/
7449 BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
7450 POLICY_HND *handle, uint32 level,
7451 char *docname, char *outputfile,
7454 DOC_INFO_CONTAINER *ctr = &q_u->doc_info_container;
7456 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7462 ctr->docinfo.switch_value = level;
7464 ctr->docinfo.doc_info_1.p_docname = docname ? 1 : 0;
7465 ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
7466 ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
7469 init_unistr2(&ctr->docinfo.doc_info_1.docname, docname,
7470 strlen(docname) + 1);
7473 init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile,
7474 strlen(outputfile) + 1);
7477 init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype,
7478 strlen(datatype) + 1);
7482 /* DOC_INFO_2 is only used by Windows 9x and since it
7483 doesn't do printing over RPC we don't have to worry
7486 DEBUG(3, ("unsupported info level %d\n", level));
7493 /*******************************************************************
7495 ********************************************************************/
7497 BOOL make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u,
7500 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7505 /*******************************************************************
7507 ********************************************************************/
7509 BOOL make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u,
7510 POLICY_HND *handle, uint32 data_size,
7513 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7514 q_u->buffer_size = q_u->buffer_size2 = data_size;
7519 /*******************************************************************
7521 ********************************************************************/
7523 BOOL make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
7524 POLICY_HND *handle, char *valuename)
7526 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7527 init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);