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.
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.
27 /*******************************************************************
28 return the length of a UNISTR string.
29 ********************************************************************/
31 static uint32 str_len_uni(UNISTR *source)
38 while (source->buffer[i])
44 /*******************************************************************
45 This should be moved in a more generic lib.
46 ********************************************************************/
48 static BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
50 if(!prs_uint16("year", ps, depth, &systime->year))
52 if(!prs_uint16("month", ps, depth, &systime->month))
54 if(!prs_uint16("dayofweek", ps, depth, &systime->dayofweek))
56 if(!prs_uint16("day", ps, depth, &systime->day))
58 if(!prs_uint16("hour", ps, depth, &systime->hour))
60 if(!prs_uint16("minute", ps, depth, &systime->minute))
62 if(!prs_uint16("second", ps, depth, &systime->second))
64 if(!prs_uint16("milliseconds", ps, depth, &systime->milliseconds))
70 /*******************************************************************
71 ********************************************************************/
73 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
75 systime->year=unixtime->tm_year+1900;
76 systime->month=unixtime->tm_mon+1;
77 systime->dayofweek=unixtime->tm_wday;
78 systime->day=unixtime->tm_mday;
79 systime->hour=unixtime->tm_hour;
80 systime->minute=unixtime->tm_min;
81 systime->second=unixtime->tm_sec;
82 systime->milliseconds=0;
87 /*******************************************************************
88 reads or writes an DOC_INFO structure.
89 ********************************************************************/
91 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
93 if (info_1 == NULL) return False;
95 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
101 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
103 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
105 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
108 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
110 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
112 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
118 /*******************************************************************
119 reads or writes an DOC_INFO structure.
120 ********************************************************************/
122 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
124 uint32 useless_ptr=0;
126 if (info == NULL) return False;
128 prs_debug(ps, depth, desc, "smb_io_doc_info");
134 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
137 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
140 switch (info->switch_value)
143 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
148 this is just a placeholder
150 MSDN July 1998 says doc_info_2 is only on
151 Windows 95, and as Win95 doesn't do RPC to print
152 this case is nearly impossible
154 Maybe one day with Windows for dishwasher 2037 ...
157 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
160 DEBUG(0,("Something is obviously wrong somewhere !\n"));
167 /*******************************************************************
168 reads or writes an DOC_INFO_CONTAINER structure.
169 ********************************************************************/
171 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
173 if (cont == NULL) return False;
175 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
181 if(!prs_uint32("level", ps, depth, &cont->level))
184 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
190 /*******************************************************************
191 reads or writes an NOTIFY OPTION TYPE structure.
192 ********************************************************************/
194 /* NOTIFY_OPTION_TYPE and NOTIFY_OPTION_TYPE_DATA are really one
195 structure. The _TYPE structure is really the deferred referrants (i.e
196 the notify fields array) of the _TYPE structure. -tpot */
198 static BOOL smb_io_notify_option_type(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
200 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
206 if(!prs_uint16("type", ps, depth, &type->type))
208 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
210 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
212 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
214 if(!prs_uint32("count", ps, depth, &type->count))
216 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
222 /*******************************************************************
223 reads or writes an NOTIFY OPTION TYPE DATA.
224 ********************************************************************/
226 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
230 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
233 /* if there are no fields just return */
234 if (type->fields_ptr==0)
240 if(!prs_uint32("count2", ps, depth, &type->count2))
243 if (type->count2 != type->count)
244 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
246 /* parse the option type data */
247 for(i=0;i<type->count2;i++)
248 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
253 /*******************************************************************
254 reads or writes an NOTIFY OPTION structure.
255 ********************************************************************/
257 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
261 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
264 if(!prs_uint32("count", ps, depth, &ctr->count))
268 if (UNMARSHALLING(ps))
269 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)prs_alloc_mem(ps,ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
272 /* the option type struct */
273 for(i=0;i<ctr->count;i++)
274 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
277 /* the type associated with the option type struct */
278 for(i=0;i<ctr->count;i++)
279 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
285 /*******************************************************************
286 reads or writes an NOTIFY OPTION structure.
287 ********************************************************************/
289 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
291 prs_debug(ps, depth, desc, "smb_io_notify_option");
294 if(!prs_uint32("version", ps, depth, &option->version))
296 if(!prs_uint32("flags", ps, depth, &option->flags))
298 if(!prs_uint32("count", ps, depth, &option->count))
300 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
303 /* marshalling or unmarshalling, that would work */
304 if (option->option_type_ptr!=0) {
305 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
309 option->ctr.type=NULL;
316 /*******************************************************************
317 reads or writes an NOTIFY INFO DATA structure.
318 ********************************************************************/
320 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
322 uint32 useless_ptr=0xADDE0FF0;
324 uint32 how_many_words;
328 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
331 how_many_words=data->size;
332 if (how_many_words==POINTER) {
333 how_many_words=TWO_VALUE;
336 isvalue=data->enc_type;
340 if(!prs_uint16("type", ps, depth, &data->type))
342 if(!prs_uint16("field", ps, depth, &data->field))
346 if(!prs_uint32("how many words", ps, depth, &how_many_words))
348 if(!prs_uint32("id", ps, depth, &data->id))
350 if(!prs_uint32("how many words", ps, depth, &how_many_words))
357 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
359 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
364 /* length in ascii including \0 */
365 x=2*(data->notify_data.data.length+1);
366 if(!prs_uint32("string length", ps, depth, &x ))
368 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
376 /*******************************************************************
377 reads or writes an NOTIFY INFO DATA structure.
378 ********************************************************************/
380 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
381 prs_struct *ps, int depth)
386 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
392 isvalue=data->enc_type;
394 if (isvalue==False) {
395 /* length of string in unicode include \0 */
396 x=data->notify_data.data.length+1;
397 if(!prs_uint32("string length", ps, depth, &x ))
399 if (MARSHALLING(ps)) {
400 /* These are already in little endian format. Don't byte swap. */
403 /* No memory allocated for this string
404 therefore following the data.string
405 pointer is a bad idea. Use a pointer to
406 the uint32 length union member to
407 provide a source for a unicode NULL */
409 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
412 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
417 /* Tallocate memory for string */
419 data->notify_data.data.string = (uint16 *)prs_alloc_mem(ps, x * 2);
420 if (!data->notify_data.data.string)
423 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
429 /* Win2k does not seem to put this parse align here */
438 /*******************************************************************
439 reads or writes an NOTIFY INFO structure.
440 ********************************************************************/
442 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
446 prs_debug(ps, depth, desc, "smb_io_notify_info");
452 if(!prs_uint32("count", ps, depth, &info->count))
454 if(!prs_uint32("version", ps, depth, &info->version))
456 if(!prs_uint32("flags", ps, depth, &info->flags))
458 if(!prs_uint32("count", ps, depth, &info->count))
461 for (i=0;i<info->count;i++) {
462 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
466 /* now do the strings at the end of the stream */
467 for (i=0;i<info->count;i++) {
468 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
475 /*******************************************************************
476 ********************************************************************/
478 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
480 prs_debug(ps, depth, desc, "");
484 if (UNMARSHALLING(ps))
489 if (!prs_uint32("size", ps, depth, &q_u->size))
491 if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
493 if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
495 if (!prs_uint32("build", ps, depth, &q_u->build))
497 if (!prs_uint32("major", ps, depth, &q_u->major))
499 if (!prs_uint32("minor", ps, depth, &q_u->minor))
501 if (!prs_uint32("processor", ps, depth, &q_u->processor))
504 if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
508 if (!smb_io_unistr2("", &q_u->user_name, q_u->user_name_ptr, ps, depth))
514 /*******************************************************************
515 ********************************************************************/
517 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
522 prs_debug(ps, depth, desc, "spool_io_user_level");
527 if (!prs_uint32("level", ps, depth, &q_u->level))
529 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
532 switch (q_u->level) {
534 if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
544 /*******************************************************************
545 * read or write a DEVICEMODE struct.
546 * on reading allocate memory for the private member
547 ********************************************************************/
549 #define DM_NUM_OPTIONAL_FIELDS 8
551 BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
553 uint32 available_space; /* size of the device mode left to parse */
554 /* only important on unmarshalling */
557 struct optional_fields {
560 } opt_fields[DM_NUM_OPTIONAL_FIELDS] = {
561 { "icmmethod", &devmode->icmmethod },
562 { "icmintent", &devmode->icmintent },
563 { "mediatype", &devmode->mediatype },
564 { "dithertype", &devmode->dithertype },
565 { "reserved1", &devmode->reserved1 },
566 { "reserved2", &devmode->reserved2 },
567 { "panningwidth", &devmode->panningwidth },
568 { "panningheight", &devmode->panningheight }
572 prs_debug(ps, depth, desc, "spoolss_io_devmode");
575 if (UNMARSHALLING(ps)) {
576 devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
577 if (devmode->devicename.buffer == NULL)
581 if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
584 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
587 /* Sanity Check - look for unknown specversions, but don't fail if we see one.
588 Let the size determine that */
590 switch (devmode->specversion) {
597 DEBUG(0,("spoolss_io_devmode: Unknown specversion in devicemode [0x%x]\n",
598 devmode->specversion));
599 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
604 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
606 if (!prs_uint16("size", ps, depth, &devmode->size))
608 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
610 if (!prs_uint32("fields", ps, depth, &devmode->fields))
612 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
614 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
616 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
618 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
620 if (!prs_uint16("scale", ps, depth, &devmode->scale))
622 if (!prs_uint16("copies", ps, depth, &devmode->copies))
624 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
626 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
628 if (!prs_uint16("color", ps, depth, &devmode->color))
630 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
632 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
634 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
636 if (!prs_uint16("collate", ps, depth, &devmode->collate))
639 if (UNMARSHALLING(ps)) {
640 devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
641 if (devmode->formname.buffer == NULL)
645 if (!prs_uint16uni(True, "formname", ps, depth, devmode->formname.buffer, 32))
647 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
649 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
651 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
653 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
655 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
657 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
660 * every device mode I've ever seen on the wire at least has up
661 * to the displayfrequency field. --jerry (05-09-2002)
664 /* add uint32's + uint16's + two UNICODE strings */
666 available_space = devmode->size - (sizeof(uint32)*6 + sizeof(uint16)*18 + sizeof(uint16)*64);
668 /* Sanity check - we only have uint32's left tp parse */
670 if ( available_space && ((available_space % 4) != 0) ) {
671 DEBUG(0,("spoolss_io_devmode: available_space [%d] no in multiple of 4 bytes (size = %d)!\n",
672 available_space, devmode->size));
673 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
678 * Conditional parsing. Assume that the DeviceMode has been
679 * zero'd by the caller.
682 while (available_space && (i<DM_NUM_OPTIONAL_FIELDS))
684 if (!prs_uint32(opt_fields[i].name, ps, depth, opt_fields[i].field))
686 available_space -= sizeof(uint32);
690 /* Sanity Check - we should no available space at this point unless
691 MS changes the device mode structure */
693 if (available_space) {
694 DEBUG(0,("spoolss_io_devmode: I've parsed all I know and there is still stuff left|\n"));
695 DEBUG(0,("spoolss_io_devmode: available_space = [%d], devmode_size = [%d]!\n",
696 available_space, devmode->size));
697 DEBUG(0,("spoolss_io_devmode: please report to samba-technical@samba.org!\n"));
703 if (devmode->driverextra!=0) {
704 if (UNMARSHALLING(ps)) {
705 devmode->private=(uint8 *)prs_alloc_mem(ps, devmode->driverextra*sizeof(uint8));
706 if(devmode->private == NULL)
708 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
711 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
712 if (!prs_uint8s(False, "private", ps, depth,
713 devmode->private, devmode->driverextra))
720 /*******************************************************************
721 Read or write a DEVICEMODE container
722 ********************************************************************/
724 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
729 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
735 if (!prs_uint32("size", ps, depth, &dm_c->size))
738 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
741 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
742 if (UNMARSHALLING(ps))
743 /* if while reading there is no DEVMODE ... */
748 /* so we have a DEVICEMODE to follow */
749 if (UNMARSHALLING(ps)) {
750 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
751 dm_c->devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE));
752 if(dm_c->devmode == NULL)
756 /* this is bad code, shouldn't be there */
757 if (!prs_uint32("size", ps, depth, &dm_c->size))
760 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
766 /*******************************************************************
767 ********************************************************************/
769 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
774 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
777 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
780 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
786 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
792 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
798 /*******************************************************************
800 ********************************************************************/
802 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
803 const fstring printername,
804 const fstring datatype,
805 uint32 access_required,
806 const fstring clientname,
807 const fstring user_name)
809 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
810 q_u->printername_ptr = (printername!=NULL)?1:0;
811 init_unistr2(&q_u->printername, printername, strlen(printername)+1);
813 q_u->printer_default.datatype_ptr = 0;
815 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
816 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
818 q_u->printer_default.devmode_cont.size=0;
819 q_u->printer_default.devmode_cont.devmode_ptr=0;
820 q_u->printer_default.devmode_cont.devmode=NULL;
821 q_u->printer_default.access_required=access_required;
823 q_u->user_ctr.level=1;
825 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
826 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
827 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
828 q_u->user_ctr.user1.build=1381;
829 q_u->user_ctr.user1.major=2;
830 q_u->user_ctr.user1.minor=0;
831 q_u->user_ctr.user1.processor=0;
832 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
833 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
838 /*******************************************************************
840 ********************************************************************/
842 BOOL make_spoolss_q_addprinterex(
844 SPOOL_Q_ADDPRINTEREX *q_u,
845 const char *srv_name,
846 const char* clientname,
847 const char* user_name,
849 PRINTER_INFO_CTR *ctr)
851 DEBUG(5,("make_spoolss_q_addprinterex\n"));
853 if (!ctr) return False;
857 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
858 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
862 q_u->info.level = level;
863 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
866 /* init q_u->info.info2 from *info */
867 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) {
868 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
878 q_u->user_ctr.level=1;
880 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
881 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
882 q_u->user_ctr.user1.build=1381;
883 q_u->user_ctr.user1.major=2;
884 q_u->user_ctr.user1.minor=0;
885 q_u->user_ctr.user1.processor=0;
886 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
887 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
888 q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
889 q_u->user_ctr.user1.client_name.uni_str_len + 2;
894 /*******************************************************************
895 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
896 *******************************************************************/
898 BOOL make_spoolss_printer_info_2(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
899 PRINTER_INFO_2 *info)
902 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
904 /* allocate the necessary memory */
905 if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2)))) {
906 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
910 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
911 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
912 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
913 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
914 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
915 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
916 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
917 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
918 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
919 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
920 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
921 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
922 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
923 inf->attributes = info->attributes;
924 inf->priority = info->priority;
925 inf->default_priority = info->defaultpriority;
926 inf->starttime = info->starttime;
927 inf->untiltime = info->untiltime;
928 inf->cjobs = info->cjobs;
929 inf->averageppm = info->averageppm;
930 init_unistr2_from_unistr(&inf->servername, &info->servername);
931 init_unistr2_from_unistr(&inf->printername, &info->printername);
932 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
933 init_unistr2_from_unistr(&inf->portname, &info->portname);
934 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
935 init_unistr2_from_unistr(&inf->comment, &info->comment);
936 init_unistr2_from_unistr(&inf->location, &info->location);
937 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
938 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
939 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
940 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
941 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
948 /*******************************************************************
950 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
951 ********************************************************************/
953 BOOL spoolss_io_q_open_printer(char *desc, SPOOL_Q_OPEN_PRINTER *q_u, prs_struct *ps, int depth)
958 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer");
964 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
966 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
972 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
978 /*******************************************************************
980 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
981 * called from spoolss_open_printer_ex (cli_spoolss.c)
982 ********************************************************************/
984 BOOL spoolss_io_r_open_printer(char *desc, SPOOL_R_OPEN_PRINTER *r_u, prs_struct *ps, int depth)
986 if (r_u == NULL) return False;
988 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer");
994 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
997 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1004 /*******************************************************************
1006 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
1007 ********************************************************************/
1009 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
1014 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
1020 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
1022 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
1028 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
1031 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
1033 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
1039 /*******************************************************************
1040 * write a structure.
1041 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
1042 * called from spoolss_open_printer_ex (cli_spoolss.c)
1043 ********************************************************************/
1045 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
1047 if (r_u == NULL) return False;
1049 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
1055 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
1058 if (!prs_werror("status code", ps, depth, &(r_u->status)))
1064 /*******************************************************************
1066 ********************************************************************/
1067 BOOL make_spoolss_q_deleteprinterdriver(
1068 TALLOC_CTX *mem_ctx,
1069 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
1075 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
1077 q_u->server_ptr = (server!=NULL)?1:0;
1079 /* these must be NULL terminated or else NT4 will
1080 complain about invalid parameters --jerry */
1081 init_unistr2(&q_u->server, server, strlen(server)+1);
1082 init_unistr2(&q_u->arch, arch, strlen(arch)+1);
1083 init_unistr2(&q_u->driver, driver, strlen(driver)+1);
1090 /*******************************************************************
1092 ********************************************************************/
1094 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
1095 const POLICY_HND *handle,
1096 UNISTR2 *valuename, uint32 size)
1098 if (q_u == NULL) return False;
1100 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
1102 q_u->handle = *handle;
1103 copy_unistr2(&q_u->valuename, valuename);
1109 /*******************************************************************
1111 * called from spoolss_q_getprinterdata (srv_spoolss.c)
1112 ********************************************************************/
1114 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
1119 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
1124 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1128 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1132 if (!prs_uint32("size", ps, depth, &q_u->size))
1138 /*******************************************************************
1140 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1141 ********************************************************************/
1143 BOOL spoolss_io_q_deleteprinterdata(char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1148 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1153 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1157 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1163 /*******************************************************************
1164 * write a structure.
1165 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1166 ********************************************************************/
1168 BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1170 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1172 if(!prs_werror("status", ps, depth, &r_u->status))
1178 /*******************************************************************
1179 * write a structure.
1180 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1181 ********************************************************************/
1183 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1188 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1193 if (!prs_uint32("type", ps, depth, &r_u->type))
1195 if (!prs_uint32("size", ps, depth, &r_u->size))
1198 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
1204 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1206 if (!prs_werror("status", ps, depth, &r_u->status))
1212 /*******************************************************************
1214 ********************************************************************/
1216 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1218 if (q_u == NULL) return False;
1220 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1222 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1227 /*******************************************************************
1229 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1230 * called from spoolss_abortprinter (cli_spoolss.c)
1231 ********************************************************************/
1233 BOOL spoolss_io_q_abortprinter(char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1235 if (q_u == NULL) return False;
1237 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1243 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1249 /*******************************************************************
1250 * write a structure.
1251 * called from spoolss_r_abortprinter (srv_spoolss.c)
1252 ********************************************************************/
1254 BOOL spoolss_io_r_abortprinter(char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1256 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1258 if(!prs_werror("status", ps, depth, &r_u->status))
1264 /*******************************************************************
1266 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1267 * called from spoolss_deleteprinter (cli_spoolss.c)
1268 ********************************************************************/
1270 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1272 if (q_u == NULL) return False;
1274 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1280 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1286 /*******************************************************************
1287 * write a structure.
1288 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1289 * called from spoolss_deleteprinter (cli_spoolss.c)
1290 ********************************************************************/
1292 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1294 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1300 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1302 if (!prs_werror("status", ps, depth, &r_u->status))
1309 /*******************************************************************
1311 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1312 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1313 ********************************************************************/
1315 BOOL spoolss_io_q_deleteprinterdriver(char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1317 if (q_u == NULL) return False;
1319 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1325 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1327 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1329 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1331 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1339 /*******************************************************************
1340 * write a structure.
1341 ********************************************************************/
1342 BOOL spoolss_io_r_deleteprinterdriver(char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1344 if (r_u == NULL) return False;
1346 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1352 if (!prs_werror("status", ps, depth, &r_u->status))
1360 /*******************************************************************
1362 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1363 * called from spoolss_closeprinter (cli_spoolss.c)
1364 ********************************************************************/
1366 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1368 if (q_u == NULL) return False;
1370 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1376 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1382 /*******************************************************************
1383 * write a structure.
1384 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1385 * called from spoolss_closeprinter (cli_spoolss.c)
1386 ********************************************************************/
1388 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1390 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1396 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1398 if (!prs_werror("status", ps, depth, &r_u->status))
1404 /*******************************************************************
1406 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1407 ********************************************************************/
1409 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1411 if (q_u == NULL) return False;
1413 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1419 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1422 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1428 /*******************************************************************
1429 * write a structure.
1430 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1431 ********************************************************************/
1433 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1435 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1437 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1439 if(!prs_werror("status", ps, depth, &r_u->status))
1445 /*******************************************************************
1447 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1448 ********************************************************************/
1450 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1452 if (q_u == NULL) return False;
1454 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1460 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1466 /*******************************************************************
1467 * write a structure.
1468 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1469 ********************************************************************/
1471 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1473 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1475 if(!prs_werror("status", ps, depth, &r_u->status))
1481 /*******************************************************************
1483 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1484 ********************************************************************/
1486 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1488 if (q_u == NULL) return False;
1490 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1496 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1502 /*******************************************************************
1503 * write a structure.
1504 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1505 ********************************************************************/
1507 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1509 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1511 if(!prs_werror("status", ps, depth, &r_u->status))
1517 /*******************************************************************
1519 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1520 ********************************************************************/
1522 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1524 if (q_u == NULL) return False;
1526 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1532 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1538 /*******************************************************************
1539 * write a structure.
1540 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1541 ********************************************************************/
1543 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1545 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1547 if(!prs_werror("status", ps, depth, &r_u->status))
1553 /*******************************************************************
1555 * called from spoolss_q_writeprinter (srv_spoolss.c)
1556 ********************************************************************/
1558 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1560 if (q_u == NULL) return False;
1562 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1568 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1570 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1573 if (q_u->buffer_size!=0)
1575 if (UNMARSHALLING(ps))
1576 q_u->buffer=(uint8 *)prs_alloc_mem(ps,q_u->buffer_size*sizeof(uint8));
1577 if(q_u->buffer == NULL)
1579 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1584 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1590 /*******************************************************************
1591 * write a structure.
1592 * called from spoolss_r_writeprinter (srv_spoolss.c)
1593 ********************************************************************/
1595 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1597 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1599 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1601 if(!prs_werror("status", ps, depth, &r_u->status))
1607 /*******************************************************************
1609 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1610 ********************************************************************/
1612 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1614 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1620 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1622 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1624 if(!prs_uint32("options", ps, depth, &q_u->options))
1626 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1628 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1634 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1637 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1640 if (q_u->option_ptr!=0) {
1642 if (UNMARSHALLING(ps))
1643 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1646 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1653 /*******************************************************************
1654 * write a structure.
1655 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1656 ********************************************************************/
1658 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1660 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1663 if(!prs_werror("status", ps, depth, &r_u->status))
1669 /*******************************************************************
1671 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1672 ********************************************************************/
1674 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1676 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1682 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1685 if(!prs_uint32("change", ps, depth, &q_u->change))
1688 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1691 if (q_u->option_ptr!=0) {
1693 if (UNMARSHALLING(ps))
1694 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1697 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1704 /*******************************************************************
1705 * write a structure.
1706 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1707 ********************************************************************/
1709 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1711 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1717 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1720 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1725 if(!prs_werror("status", ps, depth, &r_u->status))
1731 /*******************************************************************
1732 * return the length of a uint16 (obvious, but the code is clean)
1733 ********************************************************************/
1735 static uint32 size_of_uint16(uint16 *value)
1737 return (sizeof(*value));
1740 /*******************************************************************
1741 * return the length of a uint32 (obvious, but the code is clean)
1742 ********************************************************************/
1744 static uint32 size_of_uint32(uint32 *value)
1746 return (sizeof(*value));
1749 /*******************************************************************
1750 * return the length of a NTTIME (obvious, but the code is clean)
1751 ********************************************************************/
1753 static uint32 size_of_nttime(NTTIME *value)
1755 return (sizeof(*value));
1758 /*******************************************************************
1759 * return the length of a UNICODE string in number of char, includes:
1760 * - the leading zero
1761 * - the relative pointer size
1762 ********************************************************************/
1764 static uint32 size_of_relative_string(UNISTR *string)
1768 size=str_len_uni(string); /* the string length */
1769 size=size+1; /* add the trailing zero */
1770 size=size*2; /* convert in char */
1771 size=size+4; /* add the size of the ptr */
1775 * Do not include alignment as Win2k does not align relative
1776 * strings within a buffer --jerry
1778 /* Ensure size is 4 byte multiple (prs_align is being called...). */
1779 /* size += ((4 - (size & 3)) & 3); */
1785 /*******************************************************************
1786 * return the length of a uint32 (obvious, but the code is clean)
1787 ********************************************************************/
1789 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1794 return (4+devmode->size+devmode->driverextra);
1797 /*******************************************************************
1798 * return the length of a uint32 (obvious, but the code is clean)
1799 ********************************************************************/
1801 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1806 return (sizeof(SYSTEMTIME) +4);
1809 /*******************************************************************
1810 * write a UNICODE string and its relative pointer.
1811 * used by all the RPC structs passing a buffer
1813 * As I'm a nice guy, I'm forcing myself to explain this code.
1814 * MS did a good job in the overall spoolss code except in some
1815 * functions where they are passing the API buffer directly in the
1816 * RPC request/reply. That's to maintain compatiility at the API level.
1817 * They could have done it the good way the first time.
1819 * So what happen is: the strings are written at the buffer's end,
1820 * in the reverse order of the original structure. Some pointers to
1821 * the strings are also in the buffer. Those are relative to the
1824 * If you don't understand or want to change that function,
1825 * first get in touch with me: jfm@samba.org
1827 ********************************************************************/
1829 static BOOL smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1831 prs_struct *ps=&buffer->prs;
1833 if (MARSHALLING(ps)) {
1834 uint32 struct_offset = prs_offset(ps);
1835 uint32 relative_offset;
1837 buffer->string_at_end -= (size_of_relative_string(string) - 4);
1838 if(!prs_set_offset(ps, buffer->string_at_end))
1842 * Win2k does not align strings in a buffer
1843 * Tested against WinNT 4.0 SP 6a & 2k SP2 --jerry
1848 buffer->string_at_end = prs_offset(ps);
1850 /* write the string */
1851 if (!smb_io_unistr(desc, string, ps, depth))
1854 if(!prs_set_offset(ps, struct_offset))
1857 relative_offset=buffer->string_at_end - buffer->struct_start;
1858 /* write its offset */
1859 if (!prs_uint32("offset", ps, depth, &relative_offset))
1865 /* read the offset */
1866 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1869 old_offset = prs_offset(ps);
1870 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
1873 /* read the string */
1874 if (!smb_io_unistr(desc, string, ps, depth))
1877 if(!prs_set_offset(ps, old_offset))
1883 /*******************************************************************
1884 * write a array of UNICODE strings and its relative pointer.
1885 * used by 2 RPC structs
1886 ********************************************************************/
1888 static BOOL smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1892 prs_struct *ps=&buffer->prs;
1894 if (MARSHALLING(ps)) {
1895 uint32 struct_offset = prs_offset(ps);
1896 uint32 relative_offset;
1903 /* first write the last 0 */
1904 buffer->string_at_end -= 2;
1905 if(!prs_set_offset(ps, buffer->string_at_end))
1908 if(!prs_uint16("leading zero", ps, depth, &zero))
1911 while (p && (*p!=0)) {
1915 /* Yes this should be malloc not talloc. Don't change. */
1917 chaine.buffer = malloc((q-p+1)*sizeof(uint16));
1918 if (chaine.buffer == NULL)
1921 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1923 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1925 if(!prs_set_offset(ps, buffer->string_at_end)) {
1926 SAFE_FREE(chaine.buffer);
1930 /* write the string */
1931 if (!smb_io_unistr(desc, &chaine, ps, depth)) {
1932 SAFE_FREE(chaine.buffer);
1938 SAFE_FREE(chaine.buffer);
1941 if(!prs_set_offset(ps, struct_offset))
1944 relative_offset=buffer->string_at_end - buffer->struct_start;
1945 /* write its offset */
1946 if (!prs_uint32("offset", ps, depth, &relative_offset))
1954 uint16 *chaine2=NULL;
1957 size_t realloc_size = 0;
1961 /* read the offset */
1962 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1965 old_offset = prs_offset(ps);
1966 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1970 if (!smb_io_unistr(desc, &chaine, ps, depth))
1973 l_chaine=str_len_uni(&chaine);
1975 /* we're going to add two more bytes here in case this
1976 is the last string in the array and we need to add
1977 an extra NULL for termination */
1982 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
1984 /* Yes this should be realloc - it's freed below. JRA */
1986 if((tc2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL) {
1991 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1992 l_chaine2+=l_chaine+1;
1995 } while(l_chaine!=0);
1997 /* the end should be bould NULL terminated so add
1998 the second one here */
2001 chaine2[l_chaine2] = '\0';
2002 *string=(uint16 *)talloc_memdup(prs_get_mem_context(ps),chaine2,realloc_size);
2006 if(!prs_set_offset(ps, old_offset))
2012 /*******************************************************************
2013 Parse a DEVMODE structure and its relative pointer.
2014 ********************************************************************/
2016 static BOOL smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
2018 prs_struct *ps= &buffer->prs;
2020 prs_debug(ps, depth, desc, "smb_io_relsecdesc");
2023 if (MARSHALLING(ps)) {
2024 uint32 struct_offset = prs_offset(ps);
2025 uint32 relative_offset;
2028 relative_offset = 0;
2029 if (!prs_uint32("offset", ps, depth, &relative_offset))
2034 if (*secdesc != NULL) {
2035 buffer->string_at_end -= sec_desc_size(*secdesc);
2037 if(!prs_set_offset(ps, buffer->string_at_end))
2039 /* write the secdesc */
2040 if (!sec_io_desc(desc, secdesc, ps, depth))
2043 if(!prs_set_offset(ps, struct_offset))
2047 relative_offset=buffer->string_at_end - buffer->struct_start;
2048 /* write its offset */
2050 if (!prs_uint32("offset", ps, depth, &relative_offset))
2055 /* read the offset */
2056 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2059 old_offset = prs_offset(ps);
2060 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2064 if (!sec_io_desc(desc, secdesc, ps, depth))
2067 if(!prs_set_offset(ps, old_offset))
2073 /*******************************************************************
2074 Parse a DEVMODE structure and its relative pointer.
2075 ********************************************************************/
2077 static BOOL smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
2079 prs_struct *ps=&buffer->prs;
2081 prs_debug(ps, depth, desc, "smb_io_reldevmode");
2084 if (MARSHALLING(ps)) {
2085 uint32 struct_offset = prs_offset(ps);
2086 uint32 relative_offset;
2088 if (*devmode == NULL) {
2090 if (!prs_uint32("offset", ps, depth, &relative_offset))
2092 DEBUG(8, ("boing, the devmode was NULL\n"));
2097 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
2099 if(!prs_set_offset(ps, buffer->string_at_end))
2102 /* write the DEVMODE */
2103 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2106 if(!prs_set_offset(ps, struct_offset))
2109 relative_offset=buffer->string_at_end - buffer->struct_start;
2110 /* write its offset */
2111 if (!prs_uint32("offset", ps, depth, &relative_offset))
2117 /* read the offset */
2118 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2121 old_offset = prs_offset(ps);
2122 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2125 /* read the string */
2126 if((*devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE))) == NULL)
2128 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2131 if(!prs_set_offset(ps, old_offset))
2137 /*******************************************************************
2138 Parse a PRINTER_INFO_0 structure.
2139 ********************************************************************/
2141 BOOL smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2143 prs_struct *ps=&buffer->prs;
2145 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2148 buffer->struct_start=prs_offset(ps);
2150 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2152 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2155 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2157 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2159 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2162 if(!prs_uint16("year", ps, depth, &info->year))
2164 if(!prs_uint16("month", ps, depth, &info->month))
2166 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2168 if(!prs_uint16("day", ps, depth, &info->day))
2170 if(!prs_uint16("hour", ps, depth, &info->hour))
2172 if(!prs_uint16("minute", ps, depth, &info->minute))
2174 if(!prs_uint16("second", ps, depth, &info->second))
2176 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2179 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2181 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2184 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2186 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2188 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2190 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2192 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2194 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2196 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2198 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2200 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2202 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2204 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2206 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2208 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2210 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2212 if(!prs_uint32("status" , ps, depth, &info->status))
2214 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2216 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2218 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2220 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2222 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2224 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2226 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2228 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2230 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2232 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2238 /*******************************************************************
2239 Parse a PRINTER_INFO_1 structure.
2240 ********************************************************************/
2242 BOOL smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2244 prs_struct *ps=&buffer->prs;
2246 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2249 buffer->struct_start=prs_offset(ps);
2251 if (!prs_uint32("flags", ps, depth, &info->flags))
2253 if (!smb_io_relstr("description", buffer, depth, &info->description))
2255 if (!smb_io_relstr("name", buffer, depth, &info->name))
2257 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2263 /*******************************************************************
2264 Parse a PRINTER_INFO_2 structure.
2265 ********************************************************************/
2267 BOOL smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2269 prs_struct *ps=&buffer->prs;
2271 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2274 buffer->struct_start=prs_offset(ps);
2276 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2278 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2280 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2282 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2284 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2286 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2288 if (!smb_io_relstr("location", buffer, depth, &info->location))
2291 /* NT parses the DEVMODE at the end of the struct */
2292 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2295 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2297 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2299 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2301 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2304 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2307 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2309 if (!prs_uint32("priority", ps, depth, &info->priority))
2311 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2313 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2315 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2317 if (!prs_uint32("status", ps, depth, &info->status))
2319 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2321 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2325 if (!prs_uint32_post("secdesc_ptr", ps, depth, NULL, sec_offset, info->secdesc ? prs_offset(ps)-buffer->struct_start : 0 ))
2328 if (!sec_io_desc("secdesc", &info->secdesc, ps, depth))
2334 /*******************************************************************
2335 Parse a PRINTER_INFO_3 structure.
2336 ********************************************************************/
2338 BOOL smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2340 prs_struct *ps=&buffer->prs;
2342 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2345 buffer->struct_start=prs_offset(ps);
2347 if (!prs_uint32("flags", ps, depth, &info->flags))
2349 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2355 /*******************************************************************
2356 Parse a PRINTER_INFO_4 structure.
2357 ********************************************************************/
2359 BOOL smb_io_printer_info_4(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_4 *info, int depth)
2361 prs_struct *ps=&buffer->prs;
2363 prs_debug(ps, depth, desc, "smb_io_printer_info_4");
2366 buffer->struct_start=prs_offset(ps);
2368 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2370 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2372 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2377 /*******************************************************************
2378 Parse a PRINTER_INFO_5 structure.
2379 ********************************************************************/
2381 BOOL smb_io_printer_info_5(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_5 *info, int depth)
2383 prs_struct *ps=&buffer->prs;
2385 prs_debug(ps, depth, desc, "smb_io_printer_info_5");
2388 buffer->struct_start=prs_offset(ps);
2390 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2392 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2394 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2396 if (!prs_uint32("device_not_selected_timeout", ps, depth, &info->device_not_selected_timeout))
2398 if (!prs_uint32("transmission_retry_timeout", ps, depth, &info->transmission_retry_timeout))
2403 /*******************************************************************
2404 Parse a PORT_INFO_1 structure.
2405 ********************************************************************/
2407 BOOL smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2409 prs_struct *ps=&buffer->prs;
2411 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2414 buffer->struct_start=prs_offset(ps);
2416 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2422 /*******************************************************************
2423 Parse a PORT_INFO_2 structure.
2424 ********************************************************************/
2426 BOOL smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2428 prs_struct *ps=&buffer->prs;
2430 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2433 buffer->struct_start=prs_offset(ps);
2435 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2437 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2439 if (!smb_io_relstr("description", buffer, depth, &info->description))
2441 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2443 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2449 /*******************************************************************
2450 Parse a DRIVER_INFO_1 structure.
2451 ********************************************************************/
2453 BOOL smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2455 prs_struct *ps=&buffer->prs;
2457 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2460 buffer->struct_start=prs_offset(ps);
2462 if (!smb_io_relstr("name", buffer, depth, &info->name))
2468 /*******************************************************************
2469 Parse a DRIVER_INFO_2 structure.
2470 ********************************************************************/
2472 BOOL smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2474 prs_struct *ps=&buffer->prs;
2476 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2479 buffer->struct_start=prs_offset(ps);
2481 if (!prs_uint32("version", ps, depth, &info->version))
2483 if (!smb_io_relstr("name", buffer, depth, &info->name))
2485 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2487 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2489 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2491 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2497 /*******************************************************************
2498 Parse a DRIVER_INFO_3 structure.
2499 ********************************************************************/
2501 BOOL smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2503 prs_struct *ps=&buffer->prs;
2505 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2508 buffer->struct_start=prs_offset(ps);
2510 if (!prs_uint32("version", ps, depth, &info->version))
2512 if (!smb_io_relstr("name", buffer, depth, &info->name))
2514 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2516 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2518 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2520 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2522 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2525 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2528 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2530 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2536 /*******************************************************************
2537 Parse a DRIVER_INFO_6 structure.
2538 ********************************************************************/
2540 BOOL smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2542 prs_struct *ps=&buffer->prs;
2544 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
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))
2572 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2575 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2577 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2580 if (!prs_uint32("padding", ps, depth, &info->padding))
2583 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2586 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2589 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2591 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2593 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2595 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2601 /*******************************************************************
2602 Parse a JOB_INFO_1 structure.
2603 ********************************************************************/
2605 BOOL smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2607 prs_struct *ps=&buffer->prs;
2609 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2612 buffer->struct_start=prs_offset(ps);
2614 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2616 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2618 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2620 if (!smb_io_relstr("username", buffer, depth, &info->username))
2622 if (!smb_io_relstr("document", buffer, depth, &info->document))
2624 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2626 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2628 if (!prs_uint32("status", ps, depth, &info->status))
2630 if (!prs_uint32("priority", ps, depth, &info->priority))
2632 if (!prs_uint32("position", ps, depth, &info->position))
2634 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2636 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2638 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2644 /*******************************************************************
2645 Parse a JOB_INFO_2 structure.
2646 ********************************************************************/
2648 BOOL smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2651 prs_struct *ps=&buffer->prs;
2653 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2656 buffer->struct_start=prs_offset(ps);
2658 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2660 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2662 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2664 if (!smb_io_relstr("username", buffer, depth, &info->username))
2666 if (!smb_io_relstr("document", buffer, depth, &info->document))
2668 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2670 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2673 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2675 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2677 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2679 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2681 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2684 /* SEC_DESC sec_desc;*/
2685 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2688 if (!prs_uint32("status",ps, depth, &info->status))
2690 if (!prs_uint32("priority",ps, depth, &info->priority))
2692 if (!prs_uint32("position",ps, depth, &info->position))
2694 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2696 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2698 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2700 if (!prs_uint32("size",ps, depth, &info->size))
2702 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2704 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2706 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2712 /*******************************************************************
2713 ********************************************************************/
2715 BOOL smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2717 prs_struct *ps=&buffer->prs;
2719 prs_debug(ps, depth, desc, "smb_io_form_1");
2722 buffer->struct_start=prs_offset(ps);
2724 if (!prs_uint32("flag", ps, depth, &info->flag))
2727 if (!smb_io_relstr("name", buffer, depth, &info->name))
2730 if (!prs_uint32("width", ps, depth, &info->width))
2732 if (!prs_uint32("length", ps, depth, &info->length))
2734 if (!prs_uint32("left", ps, depth, &info->left))
2736 if (!prs_uint32("top", ps, depth, &info->top))
2738 if (!prs_uint32("right", ps, depth, &info->right))
2740 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2746 /*******************************************************************
2747 Read/write a BUFFER struct.
2748 ********************************************************************/
2750 static BOOL spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
2752 NEW_BUFFER *buffer = *pp_buffer;
2754 prs_debug(ps, depth, desc, "spoolss_io_buffer");
2757 if (UNMARSHALLING(ps))
2758 buffer = *pp_buffer = (NEW_BUFFER *)prs_alloc_mem(ps, sizeof(NEW_BUFFER));
2763 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2767 if (UNMARSHALLING(ps)) {
2769 buffer->string_at_end=0;
2771 if (buffer->ptr==0) {
2773 * JRA. I'm not sure if the data in here is in big-endian format if
2774 * the client is big-endian. Leave as default (little endian) for now.
2777 if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
2782 if (!prs_uint32("size", ps, depth, &buffer->size))
2786 * JRA. I'm not sure if the data in here is in big-endian format if
2787 * the client is big-endian. Leave as default (little endian) for now.
2790 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
2793 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
2796 if (!prs_set_offset(&buffer->prs, 0))
2799 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
2802 buffer->string_at_end=buffer->size;
2810 if (buffer->ptr==0) {
2811 /* We have finished with the data in buffer->prs - free it. */
2812 prs_mem_free(&buffer->prs);
2816 if (!prs_uint32("size", ps, depth, &buffer->size))
2819 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
2825 /* We have finished with the data in buffer->prs - free it. */
2826 prs_mem_free(&buffer->prs);
2832 /*******************************************************************
2833 move a BUFFER from the query to the reply.
2834 As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
2835 this is ok. This is an OPTIMIZATION and is not strictly neccessary.
2836 Clears the memory to zero also.
2837 ********************************************************************/
2839 void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2841 prs_switch_type(&src->prs, MARSHALL);
2842 if(!prs_set_offset(&src->prs, 0))
2844 prs_force_dynamic(&src->prs);
2845 prs_mem_clear(&src->prs);
2849 /*******************************************************************
2850 Get the size of a BUFFER struct.
2851 ********************************************************************/
2853 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2855 return (buffer->size);
2858 /*******************************************************************
2859 Parse a DRIVER_DIRECTORY_1 structure.
2860 ********************************************************************/
2862 BOOL smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2864 prs_struct *ps=&buffer->prs;
2866 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2869 buffer->struct_start=prs_offset(ps);
2871 if (!smb_io_unistr(desc, &info->name, ps, depth))
2877 /*******************************************************************
2878 Parse a PORT_INFO_1 structure.
2879 ********************************************************************/
2881 BOOL smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2883 prs_struct *ps=&buffer->prs;
2885 prs_debug(ps, depth, desc, "smb_io_port_1");
2888 buffer->struct_start=prs_offset(ps);
2890 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2896 /*******************************************************************
2897 Parse a PORT_INFO_2 structure.
2898 ********************************************************************/
2900 BOOL smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2902 prs_struct *ps=&buffer->prs;
2904 prs_debug(ps, depth, desc, "smb_io_port_2");
2907 buffer->struct_start=prs_offset(ps);
2909 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2911 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2913 if(!smb_io_relstr("description", buffer, depth, &info->description))
2915 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2917 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2923 /*******************************************************************
2924 ********************************************************************/
2926 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2928 prs_struct *ps=&buffer->prs;
2930 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2933 buffer->struct_start=prs_offset(ps);
2935 if (smb_io_relstr("name", buffer, depth, &info->name))
2941 /*******************************************************************
2942 ********************************************************************/
2944 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2946 prs_struct *ps=&buffer->prs;
2948 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2951 buffer->struct_start=prs_offset(ps);
2953 if (smb_io_relstr("name", buffer, depth, &info->name))
2959 /*******************************************************************
2960 ********************************************************************/
2962 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2964 prs_struct *ps=&buffer->prs;
2966 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2969 buffer->struct_start=prs_offset(ps);
2971 if (!smb_io_relstr("name", buffer, depth, &info->name))
2977 /*******************************************************************
2978 ********************************************************************/
2980 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2982 prs_struct *ps=&buffer->prs;
2984 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2987 buffer->struct_start=prs_offset(ps);
2989 if (!smb_io_relstr("name", buffer, depth, &info->name))
2991 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
2993 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2999 /*******************************************************************
3000 return the size required by a struct in the stream
3001 ********************************************************************/
3003 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
3007 size+=size_of_relative_string( &info->printername );
3008 size+=size_of_relative_string( &info->servername );
3010 size+=size_of_uint32( &info->cjobs);
3011 size+=size_of_uint32( &info->total_jobs);
3012 size+=size_of_uint32( &info->total_bytes);
3014 size+=size_of_uint16( &info->year);
3015 size+=size_of_uint16( &info->month);
3016 size+=size_of_uint16( &info->dayofweek);
3017 size+=size_of_uint16( &info->day);
3018 size+=size_of_uint16( &info->hour);
3019 size+=size_of_uint16( &info->minute);
3020 size+=size_of_uint16( &info->second);
3021 size+=size_of_uint16( &info->milliseconds);
3023 size+=size_of_uint32( &info->global_counter);
3024 size+=size_of_uint32( &info->total_pages);
3026 size+=size_of_uint16( &info->major_version);
3027 size+=size_of_uint16( &info->build_version);
3029 size+=size_of_uint32( &info->unknown7);
3030 size+=size_of_uint32( &info->unknown8);
3031 size+=size_of_uint32( &info->unknown9);
3032 size+=size_of_uint32( &info->session_counter);
3033 size+=size_of_uint32( &info->unknown11);
3034 size+=size_of_uint32( &info->printer_errors);
3035 size+=size_of_uint32( &info->unknown13);
3036 size+=size_of_uint32( &info->unknown14);
3037 size+=size_of_uint32( &info->unknown15);
3038 size+=size_of_uint32( &info->unknown16);
3039 size+=size_of_uint32( &info->change_id);
3040 size+=size_of_uint32( &info->unknown18);
3041 size+=size_of_uint32( &info->status);
3042 size+=size_of_uint32( &info->unknown20);
3043 size+=size_of_uint32( &info->c_setprinter);
3045 size+=size_of_uint16( &info->unknown22);
3046 size+=size_of_uint16( &info->unknown23);
3047 size+=size_of_uint16( &info->unknown24);
3048 size+=size_of_uint16( &info->unknown25);
3049 size+=size_of_uint16( &info->unknown26);
3050 size+=size_of_uint16( &info->unknown27);
3051 size+=size_of_uint16( &info->unknown28);
3052 size+=size_of_uint16( &info->unknown29);
3057 /*******************************************************************
3058 return the size required by a struct in the stream
3059 ********************************************************************/
3061 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
3065 size+=size_of_uint32( &info->flags );
3066 size+=size_of_relative_string( &info->description );
3067 size+=size_of_relative_string( &info->name );
3068 size+=size_of_relative_string( &info->comment );
3073 /*******************************************************************
3074 return the size required by a struct in the stream
3075 ********************************************************************/
3077 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
3082 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
3083 size += sec_desc_size( info->secdesc );
3085 size+=size_of_device_mode( info->devmode );
3087 size+=size_of_relative_string( &info->servername );
3088 size+=size_of_relative_string( &info->printername );
3089 size+=size_of_relative_string( &info->sharename );
3090 size+=size_of_relative_string( &info->portname );
3091 size+=size_of_relative_string( &info->drivername );
3092 size+=size_of_relative_string( &info->comment );
3093 size+=size_of_relative_string( &info->location );
3095 size+=size_of_relative_string( &info->sepfile );
3096 size+=size_of_relative_string( &info->printprocessor );
3097 size+=size_of_relative_string( &info->datatype );
3098 size+=size_of_relative_string( &info->parameters );
3100 size+=size_of_uint32( &info->attributes );
3101 size+=size_of_uint32( &info->priority );
3102 size+=size_of_uint32( &info->defaultpriority );
3103 size+=size_of_uint32( &info->starttime );
3104 size+=size_of_uint32( &info->untiltime );
3105 size+=size_of_uint32( &info->status );
3106 size+=size_of_uint32( &info->cjobs );
3107 size+=size_of_uint32( &info->averageppm );
3111 /*******************************************************************
3112 return the size required by a struct in the stream
3113 ********************************************************************/
3115 uint32 spoolss_size_printer_info_4(PRINTER_INFO_4 *info)
3119 size+=size_of_relative_string( &info->printername );
3120 size+=size_of_relative_string( &info->servername );
3122 size+=size_of_uint32( &info->attributes );
3126 /*******************************************************************
3127 return the size required by a struct in the stream
3128 ********************************************************************/
3130 uint32 spoolss_size_printer_info_5(PRINTER_INFO_5 *info)
3134 size+=size_of_relative_string( &info->printername );
3135 size+=size_of_relative_string( &info->portname );
3137 size+=size_of_uint32( &info->attributes );
3138 size+=size_of_uint32( &info->device_not_selected_timeout );
3139 size+=size_of_uint32( &info->transmission_retry_timeout );
3144 /*******************************************************************
3145 return the size required by a struct in the stream
3146 ********************************************************************/
3148 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
3150 /* The 4 is for the self relative pointer.. */
3151 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
3152 return 4 + (uint32)sec_desc_size( info->secdesc );
3155 /*******************************************************************
3156 return the size required by a struct in the stream
3157 ********************************************************************/
3159 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
3162 size+=size_of_relative_string( &info->name );
3167 /*******************************************************************
3168 return the size required by a struct in the stream
3169 ********************************************************************/
3171 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
3174 size+=size_of_uint32( &info->version );
3175 size+=size_of_relative_string( &info->name );
3176 size+=size_of_relative_string( &info->architecture );
3177 size+=size_of_relative_string( &info->driverpath );
3178 size+=size_of_relative_string( &info->datafile );
3179 size+=size_of_relative_string( &info->configfile );
3184 /*******************************************************************
3185 return the size required by a string array.
3186 ********************************************************************/
3188 uint32 spoolss_size_string_array(uint16 *string)
3193 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
3195 i=i+2; /* to count all chars including the leading zero */
3196 i=2*i; /* because we need the value in bytes */
3197 i=i+4; /* the offset pointer size */
3202 /*******************************************************************
3203 return the size required by a struct in the stream
3204 ********************************************************************/
3206 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3210 size+=size_of_uint32( &info->version );
3211 size+=size_of_relative_string( &info->name );
3212 size+=size_of_relative_string( &info->architecture );
3213 size+=size_of_relative_string( &info->driverpath );
3214 size+=size_of_relative_string( &info->datafile );
3215 size+=size_of_relative_string( &info->configfile );
3216 size+=size_of_relative_string( &info->helpfile );
3217 size+=size_of_relative_string( &info->monitorname );
3218 size+=size_of_relative_string( &info->defaultdatatype );
3220 size+=spoolss_size_string_array(info->dependentfiles);
3225 /*******************************************************************
3226 return the size required by a struct in the stream
3227 ********************************************************************/
3229 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3233 size+=size_of_uint32( &info->version );
3234 size+=size_of_relative_string( &info->name );
3235 size+=size_of_relative_string( &info->architecture );
3236 size+=size_of_relative_string( &info->driverpath );
3237 size+=size_of_relative_string( &info->datafile );
3238 size+=size_of_relative_string( &info->configfile );
3239 size+=size_of_relative_string( &info->helpfile );
3241 size+=spoolss_size_string_array(info->dependentfiles);
3243 size+=size_of_relative_string( &info->monitorname );
3244 size+=size_of_relative_string( &info->defaultdatatype );
3246 size+=spoolss_size_string_array(info->previousdrivernames);
3248 size+=size_of_nttime(&info->driver_date);
3249 size+=size_of_uint32( &info->padding );
3250 size+=size_of_uint32( &info->driver_version_low );
3251 size+=size_of_uint32( &info->driver_version_high );
3252 size+=size_of_relative_string( &info->mfgname );
3253 size+=size_of_relative_string( &info->oem_url );
3254 size+=size_of_relative_string( &info->hardware_id );
3255 size+=size_of_relative_string( &info->provider );
3260 /*******************************************************************
3261 return the size required by a struct in the stream
3262 ********************************************************************/
3264 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3267 size+=size_of_uint32( &info->jobid );
3268 size+=size_of_relative_string( &info->printername );
3269 size+=size_of_relative_string( &info->machinename );
3270 size+=size_of_relative_string( &info->username );
3271 size+=size_of_relative_string( &info->document );
3272 size+=size_of_relative_string( &info->datatype );
3273 size+=size_of_relative_string( &info->text_status );
3274 size+=size_of_uint32( &info->status );
3275 size+=size_of_uint32( &info->priority );
3276 size+=size_of_uint32( &info->position );
3277 size+=size_of_uint32( &info->totalpages );
3278 size+=size_of_uint32( &info->pagesprinted );
3279 size+=size_of_systemtime( &info->submitted );
3284 /*******************************************************************
3285 return the size required by a struct in the stream
3286 ********************************************************************/
3288 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3292 size+=4; /* size of sec desc ptr */
3294 size+=size_of_uint32( &info->jobid );
3295 size+=size_of_relative_string( &info->printername );
3296 size+=size_of_relative_string( &info->machinename );
3297 size+=size_of_relative_string( &info->username );
3298 size+=size_of_relative_string( &info->document );
3299 size+=size_of_relative_string( &info->notifyname );
3300 size+=size_of_relative_string( &info->datatype );
3301 size+=size_of_relative_string( &info->printprocessor );
3302 size+=size_of_relative_string( &info->parameters );
3303 size+=size_of_relative_string( &info->drivername );
3304 size+=size_of_device_mode( info->devmode );
3305 size+=size_of_relative_string( &info->text_status );
3306 /* SEC_DESC sec_desc;*/
3307 size+=size_of_uint32( &info->status );
3308 size+=size_of_uint32( &info->priority );
3309 size+=size_of_uint32( &info->position );
3310 size+=size_of_uint32( &info->starttime );
3311 size+=size_of_uint32( &info->untiltime );
3312 size+=size_of_uint32( &info->totalpages );
3313 size+=size_of_uint32( &info->size );
3314 size+=size_of_systemtime( &info->submitted );
3315 size+=size_of_uint32( &info->timeelapsed );
3316 size+=size_of_uint32( &info->pagesprinted );
3321 /*******************************************************************
3322 return the size required by a struct in the stream
3323 ********************************************************************/
3325 uint32 spoolss_size_form_1(FORM_1 *info)
3329 size+=size_of_uint32( &info->flag );
3330 size+=size_of_relative_string( &info->name );
3331 size+=size_of_uint32( &info->width );
3332 size+=size_of_uint32( &info->length );
3333 size+=size_of_uint32( &info->left );
3334 size+=size_of_uint32( &info->top );
3335 size+=size_of_uint32( &info->right );
3336 size+=size_of_uint32( &info->bottom );
3341 /*******************************************************************
3342 return the size required by a struct in the stream
3343 ********************************************************************/
3345 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3349 size+=size_of_relative_string( &info->port_name );
3354 /*******************************************************************
3355 return the size required by a struct in the stream
3356 ********************************************************************/
3358 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3362 size=str_len_uni(&info->name); /* the string length */
3363 size=size+1; /* add the leading zero */
3364 size=size*2; /* convert in char */
3369 /*******************************************************************
3370 return the size required by a struct in the stream
3371 ********************************************************************/
3373 uint32 spoolss_size_printprocessordirectory_info_1(PRINTPROCESSOR_DIRECTORY_1 *info)
3377 size=str_len_uni(&info->name); /* the string length */
3378 size=size+1; /* add the leading zero */
3379 size=size*2; /* convert in char */
3384 /*******************************************************************
3385 return the size required by a struct in the stream
3386 ********************************************************************/
3388 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3392 size+=size_of_relative_string( &info->port_name );
3393 size+=size_of_relative_string( &info->monitor_name );
3394 size+=size_of_relative_string( &info->description );
3396 size+=size_of_uint32( &info->port_type );
3397 size+=size_of_uint32( &info->reserved );
3402 /*******************************************************************
3403 return the size required by a struct in the stream
3404 ********************************************************************/
3406 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3409 size+=size_of_relative_string( &info->name );
3414 /*******************************************************************
3415 return the size required by a struct in the stream
3416 ********************************************************************/
3418 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3421 size+=size_of_relative_string( &info->name );
3426 /*******************************************************************
3427 return the size required by a struct in the stream
3428 ********************************************************************/
3429 uint32 spoolss_size_printer_enum_values(PRINTER_ENUM_VALUES *p)
3436 /* uint32(offset) + uint32(length) + length) */
3437 size += (size_of_uint32(&p->value_len)*2) + p->value_len;
3438 size += (size_of_uint32(&p->data_len)*2) + p->data_len;
3440 size += size_of_uint32(&p->type);
3445 /*******************************************************************
3446 return the size required by a struct in the stream
3447 ********************************************************************/
3449 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3452 size+=size_of_relative_string( &info->name );
3457 /*******************************************************************
3458 return the size required by a struct in the stream
3459 ********************************************************************/
3461 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3464 size+=size_of_relative_string( &info->name);
3465 size+=size_of_relative_string( &info->environment);
3466 size+=size_of_relative_string( &info->dll_name);
3471 /*******************************************************************
3473 ********************************************************************/
3475 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3476 const POLICY_HND *hnd,
3477 const fstring architecture,
3478 uint32 level, uint32 clientmajor, uint32 clientminor,
3479 NEW_BUFFER *buffer, uint32 offered)
3484 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3486 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3489 q_u->clientmajorversion=clientmajor;
3490 q_u->clientminorversion=clientminor;
3493 q_u->offered=offered;
3498 /*******************************************************************
3500 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3501 ********************************************************************/
3503 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3505 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3511 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3513 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3515 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3520 if(!prs_uint32("level", ps, depth, &q_u->level))
3523 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3529 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3532 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3534 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3540 /*******************************************************************
3542 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3543 ********************************************************************/
3545 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3547 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3553 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3558 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3560 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3562 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3564 if (!prs_werror("status", ps, depth, &r_u->status))
3570 /*******************************************************************
3572 ********************************************************************/
3574 BOOL make_spoolss_q_enumprinters(
3575 SPOOL_Q_ENUMPRINTERS *q_u,
3585 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3586 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3590 q_u->offered=offered;
3595 /*******************************************************************
3597 ********************************************************************/
3599 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3600 fstring servername, uint32 level,
3601 NEW_BUFFER *buffer, uint32 offered)
3603 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3604 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3608 q_u->offered=offered;
3613 /*******************************************************************
3615 * called from spoolss_enumprinters (srv_spoolss.c)
3616 ********************************************************************/
3618 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3620 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3626 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3628 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3631 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3636 if (!prs_uint32("level", ps, depth, &q_u->level))
3639 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3644 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3650 /*******************************************************************
3651 Parse a SPOOL_R_ENUMPRINTERS structure.
3652 ********************************************************************/
3654 BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3656 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3662 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3668 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3671 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3674 if (!prs_werror("status", ps, depth, &r_u->status))
3680 /*******************************************************************
3681 * write a structure.
3682 * called from spoolss_r_enum_printers (srv_spoolss.c)
3684 ********************************************************************/
3686 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3688 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3694 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3700 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3703 if (!prs_werror("status", ps, depth, &r_u->status))
3709 /*******************************************************************
3711 * called from spoolss_getprinter (srv_spoolss.c)
3712 ********************************************************************/
3714 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3716 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3722 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3724 if (!prs_uint32("level", ps, depth, &q_u->level))
3727 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3732 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3738 /*******************************************************************
3740 ********************************************************************/
3742 BOOL make_spoolss_q_getprinter(
3743 TALLOC_CTX *mem_ctx,
3744 SPOOL_Q_GETPRINTER *q_u,
3745 const POLICY_HND *hnd,
3755 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3759 q_u->offered=offered;
3764 /*******************************************************************
3766 ********************************************************************/
3767 BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
3768 const POLICY_HND *hnd, uint32 level, PRINTER_INFO_CTR *info,
3772 DEVICEMODE *devmode;
3777 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3780 q_u->info.level = level;
3781 q_u->info.info_ptr = (info != NULL) ? 1 : 0;
3784 /* There's no such thing as a setprinter level 1 */
3787 secdesc = info->printers_2->secdesc;
3788 devmode = info->printers_2->devmode;
3790 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3791 #if 1 /* JERRY TEST */
3792 q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
3793 if (!q_u->secdesc_ctr)
3795 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
3796 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3797 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3798 q_u->secdesc_ctr->sec = secdesc;
3800 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3801 q_u->devmode_ctr.size = (devmode != NULL) ? sizeof(DEVICEMODE) + (3*sizeof(uint32)) : 0;
3802 q_u->devmode_ctr.devmode = devmode;
3804 q_u->secdesc_ctr = NULL;
3806 q_u->devmode_ctr.devmode_ptr = 0;
3807 q_u->devmode_ctr.size = 0;
3808 q_u->devmode_ctr.devmode = NULL;
3812 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3817 q_u->command = command;
3823 /*******************************************************************
3824 ********************************************************************/
3826 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3828 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3834 if(!prs_werror("status", ps, depth, &r_u->status))
3840 /*******************************************************************
3841 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3842 ********************************************************************/
3844 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3846 uint32 ptr_sec_desc = 0;
3848 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3854 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3856 if(!prs_uint32("level", ps, depth, &q_u->level))
3859 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3862 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3872 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3877 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3883 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3888 /* Parse a NULL security descriptor. This should really
3889 happen inside the sec_io_desc_buf() function. */
3891 prs_debug(ps, depth, "", "sec_io_desc_buf");
3892 if (!prs_uint32("size", ps, depth + 1, &dummy))
3894 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
3898 if(!prs_uint32("command", ps, depth, &q_u->command))
3904 /*******************************************************************
3905 ********************************************************************/
3907 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3909 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3915 if(!prs_werror("status", ps, depth, &r_u->status))
3921 /*******************************************************************
3922 ********************************************************************/
3924 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3927 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3933 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3940 /*******************************************************************
3941 ********************************************************************/
3943 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3945 prs_debug(ps, depth, desc, "");
3951 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3957 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3960 if(!prs_werror("status", ps, depth, &r_u->status))
3966 /*******************************************************************
3967 ********************************************************************/
3969 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3971 prs_debug(ps, depth, desc, "");
3977 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3979 if(!prs_uint32("level", ps, depth, &q_u->level))
3982 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3988 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3994 /*******************************************************************
3995 ********************************************************************/
3997 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3999 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
4005 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4011 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4014 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4017 if (!prs_werror("status", ps, depth, &r_u->status))
4023 /*******************************************************************
4024 ********************************************************************/
4026 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
4037 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
4038 q_u->firstjob = firstjob;
4039 q_u->numofjobs = numofjobs;
4041 q_u->buffer= buffer;
4042 q_u->offered = offered;
4046 /*******************************************************************
4047 ********************************************************************/
4049 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
4051 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
4057 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
4060 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
4062 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
4064 if (!prs_uint32("level", ps, depth, &q_u->level))
4067 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4073 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4079 /*******************************************************************
4080 ********************************************************************/
4082 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
4084 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
4090 if(!prs_werror("status", ps, depth, &r_u->status))
4096 /*******************************************************************
4097 ********************************************************************/
4099 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
4101 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
4107 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4109 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4115 /*******************************************************************
4116 ********************************************************************/
4118 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
4120 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
4126 if(!prs_werror("status", ps, depth, &r_u->status))
4132 /*******************************************************************
4133 ********************************************************************/
4135 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
4137 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
4143 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4145 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
4148 * level is usually 0. If (level!=0) then I'm in trouble !
4149 * I will try to generate setjob command with level!=0, one day.
4151 if(!prs_uint32("level", ps, depth, &q_u->level))
4153 if(!prs_uint32("command", ps, depth, &q_u->command))
4159 /*******************************************************************
4160 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
4161 ********************************************************************/
4163 BOOL spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
4165 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
4171 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4177 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4180 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4183 if (!prs_werror("status", ps, depth, &r_u->status))
4189 /*******************************************************************
4191 ********************************************************************/
4193 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
4195 const char *environment,
4197 NEW_BUFFER *buffer, uint32 offered)
4199 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
4200 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
4204 q_u->offered=offered;
4209 /*******************************************************************
4210 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
4211 ********************************************************************/
4213 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
4216 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
4222 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
4224 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
4229 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4231 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4236 if (!prs_uint32("level", ps, depth, &q_u->level))
4239 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4245 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4251 /*******************************************************************
4252 ********************************************************************/
4254 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4257 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4262 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4264 if (!prs_uint32("level", ps, depth, &q_u->level))
4267 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4272 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4278 /*******************************************************************
4279 ********************************************************************/
4281 BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4283 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4289 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4295 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4298 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4301 if (!prs_werror("status", ps, depth, &r_u->status))
4307 /*******************************************************************
4308 ********************************************************************/
4310 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4313 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4318 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4320 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4326 if (!prs_uint32("level", ps, depth, &q_u->level))
4329 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4334 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4340 /*******************************************************************
4341 ********************************************************************/
4343 BOOL spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4345 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4351 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4357 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4360 if (!prs_werror("status", ps, depth, &r_u->status))
4366 /*******************************************************************
4367 Parse a SPOOL_R_ENUMPORTS structure.
4368 ********************************************************************/
4370 BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4372 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4378 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4384 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4387 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4390 if (!prs_werror("status", ps, depth, &r_u->status))
4396 /*******************************************************************
4397 ********************************************************************/
4399 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4401 prs_debug(ps, depth, desc, "");
4407 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4409 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4414 if (!prs_uint32("level", ps, depth, &q_u->level))
4417 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4422 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4428 /*******************************************************************
4429 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4430 ********************************************************************/
4432 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4434 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4440 if(!prs_uint32("flags", ps, depth, &il->flags))
4442 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4444 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4446 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4449 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4451 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4453 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4459 /*******************************************************************
4460 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4461 ********************************************************************/
4463 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4465 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4471 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4477 /*******************************************************************
4478 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4479 ********************************************************************/
4481 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4483 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4489 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4491 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4493 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4495 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4498 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4500 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4502 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4504 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4506 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4508 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4510 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4512 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4514 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4517 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4519 if(!prs_uint32("priority", ps, depth, &il->priority))
4521 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4523 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4525 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4527 if(!prs_uint32("status", ps, depth, &il->status))
4529 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4531 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4534 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4536 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4538 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4540 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4542 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4544 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4546 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4548 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4550 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4552 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4554 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4560 /*******************************************************************
4561 ********************************************************************/
4563 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4565 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4570 if(!prs_uint32("level", ps, depth, &il->level))
4572 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4575 /* if no struct inside just return */
4576 if (il->info_ptr==0) {
4577 if (UNMARSHALLING(ps)) {
4584 switch (il->level) {
4586 * level 0 is used by setprinter when managing the queue
4587 * (hold, stop, start a queue)
4591 /* DOCUMENT ME!!! What is level 1 used for? */
4594 if (UNMARSHALLING(ps)) {
4595 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4598 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4603 * level 2 is used by addprinter
4604 * and by setprinter when updating printer's info
4607 if (UNMARSHALLING(ps)) {
4608 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4611 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4614 /* DOCUMENT ME!!! What is level 3 used for? */
4617 if (UNMARSHALLING(ps)) {
4618 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4621 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4630 /*******************************************************************
4631 ********************************************************************/
4633 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4635 uint32 ptr_sec_desc = 0;
4637 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4642 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4644 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4650 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4653 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4656 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
4662 switch (q_u->level) {
4664 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
4667 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
4671 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
4676 /* Parse a NULL security descriptor. This should really
4677 happen inside the sec_io_desc_buf() function. */
4679 prs_debug(ps, depth, "", "sec_io_desc_buf");
4680 if (!prs_uint32("size", ps, depth + 1, &dummy))
4682 if (!prs_uint32("ptr", ps, depth + 1, &dummy))
4686 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4688 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4694 /*******************************************************************
4695 ********************************************************************/
4697 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4698 prs_struct *ps, int depth)
4700 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4703 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4706 if(!prs_werror("status", ps, depth, &r_u->status))
4712 /*******************************************************************
4713 ********************************************************************/
4715 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4716 prs_struct *ps, int depth)
4718 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4720 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4724 if (UNMARSHALLING(ps)) {
4725 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4737 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4739 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4741 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4743 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4745 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4747 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4749 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4751 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4753 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4755 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4757 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4763 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4765 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4767 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4769 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4771 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4773 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4775 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4777 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4783 if (il->dependentfiles_ptr)
4784 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4789 /*******************************************************************
4790 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4791 ********************************************************************/
4793 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4794 prs_struct *ps, int depth)
4796 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4798 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4802 if (UNMARSHALLING(ps)) {
4803 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
4816 /* parse the main elements the packet */
4818 if(!prs_uint32("version", ps, depth, &il->version))
4821 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4824 * If name_ptr is NULL then the next 4 bytes are the name_ptr. A driver
4825 * with a NULL name just isn't a driver For example: "HP LaserJet 4si"
4826 * from W2K CDROM (which uses unidriver). JohnR 010205
4828 if (!il->name_ptr) {
4829 DEBUG(5,("spool_io_printer_driver_info_level_6: name_ptr is NULL! Get next value\n"));
4830 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4834 if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr))
4836 if(!prs_uint32("driverpath_ptr", ps, depth, &il->driverpath_ptr))
4838 if(!prs_uint32("datafile_ptr", ps, depth, &il->datafile_ptr))
4840 if(!prs_uint32("configfile_ptr", ps, depth, &il->configfile_ptr))
4842 if(!prs_uint32("helpfile_ptr", ps, depth, &il->helpfile_ptr))
4844 if(!prs_uint32("monitorname_ptr", ps, depth, &il->monitorname_ptr))
4846 if(!prs_uint32("defaultdatatype_ptr", ps, depth, &il->defaultdatatype_ptr))
4848 if(!prs_uint32("dependentfiles_len", ps, depth, &il->dependentfiles_len))
4850 if(!prs_uint32("dependentfiles_ptr", ps, depth, &il->dependentfiles_ptr))
4852 if(!prs_uint32("previousnames_len", ps, depth, &il->previousnames_len))
4854 if(!prs_uint32("previousnames_ptr", ps, depth, &il->previousnames_ptr))
4856 if(!smb_io_time("driverdate", &il->driverdate, ps, depth))
4858 if(!prs_uint32("dummy4", ps, depth, &il->dummy4))
4860 if(!prs_uint64("driverversion", ps, depth, &il->driverversion))
4862 if(!prs_uint32("mfgname_ptr", ps, depth, &il->mfgname_ptr))
4864 if(!prs_uint32("oemurl_ptr", ps, depth, &il->oemurl_ptr))
4866 if(!prs_uint32("hardwareid_ptr", ps, depth, &il->hardwareid_ptr))
4868 if(!prs_uint32("provider_ptr", ps, depth, &il->provider_ptr))
4871 /* parse the structures in the packet */
4873 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4878 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4883 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4888 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4893 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4898 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4903 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4908 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4912 if (il->dependentfiles_ptr) {
4913 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4918 if (il->previousnames_ptr) {
4919 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4924 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4928 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4932 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4936 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4942 /*******************************************************************
4943 convert a buffer of UNICODE strings null terminated
4944 the buffer is terminated by a NULL
4946 convert to an dos codepage array (null terminated)
4948 dynamically allocate memory
4950 ********************************************************************/
4951 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4960 src = (char *)buf5->buffer;
4963 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4964 rpcstr_pull(f, src, sizeof(f)-1, -1, 0);
4965 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4966 tar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
4971 fstrcpy((*ar)[n], f);
4974 fstrcpy((*ar)[n], "");
4982 /*******************************************************************
4983 read a UNICODE array with null terminated strings
4984 and null terminated array
4985 and size of array at beginning
4986 ********************************************************************/
4988 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
4990 if (buffer==NULL) return False;
4993 buffer->uni_str_len=buffer->uni_max_len;
4995 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
4998 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
5004 /*******************************************************************
5005 ********************************************************************/
5007 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
5009 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
5014 if(!prs_uint32("level", ps, depth, &il->level))
5016 if(!prs_uint32("ptr", ps, depth, &il->ptr))
5022 switch (il->level) {
5024 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
5028 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
5038 /*******************************************************************
5039 init a SPOOL_Q_ADDPRINTERDRIVER struct
5040 ******************************************************************/
5042 BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *mem_ctx,
5043 SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name,
5044 uint32 level, PRINTER_DRIVER_CTR *info)
5046 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
5048 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
5049 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
5053 q_u->info.level = level;
5054 q_u->info.ptr = (info!=NULL)?1:0;
5057 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
5059 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
5063 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
5070 BOOL make_spoolss_driver_info_3(TALLOC_CTX *mem_ctx,
5071 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
5072 DRIVER_INFO_3 *info3)
5075 uint16 *ptr = info3->dependentfiles;
5077 BOOL null_char = False;
5078 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
5080 if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3))))
5083 inf->cversion = info3->version;
5084 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
5085 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
5086 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
5087 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
5088 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
5089 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
5090 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
5091 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
5093 init_unistr2_from_unistr(&inf->name, &info3->name);
5094 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
5095 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
5096 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
5097 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
5098 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
5099 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
5100 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
5107 /* the null_char BOOL is used to help locate
5108 two '\0's back to back */
5123 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
5124 inf->dependentfilessize = len;
5125 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
5131 *spool_drv_info = inf;
5136 /*******************************************************************
5137 make a BUFFER5 struct from a uint16*
5138 ******************************************************************/
5139 BOOL make_spoolss_buffer5(TALLOC_CTX *mem_ctx, BUFFER5 *buf5, uint32 len, uint16 *src)
5142 buf5->buf_len = len;
5143 if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
5145 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
5152 /*******************************************************************
5153 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
5154 ********************************************************************/
5156 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5158 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
5164 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
5166 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
5171 if(!prs_uint32("info_level", ps, depth, &q_u->level))
5174 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
5180 /*******************************************************************
5181 ********************************************************************/
5183 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
5185 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
5188 if(!prs_werror("status", ps, depth, &q_u->status))
5194 /*******************************************************************
5195 ********************************************************************/
5197 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
5198 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
5200 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
5202 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
5206 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
5214 d->cversion=uni->cversion;
5216 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5217 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5218 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5219 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5220 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5221 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5222 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5223 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5225 DEBUGADD(8,( "version: %d\n", d->cversion));
5226 DEBUGADD(8,( "name: %s\n", d->name));
5227 DEBUGADD(8,( "environment: %s\n", d->environment));
5228 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5229 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5230 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5231 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5232 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5233 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5235 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5242 /*******************************************************************
5243 ********************************************************************/
5244 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5245 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5247 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5249 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5253 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
5261 d->version=uni->version;
5263 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5264 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5265 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5266 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5267 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5268 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5269 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5270 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5272 DEBUGADD(8,( "version: %d\n", d->version));
5273 DEBUGADD(8,( "name: %s\n", d->name));
5274 DEBUGADD(8,( "environment: %s\n", d->environment));
5275 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5276 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5277 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5278 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5279 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5280 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5282 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5284 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5294 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5295 NT_PRINTER_INFO_LEVEL_2 **asc)
5297 NT_PRINTER_INFO_LEVEL_2 *d;
5300 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5301 time_unix=time(NULL);
5304 DEBUGADD(8,("allocating memory\n"));
5306 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
5311 /* we allocate memory iff called from
5312 * addprinter(ex) so we can do one time stuff here.
5314 (*asc)->setuptime=time_unix;
5317 DEBUGADD(8,("start converting\n"));
5321 d->attributes=uni->attributes;
5322 d->priority=uni->priority;
5323 d->default_priority=uni->default_priority;
5324 d->starttime=uni->starttime;
5325 d->untiltime=uni->untiltime;
5326 d->status=uni->status;
5327 d->cjobs=uni->cjobs;
5329 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5330 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5331 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5332 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5333 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5334 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5335 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5336 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5337 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5338 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5339 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5344 /*******************************************************************
5346 ********************************************************************/
5348 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5349 fstring servername, fstring env_name, uint32 level,
5350 NEW_BUFFER *buffer, uint32 offered)
5352 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5353 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5357 q_u->offered=offered;
5362 /*******************************************************************
5363 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5364 ********************************************************************/
5366 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5368 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5373 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5375 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5381 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5383 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5389 if(!prs_uint32("level", ps, depth, &q_u->level))
5392 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5398 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5404 /*******************************************************************
5405 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5406 ********************************************************************/
5408 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5410 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5416 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5422 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5425 if (!prs_werror("status", ps, depth, &r_u->status))
5431 /*******************************************************************
5432 ********************************************************************/
5434 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5436 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5442 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5448 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5451 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5454 if (!prs_werror("status", ps, depth, &r_u->status))
5460 /*******************************************************************
5461 ********************************************************************/
5463 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5465 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5471 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5473 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5479 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5481 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5487 if (!prs_uint32("level", ps, depth, &q_u->level))
5490 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5496 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5502 /*******************************************************************
5503 ********************************************************************/
5505 BOOL spoolss_io_q_addprintprocessor(char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5507 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5513 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5515 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5520 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5525 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5530 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5536 /*******************************************************************
5537 ********************************************************************/
5539 BOOL spoolss_io_r_addprintprocessor(char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5541 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5547 if (!prs_werror("status", ps, depth, &r_u->status))
5553 /*******************************************************************
5554 ********************************************************************/
5556 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5558 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5564 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5570 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5573 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5576 if (!prs_werror("status", ps, depth, &r_u->status))
5582 /*******************************************************************
5583 ********************************************************************/
5585 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5587 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5593 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5595 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5601 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5603 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5609 if (!prs_uint32("level", ps, depth, &q_u->level))
5612 if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
5618 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5624 /*******************************************************************
5625 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5626 ********************************************************************/
5628 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5630 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5636 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5638 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5644 if (!prs_uint32("level", ps, depth, &q_u->level))
5647 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5653 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5659 /*******************************************************************
5660 ********************************************************************/
5662 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5664 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5670 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5676 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5679 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5682 if (!prs_werror("status", ps, depth, &r_u->status))
5688 /*******************************************************************
5689 ********************************************************************/
5691 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5693 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5698 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5701 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5707 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5710 if(!prs_uint32("type", ps, depth, &r_u->type))
5713 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5715 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5720 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5722 if(!prs_werror("status", ps, depth, &r_u->status))
5728 /*******************************************************************
5729 ********************************************************************/
5731 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5733 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5738 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5740 if(!prs_uint32("index", ps, depth, &q_u->index))
5742 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5744 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5750 /*******************************************************************
5751 ********************************************************************/
5753 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5754 const POLICY_HND *hnd,
5755 uint32 idx, uint32 valuelen, uint32 datalen)
5757 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5759 q_u->valuesize=valuelen;
5760 q_u->datasize=datalen;
5765 /*******************************************************************
5766 ********************************************************************/
5767 BOOL make_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u, TALLOC_CTX *ctx, const POLICY_HND *hnd,
5768 char* value, char* data)
5772 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5774 init_unistr2(&q_u->value, value, strlen(value)+1);
5776 init_unistr2(&tmp, data, strlen(data)+1);
5777 q_u->max_len = q_u->real_len = tmp.uni_max_len*2;
5778 q_u->data = talloc(ctx, q_u->real_len);
5779 memcpy(q_u->data, tmp.buffer, q_u->real_len);
5783 /*******************************************************************
5784 ********************************************************************/
5786 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5788 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5793 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5795 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5801 if(!prs_uint32("type", ps, depth, &q_u->type))
5804 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5814 if (UNMARSHALLING(ps))
5815 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
5816 if(q_u->data == NULL)
5818 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5826 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5832 /*******************************************************************
5833 ********************************************************************/
5835 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5837 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5842 if(!prs_werror("status", ps, depth, &r_u->status))
5848 /*******************************************************************
5849 ********************************************************************/
5850 BOOL spoolss_io_q_resetprinter(char *desc, SPOOL_Q_RESETPRINTER *q_u, prs_struct *ps, int depth)
5852 prs_debug(ps, depth, desc, "spoolss_io_q_resetprinter");
5857 if (!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5860 if (!prs_uint32("datatype_ptr", ps, depth, &q_u->datatype_ptr))
5863 if (q_u->datatype_ptr) {
5864 if (!smb_io_unistr2("datatype", &q_u->datatype, q_u->datatype_ptr?True:False, ps, depth))
5868 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
5875 /*******************************************************************
5876 ********************************************************************/
5877 BOOL spoolss_io_r_resetprinter(char *desc, SPOOL_R_RESETPRINTER *r_u, prs_struct *ps, int depth)
5879 prs_debug(ps, depth, desc, "spoolss_io_r_resetprinter");
5884 if(!prs_werror("status", ps, depth, &r_u->status))
5890 /*******************************************************************
5891 ********************************************************************/
5892 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
5893 uint32 type, const uint8 *data, uint32 len)
5895 DEBUG(5,("converting a specific param struct\n"));
5899 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
5902 memset((char *)*param, '\0', sizeof(NT_PRINTER_PARAM));
5903 DEBUGADD(6,("Allocated a new PARAM struct\n"));
5905 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
5906 (*param)->type = type;
5908 /* le champ data n'est pas NULL termine */
5909 /* on stocke donc la longueur */
5911 (*param)->data_len=len;
5914 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
5915 if((*param)->data == NULL)
5917 memcpy((*param)->data, data, len);
5920 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
5921 dump_data(10, (char *)(*param)->data, (*param)->data_len);
5926 /*******************************************************************
5927 ********************************************************************/
5929 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5931 prs_debug(ps, depth, desc, "spoolss_io_addform");
5938 if(!prs_uint32("flags", ps, depth, &f->flags))
5940 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
5942 if(!prs_uint32("size_x", ps, depth, &f->size_x))
5944 if(!prs_uint32("size_y", ps, depth, &f->size_y))
5946 if(!prs_uint32("left", ps, depth, &f->left))
5948 if(!prs_uint32("top", ps, depth, &f->top))
5950 if(!prs_uint32("right", ps, depth, &f->right))
5952 if(!prs_uint32("bottom", ps, depth, &f->bottom))
5955 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
5962 /*******************************************************************
5963 ********************************************************************/
5965 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
5967 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
5972 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5974 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
5980 /*******************************************************************
5981 ********************************************************************/
5983 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
5985 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
5990 if(!prs_werror("status", ps, depth, &r_u->status))
5996 /*******************************************************************
5997 ********************************************************************/
5999 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
6001 uint32 useless_ptr=1;
6002 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
6007 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6009 if(!prs_uint32("level", ps, depth, &q_u->level))
6011 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6016 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6018 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6025 /*******************************************************************
6026 ********************************************************************/
6028 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
6030 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
6035 if(!prs_werror("status", ps, depth, &r_u->status))
6041 /*******************************************************************
6042 ********************************************************************/
6044 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
6046 uint32 useless_ptr=1;
6047 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
6052 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6054 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
6060 if(!prs_uint32("level", ps, depth, &q_u->level))
6062 if(!prs_uint32("level2", ps, depth, &q_u->level2))
6067 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
6069 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
6076 /*******************************************************************
6077 ********************************************************************/
6079 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
6081 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
6086 if(!prs_werror("status", ps, depth, &r_u->status))
6092 /*******************************************************************
6093 Parse a SPOOL_R_GETJOB structure.
6094 ********************************************************************/
6096 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
6098 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
6104 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
6110 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6113 if (!prs_werror("status", ps, depth, &r_u->status))
6119 /*******************************************************************
6120 Parse a SPOOL_Q_GETJOB structure.
6121 ********************************************************************/
6123 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
6125 prs_debug(ps, depth, desc, "");
6131 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6133 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
6135 if(!prs_uint32("level", ps, depth, &q_u->level))
6138 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
6144 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6150 void free_devmode(DEVICEMODE *devmode)
6152 if (devmode!=NULL) {
6153 SAFE_FREE(devmode->private);
6158 void free_printer_info_1(PRINTER_INFO_1 *printer)
6163 void free_printer_info_2(PRINTER_INFO_2 *printer)
6165 if (printer!=NULL) {
6166 free_devmode(printer->devmode);
6167 printer->devmode = NULL;
6172 void free_printer_info_3(PRINTER_INFO_3 *printer)
6177 void free_printer_info_4(PRINTER_INFO_4 *printer)
6182 void free_printer_info_5(PRINTER_INFO_5 *printer)
6187 void free_job_info_2(JOB_INFO_2 *job)
6190 free_devmode(job->devmode);
6193 /*******************************************************************
6195 ********************************************************************/
6197 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
6198 const fstring string, uint32 printer, uint32 type)
6203 init_unistr2(&q_u->string, string, strlen(string)+1);
6205 q_u->printer=printer;
6214 /*******************************************************************
6215 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
6216 ********************************************************************/
6218 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
6220 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
6226 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
6232 if(!prs_uint32("printer", ps, depth, &q_u->printer))
6234 if(!prs_uint32("type", ps, depth, &q_u->type))
6237 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6239 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6245 /*******************************************************************
6246 Parse a SPOOL_R_REPLYOPENPRINTER structure.
6247 ********************************************************************/
6249 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
6251 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
6257 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6260 if (!prs_werror("status", ps, depth, &r_u->status))
6266 /*******************************************************************
6268 ********************************************************************/
6269 BOOL make_spoolss_q_routerreplyprinter(SPOOL_Q_ROUTERREPLYPRINTER *q_u, POLICY_HND *hnd,
6270 uint32 condition, uint32 change_id)
6273 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6275 q_u->condition = condition;
6276 q_u->change_id = change_id;
6279 q_u->unknown1 = 0x1;
6280 memset(q_u->unknown2, 0x0, 5);
6281 q_u->unknown2[0] = 0x1;
6286 /*******************************************************************
6287 Parse a SPOOL_Q_ROUTERREPLYPRINTER structure.
6288 ********************************************************************/
6289 BOOL spoolss_io_q_routerreplyprinter (char *desc, SPOOL_Q_ROUTERREPLYPRINTER *q_u, prs_struct *ps, int depth)
6292 prs_debug(ps, depth, desc, "spoolss_io_q_routerreplyprinter");
6298 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6301 if (!prs_uint32("condition", ps, depth, &q_u->condition))
6304 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6307 if (!prs_uint32("change_id", ps, depth, &q_u->change_id))
6310 if (!prs_uint8s(False, "private", ps, depth, q_u->unknown2, 5))
6316 /*******************************************************************
6317 Parse a SPOOL_R_ROUTERREPLYPRINTER structure.
6318 ********************************************************************/
6319 BOOL spoolss_io_r_routerreplyprinter (char *desc, SPOOL_R_ROUTERREPLYPRINTER *r_u, prs_struct *ps, int depth)
6321 prs_debug(ps, depth, desc, "spoolss_io_r_routerreplyprinter");
6327 if (!prs_werror("status", ps, depth, &r_u->status))
6333 /*******************************************************************
6335 ********************************************************************/
6337 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
6342 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6347 /*******************************************************************
6348 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
6349 ********************************************************************/
6351 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
6353 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
6359 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6365 /*******************************************************************
6366 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6367 ********************************************************************/
6369 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6371 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6377 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6380 if (!prs_werror("status", ps, depth, &r_u->status))
6386 #if 0 /* JERRY - not currently used but could be :-) */
6388 /*******************************************************************
6389 Deep copy a SPOOL_NOTIFY_INFO_DATA structure
6390 ******************************************************************/
6391 static BOOL copy_spool_notify_info_data(SPOOL_NOTIFY_INFO_DATA *dst,
6392 SPOOL_NOTIFY_INFO_DATA *src, int n)
6396 memcpy(dst, src, sizeof(SPOOL_NOTIFY_INFO_DATA)*n);
6398 for (i=0; i<n; i++) {
6402 if (src->size != POINTER)
6404 len = src->notify_data.data.length;
6405 s = malloc(sizeof(uint16)*len);
6407 DEBUG(0,("copy_spool_notify_info_data: malloc() failed!\n"));
6411 memcpy(s, src->notify_data.data.string, len*2);
6412 dst->notify_data.data.string = s;
6418 /*******************************************************************
6419 Deep copy a SPOOL_NOTIFY_INFO structure
6420 ******************************************************************/
6421 static BOOL copy_spool_notify_info(SPOOL_NOTIFY_INFO *dst, SPOOL_NOTIFY_INFO *src)
6424 DEBUG(0,("copy_spool_notify_info: NULL destination pointer!\n"));
6428 dst->version = src->version;
6429 dst->flags = src->flags;
6430 dst->count = src->count;
6434 dst->data = malloc(dst->count * sizeof(SPOOL_NOTIFY_INFO_DATA));
6436 DEBUG(10,("copy_spool_notify_info: allocating space for [%d] PRINTER_NOTIFY_INFO_DATA entries\n",
6439 if (dst->data == NULL) {
6440 DEBUG(0,("copy_spool_notify_info: malloc() failed for [%d] entries!\n",
6445 return (copy_spool_notify_info_data(dst->data, src->data, src->count));
6452 /*******************************************************************
6454 ********************************************************************/
6456 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6457 uint32 change_low, uint32 change_high,
6458 SPOOL_NOTIFY_INFO *info)
6463 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6465 q_u->change_low=change_low;
6466 q_u->change_high=change_high;
6471 q_u->info_ptr=0xaddee11e;
6473 q_u->info.version=2;
6476 DEBUG(10,("make_spoolss_q_reply_rrpcn: [%d] PRINTER_NOTIFY_INFO_DATA\n",
6478 q_u->info.version = info->version;
6479 q_u->info.flags = info->flags;
6480 q_u->info.count = info->count;
6481 /* pointer field - be careful! */
6482 q_u->info.data = info->data;
6485 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6492 /*******************************************************************
6493 Parse a SPOOL_Q_REPLY_RRPCN structure.
6494 ********************************************************************/
6496 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6498 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6504 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6507 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6510 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6513 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6516 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6519 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6522 if(q_u->info_ptr!=0)
6523 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6529 /*******************************************************************
6530 Parse a SPOOL_R_REPLY_RRPCN structure.
6531 ********************************************************************/
6533 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6535 prs_debug(ps, depth, desc, "spoolss_io_r_reply_rrpcn");
6541 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6544 if (!prs_werror("status", ps, depth, &r_u->status))
6550 /*******************************************************************
6552 * called from spoolss_q_getprinterdataex (srv_spoolss.c)
6553 ********************************************************************/
6555 BOOL spoolss_io_q_getprinterdataex(char *desc, SPOOL_Q_GETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6560 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdataex");
6565 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6569 if (!smb_io_unistr2("keyname", &q_u->keyname,True,ps,depth))
6573 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
6577 if (!prs_uint32("size", ps, depth, &q_u->size))
6583 /*******************************************************************
6584 * write a structure.
6585 * called from spoolss_r_getprinterdataex (srv_spoolss.c)
6586 ********************************************************************/
6588 BOOL spoolss_io_r_getprinterdataex(char *desc, SPOOL_R_GETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6593 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdataex");
6598 if (!prs_uint32("type", ps, depth, &r_u->type))
6600 if (!prs_uint32("size", ps, depth, &r_u->size))
6603 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
6609 if (!prs_uint32("needed", ps, depth, &r_u->needed))
6611 if (!prs_werror("status", ps, depth, &r_u->status))
6617 /*******************************************************************
6619 ********************************************************************/
6621 BOOL spoolss_io_q_setprinterdataex(char *desc, SPOOL_Q_SETPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6623 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdataex");
6628 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6630 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6636 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
6642 if(!prs_uint32("type", ps, depth, &q_u->type))
6645 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
6655 if (UNMARSHALLING(ps))
6656 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
6657 if(q_u->data == NULL)
6659 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
6667 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
6673 /*******************************************************************
6674 * write a structure.
6675 ********************************************************************/
6677 BOOL spoolss_io_r_setprinterdataex(char *desc, SPOOL_R_SETPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6679 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdataex");
6684 if(!prs_werror("status", ps, depth, &r_u->status))
6691 /*******************************************************************
6693 ********************************************************************/
6695 BOOL spoolss_io_q_enumprinterkey(char *desc, SPOOL_Q_ENUMPRINTERKEY *q_u, prs_struct *ps, int depth)
6697 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterkey");
6702 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6705 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6711 if(!prs_uint32("size", ps, depth, &q_u->size))
6717 /*******************************************************************
6718 * write a structure.
6719 ********************************************************************/
6721 BOOL spoolss_io_r_enumprinterkey(char *desc, SPOOL_R_ENUMPRINTERKEY *r_u, prs_struct *ps, int depth)
6723 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterkey");
6729 if (!smb_io_buffer5("", &r_u->keys, ps, depth))
6735 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6738 if(!prs_werror("status", ps, depth, &r_u->status))
6745 /*******************************************************************
6747 ********************************************************************/
6749 BOOL spoolss_io_q_enumprinterdataex(char *desc, SPOOL_Q_ENUMPRINTERDATAEX *q_u, prs_struct *ps, int depth)
6751 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdataex");
6756 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
6759 if(!smb_io_unistr2("", &q_u->key, True, ps, depth))
6765 if(!prs_uint32("size", ps, depth, &q_u->size))
6771 /*******************************************************************
6772 ********************************************************************/
6773 static BOOL spoolss_io_printer_enum_values_ctr(char *desc, prs_struct *ps,
6774 PRINTER_ENUM_VALUES_CTR *ctr, int depth)
6777 uint32 valuename_offset,
6780 const uint32 basic_unit = 20; /* size of static portion of enum_values */
6782 prs_debug(ps, depth, desc, "spoolss_io_printer_enum_values_ctr");
6785 if (!prs_uint32("size", ps, depth, &ctr->size))
6788 /* offset data begins at 20 bytes per structure * size_of_array.
6789 Don't forget the uint32 at the beginning */
6791 current_offset = basic_unit * ctr->size_of_array;
6793 /* first loop to write basic enum_value information */
6795 for (i=0; i<ctr->size_of_array; i++)
6797 valuename_offset = current_offset;
6798 if (!prs_uint32("valuename_offset", ps, depth, &valuename_offset))
6801 if (!prs_uint32("value_len", ps, depth, &ctr->values[i].value_len))
6804 if (!prs_uint32("type", ps, depth, &ctr->values[i].type))
6807 data_offset = ctr->values[i].value_len + valuename_offset;
6808 if (!prs_uint32("data_offset", ps, depth, &data_offset))
6811 if (!prs_uint32("data_len", ps, depth, &ctr->values[i].data_len))
6814 current_offset = data_offset + ctr->values[i].data_len - basic_unit;
6817 /* loop #2 for writing the dynamically size objects
6818 while viewing conversations between Win2k -> Win2k,
6819 4-byte alignment does not seem to matter here --jerry */
6821 for (i=0; i<ctr->size_of_array; i++)
6824 if (!prs_unistr("valuename", ps, depth, &ctr->values[i].valuename))
6827 if (!prs_uint8s(False, "data", ps, depth, ctr->values[i].data, ctr->values[i].data_len))
6837 /*******************************************************************
6838 * write a structure.
6839 ********************************************************************/
6841 BOOL spoolss_io_r_enumprinterdataex(char *desc, SPOOL_R_ENUMPRINTERDATAEX *r_u, prs_struct *ps, int depth)
6843 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdataex");
6849 if (!spoolss_io_printer_enum_values_ctr("", ps, &r_u->ctr, depth ))
6855 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6858 if(!prs_uint32("returned", ps, depth, &r_u->returned))
6861 if(!prs_werror("status", ps, depth, &r_u->status))
6868 /*******************************************************************
6869 * write a structure.
6870 ********************************************************************/
6873 uint32 GetPrintProcessorDirectory(
6875 [in] unistr2 *environment,
6877 [in,out] NEW_BUFFER buffer,
6878 [in] uint32 offered,
6879 [out] uint32 needed,
6880 [out] uint32 returned
6885 BOOL make_spoolss_q_getprintprocessordirectory(SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, const char *name, char *environment, int level, NEW_BUFFER *buffer, uint32 offered)
6887 DEBUG(5,("make_spoolss_q_getprintprocessordirectory\n"));
6889 init_unistr2(&q_u->name, name, strlen(name)+1);
6890 init_unistr2(&q_u->environment, environment, strlen(environment)+1);
6894 q_u->buffer = buffer;
6895 q_u->offered = offered;
6900 BOOL spoolss_io_q_getprintprocessordirectory(char *desc, SPOOL_Q_GETPRINTPROCESSORDIRECTORY *q_u, prs_struct *ps, int depth)
6904 prs_debug(ps, depth, desc, "spoolss_io_q_getprintprocessordirectory");
6910 if (!prs_uint32("ptr", ps, depth, &ptr))
6914 if(!smb_io_unistr2("name", &q_u->name, True, ps, depth))
6921 if (!prs_uint32("ptr", ps, depth, &ptr))
6925 if(!smb_io_unistr2("environment", &q_u->environment, True,
6933 if(!prs_uint32("level", ps, depth, &q_u->level))
6936 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
6942 if(!prs_uint32("offered", ps, depth, &q_u->offered))
6948 /*******************************************************************
6949 * write a structure.
6950 ********************************************************************/
6952 BOOL spoolss_io_r_getprintprocessordirectory(char *desc, SPOOL_R_GETPRINTPROCESSORDIRECTORY *r_u, prs_struct *ps, int depth)
6954 prs_debug(ps, depth, desc, "spoolss_io_r_getprintprocessordirectory");
6960 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
6966 if(!prs_uint32("needed", ps, depth, &r_u->needed))
6969 if(!prs_werror("status", ps, depth, &r_u->status))
6975 BOOL smb_io_printprocessordirectory_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_DIRECTORY_1 *info, int depth)
6977 prs_struct *ps=&buffer->prs;
6979 prs_debug(ps, depth, desc, "smb_io_printprocessordirectory_1");
6982 buffer->struct_start=prs_offset(ps);
6984 if (!smb_io_unistr(desc, &info->name, ps, depth))
6990 /*******************************************************************
6992 ********************************************************************/
6994 BOOL make_spoolss_q_addform(SPOOL_Q_ADDFORM *q_u, POLICY_HND *handle,
6995 int level, FORM *form)
6997 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
6999 q_u->level2 = level;
7000 memcpy(&q_u->form, form, sizeof(FORM));
7005 /*******************************************************************
7007 ********************************************************************/
7009 BOOL make_spoolss_q_setform(SPOOL_Q_SETFORM *q_u, POLICY_HND *handle,
7010 int level, char *form_name, FORM *form)
7012 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7014 q_u->level2 = level;
7015 memcpy(&q_u->form, form, sizeof(FORM));
7016 init_unistr2(&q_u->name, form_name, strlen(form_name) + 1);
7021 /*******************************************************************
7023 ********************************************************************/
7025 BOOL make_spoolss_q_deleteform(SPOOL_Q_DELETEFORM *q_u, POLICY_HND *handle, char *form)
7027 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7028 init_unistr2(&q_u->name, form, strlen(form) + 1);
7032 /*******************************************************************
7034 ********************************************************************/
7036 BOOL make_spoolss_q_getform(SPOOL_Q_GETFORM *q_u, POLICY_HND *handle,
7037 char *formname, uint32 level, NEW_BUFFER *buffer,
7040 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7042 init_unistr2(&q_u->formname, formname, strlen(formname) + 1);
7044 q_u->offered=offered;
7049 /*******************************************************************
7051 ********************************************************************/
7053 BOOL make_spoolss_q_enumforms(SPOOL_Q_ENUMFORMS *q_u, POLICY_HND *handle,
7054 uint32 level, NEW_BUFFER *buffer,
7057 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7060 q_u->offered=offered;
7065 /*******************************************************************
7067 ********************************************************************/
7069 BOOL make_spoolss_q_setjob(SPOOL_Q_SETJOB *q_u, POLICY_HND *handle,
7070 uint32 jobid, uint32 level, uint32 command)
7072 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7076 /* Hmm - the SPOOL_Q_SETJOB structure has a JOB_INFO ctr in it but
7077 the server side code has it marked as unused. */
7079 q_u->command = command;
7084 /*******************************************************************
7086 ********************************************************************/
7088 BOOL make_spoolss_q_getjob(SPOOL_Q_GETJOB *q_u, POLICY_HND *handle,
7089 uint32 jobid, uint32 level, NEW_BUFFER *buffer,
7092 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7095 q_u->buffer = buffer;
7096 q_u->offered = offered;
7101 /*******************************************************************
7103 ********************************************************************/
7105 BOOL make_spoolss_q_startpageprinter(SPOOL_Q_STARTPAGEPRINTER *q_u,
7108 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));
7113 /*******************************************************************
7115 ********************************************************************/
7117 BOOL make_spoolss_q_endpageprinter(SPOOL_Q_ENDPAGEPRINTER *q_u,
7120 memcpy(&q_u->handle, handle, sizeof(POLICY_HND));