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 static 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=1;
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 uint32 how_many_words;
331 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
334 how_many_words=data->size;
335 if (how_many_words==POINTER) {
336 how_many_words=TWO_VALUE;
339 isvalue=data->enc_type;
343 if(!prs_uint16("type", ps, depth, &data->type))
345 if(!prs_uint16("field", ps, depth, &data->field))
349 if(!prs_uint32("how many words", ps, depth, &how_many_words))
351 if(!prs_uint32("id", ps, depth, &data->id))
353 if(!prs_uint32("how many words", ps, depth, &how_many_words))
360 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
362 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
367 /* length in ascii including \0 */
368 x=2*(data->notify_data.data.length+1);
369 if(!prs_uint32("string length", ps, depth, &x ))
371 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
379 /*******************************************************************
380 reads or writes an NOTIFY INFO DATA structure.
381 ********************************************************************/
383 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
384 prs_struct *ps, int depth)
389 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
395 isvalue=data->enc_type;
397 if (isvalue==False) {
398 /* length of string in unicode include \0 */
399 x=data->notify_data.data.length+1;
400 if(!prs_uint32("string length", ps, depth, &x ))
402 if (MARSHALLING(ps)) {
403 /* These are already in little endian format. Don't byte swap. */
406 /* No memory allocated for this string
407 therefore following the data.string
408 pointer is a bad idea. Use a pointer to
409 the uint32 length union member to
410 provide a source for a unicode NULL */
412 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
415 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
420 /* Tallocate memory for string */
422 data->notify_data.data.string = (uint16 *)prs_alloc_mem(ps, x * 2);
423 if (!data->notify_data.data.string)
426 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
432 /* Win2k does not seem to put this parse align here */
441 /*******************************************************************
442 reads or writes an NOTIFY INFO structure.
443 ********************************************************************/
445 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
449 prs_debug(ps, depth, desc, "smb_io_notify_info");
455 if(!prs_uint32("count", ps, depth, &info->count))
457 if(!prs_uint32("version", ps, depth, &info->version))
459 if(!prs_uint32("flags", ps, depth, &info->flags))
461 if(!prs_uint32("count", ps, depth, &info->count))
464 for (i=0;i<info->count;i++) {
465 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
469 /* now do the strings at the end of the stream */
470 for (i=0;i<info->count;i++) {
471 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
478 /*******************************************************************
479 ********************************************************************/
481 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
483 prs_debug(ps, depth, desc, "");
487 if (UNMARSHALLING(ps))
492 if (!prs_uint32("size", ps, depth, &q_u->size))
494 if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
496 if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
498 if (!prs_uint32("build", ps, depth, &q_u->build))
500 if (!prs_uint32("major", ps, depth, &q_u->major))
502 if (!prs_uint32("minor", ps, depth, &q_u->minor))
504 if (!prs_uint32("processor", ps, depth, &q_u->processor))
507 if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
511 if (!smb_io_unistr2("", &q_u->user_name, q_u->user_name_ptr, ps, depth))
517 /*******************************************************************
518 ********************************************************************/
520 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
525 prs_debug(ps, depth, desc, "spool_io_user_level");
530 if (!prs_uint32("level", ps, depth, &q_u->level))
532 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
535 switch (q_u->level) {
537 if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
547 /*******************************************************************
548 * read or write a DEVICEMODE struct.
549 * on reading allocate memory for the private member
550 ********************************************************************/
552 #define DM_NUM_OPTIONAL_FIELDS 8
554 BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
556 uint32 available_space; /* size of the device mode left to parse */
557 /* only important on unmarshalling */
560 struct optional_fields {
563 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
564 { "icmmethod", NULL },
565 { "icmintent", NULL },
566 { "mediatype", NULL },
567 { "dithertype", NULL },
568 { "reserved1", NULL },
569 { "reserved2", NULL },
570 { "panningwidth", NULL },
571 { "panningheight", NULL }
574 /* assign at run time to keep non-gcc vompilers happy */
576 opt_fields[0].field = &devmode->icmmethod;
577 opt_fields[1].field = &devmode->icmintent;
578 opt_fields[2].field = &devmode->mediatype;
579 opt_fields[3].field = &devmode->dithertype;
580 opt_fields[4].field = &devmode->reserved1;
581 opt_fields[5].field = &devmode->reserved2;
582 opt_fields[6].field = &devmode->panningwidth;
583 opt_fields[7].field = &devmode->panningheight;
586 prs_debug(ps, depth, desc, "spoolss_io_devmode");
589 if (UNMARSHALLING(ps)) {
590 devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
591 if (devmode->devicename.buffer == NULL)
595 if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
598 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
601 /* Sanity Check - look for unknown specversions, but don't fail if we see one.
602 Let the size determine that */
604 switch (devmode->specversion) {
611 DEBUG(0,("spoolss_io_devmode: Unknown specversion in devicemode [0x%x]\n",
612 devmode->specversion));
613 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
618 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
620 if (!prs_uint16("size", ps, depth, &devmode->size))
622 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
624 if (!prs_uint32("fields", ps, depth, &devmode->fields))
626 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
628 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
630 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
632 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
634 if (!prs_uint16("scale", ps, depth, &devmode->scale))
636 if (!prs_uint16("copies", ps, depth, &devmode->copies))
638 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
640 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
642 if (!prs_uint16("color", ps, depth, &devmode->color))
644 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
646 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
648 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
650 if (!prs_uint16("collate", ps, depth, &devmode->collate))
653 if (UNMARSHALLING(ps)) {
654 devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
655 if (devmode->formname.buffer == NULL)
659 if (!prs_uint16uni(True, "formname", ps, depth, devmode->formname.buffer, 32))
661 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
663 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
665 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
667 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
669 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
671 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
674 * every device mode I've ever seen on the wire at least has up
675 * to the displayfrequency field. --jerry (05-09-2002)
678 /* add uint32's + uint16's + two UNICODE strings */
680 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
682 /* Sanity check - we only have uint32's left tp parse */
684 if ( available_space && ((available_space % sizeof(uint32)) != 0) ) {
685 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
686 available_space, devmode->size));
687 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
692 * Conditional parsing. Assume that the DeviceMode has been
693 * zero'd by the caller.
696 while ((available_space > 0) && (i < DM_NUM_OPTIONAL_FIELDS))
698 DEBUG(10, ("spoolss_io_devmode: [%d] bytes left to parse in devmode\n", available_space));
699 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
701 available_space -= sizeof(uint32);
705 /* Sanity Check - we should no available space at this point unless
706 MS changes the device mode structure */
708 if (available_space) {
709 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
710 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
711 available_space, devmode->size));
712 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
717 if (devmode->driverextra!=0) {
718 if (UNMARSHALLING(ps)) {
719 devmode->private=(uint8 *)prs_alloc_mem(ps, devmode->driverextra*sizeof(uint8));
720 if(devmode->private == NULL)
722 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
725 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
726 if (!prs_uint8s(False, "private", ps, depth,
727 devmode->private, devmode->driverextra))
734 /*******************************************************************
735 Read or write a DEVICEMODE container
736 ********************************************************************/
738 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
743 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
749 if (!prs_uint32("size", ps, depth, &dm_c->size))
752 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
755 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
756 if (UNMARSHALLING(ps))
757 /* if while reading there is no DEVMODE ... */
762 /* so we have a DEVICEMODE to follow */
763 if (UNMARSHALLING(ps)) {
764 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
765 dm_c->devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE));
766 if(dm_c->devmode == NULL)
770 /* this is bad code, shouldn't be there */
771 if (!prs_uint32("size", ps, depth, &dm_c->size))
774 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
780 /*******************************************************************
781 ********************************************************************/
783 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
788 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
791 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
794 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
800 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
806 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
812 /*******************************************************************
814 ********************************************************************/
816 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
817 const fstring printername,
818 const fstring datatype,
819 uint32 access_required,
820 const fstring clientname,
821 const fstring user_name)
823 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
824 q_u->printername_ptr = (printername!=NULL)?1:0;
825 init_unistr2(&q_u->printername, printername, strlen(printername)+1);
827 q_u->printer_default.datatype_ptr = 0;
829 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
830 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
832 q_u->printer_default.devmode_cont.size=0;
833 q_u->printer_default.devmode_cont.devmode_ptr=0;
834 q_u->printer_default.devmode_cont.devmode=NULL;
835 q_u->printer_default.access_required=access_required;
837 q_u->user_ctr.level=1;
839 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
840 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
841 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
842 q_u->user_ctr.user1.build=1381;
843 q_u->user_ctr.user1.major=2;
844 q_u->user_ctr.user1.minor=0;
845 q_u->user_ctr.user1.processor=0;
846 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
847 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
852 /*******************************************************************
854 ********************************************************************/
856 BOOL make_spoolss_q_addprinterex(
858 SPOOL_Q_ADDPRINTEREX *q_u,
859 const char *srv_name,
860 const char* clientname,
861 const char* user_name,
863 PRINTER_INFO_CTR *ctr)
865 DEBUG(5,("make_spoolss_q_addprinterex\n"));
867 if (!ctr) return False;
871 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
872 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
876 q_u->info.level = level;
877 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
880 /* init q_u->info.info2 from *info */
881 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
882 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
892 q_u->user_ctr.level=1;
894 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
895 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
896 q_u->user_ctr.user1.build=1381;
897 q_u->user_ctr.user1.major=2;
898 q_u->user_ctr.user1.minor=0;
899 q_u->user_ctr.user1.processor=0;
900 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
901 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
902 q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
903 q_u->user_ctr.user1.client_name.uni_str_len + 2;
908 /*******************************************************************
909 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
910 *******************************************************************/
912 BOOL make_spoolss_printer_info_2(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
913 PRINTER_INFO_2 *info)
916 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
918 /* allocate the necessary memory */
919 if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2)))) {
920 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
924 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
925 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
926 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
927 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
928 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
929 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
930 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
931 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
932 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
933 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
934 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
935 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
936 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
937 inf->attributes = info->attributes;
938 inf->priority = info->priority;
939 inf->default_priority = info->defaultpriority;
940 inf->starttime = info->starttime;
941 inf->untiltime = info->untiltime;
942 inf->cjobs = info->cjobs;
943 inf->averageppm = info->averageppm;
944 init_unistr2_from_unistr(&inf->servername, &info->servername);
945 init_unistr2_from_unistr(&inf->printername, &info->printername);
946 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
947 init_unistr2_from_unistr(&inf->portname, &info->portname);
948 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
949 init_unistr2_from_unistr(&inf->comment, &info->comment);
950 init_unistr2_from_unistr(&inf->location, &info->location);
951 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
952 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
953 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
954 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
955 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
962 /*******************************************************************
964 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
965 ********************************************************************/
967 BOOL spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
972 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
978 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
980 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
986 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
992 /*******************************************************************
994 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
995 * called from spoolss_open_printer_ex (cli_spoolss.c)
996 ********************************************************************/
998 BOOL spoolss_io_r_open_printer(char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
1000 if (r_u == NULL) return False;
1002 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
1008 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1011 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1018 /*******************************************************************
1020 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1021 ********************************************************************/
1023 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
1028 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
1034 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
1036 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
1042 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1045 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
1047 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
1053 /*******************************************************************
1054 * write a structure.
1055 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1056 * called from spoolss_open_printer_ex (cli_spoolss.c)
1057 ********************************************************************/
1059 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
1061 if (r_u == NULL) return False;
1063 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
1069 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1072 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1078 /*******************************************************************
1080 ********************************************************************/
1081 BOOL make_spoolss_q_deleteprinterdriver(
1082 TALLOC_CTX *mem_ctx,
1083 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
1089 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1091 q_u->server_ptr = (server!=NULL)?1:0;
1093 /* these must be NULL terminated or else NT4 will
1094 complain about invalid parameters --jerry */
1095 init_unistr2(&q_u->server, server, strlen(server)+1);
1096 init_unistr2(&q_u->arch, arch, strlen(arch)+1);
1097 init_unistr2(&q_u->driver, driver, strlen(driver)+1);
1104 /*******************************************************************
1106 ********************************************************************/
1108 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
1109 const POLICY_HND *handle,
1110 char *valuename, uint32 size)
1112 if (q_u == NULL) return False;
1114 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1116 q_u->handle = *handle;
1117 init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);
1123 /*******************************************************************
1125 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1126 ********************************************************************/
1128 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
1133 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
1138 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1142 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1146 if (!prs_uint32("size", ps, depth, &q_u->size))
1152 /*******************************************************************
1154 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1155 ********************************************************************/
1157 BOOL spoolss_io_q_deleteprinterdata(char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1162 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1167 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1171 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1177 /*******************************************************************
1178 * write a structure.
1179 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1180 ********************************************************************/
1182 BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1184 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1186 if(!prs_werror("status", ps, depth, &r_u->status))
1192 /*******************************************************************
1193 * write a structure.
1194 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1195 ********************************************************************/
1197 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1202 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1207 if (!prs_uint32("type", ps, depth, &r_u->type))
1209 if (!prs_uint32("size", ps, depth, &r_u->size))
1212 if (UNMARSHALLING(ps))
1213 r_u->data = prs_alloc_mem(ps, r_u->size);
1215 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
1221 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1223 if (!prs_werror("status", ps, depth, &r_u->status))
1229 /*******************************************************************
1231 ********************************************************************/
1233 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1235 if (q_u == NULL) return False;
1237 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1239 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1244 /*******************************************************************
1246 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1247 * called from spoolss_abortprinter (cli_spoolss.c)
1248 ********************************************************************/
1250 BOOL spoolss_io_q_abortprinter(char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1252 if (q_u == NULL) return False;
1254 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1260 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1266 /*******************************************************************
1267 * write a structure.
1268 * called from spoolss_r_abortprinter (srv_spoolss.c)
1269 ********************************************************************/
1271 BOOL spoolss_io_r_abortprinter(char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1273 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1275 if(!prs_werror("status", ps, depth, &r_u->status))
1281 /*******************************************************************
1283 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1284 * called from spoolss_deleteprinter (cli_spoolss.c)
1285 ********************************************************************/
1287 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1289 if (q_u == NULL) return False;
1291 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1297 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1303 /*******************************************************************
1304 * write a structure.
1305 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1306 * called from spoolss_deleteprinter (cli_spoolss.c)
1307 ********************************************************************/
1309 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1311 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1317 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1319 if (!prs_werror("status", ps, depth, &r_u->status))
1326 /*******************************************************************
1328 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1329 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1330 ********************************************************************/
1332 BOOL spoolss_io_q_deleteprinterdriver(char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1334 if (q_u == NULL) return False;
1336 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1342 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1344 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1346 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1348 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1356 /*******************************************************************
1357 * write a structure.
1358 ********************************************************************/
1359 BOOL spoolss_io_r_deleteprinterdriver(char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1361 if (r_u == NULL) return False;
1363 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1369 if (!prs_werror("status", ps, depth, &r_u->status))
1377 /*******************************************************************
1379 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1380 * called from spoolss_closeprinter (cli_spoolss.c)
1381 ********************************************************************/
1383 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1385 if (q_u == NULL) return False;
1387 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1393 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1399 /*******************************************************************
1400 * write a structure.
1401 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1402 * called from spoolss_closeprinter (cli_spoolss.c)
1403 ********************************************************************/
1405 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1407 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1413 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1415 if (!prs_werror("status", ps, depth, &r_u->status))
1421 /*******************************************************************
1423 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1424 ********************************************************************/
1426 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1428 if (q_u == NULL) return False;
1430 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1436 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1439 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1445 /*******************************************************************
1446 * write a structure.
1447 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1448 ********************************************************************/
1450 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1452 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1454 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1456 if(!prs_werror("status", ps, depth, &r_u->status))
1462 /*******************************************************************
1464 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1465 ********************************************************************/
1467 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1469 if (q_u == NULL) return False;
1471 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1477 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1483 /*******************************************************************
1484 * write a structure.
1485 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1486 ********************************************************************/
1488 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1490 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1492 if(!prs_werror("status", ps, depth, &r_u->status))
1498 /*******************************************************************
1500 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1501 ********************************************************************/
1503 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1505 if (q_u == NULL) return False;
1507 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1513 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1519 /*******************************************************************
1520 * write a structure.
1521 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1522 ********************************************************************/
1524 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1526 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1528 if(!prs_werror("status", ps, depth, &r_u->status))
1534 /*******************************************************************
1536 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1537 ********************************************************************/
1539 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1541 if (q_u == NULL) return False;
1543 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1549 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1555 /*******************************************************************
1556 * write a structure.
1557 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1558 ********************************************************************/
1560 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1562 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1564 if(!prs_werror("status", ps, depth, &r_u->status))
1570 /*******************************************************************
1572 * called from spoolss_q_writeprinter (srv_spoolss.c)
1573 ********************************************************************/
1575 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1577 if (q_u == NULL) return False;
1579 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1585 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1587 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1590 if (q_u->buffer_size!=0)
1592 if (UNMARSHALLING(ps))
1593 q_u->buffer=(uint8 *)prs_alloc_mem(ps,q_u->buffer_size*sizeof(uint8));
1594 if(q_u->buffer == NULL)
1596 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1601 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1607 /*******************************************************************
1608 * write a structure.
1609 * called from spoolss_r_writeprinter (srv_spoolss.c)
1610 ********************************************************************/
1612 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1614 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1616 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1618 if(!prs_werror("status", ps, depth, &r_u->status))
1624 /*******************************************************************
1626 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1627 ********************************************************************/
1629 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1631 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1637 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1639 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1641 if(!prs_uint32("options", ps, depth, &q_u->options))
1643 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1645 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1651 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1654 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1657 if (q_u->option_ptr!=0) {
1659 if (UNMARSHALLING(ps))
1660 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1663 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1670 /*******************************************************************
1671 * write a structure.
1672 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1673 ********************************************************************/
1675 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1677 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1680 if(!prs_werror("status", ps, depth, &r_u->status))
1686 /*******************************************************************
1688 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1689 ********************************************************************/
1691 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1693 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1699 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1702 if(!prs_uint32("change", ps, depth, &q_u->change))
1705 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1708 if (q_u->option_ptr!=0) {
1710 if (UNMARSHALLING(ps))
1711 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1714 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1721 /*******************************************************************
1722 * write a structure.
1723 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1724 ********************************************************************/
1726 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1728 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1734 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1737 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1742 if(!prs_werror("status", ps, depth, &r_u->status))
1748 /*******************************************************************
1749 * return the length of a uint16 (obvious, but the code is clean)
1750 ********************************************************************/
1752 static uint32 size_of_uint16(uint16 *value)
1754 return (sizeof(*value));
1757 /*******************************************************************
1758 * return the length of a uint32 (obvious, but the code is clean)
1759 ********************************************************************/
1761 static uint32 size_of_uint32(uint32 *value)
1763 return (sizeof(*value));
1766 /*******************************************************************
1767 * return the length of a NTTIME (obvious, but the code is clean)
1768 ********************************************************************/
1770 static uint32 size_of_nttime(NTTIME *value)
1772 return (sizeof(*value));
1775 /*******************************************************************
1776 * return the length of a UNICODE string in number of char, includes:
1777 * - the leading zero
1778 * - the relative pointer size
1779 ********************************************************************/
1781 static uint32 size_of_relative_string(UNISTR *string)
1785 size=str_len_uni(string); /* the string length */
1786 size=size+1; /* add the trailing zero */
1787 size=size*2; /* convert in char */
1788 size=size+4; /* add the size of the ptr */
1792 * Do not include alignment as Win2k does not align relative
1793 * strings within a buffer --jerry
1795 /* Ensure size is 4 byte multiple (prs_align is being called...). */
1796 /* size += ((4 - (size & 3)) & 3); */
1802 /*******************************************************************
1803 * return the length of a uint32 (obvious, but the code is clean)
1804 ********************************************************************/
1806 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1811 return (4+devmode->size+devmode->driverextra);
1814 /*******************************************************************
1815 * return the length of a uint32 (obvious, but the code is clean)
1816 ********************************************************************/
1818 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1823 return (sizeof(SYSTEMTIME) +4);
1826 /*******************************************************************
1827 * write a UNICODE string and its relative pointer.
1828 * used by all the RPC structs passing a buffer
1830 * As I'm a nice guy, I'm forcing myself to explain this code.
1831 * MS did a good job in the overall spoolss code except in some
1832 * functions where they are passing the API buffer directly in the
1833 * RPC request/reply. That's to maintain compatiility at the API level.
1834 * They could have done it the good way the first time.
1836 * So what happen is: the strings are written at the buffer's end,
1837 * in the reverse order of the original structure. Some pointers to
1838 * the strings are also in the buffer. Those are relative to the
1841 * If you don't understand or want to change that function,
1842 * first get in touch with me: jfm@samba.org
1844 ********************************************************************/
1846 static BOOL smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1848 prs_struct *ps=&buffer->prs;
1850 if (MARSHALLING(ps)) {
1851 uint32 struct_offset = prs_offset(ps);
1852 uint32 relative_offset;
1854 buffer->string_at_end -= (size_of_relative_string(string) - 4);
1855 if(!prs_set_offset(ps, buffer->string_at_end))
1859 * Win2k does not align strings in a buffer
1860 * Tested against WinNT 4.0 SP 6a & 2k SP2 --jerry
1865 buffer->string_at_end = prs_offset(ps);
1867 /* write the string */
1868 if (!smb_io_unistr(desc, string, ps, depth))
1871 if(!prs_set_offset(ps, struct_offset))
1874 relative_offset=buffer->string_at_end - buffer->struct_start;
1875 /* write its offset */
1876 if (!prs_uint32("offset", ps, depth, &relative_offset))
1882 /* read the offset */
1883 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1886 old_offset = prs_offset(ps);
1887 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
1890 /* read the string */
1891 if (!smb_io_unistr(desc, string, ps, depth))
1894 if(!prs_set_offset(ps, old_offset))
1900 /*******************************************************************
1901 * write a array of UNICODE strings and its relative pointer.
1902 * used by 2 RPC structs
1903 ********************************************************************/
1905 static BOOL smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1909 prs_struct *ps=&buffer->prs;
1911 if (MARSHALLING(ps)) {
1912 uint32 struct_offset = prs_offset(ps);
1913 uint32 relative_offset;
1920 /* first write the last 0 */
1921 buffer->string_at_end -= 2;
1922 if(!prs_set_offset(ps, buffer->string_at_end))
1925 if(!prs_uint16("leading zero", ps, depth, &zero))
1928 while (p && (*p!=0)) {
1932 /* Yes this should be malloc not talloc. Don't change. */
1934 chaine.buffer = malloc((q-p+1)*sizeof(uint16));
1935 if (chaine.buffer == NULL)
1938 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1940 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1942 if(!prs_set_offset(ps, buffer->string_at_end)) {
1943 SAFE_FREE(chaine.buffer);
1947 /* write the string */
1948 if (!smb_io_unistr(desc, &chaine, ps, depth)) {
1949 SAFE_FREE(chaine.buffer);
1955 SAFE_FREE(chaine.buffer);
1958 if(!prs_set_offset(ps, struct_offset))
1961 relative_offset=buffer->string_at_end - buffer->struct_start;
1962 /* write its offset */
1963 if (!prs_uint32("offset", ps, depth, &relative_offset))
1971 uint16 *chaine2=NULL;
1974 size_t realloc_size = 0;
1978 /* read the offset */
1979 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1982 old_offset = prs_offset(ps);
1983 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1987 if (!smb_io_unistr(desc, &chaine, ps, depth))
1990 l_chaine=str_len_uni(&chaine);
1992 /* we're going to add two more bytes here in case this
1993 is the last string in the array and we need to add
1994 an extra NULL for termination */
1999 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
2001 /* Yes this should be realloc - it's freed below. JRA */
2003 if((tc2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL) {
2008 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
2009 l_chaine2+=l_chaine+1;
2012 } while(l_chaine!=0);
2014 /* the end should be bould NULL terminated so add
2015 the second one here */
2018 chaine2[l_chaine2] = '\0';
2019 *string=(uint16 *)talloc_memdup(prs_get_mem_context(ps),chaine2,realloc_size);
2023 if(!prs_set_offset(ps, old_offset))
2029 /*******************************************************************
2030 Parse a DEVMODE structure and its relative pointer.
2031 ********************************************************************/
2033 static BOOL smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
2035 prs_struct *ps= &buffer->prs;
2037 prs_debug(ps, depth, desc, "smb_io_relsecdesc");
2040 if (MARSHALLING(ps)) {
2041 uint32 struct_offset = prs_offset(ps);
2042 uint32 relative_offset;
2045 relative_offset = 0;
2046 if (!prs_uint32("offset", ps, depth, &relative_offset))
2051 if (*secdesc != NULL) {
2052 buffer->string_at_end -= sec_desc_size(*secdesc);
2054 if(!prs_set_offset(ps, buffer->string_at_end))
2056 /* write the secdesc */
2057 if (!sec_io_desc(desc, secdesc, ps, depth))
2060 if(!prs_set_offset(ps, struct_offset))
2064 relative_offset=buffer->string_at_end - buffer->struct_start;
2065 /* write its offset */
2067 if (!prs_uint32("offset", ps, depth, &relative_offset))
2072 /* read the offset */
2073 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2076 old_offset = prs_offset(ps);
2077 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2081 if (!sec_io_desc(desc, secdesc, ps, depth))
2084 if(!prs_set_offset(ps, old_offset))
2090 /*******************************************************************
2091 Parse a DEVMODE structure and its relative pointer.
2092 ********************************************************************/
2094 static BOOL smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
2096 prs_struct *ps=&buffer->prs;
2098 prs_debug(ps, depth, desc, "smb_io_reldevmode");
2101 if (MARSHALLING(ps)) {
2102 uint32 struct_offset = prs_offset(ps);
2103 uint32 relative_offset;
2105 if (*devmode == NULL) {
2107 if (!prs_uint32("offset", ps, depth, &relative_offset))
2109 DEBUG(8, ("boing, the devmode was NULL\n"));
2114 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
2116 if(!prs_set_offset(ps, buffer->string_at_end))
2119 /* write the DEVMODE */
2120 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2123 if(!prs_set_offset(ps, struct_offset))
2126 relative_offset=buffer->string_at_end - buffer->struct_start;
2127 /* write its offset */
2128 if (!prs_uint32("offset", ps, depth, &relative_offset))
2134 /* read the offset */
2135 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2137 if (buffer->string_at_end == 0) {
2142 old_offset = prs_offset(ps);
2143 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2146 /* read the string */
2147 if((*devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE))) == NULL)
2149 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2152 if(!prs_set_offset(ps, old_offset))
2158 /*******************************************************************
2159 Parse a PRINTER_INFO_0 structure.
2160 ********************************************************************/
2162 BOOL smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2164 prs_struct *ps=&buffer->prs;
2166 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2169 buffer->struct_start=prs_offset(ps);
2171 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2173 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2176 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2178 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2180 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2183 if(!prs_uint16("year", ps, depth, &info->year))
2185 if(!prs_uint16("month", ps, depth, &info->month))
2187 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2189 if(!prs_uint16("day", ps, depth, &info->day))
2191 if(!prs_uint16("hour", ps, depth, &info->hour))
2193 if(!prs_uint16("minute", ps, depth, &info->minute))
2195 if(!prs_uint16("second", ps, depth, &info->second))
2197 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2200 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2202 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2205 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2207 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2209 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2211 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2213 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2215 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2217 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2219 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2221 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2223 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2225 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2227 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2229 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2231 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2233 if(!prs_uint32("status" , ps, depth, &info->status))
2235 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2237 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2239 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2241 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2243 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2245 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2247 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2249 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2251 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2253 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2259 /*******************************************************************
2260 Parse a PRINTER_INFO_1 structure.
2261 ********************************************************************/
2263 BOOL smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2265 prs_struct *ps=&buffer->prs;
2267 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2270 buffer->struct_start=prs_offset(ps);
2272 if (!prs_uint32("flags", ps, depth, &info->flags))
2274 if (!smb_io_relstr("description", buffer, depth, &info->description))
2276 if (!smb_io_relstr("name", buffer, depth, &info->name))
2278 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2284 /*******************************************************************
2285 Parse a PRINTER_INFO_2 structure.
2286 ********************************************************************/
2288 BOOL smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2290 prs_struct *ps=&buffer->prs;
2291 uint32 dm_offset, sd_offset, current_offset;
2292 uint32 dummy_value = 0;
2294 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2297 buffer->struct_start=prs_offset(ps);
2299 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2301 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2303 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2305 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2307 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2309 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2311 if (!smb_io_relstr("location", buffer, depth, &info->location))
2314 /* save current offset and wind forwared by a uint32 */
2315 dm_offset = prs_offset(ps);
2316 if (!prs_uint32("devmode", ps, depth, &dummy_value))
2319 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2321 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2323 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2325 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2328 /* save current offset for the sec_desc */
2329 sd_offset = prs_offset(ps);
2330 if (!prs_uint32("sec_desc", ps, depth, &dummy_value))
2334 /* save current location so we can pick back up here */
2335 current_offset = prs_offset(ps);
2337 /* parse the devmode */
2338 if (!prs_set_offset(ps, dm_offset))
2340 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2343 /* parse the sec_desc */
2344 if (!prs_set_offset(ps, sd_offset))
2346 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2349 /* pick up where we left off */
2350 if (!prs_set_offset(ps, current_offset))
2353 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2355 if (!prs_uint32("priority", ps, depth, &info->priority))
2357 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2359 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2361 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2363 if (!prs_uint32("status", ps, depth, &info->status))
2365 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2367 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2373 /*******************************************************************
2374 Parse a PRINTER_INFO_3 structure.
2375 ********************************************************************/
2377 BOOL smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2379 prs_struct *ps=&buffer->prs;
2381 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2384 buffer->struct_start=prs_offset(ps);
2386 if (!prs_uint32("flags", ps, depth, &info->flags))
2388 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2394 /*******************************************************************
2395 Parse a PRINTER_INFO_4 structure.
2396 ********************************************************************/
2398 BOOL smb_io_printer_info_4(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
2400 prs_struct *ps=&buffer->prs;
2402 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
2405 buffer->struct_start=prs_offset(ps);
2407 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2409 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2411 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2416 /*******************************************************************
2417 Parse a PRINTER_INFO_5 structure.
2418 ********************************************************************/
2420 BOOL smb_io_printer_info_5(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
2422 prs_struct *ps=&buffer->prs;
2424 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
2427 buffer->struct_start=prs_offset(ps);
2429 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2431 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2433 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2435 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
2437 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
2442 /*******************************************************************
2443 Parse a PORT_INFO_1 structure.
2444 ********************************************************************/
2446 BOOL smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2448 prs_struct *ps=&buffer->prs;
2450 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2453 buffer->struct_start=prs_offset(ps);
2455 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2461 /*******************************************************************
2462 Parse a PORT_INFO_2 structure.
2463 ********************************************************************/
2465 BOOL smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2467 prs_struct *ps=&buffer->prs;
2469 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2472 buffer->struct_start=prs_offset(ps);
2474 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2476 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2478 if (!smb_io_relstr("description", buffer, depth, &info->description))
2480 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2482 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2488 /*******************************************************************
2489 Parse a DRIVER_INFO_1 structure.
2490 ********************************************************************/
2492 BOOL smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2494 prs_struct *ps=&buffer->prs;
2496 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2499 buffer->struct_start=prs_offset(ps);
2501 if (!smb_io_relstr("name", buffer, depth, &info->name))
2507 /*******************************************************************
2508 Parse a DRIVER_INFO_2 structure.
2509 ********************************************************************/
2511 BOOL smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2513 prs_struct *ps=&buffer->prs;
2515 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2518 buffer->struct_start=prs_offset(ps);
2520 if (!prs_uint32("version", ps, depth, &info->version))
2522 if (!smb_io_relstr("name", buffer, depth, &info->name))
2524 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2526 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2528 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2530 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2536 /*******************************************************************
2537 Parse a DRIVER_INFO_3 structure.
2538 ********************************************************************/
2540 BOOL smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2542 prs_struct *ps=&buffer->prs;
2544 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2547 buffer->struct_start=prs_offset(ps);
2549 if (!prs_uint32("version", ps, depth, &info->version))
2551 if (!smb_io_relstr("name", buffer, depth, &info->name))
2553 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2555 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2557 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2559 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2561 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2564 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2567 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2569 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2575 /*******************************************************************
2576 Parse a DRIVER_INFO_6 structure.
2577 ********************************************************************/
2579 BOOL smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2581 prs_struct *ps=&buffer->prs;
2583 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2586 buffer->struct_start=prs_offset(ps);
2588 if (!prs_uint32("version", ps, depth, &info->version))
2590 if (!smb_io_relstr("name", buffer, depth, &info->name))
2592 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2594 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2596 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2598 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2600 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2603 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2606 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2608 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2611 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2614 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2616 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2619 if (!prs_uint32("padding", ps, depth, &info->padding))
2622 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2625 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2628 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2630 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2632 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2634 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2640 /*******************************************************************
2641 Parse a JOB_INFO_1 structure.
2642 ********************************************************************/
2644 BOOL smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2646 prs_struct *ps=&buffer->prs;
2648 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2651 buffer->struct_start=prs_offset(ps);
2653 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2655 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2657 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2659 if (!smb_io_relstr("username", buffer, depth, &info->username))
2661 if (!smb_io_relstr("document", buffer, depth, &info->document))
2663 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2665 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2667 if (!prs_uint32("status", ps, depth, &info->status))
2669 if (!prs_uint32("priority", ps, depth, &info->priority))
2671 if (!prs_uint32("position", ps, depth, &info->position))
2673 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2675 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2677 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2683 /*******************************************************************
2684 Parse a JOB_INFO_2 structure.
2685 ********************************************************************/
2687 BOOL smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2690 prs_struct *ps=&buffer->prs;
2692 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2695 buffer->struct_start=prs_offset(ps);
2697 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2699 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2701 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2703 if (!smb_io_relstr("username", buffer, depth, &info->username))
2705 if (!smb_io_relstr("document", buffer, depth, &info->document))
2707 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2709 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2712 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2714 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2716 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2718 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2720 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2723 /* SEC_DESC sec_desc;*/
2724 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2727 if (!prs_uint32("status",ps, depth, &info->status))
2729 if (!prs_uint32("priority",ps, depth, &info->priority))
2731 if (!prs_uint32("position",ps, depth, &info->position))
2733 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2735 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2737 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2739 if (!prs_uint32("size",ps, depth, &info->size))
2741 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2743 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2745 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2751 /*******************************************************************
2752 ********************************************************************/
2754 BOOL smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2756 prs_struct *ps=&buffer->prs;
2758 prs_debug(ps, depth, desc, "smb_io_form_1");
2761 buffer->struct_start=prs_offset(ps);
2763 if (!prs_uint32("flag", ps, depth, &info->flag))
2766 if (!smb_io_relstr("name", buffer, depth, &info->name))
2769 if (!prs_uint32("width", ps, depth, &info->width))
2771 if (!prs_uint32("length", ps, depth, &info->length))
2773 if (!prs_uint32("left", ps, depth, &info->left))
2775 if (!prs_uint32("top", ps, depth, &info->top))
2777 if (!prs_uint32("right", ps, depth, &info->right))
2779 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2785 /*******************************************************************
2786 Read/write a BUFFER struct.
2787 ********************************************************************/
2789 static BOOL spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
2791 NEW_BUFFER *buffer = *pp_buffer;
2793 prs_debug(ps, depth, desc, "spoolss_io_buffer");
2796 if (UNMARSHALLING(ps))
2797 buffer = *pp_buffer = (NEW_BUFFER *)prs_alloc_mem(ps, sizeof(NEW_BUFFER));
2802 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2806 if (UNMARSHALLING(ps)) {
2808 buffer->string_at_end=0;
2810 if (buffer->ptr==0) {
2812 * JRA. I'm not sure if the data in here is in big-endian format if
2813 * the client is big-endian. Leave as default (little endian) for now.
2816 if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
2821 if (!prs_uint32("size", ps, depth, &buffer->size))
2825 * JRA. I'm not sure if the data in here is in big-endian format if
2826 * the client is big-endian. Leave as default (little endian) for now.
2829 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
2832 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
2835 if (!prs_set_offset(&buffer->prs, 0))
2838 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
2841 buffer->string_at_end=buffer->size;
2849 if (buffer->ptr==0) {
2850 /* We have finished with the data in buffer->prs - free it. */
2851 prs_mem_free(&buffer->prs);
2855 if (!prs_uint32("size", ps, depth, &buffer->size))
2858 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
2864 /* We have finished with the data in buffer->prs - free it. */
2865 prs_mem_free(&buffer->prs);
2871 /*******************************************************************
2872 move a BUFFER from the query to the reply.
2873 As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
2874 this is ok. This is an OPTIMIZATION and is not strictly neccessary.
2875 Clears the memory to zero also.
2876 ********************************************************************/
2878 void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2880 prs_switch_type(&src->prs, MARSHALL);
2881 if(!prs_set_offset(&src->prs, 0))
2883 prs_force_dynamic(&src->prs);
2884 prs_mem_clear(&src->prs);
2888 /*******************************************************************
2889 Get the size of a BUFFER struct.
2890 ********************************************************************/
2892 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2894 return (buffer->size);
2897 /*******************************************************************
2898 Parse a DRIVER_DIRECTORY_1 structure.
2899 ********************************************************************/
2901 BOOL smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2903 prs_struct *ps=&buffer->prs;
2905 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2908 buffer->struct_start=prs_offset(ps);
2910 if (!smb_io_unistr(desc, &info->name, ps, depth))
2916 /*******************************************************************
2917 Parse a PORT_INFO_1 structure.
2918 ********************************************************************/
2920 BOOL smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2922 prs_struct *ps=&buffer->prs;
2924 prs_debug(ps, depth, desc, "smb_io_port_1");
2927 buffer->struct_start=prs_offset(ps);
2929 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2935 /*******************************************************************
2936 Parse a PORT_INFO_2 structure.
2937 ********************************************************************/
2939 BOOL smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2941 prs_struct *ps=&buffer->prs;
2943 prs_debug(ps, depth, desc, "smb_io_port_2");
2946 buffer->struct_start=prs_offset(ps);
2948 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2950 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2952 if(!smb_io_relstr("description", buffer, depth, &info->description))
2954 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2956 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2962 /*******************************************************************
2963 ********************************************************************/
2965 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2967 prs_struct *ps=&buffer->prs;
2969 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2972 buffer->struct_start=prs_offset(ps);
2974 if (smb_io_relstr("name", buffer, depth, &info->name))
2980 /*******************************************************************
2981 ********************************************************************/
2983 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2985 prs_struct *ps=&buffer->prs;
2987 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2990 buffer->struct_start=prs_offset(ps);
2992 if (smb_io_relstr("name", buffer, depth, &info->name))
2998 /*******************************************************************
2999 ********************************************************************/
3001 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
3003 prs_struct *ps=&buffer->prs;
3005 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
3008 buffer->struct_start=prs_offset(ps);
3010 if (!smb_io_relstr("name", buffer, depth, &info->name))
3016 /*******************************************************************
3017 ********************************************************************/
3019 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
3021 prs_struct *ps=&buffer->prs;
3023 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
3026 buffer->struct_start=prs_offset(ps);
3028 if (!smb_io_relstr("name", buffer, depth, &info->name))
3030 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
3032 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
3038 /*******************************************************************
3039 return the size required by a struct in the stream
3040 ********************************************************************/
3042 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
3046 size+=size_of_relative_string( &info->printername );
3047 size+=size_of_relative_string( &info->servername );
3049 size+=size_of_uint32( &info->cjobs);
3050 size+=size_of_uint32( &info->total_jobs);
3051 size+=size_of_uint32( &info->total_bytes);
3053 size+=size_of_uint16( &info->year);
3054 size+=size_of_uint16( &info->month);
3055 size+=size_of_uint16( &info->dayofweek);
3056 size+=size_of_uint16( &info->day);
3057 size+=size_of_uint16( &info->hour);
3058 size+=size_of_uint16( &info->minute);
3059 size+=size_of_uint16( &info->second);
3060 size+=size_of_uint16( &info->milliseconds);
3062 size+=size_of_uint32( &info->global_counter);
3063 size+=size_of_uint32( &info->total_pages);
3065 size+=size_of_uint16( &info->major_version);
3066 size+=size_of_uint16( &info->build_version);
3068 size+=size_of_uint32( &info->unknown7);
3069 size+=size_of_uint32( &info->unknown8);
3070 size+=size_of_uint32( &info->unknown9);
3071 size+=size_of_uint32( &info->session_counter);
3072 size+=size_of_uint32( &info->unknown11);
3073 size+=size_of_uint32( &info->printer_errors);
3074 size+=size_of_uint32( &info->unknown13);
3075 size+=size_of_uint32( &info->unknown14);
3076 size+=size_of_uint32( &info->unknown15);
3077 size+=size_of_uint32( &info->unknown16);
3078 size+=size_of_uint32( &info->change_id);
3079 size+=size_of_uint32( &info->unknown18);
3080 size+=size_of_uint32( &info->status);
3081 size+=size_of_uint32( &info->unknown20);
3082 size+=size_of_uint32( &info->c_setprinter);
3084 size+=size_of_uint16( &info->unknown22);
3085 size+=size_of_uint16( &info->unknown23);
3086 size+=size_of_uint16( &info->unknown24);
3087 size+=size_of_uint16( &info->unknown25);
3088 size+=size_of_uint16( &info->unknown26);
3089 size+=size_of_uint16( &info->unknown27);
3090 size+=size_of_uint16( &info->unknown28);
3091 size+=size_of_uint16( &info->unknown29);
3096 /*******************************************************************
3097 return the size required by a struct in the stream
3098 ********************************************************************/
3100 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
3104 size+=size_of_uint32( &info->flags );
3105 size+=size_of_relative_string( &info->description );
3106 size+=size_of_relative_string( &info->name );
3107 size+=size_of_relative_string( &info->comment );
3112 /*******************************************************************
3113 return the size required by a struct in the stream
3114 ********************************************************************/
3116 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
3122 size += sec_desc_size( info->secdesc );
3124 size+=size_of_device_mode( info->devmode );
3126 size+=size_of_relative_string( &info->servername );
3127 size+=size_of_relative_string( &info->printername );
3128 size+=size_of_relative_string( &info->sharename );
3129 size+=size_of_relative_string( &info->portname );
3130 size+=size_of_relative_string( &info->drivername );
3131 size+=size_of_relative_string( &info->comment );
3132 size+=size_of_relative_string( &info->location );
3134 size+=size_of_relative_string( &info->sepfile );
3135 size+=size_of_relative_string( &info->printprocessor );
3136 size+=size_of_relative_string( &info->datatype );
3137 size+=size_of_relative_string( &info->parameters );
3139 size+=size_of_uint32( &info->attributes );
3140 size+=size_of_uint32( &info->priority );
3141 size+=size_of_uint32( &info->defaultpriority );
3142 size+=size_of_uint32( &info->starttime );
3143 size+=size_of_uint32( &info->untiltime );
3144 size+=size_of_uint32( &info->status );
3145 size+=size_of_uint32( &info->cjobs );
3146 size+=size_of_uint32( &info->averageppm );
3149 * add any adjustments for alignment. This is
3150 * not optimal since we could be calling this
3151 * function from a loop (e.g. enumprinters), but
3152 * it is easier to maintain the calculation here and
3153 * not place the burden on the caller to remember. --jerry
3160 /*******************************************************************
3161 return the size required by a struct in the stream
3162 ********************************************************************/
3164 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
3168 size+=size_of_relative_string( &info->printername );
3169 size+=size_of_relative_string( &info->servername );
3171 size+=size_of_uint32( &info->attributes );
3175 /*******************************************************************
3176 return the size required by a struct in the stream
3177 ********************************************************************/
3179 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
3183 size+=size_of_relative_string( &info->printername );
3184 size+=size_of_relative_string( &info->portname );
3186 size+=size_of_uint32( &info->attributes );
3187 size+=size_of_uint32( &info->device_not_selected_timeout );
3188 size+=size_of_uint32( &info->transmission_retry_timeout );
3193 /*******************************************************************
3194 return the size required by a struct in the stream
3195 ********************************************************************/
3197 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
3199 /* The 4 is for the self relative pointer.. */
3200 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
3201 return 4 + (uint32)sec_desc_size( info->secdesc );
3204 /*******************************************************************
3205 return the size required by a struct in the stream
3206 ********************************************************************/
3208 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
3211 size+=size_of_relative_string( &info->name );
3216 /*******************************************************************
3217 return the size required by a struct in the stream
3218 ********************************************************************/
3220 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
3223 size+=size_of_uint32( &info->version );
3224 size+=size_of_relative_string( &info->name );
3225 size+=size_of_relative_string( &info->architecture );
3226 size+=size_of_relative_string( &info->driverpath );
3227 size+=size_of_relative_string( &info->datafile );
3228 size+=size_of_relative_string( &info->configfile );
3233 /*******************************************************************
3234 return the size required by a string array.
3235 ********************************************************************/
3237 uint32 spoolss_size_string_array(uint16 *string)
3242 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
3244 i=i+2; /* to count all chars including the leading zero */
3245 i=2*i; /* because we need the value in bytes */
3246 i=i+4; /* the offset pointer size */
3251 /*******************************************************************
3252 return the size required by a struct in the stream
3253 ********************************************************************/
3255 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3259 size+=size_of_uint32( &info->version );
3260 size+=size_of_relative_string( &info->name );
3261 size+=size_of_relative_string( &info->architecture );
3262 size+=size_of_relative_string( &info->driverpath );
3263 size+=size_of_relative_string( &info->datafile );
3264 size+=size_of_relative_string( &info->configfile );
3265 size+=size_of_relative_string( &info->helpfile );
3266 size+=size_of_relative_string( &info->monitorname );
3267 size+=size_of_relative_string( &info->defaultdatatype );
3269 size+=spoolss_size_string_array(info->dependentfiles);
3274 /*******************************************************************
3275 return the size required by a struct in the stream
3276 ********************************************************************/
3278 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3282 size+=size_of_uint32( &info->version );
3283 size+=size_of_relative_string( &info->name );
3284 size+=size_of_relative_string( &info->architecture );
3285 size+=size_of_relative_string( &info->driverpath );
3286 size+=size_of_relative_string( &info->datafile );
3287 size+=size_of_relative_string( &info->configfile );
3288 size+=size_of_relative_string( &info->helpfile );
3290 size+=spoolss_size_string_array(info->dependentfiles);
3292 size+=size_of_relative_string( &info->monitorname );
3293 size+=size_of_relative_string( &info->defaultdatatype );
3295 size+=spoolss_size_string_array(info->previousdrivernames);
3297 size+=size_of_nttime(&info->driver_date);
3298 size+=size_of_uint32( &info->padding );
3299 size+=size_of_uint32( &info->driver_version_low );
3300 size+=size_of_uint32( &info->driver_version_high );
3301 size+=size_of_relative_string( &info->mfgname );
3302 size+=size_of_relative_string( &info->oem_url );
3303 size+=size_of_relative_string( &info->hardware_id );
3304 size+=size_of_relative_string( &info->provider );
3309 /*******************************************************************
3310 return the size required by a struct in the stream
3311 ********************************************************************/
3313 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3316 size+=size_of_uint32( &info->jobid );
3317 size+=size_of_relative_string( &info->printername );
3318 size+=size_of_relative_string( &info->machinename );
3319 size+=size_of_relative_string( &info->username );
3320 size+=size_of_relative_string( &info->document );
3321 size+=size_of_relative_string( &info->datatype );
3322 size+=size_of_relative_string( &info->text_status );
3323 size+=size_of_uint32( &info->status );
3324 size+=size_of_uint32( &info->priority );
3325 size+=size_of_uint32( &info->position );
3326 size+=size_of_uint32( &info->totalpages );
3327 size+=size_of_uint32( &info->pagesprinted );
3328 size+=size_of_systemtime( &info->submitted );
3333 /*******************************************************************
3334 return the size required by a struct in the stream
3335 ********************************************************************/
3337 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3341 size+=4; /* size of sec desc ptr */
3343 size+=size_of_uint32( &info->jobid );
3344 size+=size_of_relative_string( &info->printername );
3345 size+=size_of_relative_string( &info->machinename );
3346 size+=size_of_relative_string( &info->username );
3347 size+=size_of_relative_string( &info->document );
3348 size+=size_of_relative_string( &info->notifyname );
3349 size+=size_of_relative_string( &info->datatype );
3350 size+=size_of_relative_string( &info->printprocessor );
3351 size+=size_of_relative_string( &info->parameters );
3352 size+=size_of_relative_string( &info->drivername );
3353 size+=size_of_device_mode( info->devmode );
3354 size+=size_of_relative_string( &info->text_status );
3355 /* SEC_DESC sec_desc;*/
3356 size+=size_of_uint32( &info->status );
3357 size+=size_of_uint32( &info->priority );
3358 size+=size_of_uint32( &info->position );
3359 size+=size_of_uint32( &info->starttime );
3360 size+=size_of_uint32( &info->untiltime );
3361 size+=size_of_uint32( &info->totalpages );
3362 size+=size_of_uint32( &info->size );
3363 size+=size_of_systemtime( &info->submitted );
3364 size+=size_of_uint32( &info->timeelapsed );
3365 size+=size_of_uint32( &info->pagesprinted );
3370 /*******************************************************************
3371 return the size required by a struct in the stream
3372 ********************************************************************/
3374 uint32 spoolss_size_form_1(FORM_1 *info)
3378 size+=size_of_uint32( &info->flag );
3379 size+=size_of_relative_string( &info->name );
3380 size+=size_of_uint32( &info->width );
3381 size+=size_of_uint32( &info->length );
3382 size+=size_of_uint32( &info->left );
3383 size+=size_of_uint32( &info->top );
3384 size+=size_of_uint32( &info->right );
3385 size+=size_of_uint32( &info->bottom );
3390 /*******************************************************************
3391 return the size required by a struct in the stream
3392 ********************************************************************/
3394 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3398 size+=size_of_relative_string( &info->port_name );
3403 /*******************************************************************
3404 return the size required by a struct in the stream
3405 ********************************************************************/
3407 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3411 size=str_len_uni(&info->name); /* the string length */
3412 size=size+1; /* add the leading zero */
3413 size=size*2; /* convert in char */
3418 /*******************************************************************
3419 return the size required by a struct in the stream
3420 ********************************************************************/
3422 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3426 size=str_len_uni(&info->name); /* the string length */
3427 size=size+1; /* add the leading zero */
3428 size=size*2; /* convert in char */
3433 /*******************************************************************
3434 return the size required by a struct in the stream
3435 ********************************************************************/
3437 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3441 size+=size_of_relative_string( &info->port_name );
3442 size+=size_of_relative_string( &info->monitor_name );
3443 size+=size_of_relative_string( &info->description );
3445 size+=size_of_uint32( &info->port_type );
3446 size+=size_of_uint32( &info->reserved );
3451 /*******************************************************************
3452 return the size required by a struct in the stream
3453 ********************************************************************/
3455 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3458 size+=size_of_relative_string( &info->name );
3463 /*******************************************************************
3464 return the size required by a struct in the stream
3465 ********************************************************************/
3467 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3470 size+=size_of_relative_string( &info->name );
3475 /*******************************************************************
3476 return the size required by a struct in the stream
3477 ********************************************************************/
3478 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3485 /* uint32(offset) + uint32(length) + length) */
3486 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3487 size += (size_of_uint32(&p->data_len)*2) + p->data_len;
3489 size += size_of_uint32(&p->type);
3494 /*******************************************************************
3495 return the size required by a struct in the stream
3496 ********************************************************************/
3498 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3501 size+=size_of_relative_string( &info->name );
3506 /*******************************************************************
3507 return the size required by a struct in the stream
3508 ********************************************************************/
3510 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3513 size+=size_of_relative_string( &info->name);
3514 size+=size_of_relative_string( &info->environment);
3515 size+=size_of_relative_string( &info->dll_name);
3520 /*******************************************************************
3522 ********************************************************************/
3524 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3525 const POLICY_HND *hnd,
3526 const fstring architecture,
3527 uint32 level, uint32 clientmajor, uint32 clientminor,
3528 NEW_BUFFER *buffer, uint32 offered)
3533 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3535 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3538 q_u->clientmajorversion=clientmajor;
3539 q_u->clientminorversion=clientminor;
3542 q_u->offered=offered;
3547 /*******************************************************************
3549 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3550 ********************************************************************/
3552 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3554 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3560 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3562 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3564 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3569 if(!prs_uint32("level", ps, depth, &q_u->level))
3572 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3578 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3581 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3583 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3589 /*******************************************************************
3591 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3592 ********************************************************************/
3594 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3596 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3602 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3607 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3609 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3611 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3613 if (!prs_werror("status", ps, depth, &r_u->status))
3619 /*******************************************************************
3621 ********************************************************************/
3623 BOOL make_spoolss_q_enumprinters(
3624 SPOOL_Q_ENUMPRINTERS *q_u,
3634 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3635 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3639 q_u->offered=offered;
3644 /*******************************************************************
3646 ********************************************************************/
3648 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3649 fstring servername, uint32 level,
3650 NEW_BUFFER *buffer, uint32 offered)
3652 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3653 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3657 q_u->offered=offered;
3662 /*******************************************************************
3664 * called from spoolss_enumprinters (srv_spoolss.c)
3665 ********************************************************************/
3667 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3669 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3675 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3677 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3680 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3685 if (!prs_uint32("level", ps, depth, &q_u->level))
3688 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3693 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3699 /*******************************************************************
3700 Parse a SPOOL_R_ENUMPRINTERS structure.
3701 ********************************************************************/
3703 BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3705 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3711 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3717 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3720 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3723 if (!prs_werror("status", ps, depth, &r_u->status))
3729 /*******************************************************************
3730 * write a structure.
3731 * called from spoolss_r_enum_printers (srv_spoolss.c)
3733 ********************************************************************/
3735 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3737 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3743 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3749 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3752 if (!prs_werror("status", ps, depth, &r_u->status))
3758 /*******************************************************************
3760 * called from spoolss_getprinter (srv_spoolss.c)
3761 ********************************************************************/
3763 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3765 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3771 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3773 if (!prs_uint32("level", ps, depth, &q_u->level))
3776 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3781 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3787 /*******************************************************************
3789 ********************************************************************/
3791 BOOL make_spoolss_q_getprinter(
3792 TALLOC_CTX *mem_ctx,
3793 SPOOL_Q_GETPRINTER *q_u,
3794 const POLICY_HND *hnd,
3804 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3808 q_u->offered=offered;
3813 /*******************************************************************
3815 ********************************************************************/
3816 BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
3817 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
3821 DEVICEMODE *devmode;
3826 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3829 q_u->info.level = level;
3830 q_u->info.info_ptr = (info != NULL) ? 1 : 0;
3833 /* There's no such thing as a setprinter level 1 */
3836 secdesc = info->printers_2->secdesc;
3837 devmode = info->printers_2->devmode;
3839 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3840 #if 1 /* JERRY TEST */
3841 q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
3842 if (!q_u->secdesc_ctr)
3844 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
3845 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3846 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3847 q_u->secdesc_ctr->sec = secdesc;
3849 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3850 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
3851 q_u->devmode_ctr.devmode = devmode;
3853 q_u->secdesc_ctr = NULL;
3855 q_u->devmode_ctr.devmode_ptr = 0;
3856 q_u->devmode_ctr.size = 0;
3857 q_u->devmode_ctr.devmode = NULL;
3861 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3866 q_u->command = command;
3872 /*******************************************************************
3873 ********************************************************************/
3875 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3877 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3883 if(!prs_werror("status", ps, depth, &r_u->status))
3889 /*******************************************************************
3890 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3891 ********************************************************************/
3893 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3895 uint32 ptr_sec_desc = 0;
3897 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3903 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3905 if(!prs_uint32("level", ps, depth, &q_u->level))
3908 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3911 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3921 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3926 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3932 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3937 /* Parse a NULL security descriptor. This should really
3938 happen inside the sec_io_desc_buf() function. */
3940 prs_debug(ps, depth, "", "sec_io_desc_buf");
3941 if (!prs_uint32("size", ps, depth + 1, &dummy))
3943 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
3947 if(!prs_uint32("command", ps, depth, &q_u->command))
3953 /*******************************************************************
3954 ********************************************************************/
3956 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3958 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3964 if(!prs_werror("status", ps, depth, &r_u->status))
3970 /*******************************************************************
3971 ********************************************************************/
3973 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3976 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3982 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3989 /*******************************************************************
3990 ********************************************************************/
3992 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3994 prs_debug(ps, depth, desc, "");
4000 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4006 if(!prs_uint32("needed", ps, depth, &r_u->needed))
4009 if(!prs_werror("status", ps, depth, &r_u->status))
4015 /*******************************************************************
4016 ********************************************************************/
4018 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
4020 prs_debug(ps, depth, desc, "");
4026 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
4028 if(!prs_uint32("level", ps, depth, &q_u->level))
4031 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4037 if(!prs_uint32("offered", ps, depth, &q_u->offered))
4043 /*******************************************************************
4044 ********************************************************************/
4046 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
4048 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
4054 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4060 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4063 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4066 if (!prs_werror("status", ps, depth, &r_u->status))
4072 /*******************************************************************
4073 ********************************************************************/
4075 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
4086 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4087 q_u->firstjob = firstjob;
4088 q_u->numofjobs = numofjobs;
4090 q_u->buffer= buffer;
4091 q_u->offered = offered;
4095 /*******************************************************************
4096 ********************************************************************/
4098 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
4100 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
4106 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
4109 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
4111 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
4113 if (!prs_uint32("level", ps, depth, &q_u->level))
4116 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4122 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4128 /*******************************************************************
4129 ********************************************************************/
4131 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
4133 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
4139 if(!prs_werror("status", ps, depth, &r_u->status))
4145 /*******************************************************************
4146 ********************************************************************/
4148 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
4150 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
4156 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4158 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4164 /*******************************************************************
4165 ********************************************************************/
4167 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
4169 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
4175 if(!prs_werror("status", ps, depth, &r_u->status))
4181 /*******************************************************************
4182 ********************************************************************/
4184 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
4186 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
4192 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4194 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4197 * level is usually 0. If (level!=0) then I'm in trouble !
4198 * I will try to generate setjob command with level!=0, one day.
4200 if(!prs_uint32("level", ps, depth, &q_u->level))
4202 if(!prs_uint32("command", ps, depth, &q_u->command))
4208 /*******************************************************************
4209 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4210 ********************************************************************/
4212 BOOL spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
4214 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
4220 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4226 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4229 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4232 if (!prs_werror("status", ps, depth, &r_u->status))
4238 /*******************************************************************
4240 ********************************************************************/
4242 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4244 const char *environment,
4246 NEW_BUFFER *buffer, uint32 offered)
4248 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4249 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4253 q_u->offered=offered;
4258 /*******************************************************************
4259 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4260 ********************************************************************/
4262 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4265 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4271 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4273 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4278 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4280 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4285 if (!prs_uint32("level", ps, depth, &q_u->level))
4288 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4294 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4300 /*******************************************************************
4301 ********************************************************************/
4303 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4306 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4311 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4313 if (!prs_uint32("level", ps, depth, &q_u->level))
4316 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4321 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4327 /*******************************************************************
4328 ********************************************************************/
4330 BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4332 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4338 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4344 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4347 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4350 if (!prs_werror("status", ps, depth, &r_u->status))
4356 /*******************************************************************
4357 ********************************************************************/
4359 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4362 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4367 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4369 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4375 if (!prs_uint32("level", ps, depth, &q_u->level))
4378 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4383 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4389 /*******************************************************************
4390 ********************************************************************/
4392 BOOL spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4394 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4400 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4406 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4409 if (!prs_werror("status", ps, depth, &r_u->status))
4415 /*******************************************************************
4416 Parse a SPOOL_R_ENUMPORTS structure.
4417 ********************************************************************/
4419 BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4421 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4427 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4433 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4436 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4439 if (!prs_werror("status", ps, depth, &r_u->status))
4445 /*******************************************************************
4446 ********************************************************************/
4448 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4450 prs_debug(ps, depth, desc, "");
4456 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4458 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4463 if (!prs_uint32("level", ps, depth, &q_u->level))
4466 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4471 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4477 /*******************************************************************
4478 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4479 ********************************************************************/
4481 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4483 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4489 if(!prs_uint32("flags", ps, depth, &il->flags))
4491 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4493 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4495 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4498 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4500 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4502 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4508 /*******************************************************************
4509 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4510 ********************************************************************/
4512 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4514 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4520 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4526 /*******************************************************************
4527 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4528 ********************************************************************/
4530 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4532 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4538 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4540 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4542 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4544 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4547 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4549 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4551 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4553 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4555 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4557 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4559 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4561 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4563 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4566 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4568 if(!prs_uint32("priority", ps, depth, &il->priority))
4570 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4572 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4574 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4576 if(!prs_uint32("status", ps, depth, &il->status))
4578 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4580 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4583 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4585 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4587 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4589 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4591 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4593 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4595 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4597 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4599 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4601 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4603 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4609 /*******************************************************************
4610 ********************************************************************/
4612 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4614 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4619 if(!prs_uint32("level", ps, depth, &il->level))
4621 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4624 /* if no struct inside just return */
4625 if (il->info_ptr==0) {
4626 if (UNMARSHALLING(ps)) {
4633 switch (il->level) {
4635 * level 0 is used by setprinter when managing the queue
4636 * (hold, stop, start a queue)
4640 /* DOCUMENT ME!!! What is level 1 used for? */
4643 if (UNMARSHALLING(ps)) {
4644 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4647 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4652 * level 2 is used by addprinter
4653 * and by setprinter when updating printer's info
4656 if (UNMARSHALLING(ps)) {
4657 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4660 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4663 /* DOCUMENT ME!!! What is level 3 used for? */
4666 if (UNMARSHALLING(ps)) {
4667 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4670 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4679 /*******************************************************************
4680 ********************************************************************/
4682 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4684 uint32 ptr_sec_desc = 0;
4686 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4691 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4693 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4699 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4702 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4705 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4711 switch (q_u->level) {
4713 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4716 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4720 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4725 /* Parse a NULL security descriptor. This should really
4726 happen inside the sec_io_desc_buf() function. */
4728 prs_debug(ps, depth, "", "sec_io_desc_buf");
4729 if (!prs_uint32("size", ps, depth + 1, &dummy))
4731 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
4735 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4737 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4743 /*******************************************************************
4744 ********************************************************************/
4746 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4747 prs_struct *ps, int depth)
4749 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4752 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4755 if(!prs_werror("status", ps, depth, &r_u->status))
4761 /*******************************************************************
4762 ********************************************************************/
4764 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4765 prs_struct *ps, int depth)
4767 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4769 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4773 if (UNMARSHALLING(ps)) {
4774 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4786 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4788 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4790 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4792 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4794 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4796 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4798 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4800 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4802 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4804 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4806 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4812 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4814 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4816 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4818 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4820 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4822 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4824 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4826 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4832 if (il->dependentfiles_ptr)
4833 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4838 /*******************************************************************
4839 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4840 ********************************************************************/
4842 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4843 prs_struct *ps, int depth)
4845 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4847 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4851 if (UNMARSHALLING(ps)) {
4852 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
4865 /* parse the main elements the packet */
4867 if(!prs_uint32("version", ps, depth, &il->version))
4870 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4873 * If name_ptr is NULL then the next 4 bytes are the name_ptr. A driver
4874 * with a NULL name just isn't a driver For example: "HP LaserJet 4si"
4875 * from W2K CDROM (which uses unidriver). JohnR 010205
4877 if (!il->name_ptr) {
4878 DEBUG(5,("spool_io_printer_driver_info_level_6: name_ptr is NULL! Get next value\n"));
4879 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4883 if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr))
4885 if(!prs_uint32("driverpath_ptr", ps, depth, &il->driverpath_ptr))
4887 if(!prs_uint32("datafile_ptr", ps, depth, &il->datafile_ptr))
4889 if(!prs_uint32("configfile_ptr", ps, depth, &il->configfile_ptr))
4891 if(!prs_uint32("helpfile_ptr", ps, depth, &il->helpfile_ptr))
4893 if(!prs_uint32("monitorname_ptr", ps, depth, &il->monitorname_ptr))
4895 if(!prs_uint32("defaultdatatype_ptr", ps, depth, &il->defaultdatatype_ptr))
4897 if(!prs_uint32("dependentfiles_len", ps, depth, &il->dependentfiles_len))
4899 if(!prs_uint32("dependentfiles_ptr", ps, depth, &il->dependentfiles_ptr))
4901 if(!prs_uint32("previousnames_len", ps, depth, &il->previousnames_len))
4903 if(!prs_uint32("previousnames_ptr", ps, depth, &il->previousnames_ptr))
4905 if(!smb_io_time("driverdate", &il->driverdate, ps, depth))
4907 if(!prs_uint32("dummy4", ps, depth, &il->dummy4))
4909 if(!prs_uint64("driverversion", ps, depth, &il->driverversion))
4911 if(!prs_uint32("mfgname_ptr", ps, depth, &il->mfgname_ptr))
4913 if(!prs_uint32("oemurl_ptr", ps, depth, &il->oemurl_ptr))
4915 if(!prs_uint32("hardwareid_ptr", ps, depth, &il->hardwareid_ptr))
4917 if(!prs_uint32("provider_ptr", ps, depth, &il->provider_ptr))
4920 /* parse the structures in the packet */
4922 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4927 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4932 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4937 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4942 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4947 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4952 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4957 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4961 if (il->dependentfiles_ptr) {
4962 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4967 if (il->previousnames_ptr) {
4968 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4973 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4977 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4981 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4985 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4991 /*******************************************************************
4992 convert a buffer of UNICODE strings null terminated
4993 the buffer is terminated by a NULL
4995 convert to an dos codepage array (null terminated)
4997 dynamically allocate memory
4999 ********************************************************************/
5000 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
5009 src = (char *)buf5->buffer;
5012 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
5013 rpcstr_pull(f, src, sizeof(f)-1, -1, 0);
5014 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
5015 tar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
5020 fstrcpy((*ar)[n], f);
5023 fstrcpy((*ar)[n], "");
5031 /*******************************************************************
5032 read a UNICODE array with null terminated strings
5033 and null terminated array
5034 and size of array at beginning
5035 ********************************************************************/
5037 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
5039 if (buffer==NULL) return False;
5042 buffer->uni_str_len=buffer->uni_max_len;
5044 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
5047 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
5053 /*******************************************************************
5054 ********************************************************************/
5056 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
5058 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
5063 if(!prs_uint32("level", ps, depth, &il->level))
5065 if(!prs_uint32("ptr", ps, depth, &il->ptr))
5071 switch (il->level) {
5073 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
5077 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
5087 /*******************************************************************
5088 init a SPOOL_Q_ADDPRINTERDRIVER struct
5089 ******************************************************************/
5091 BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
5092 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
5093 uint32 level, PRINTER_DRIVER_CTR *info)
5095 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
5097 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
5098 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
5102 q_u->info.level = level;
5103 q_u->info.ptr = (info!=NULL)?1:0;
5106 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
5108 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
5112 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
5119 BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
5120 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
5121 DRIVER_INFO_3 *info3)
5124 uint16 *ptr = info3->dependentfiles;
5126 BOOL null_char = False;
5127 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
5129 if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3))))
5132 inf->cversion = info3->version;
5133 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
5134 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
5135 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
5136 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
5137 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
5138 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
5139 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
5140 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
5142 init_unistr2_from_unistr(&inf->name, &info3->name);
5143 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
5144 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
5145 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
5146 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
5147 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
5148 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
5149 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
5156 /* the null_char BOOL is used to help locate
5157 two '\0's back to back */
5172 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
5173 inf->dependentfilessize = len;
5174 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
5180 *spool_drv_info = inf;
5185 /*******************************************************************
5186 make a BUFFER5 struct from a uint16*
5187 ******************************************************************/
5188 BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
5191 buf5->buf_len = len;
5192 if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
5194 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5201 /*******************************************************************
5202 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5203 ********************************************************************/
5205 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5207 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
5213 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5215 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5220 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5223 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5229 /*******************************************************************
5230 ********************************************************************/
5232 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5234 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
5237 if(!prs_werror("status", ps, depth, &q_u->status))
5243 /*******************************************************************
5244 ********************************************************************/
5246 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5247 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5249 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5251 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5255 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
5263 d->cversion=uni->cversion;
5265 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5266 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5267 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5268 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5269 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5270 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5271 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5272 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5274 DEBUGADD(8,( "version: %d\n", d->cversion));
5275 DEBUGADD(8,( "name: %s\n", d->name));
5276 DEBUGADD(8,( "environment: %s\n", d->environment));
5277 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5278 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5279 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5280 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5281 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5282 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5284 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5291 /*******************************************************************
5292 ********************************************************************/
5293 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5294 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5296 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5298 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5302 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
5310 d->version=uni->version;
5312 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5313 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5314 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5315 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5316 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5317 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5318 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5319 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5321 DEBUGADD(8,( "version: %d\n", d->version));
5322 DEBUGADD(8,( "name: %s\n", d->name));
5323 DEBUGADD(8,( "environment: %s\n", d->environment));
5324 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5325 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5326 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5327 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5328 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5329 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5331 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5333 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5343 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5344 NT_PRINTER_INFO_LEVEL_2 **asc)
5346 NT_PRINTER_INFO_LEVEL_2 *d;
5349 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5350 time_unix=time(NULL);
5353 DEBUGADD(8,("allocating memory\n"));
5355 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
5360 /* we allocate memory iff called from
5361 * addprinter(ex) so we can do one time stuff here.
5363 (*asc)->setuptime=time_unix;
5366 DEBUGADD(8,("start converting\n"));
5370 d->attributes=uni->attributes;
5371 d->priority=uni->priority;
5372 d->default_priority=uni->default_priority;
5373 d->starttime=uni->starttime;
5374 d->untiltime=uni->untiltime;
5375 d->status=uni->status;
5376 d->cjobs=uni->cjobs;
5378 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5379 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5380 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5381 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5382 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5383 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5384 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5385 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5386 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5387 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5388 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5393 /*******************************************************************
5395 ********************************************************************/
5397 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5398 fstring servername, fstring env_name, uint32 level,
5399 NEW_BUFFER *buffer, uint32 offered)
5401 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5402 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5406 q_u->offered=offered;
5411 /*******************************************************************
5412 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5413 ********************************************************************/
5415 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5417 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5422 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5424 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5430 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5432 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5438 if(!prs_uint32("level", ps, depth, &q_u->level))
5441 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5447 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5453 /*******************************************************************
5454 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5455 ********************************************************************/
5457 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5459 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5465 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5471 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5474 if (!prs_werror("status", ps, depth, &r_u->status))
5480 /*******************************************************************
5481 ********************************************************************/
5483 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5485 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5491 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5497 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5500 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5503 if (!prs_werror("status", ps, depth, &r_u->status))
5509 /*******************************************************************
5510 ********************************************************************/
5512 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5514 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5520 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5522 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5528 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5530 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5536 if (!prs_uint32("level", ps, depth, &q_u->level))
5539 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5545 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5551 /*******************************************************************
5552 ********************************************************************/
5554 BOOL spoolss_io_q_addprintprocessor(char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5556 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5562 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5564 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5569 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5574 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5579 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5585 /*******************************************************************
5586 ********************************************************************/
5588 BOOL spoolss_io_r_addprintprocessor(char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5590 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5596 if (!prs_werror("status", ps, depth, &r_u->status))
5602 /*******************************************************************
5603 ********************************************************************/
5605 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5607 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5613 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5619 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5622 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5625 if (!prs_werror("status", ps, depth, &r_u->status))
5631 /*******************************************************************
5632 ********************************************************************/
5634 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5636 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5642 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5644 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5650 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5652 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5658 if (!prs_uint32("level", ps, depth, &q_u->level))
5661 if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
5667 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5673 /*******************************************************************
5674 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5675 ********************************************************************/
5677 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5679 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5685 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5687 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5693 if (!prs_uint32("level", ps, depth, &q_u->level))
5696 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5702 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5708 /*******************************************************************
5709 ********************************************************************/
5711 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5713 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5719 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5725 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5728 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5731 if (!prs_werror("status", ps, depth, &r_u->status))
5737 /*******************************************************************
5738 ********************************************************************/
5740 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5742 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5747 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5750 if (UNMARSHALLING(ps) && r_u->valuesize) {
5752 r_u->value = (uint16 *)prs_alloc_mem(ps, r_u->valuesize * 2);
5755 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata value\n"));
5760 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5766 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5769 if(!prs_uint32("type", ps, depth, &r_u->type))
5772 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5775 if (UNMARSHALLING(ps) && r_u->datasize) {
5777 r_u->data = (uint8 *)prs_alloc_mem(ps, r_u->datasize);
5780 DEBUG(0, ("spoolss_io_r_enumprinterdata: out of memory for printerdata data\n"));
5785 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5790 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5792 if(!prs_werror("status", ps, depth, &r_u->status))
5798 /*******************************************************************
5799 ********************************************************************/
5801 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5803 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5808 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5810 if(!prs_uint32("index", ps, depth, &q_u->index))
5812 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5814 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5820 /*******************************************************************
5821 ********************************************************************/
5823 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5824 const POLICY_HND *hnd,
5825 uint32 idx, uint32 valuelen, uint32 datalen)
5827 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5829 q_u->valuesize=valuelen;
5830 q_u->datasize=datalen;
5835 /*******************************************************************
5836 ********************************************************************/
5837 BOOL make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, const POLICY_HND *hnd,
5838 char* value, char* data, uint32 data_size)
5840 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5842 init_unistr2(&q_u->value, value, strlen(value)+1);
5844 q_u->max_len = q_u->real_len = data_size;
5849 /*******************************************************************
5850 ********************************************************************/
5852 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5854 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5859 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5861 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5867 if(!prs_uint32("type", ps, depth, &q_u->type))
5870 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5880 if (UNMARSHALLING(ps))
5881 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
5882 if(q_u->data == NULL)
5884 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5892 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5898 /*******************************************************************
5899 ********************************************************************/
5901 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5903 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5908 if(!prs_werror("status", ps, depth, &r_u->status))
5914 /*******************************************************************
5915 ********************************************************************/
5916 BOOL spoolss_io_q_resetprinter(char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
5918 prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
5923 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5926 if (!prs_uint32("datatype_ptr", ps, depth, &q_u->datatype_ptr))
5929 if (q_u->datatype_ptr) {
5930 if (!smb_io_unistr2("datatype", &q_u->datatype, q_u->datatype_ptr?True:False, ps, depth))
5934 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
5941 /*******************************************************************
5942 ********************************************************************/
5943 BOOL spoolss_io_r_resetprinter(char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
5945 prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
5950 if(!prs_werror("status", ps, depth, &r_u->status))
5956 /*******************************************************************
5957 ********************************************************************/
5958 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
5959 uint32 type, const uint8 *data, uint32 len)
5961 DEBUG(5,("converting a specific param struct\n"));
5965 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
5968 memset((char *)*param, '\0', sizeof(NT_PRINTER_PARAM));
5969 DEBUGADD(6,("Allocated a new PARAM struct\n"));
5971 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
5972 (*param)->type = type;
5974 /* le champ data n'est pas NULL termine */
5975 /* on stocke donc la longueur */
5977 (*param)->data_len=len;
5980 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
5981 if((*param)->data == NULL)
5983 memcpy((*param)->data, data, len);
5986 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
5987 dump_data(10, (char *)(*param)->data, (*param)->data_len);
5992 /*******************************************************************
5993 ********************************************************************/
5995 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5997 prs_debug(ps, depth, desc, "spoolss_io_addform");
6004 if(!prs_uint32("flags", ps, depth, &f->flags))
6006 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
6008 if(!prs_uint32("size_x", ps, depth, &f->size_x))
6010 if(!prs_uint32("size_y", ps, depth, &f->size_y))
6012 if(!prs_uint32("left", ps, depth, &f->left))
6014 if(!prs_uint32("top", ps, depth, &f->top))
6016 if(!prs_uint32("right", ps, depth, &f->right))
6018 if(!prs_uint32("bottom", ps, depth, &f->bottom))
6021 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
6028 /*******************************************************************
6029 ********************************************************************/
6031 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
6033 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
6038 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6040 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
6046 /*******************************************************************
6047 ********************************************************************/
6049 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
6051 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
6056 if(!prs_werror("status", ps, depth, &r_u->status))
6062 /*******************************************************************
6063 ********************************************************************/
6065 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
6067 uint32 useless_ptr=1;
6068 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
6073 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6075 if(!prs_uint32("level", ps, depth, &q_u->level))
6077 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6082 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6084 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6091 /*******************************************************************
6092 ********************************************************************/
6094 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
6096 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
6101 if(!prs_werror("status", ps, depth, &r_u->status))
6107 /*******************************************************************
6108 ********************************************************************/
6110 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
6112 uint32 useless_ptr=1;
6113 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
6118 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6120 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
6126 if(!prs_uint32("level", ps, depth, &q_u->level))
6128 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6133 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6135 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6142 /*******************************************************************
6143 ********************************************************************/
6145 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
6147 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
6152 if(!prs_werror("status", ps, depth, &r_u->status))
6158 /*******************************************************************
6159 Parse a SPOOL_R_GETJOB structure.
6160 ********************************************************************/
6162 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
6164 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
6170 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
6176 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6179 if (!prs_werror("status", ps, depth, &r_u->status))
6185 /*******************************************************************
6186 Parse a SPOOL_Q_GETJOB structure.
6187 ********************************************************************/
6189 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
6191 prs_debug(ps, depth, desc, "");
6197 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6199 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
6201 if(!prs_uint32("level", ps, depth, &q_u->level))
6204 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
6210 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6216 void free_devmode(DEVICEMODE *devmode)
6218 if (devmode!=NULL) {
6219 SAFE_FREE(devmode->private);
6224 void free_printer_info_1(PRINTER_INFO_1 *printer)
6229 void free_printer_info_2(PRINTER_INFO_2 *printer)
6231 if (printer!=NULL) {
6232 free_devmode(printer->devmode);
6233 printer->devmode = NULL;
6238 void free_printer_info_3(PRINTER_INFO_3 *printer)
6243 void free_printer_info_4(PRINTER_INFO_4 *printer)
6248 void free_printer_info_5(PRINTER_INFO_5 *printer)
6253 void free_job_info_2(JOB_INFO_2 *job)
6256 free_devmode(job->devmode);
6259 /*******************************************************************
6261 ********************************************************************/
6263 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
6264 const fstring string, uint32 printer, uint32 type)
6269 init_unistr2(&q_u->string, string, strlen(string)+1);
6271 q_u->printer=printer;
6280 /*******************************************************************
6281 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6282 ********************************************************************/
6284 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
6286 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
6292 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
6298 if(!prs_uint32("printer", ps, depth, &q_u->printer))
6300 if(!prs_uint32("type", ps, depth, &q_u->type))
6303 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6305 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6311 /*******************************************************************
6312 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6313 ********************************************************************/
6315 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
6317 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
6323 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6326 if (!prs_werror("status", ps, depth, &r_u->status))
6332 /*******************************************************************
6334 ********************************************************************/
6335 BOOL make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd,
6336 uint32 condition, uint32 change_id)
6339 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6341 q_u->condition = condition;
6342 q_u->change_id = change_id;
6345 q_u->unknown1 = 0x1;
6346 memset(q_u->unknown2, 0x0, 5);
6347 q_u->unknown2[0] = 0x1;
6352 /*******************************************************************
6353 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6354 ********************************************************************/
6355 BOOL spoolss_io_q_routerreplyprinter (char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
6358 prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
6364 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6367 if (!prs_uint32("condition", ps, depth, &q_u->condition))
6370 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6373 if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
6376 if (!prs_uint8s(False, "private", ps, depth, q_u->unknown2, 5))
6382 /*******************************************************************
6383 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6384 ********************************************************************/
6385 BOOL spoolss_io_r_routerreplyprinter (char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
6387 prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
6393 if (!prs_werror("status", ps, depth, &r_u->status))
6399 /*******************************************************************
6401 ********************************************************************/
6403 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6408 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6413 /*******************************************************************
6414 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6415 ********************************************************************/
6417 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6419 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6425 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6431 /*******************************************************************
6432 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6433 ********************************************************************/
6435 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6437 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6443 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6446 if (!prs_werror("status", ps, depth, &r_u->status))
6452 #if 0 /* JERRY - not currently used but could be :-) */
6454 /*******************************************************************
6455 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6456 ******************************************************************/
6457 static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
6458 SPOOL_NOTIFY_INFO_DATA *src, int n)
6462 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
6464 for (i=0; i<n; i++) {
6468 if (src->size != POINTER)
6470 len = src->notify_data.data.length;
6471 s = malloc(sizeof(uint16)*len);
6473 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6477 memcpy(s, src->notify_data.data.string, len*2);
6478 dst->notify_data.data.string = s;
6484 /*******************************************************************
6485 Deep copy a SPOOL_NOTIFY_INFO structure
6486 ******************************************************************/
6487 static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
6490 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6494 dst->version = src->version;
6495 dst->flags = src->flags;
6496 dst->count = src->count;
6500 dst->data = malloc(dst->count * sizeof(SPOOL_NOTIFY_INFO_DATA));
6502 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6505 if (dst->data == NULL) {
6506 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6511 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
6518 /*******************************************************************
6520 ********************************************************************/
6522 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6523 uint32 change_low, uint32 change_high,
6524 SPOOL_NOTIFY_INFO *info)
6529 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6531 q_u->change_low=change_low;
6532 q_u->change_high=change_high;
6537 q_u->info_ptr=0xaddee11e;
6539 q_u->info.version=2;
6542 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6544 q_u->info.version = info->version;
6545 q_u->info.flags = info->flags;
6546 q_u->info.count = info->count;
6547 /* pointer field - be careful! */
6548 q_u->info.data = info->data;
6551 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6558 /*******************************************************************
6559 Parse a SPOOL_Q_REPLY_RRPCN structure.
6560 ********************************************************************/
6562 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6564 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6570 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6573 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6576 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6579 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6582 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6585 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6588 if(q_u->info_ptr!=0)
6589 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6595 /*******************************************************************
6596 Parse a SPOOL_R_REPLY_RRPCN structure.
6597 ********************************************************************/
6599 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6601 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
6607 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6610 if (!prs_werror("status", ps, depth, &r_u->status))
6616 /*******************************************************************
6618 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6619 ********************************************************************/
6621 BOOL spoolss_io_q_getprinterdataex(char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6626 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6631 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6635 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6639 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6643 if (!prs_uint32("size", ps, depth, &q_u->size))
6649 /*******************************************************************
6650 * write a structure.
6651 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6652 ********************************************************************/
6654 BOOL spoolss_io_r_getprinterdataex(char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6659 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6664 if (!prs_uint32("type", ps, depth, &r_u->type))
6666 if (!prs_uint32("size", ps, depth, &r_u->size))
6669 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6675 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6677 if (!prs_werror("status", ps, depth, &r_u->status))
6683 /*******************************************************************
6685 ********************************************************************/
6687 BOOL spoolss_io_q_setprinterdataex(char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6689 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6694 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6696 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6702 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6708 if(!prs_uint32("type", ps, depth, &q_u->type))
6711 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6721 if (UNMARSHALLING(ps))
6722 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
6723 if(q_u->data == NULL)
6725 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6733 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6739 /*******************************************************************
6740 * write a structure.
6741 ********************************************************************/
6743 BOOL spoolss_io_r_setprinterdataex(char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6745 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6750 if(!prs_werror("status", ps, depth, &r_u->status))
6757 /*******************************************************************
6759 ********************************************************************/
6761 BOOL spoolss_io_q_enumprinterkey(char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6763 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
6768 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6771 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6777 if(!prs_uint32("size", ps, depth, &q_u->size))
6783 /*******************************************************************
6784 * write a structure.
6785 ********************************************************************/
6787 BOOL spoolss_io_r_enumprinterkey(char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
6789 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
6795 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
6801 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6804 if(!prs_werror("status", ps, depth, &r_u->status))
6811 /*******************************************************************
6813 ********************************************************************/
6815 BOOL spoolss_io_q_enumprinterdataex(char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6817 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
6822 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6825 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6831 if(!prs_uint32("size", ps, depth, &q_u->size))
6837 /*******************************************************************
6838 ********************************************************************/
6839 static BOOL spoolss_io_printer_enum_values_ctr(char *desc, prs_struct *ps,
6840 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
6843 uint32 valuename_offset,
6846 const uint32 basic_unit = 20; /* size of static portion of enum_values */
6848 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
6851 if (!prs_uint32("size", ps, depth, &ctr->size))
6854 /* offset data begins at 20 bytes per structure * size_of_array.
6855 Don't forget the uint32 at the beginning */
6857 current_offset = basic_unit * ctr->size_of_array;
6859 /* first loop to write basic enum_value information */
6861 for (i=0; i<ctr->size_of_array; i++)
6863 valuename_offset = current_offset;
6864 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
6867 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
6870 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
6873 data_offset = ctr->values[i].value_len + valuename_offset;
6874 if (!prs_uint32("data_offset", ps, depth, &data_offset))
6877 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
6880 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
6883 /* loop #2 for writing the dynamically size objects
6884 while viewing conversations between Win2k -> Win2k,
6885 4-byte alignment does not seem to matter here --jerry */
6887 for (i=0; i<ctr->size_of_array; i++)
6890 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
6893 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
6903 /*******************************************************************
6904 * write a structure.
6905 ********************************************************************/
6907 BOOL spoolss_io_r_enumprinterdataex(char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6909 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
6915 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
6921 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6924 if(!prs_uint32("returned", ps, depth, &r_u->returned))
6927 if(!prs_werror("status", ps, depth, &r_u->status))
6934 /*******************************************************************
6935 * write a structure.
6936 ********************************************************************/
6939 uint32 GetPrintProcessorDirectory(
6941 [in] unistr2 *environment,
6943 [in,out] NEW_BUFFER buffer,
6944 [in] uint32 offered,
6945 [out] uint32 needed,
6946 [out] uint32 returned
6951 BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, NEW_BUFFER *buffer, uint32 offered)
6953 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
6955 init_unistr2(&q_u->name, name, strlen(name)+1);
6956 init_unistr2(&q_u->environment, environment, strlen(environment)+1);
6960 q_u->buffer = buffer;
6961 q_u->offered = offered;
6966 BOOL spoolss_io_q_getprintprocessordirectory(char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
6970 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
6976 if (!prs_uint32("ptr", ps, depth, &ptr))
6980 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
6987 if (!prs_uint32("ptr", ps, depth, &ptr))
6991 if(!smb_io_unistr2("environment", &q_u->environment, True,
6999 if(!prs_uint32("level", ps, depth, &q_u->level))
7002 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
7008 if(!prs_uint32("offered", ps, depth, &q_u->offered))
7014 /*******************************************************************
7015 * write a structure.
7016 ********************************************************************/
7018 BOOL spoolss_io_r_getprintprocessordirectory(char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
7020 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
7026 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
7032 if(!prs_uint32("needed", ps, depth, &r_u->needed))
7035 if(!prs_werror("status", ps, depth, &r_u->status))
7041 BOOL smb_io_printprocessordirectory_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
7043 prs_struct *ps=&buffer->prs;
7045 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
7048 buffer->struct_start=prs_offset(ps);
7050 if (!smb_io_unistr(desc, &info->name, ps, depth))
7056 /*******************************************************************
7058 ********************************************************************/
7060 BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
7061 int level, FORM *form)
7063 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7065 q_u->level2 = level;
7066 memcpy(&q_u->form, form, sizeof(FORM));
7071 /*******************************************************************
7073 ********************************************************************/
7075 BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
7076 int level, char *form_name, FORM *form)
7078 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7080 q_u->level2 = level;
7081 memcpy(&q_u->form, form, sizeof(FORM));
7082 init_unistr2(&q_u->name, form_name, strlen(form_name) + 1);
7087 /*******************************************************************
7089 ********************************************************************/
7091 BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, char *form)
7093 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7094 init_unistr2(&q_u->name, form, strlen(form) + 1);
7098 /*******************************************************************
7100 ********************************************************************/
7102 BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
7103 char *formname, uint32 level, NEW_BUFFER *buffer,
7106 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7108 init_unistr2(&q_u->formname, formname, strlen(formname) + 1);
7110 q_u->offered=offered;
7115 /*******************************************************************
7117 ********************************************************************/
7119 BOOL make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
7120 uint32 level, NEW_BUFFER *buffer,
7123 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7126 q_u->offered=offered;
7131 /*******************************************************************
7133 ********************************************************************/
7135 BOOL make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
7136 uint32 jobid, uint32 level, uint32 command)
7138 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7142 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7143 the server side code has it marked as unused. */
7145 q_u->command = command;
7150 /*******************************************************************
7152 ********************************************************************/
7154 BOOL make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
7155 uint32 jobid, uint32 level, NEW_BUFFER *buffer,
7158 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7161 q_u->buffer = buffer;
7162 q_u->offered = offered;
7167 /*******************************************************************
7169 ********************************************************************/
7171 BOOL make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u,
7174 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7179 /*******************************************************************
7181 ********************************************************************/
7183 BOOL make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u,
7186 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7191 /*******************************************************************
7193 ********************************************************************/
7195 BOOL make_spoolss_q_startdocprinter(SPOOL_Q_STARTDOCPRINTER *q_u,
7196 POLICY_HND *handle, uint32 level,
7197 char *docname, char *outputfile,
7200 DOC_INFO_CONTAINER *ctr = &q_u->doc_info_container;
7202 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7208 ctr->docinfo.switch_value = level;
7210 ctr->docinfo.doc_info_1.p_docname = docname ? 1 : 0;
7211 ctr->docinfo.doc_info_1.p_outputfile = outputfile ? 1 : 0;
7212 ctr->docinfo.doc_info_1.p_datatype = datatype ? 1 : 0;
7215 init_unistr2(&ctr->docinfo.doc_info_1.docname, docname,
7216 strlen(docname) + 1);
7219 init_unistr2(&ctr->docinfo.doc_info_1.outputfile, outputfile,
7220 strlen(outputfile) + 1);
7223 init_unistr2(&ctr->docinfo.doc_info_1.datatype, datatype,
7224 strlen(datatype) + 1);
7228 /* DOC_INFO_2 is only used by Windows 9x and since it
7229 doesn't do printing over RPC we don't have to worry
7232 DEBUG(3, ("unsupported info level %d\n", level));
7239 /*******************************************************************
7241 ********************************************************************/
7243 BOOL make_spoolss_q_enddocprinter(SPOOL_Q_ENDDOCPRINTER *q_u,
7246 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7251 /*******************************************************************
7253 ********************************************************************/
7255 BOOL make_spoolss_q_writeprinter(SPOOL_Q_WRITEPRINTER *q_u,
7256 POLICY_HND *handle, uint32 data_size,
7259 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7260 q_u->buffer_size = q_u->buffer_size2 = data_size;
7265 /*******************************************************************
7267 ********************************************************************/
7269 BOOL make_spoolss_q_deleteprinterdata(SPOOL_Q_DELETEPRINTERDATA *q_u,
7270 POLICY_HND *handle, char *valuename)
7272 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7273 init_unistr2(&q_u->valuename, valuename, strlen(valuename) + 1);