2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-2000,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
7 * Copyright (C) Jean François Micouleau 1998-2000.
8 * Copyright (C) Gerald Carter 2000
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 extern int DEBUGLEVEL;
29 /*******************************************************************
30 return the length of a UNISTR string.
31 ********************************************************************/
33 static uint32 str_len_uni(UNISTR *source)
40 while (source->buffer[i])
46 /*******************************************************************
47 This should be moved in a more generic lib.
48 ********************************************************************/
50 static BOOL spoolss_io_system_time(char *desc, prs_struct *ps, int depth, SYSTEMTIME *systime)
52 if(!prs_uint16("year", ps, depth, &(systime->year)))
54 if(!prs_uint16("month", ps, depth, &(systime->month)))
56 if(!prs_uint16("dayofweek", ps, depth, &(systime->dayofweek)))
58 if(!prs_uint16("day", ps, depth, &(systime->day)))
60 if(!prs_uint16("hour", ps, depth, &(systime->hour)))
62 if(!prs_uint16("minute", ps, depth, &(systime->minute)))
64 if(!prs_uint16("second", ps, depth, &(systime->second)))
66 if(!prs_uint16("milliseconds", ps, depth, &(systime->milliseconds)))
72 /*******************************************************************
73 ********************************************************************/
75 BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime)
77 systime->year=unixtime->tm_year+1900;
78 systime->month=unixtime->tm_mon+1;
79 systime->dayofweek=unixtime->tm_wday;
80 systime->day=unixtime->tm_mday;
81 systime->hour=unixtime->tm_hour;
82 systime->minute=unixtime->tm_min;
83 systime->second=unixtime->tm_sec;
84 systime->milliseconds=0;
89 /*******************************************************************
90 reads or writes an DOC_INFO structure.
91 ********************************************************************/
93 static BOOL smb_io_doc_info_1(char *desc, DOC_INFO_1 *info_1, prs_struct *ps, int depth)
95 if (info_1 == NULL) return False;
97 prs_debug(ps, depth, desc, "smb_io_doc_info_1");
103 if(!prs_uint32("p_docname", ps, depth, &info_1->p_docname))
105 if(!prs_uint32("p_outputfile", ps, depth, &info_1->p_outputfile))
107 if(!prs_uint32("p_datatype", ps, depth, &info_1->p_datatype))
110 if(!smb_io_unistr2("", &info_1->docname, info_1->p_docname, ps, depth))
112 if(!smb_io_unistr2("", &info_1->outputfile, info_1->p_outputfile, ps, depth))
114 if(!smb_io_unistr2("", &info_1->datatype, info_1->p_datatype, ps, depth))
120 /*******************************************************************
121 reads or writes an DOC_INFO structure.
122 ********************************************************************/
124 static BOOL smb_io_doc_info(char *desc, DOC_INFO *info, prs_struct *ps, int depth)
126 uint32 useless_ptr=0;
128 if (info == NULL) return False;
130 prs_debug(ps, depth, desc, "smb_io_doc_info");
136 if(!prs_uint32("switch_value", ps, depth, &info->switch_value))
139 if(!prs_uint32("doc_info_X ptr", ps, depth, &useless_ptr))
142 switch (info->switch_value)
145 if(!smb_io_doc_info_1("",&info->doc_info_1, ps, depth))
150 this is just a placeholder
152 MSDN July 1998 says doc_info_2 is only on
153 Windows 95, and as Win95 doesn't do RPC to print
154 this case is nearly impossible
156 Maybe one day with Windows for dishwasher 2037 ...
159 /* smb_io_doc_info_2("",&info->doc_info_2, ps, depth); */
162 DEBUG(0,("Something is obviously wrong somewhere !\n"));
169 /*******************************************************************
170 reads or writes an DOC_INFO_CONTAINER structure.
171 ********************************************************************/
173 static BOOL smb_io_doc_info_container(char *desc, DOC_INFO_CONTAINER *cont, prs_struct *ps, int depth)
175 if (cont == NULL) return False;
177 prs_debug(ps, depth, desc, "smb_io_doc_info_container");
183 if(!prs_uint32("level", ps, depth, &cont->level))
186 if(!smb_io_doc_info("",&cont->docinfo, ps, depth))
192 /*******************************************************************
193 reads or writes an NOTIFY OPTION TYPE structure.
194 ********************************************************************/
196 static BOOL smb_io_notify_option_type(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
198 prs_debug(ps, depth, desc, "smb_io_notify_option_type");
204 if(!prs_uint16("type", ps, depth, &type->type))
206 if(!prs_uint16("reserved0", ps, depth, &type->reserved0))
208 if(!prs_uint32("reserved1", ps, depth, &type->reserved1))
210 if(!prs_uint32("reserved2", ps, depth, &type->reserved2))
212 if(!prs_uint32("count", ps, depth, &type->count))
214 if(!prs_uint32("fields_ptr", ps, depth, &type->fields_ptr))
220 /*******************************************************************
221 reads or writes an NOTIFY OPTION TYPE DATA.
222 ********************************************************************/
224 static BOOL smb_io_notify_option_type_data(char *desc, SPOOL_NOTIFY_OPTION_TYPE *type, prs_struct *ps, int depth)
228 prs_debug(ps, depth, desc, "smb_io_notify_option_type_data");
231 /* if there are no fields just return */
232 if (type->fields_ptr==0)
238 if(!prs_uint32("count2", ps, depth, &type->count2))
241 if (type->count2 != type->count)
242 DEBUG(4,("What a mess, count was %x now is %x !\n", type->count, type->count2));
244 /* parse the option type data */
245 for(i=0;i<type->count2;i++)
246 if(!prs_uint16("fields",ps,depth,&type->fields[i]))
251 /*******************************************************************
252 reads or writes an NOTIFY OPTION structure.
253 ********************************************************************/
255 static BOOL smb_io_notify_option_type_ctr(char *desc, SPOOL_NOTIFY_OPTION_TYPE_CTR *ctr , prs_struct *ps, int depth)
259 prs_debug(ps, depth, desc, "smb_io_notify_option_type_ctr");
262 if(!prs_uint32("count", ps, depth, &ctr->count))
266 if (UNMARSHALLING(ps))
267 if((ctr->type=(SPOOL_NOTIFY_OPTION_TYPE *)prs_alloc_mem(ps,ctr->count*sizeof(SPOOL_NOTIFY_OPTION_TYPE))) == NULL)
270 /* the option type struct */
271 for(i=0;i<ctr->count;i++)
272 if(!smb_io_notify_option_type("", &ctr->type[i] , ps, depth))
275 /* the type associated with the option type struct */
276 for(i=0;i<ctr->count;i++)
277 if(!smb_io_notify_option_type_data("", &ctr->type[i] , ps, depth))
283 /*******************************************************************
284 reads or writes an NOTIFY OPTION structure.
285 ********************************************************************/
287 static BOOL smb_io_notify_option(char *desc, SPOOL_NOTIFY_OPTION *option, prs_struct *ps, int depth)
289 prs_debug(ps, depth, desc, "smb_io_notify_option");
292 if(!prs_uint32("version", ps, depth, &option->version))
294 if(!prs_uint32("flags", ps, depth, &option->flags))
296 if(!prs_uint32("count", ps, depth, &option->count))
298 if(!prs_uint32("option_type_ptr", ps, depth, &option->option_type_ptr))
301 /* marshalling or unmarshalling, that would work */
302 if (option->option_type_ptr!=0) {
303 if(!smb_io_notify_option_type_ctr("", &option->ctr ,ps, depth))
307 option->ctr.type=NULL;
314 /*******************************************************************
315 reads or writes an NOTIFY INFO DATA structure.
316 ********************************************************************/
318 static BOOL smb_io_notify_info_data(char *desc,SPOOL_NOTIFY_INFO_DATA *data, prs_struct *ps, int depth)
320 uint32 useless_ptr=0xADDE0FF0;
322 uint32 how_many_words;
326 prs_debug(ps, depth, desc, "smb_io_notify_info_data");
329 how_many_words=data->size;
330 if (how_many_words==POINTER) {
331 how_many_words=TWO_VALUE;
334 isvalue=data->enc_type;
338 if(!prs_uint16("type", ps, depth, &data->type))
340 if(!prs_uint16("field", ps, depth, &data->field))
344 if(!prs_uint32("how many words", ps, depth, &how_many_words))
346 if(!prs_uint32("id", ps, depth, &data->id))
348 if(!prs_uint32("how many words", ps, depth, &how_many_words))
355 if(!prs_uint32("value[0]", ps, depth, &data->notify_data.value[0]))
357 if(!prs_uint32("value[1]", ps, depth, &data->notify_data.value[1]))
362 /* length in ascii including \0 */
363 x=2*(data->notify_data.data.length+1);
364 if(!prs_uint32("string length", ps, depth, &x ))
366 if(!prs_uint32("pointer", ps, depth, &useless_ptr))
374 /*******************************************************************
375 reads or writes an NOTIFY INFO DATA structure.
376 ********************************************************************/
378 BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
379 prs_struct *ps, int depth)
384 prs_debug(ps, depth, desc, "smb_io_notify_info_data_strings");
390 isvalue=data->enc_type;
392 if (isvalue==False) {
393 /* length of string in unicode include \0 */
394 x=data->notify_data.data.length+1;
395 if(!prs_uint32("string length", ps, depth, &x ))
397 if (MARSHALLING(ps)) {
398 /* These are already in little endian format. Don't byte swap. */
401 /* No memory allocated for this string
402 therefore following the data.string
403 pointer is a bad idea. Use a pointer to
404 the uint32 length union member to
405 provide a source for a unicode NULL */
407 if(!prs_uint8s(True,"string",ps,depth, (uint8 *)&data->notify_data.data.length,x*2))
410 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
415 /* Tallocate memory for string */
417 data->notify_data.data.string = (uint16 *)prs_alloc_mem(ps, x * 2);
418 if (!data->notify_data.data.string)
421 if(!prs_uint16uni(True,"string",ps,depth,data->notify_data.data.string,x))
431 /*******************************************************************
432 reads or writes an NOTIFY INFO structure.
433 ********************************************************************/
435 static BOOL smb_io_notify_info(char *desc, SPOOL_NOTIFY_INFO *info, prs_struct *ps, int depth)
439 prs_debug(ps, depth, desc, "smb_io_notify_info");
445 if(!prs_uint32("count", ps, depth, &info->count))
447 if(!prs_uint32("version", ps, depth, &info->version))
449 if(!prs_uint32("flags", ps, depth, &info->flags))
451 if(!prs_uint32("count", ps, depth, &info->count))
454 for (i=0;i<info->count;i++) {
455 if(!smb_io_notify_info_data(desc, &info->data[i], ps, depth))
459 /* now do the strings at the end of the stream */
460 for (i=0;i<info->count;i++) {
461 if(!smb_io_notify_info_data_strings(desc, &info->data[i], ps, depth))
468 /*******************************************************************
469 ********************************************************************/
471 static BOOL spool_io_user_level_1(char *desc, SPOOL_USER_1 *q_u, prs_struct *ps, int depth)
473 prs_debug(ps, depth, desc, "");
477 if (UNMARSHALLING(ps))
482 if (!prs_uint32("size", ps, depth, &q_u->size))
484 if (!prs_uint32("client_name_ptr", ps, depth, &q_u->client_name_ptr))
486 if (!prs_uint32("user_name_ptr", ps, depth, &q_u->user_name_ptr))
488 if (!prs_uint32("build", ps, depth, &q_u->build))
490 if (!prs_uint32("major", ps, depth, &q_u->major))
492 if (!prs_uint32("minor", ps, depth, &q_u->minor))
494 if (!prs_uint32("processor", ps, depth, &q_u->processor))
497 if (!smb_io_unistr2("", &q_u->client_name, q_u->client_name_ptr, ps, depth))
501 if (!smb_io_unistr2("", &q_u->user_name, q_u->user_name_ptr, ps, depth))
507 /*******************************************************************
508 ********************************************************************/
510 static BOOL spool_io_user_level(char *desc, SPOOL_USER_CTR *q_u, prs_struct *ps, int depth)
515 prs_debug(ps, depth, desc, "spool_io_user_level");
520 if (!prs_uint32("level", ps, depth, &q_u->level))
522 if (!prs_uint32("ptr", ps, depth, &q_u->ptr))
525 switch (q_u->level) {
527 if (!spool_io_user_level_1("", &q_u->user1, ps, depth))
537 /*******************************************************************
538 * read or write a DEVICEMODE struct.
539 * on reading allocate memory for the private member
540 ********************************************************************/
542 BOOL spoolss_io_devmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode)
544 prs_debug(ps, depth, desc, "spoolss_io_devmode");
547 if (UNMARSHALLING(ps)) {
548 devmode->devicename.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
549 if (devmode->devicename.buffer == NULL)
553 if (!prs_uint16uni(True,"devicename", ps, depth, devmode->devicename.buffer, 32))
555 if (!prs_uint16("specversion", ps, depth, &devmode->specversion))
557 if (!prs_uint16("driverversion", ps, depth, &devmode->driverversion))
559 if (!prs_uint16("size", ps, depth, &devmode->size))
561 if (!prs_uint16("driverextra", ps, depth, &devmode->driverextra))
563 if (!prs_uint32("fields", ps, depth, &devmode->fields))
565 if (!prs_uint16("orientation", ps, depth, &devmode->orientation))
567 if (!prs_uint16("papersize", ps, depth, &devmode->papersize))
569 if (!prs_uint16("paperlength", ps, depth, &devmode->paperlength))
571 if (!prs_uint16("paperwidth", ps, depth, &devmode->paperwidth))
573 if (!prs_uint16("scale", ps, depth, &devmode->scale))
575 if (!prs_uint16("copies", ps, depth, &devmode->copies))
577 if (!prs_uint16("defaultsource", ps, depth, &devmode->defaultsource))
579 if (!prs_uint16("printquality", ps, depth, &devmode->printquality))
581 if (!prs_uint16("color", ps, depth, &devmode->color))
583 if (!prs_uint16("duplex", ps, depth, &devmode->duplex))
585 if (!prs_uint16("yresolution", ps, depth, &devmode->yresolution))
587 if (!prs_uint16("ttoption", ps, depth, &devmode->ttoption))
589 if (!prs_uint16("collate", ps, depth, &devmode->collate))
592 if (UNMARSHALLING(ps)) {
593 devmode->formname.buffer = (uint16 *)prs_alloc_mem(ps, 32 * sizeof(uint16) );
594 if (devmode->formname.buffer == NULL)
598 if (!prs_uint16uni(True, "formname", ps, depth, devmode->formname.buffer, 32))
600 if (!prs_uint16("logpixels", ps, depth, &devmode->logpixels))
602 if (!prs_uint32("bitsperpel", ps, depth, &devmode->bitsperpel))
604 if (!prs_uint32("pelswidth", ps, depth, &devmode->pelswidth))
606 if (!prs_uint32("pelsheight", ps, depth, &devmode->pelsheight))
608 if (!prs_uint32("displayflags", ps, depth, &devmode->displayflags))
610 if (!prs_uint32("displayfrequency", ps, depth, &devmode->displayfrequency))
612 if (!prs_uint32("icmmethod", ps, depth, &devmode->icmmethod))
614 if (!prs_uint32("icmintent", ps, depth, &devmode->icmintent))
616 if (!prs_uint32("mediatype", ps, depth, &devmode->mediatype))
618 if (!prs_uint32("dithertype", ps, depth, &devmode->dithertype))
620 if (!prs_uint32("reserved1", ps, depth, &devmode->reserved1))
622 if (!prs_uint32("reserved2", ps, depth, &devmode->reserved2))
624 if (!prs_uint32("panningwidth", ps, depth, &devmode->panningwidth))
626 if (!prs_uint32("panningheight", ps, depth, &devmode->panningheight))
629 if (devmode->driverextra!=0) {
630 if (UNMARSHALLING(ps)) {
631 devmode->private=(uint8 *)prs_alloc_mem(ps, devmode->driverextra*sizeof(uint8));
632 if(devmode->private == NULL)
634 DEBUG(7,("spoolss_io_devmode: allocated memory [%d] for private\n",devmode->driverextra));
637 DEBUG(7,("spoolss_io_devmode: parsing [%d] bytes of private\n",devmode->driverextra));
638 if (!prs_uint8s(True, "private", ps, depth, devmode->private, devmode->driverextra))
645 /*******************************************************************
646 Read or write a DEVICEMODE container
647 ********************************************************************/
649 static BOOL spoolss_io_devmode_cont(char *desc, DEVMODE_CTR *dm_c, prs_struct *ps, int depth)
654 prs_debug(ps, depth, desc, "spoolss_io_devmode_cont");
660 if (!prs_uint32("size", ps, depth, &dm_c->size))
663 if (!prs_uint32("devmode_ptr", ps, depth, &dm_c->devmode_ptr))
666 if (dm_c->size==0 || dm_c->devmode_ptr==0) {
667 if (UNMARSHALLING(ps))
668 /* if while reading there is no DEVMODE ... */
673 /* so we have a DEVICEMODE to follow */
674 if (UNMARSHALLING(ps)) {
675 DEBUG(9,("Allocating memory for spoolss_io_devmode\n"));
676 dm_c->devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE));
677 if(dm_c->devmode == NULL)
681 /* this is bad code, shouldn't be there */
682 if (!prs_uint32("size", ps, depth, &dm_c->size))
685 if (!spoolss_io_devmode(desc, ps, depth, dm_c->devmode))
691 /*******************************************************************
692 ********************************************************************/
694 static BOOL spoolss_io_printer_default(char *desc, PRINTER_DEFAULT *pd, prs_struct *ps, int depth)
699 prs_debug(ps, depth, desc, "spoolss_io_printer_default");
702 if (!prs_uint32("datatype_ptr", ps, depth, &pd->datatype_ptr))
705 if (!smb_io_unistr2("datatype", &pd->datatype, pd->datatype_ptr, ps,depth))
711 if (!spoolss_io_devmode_cont("", &pd->devmode_cont, ps, depth))
714 if (!prs_uint32("access_required", ps, depth, &pd->access_required))
720 /*******************************************************************
722 ********************************************************************/
724 BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
725 const fstring printername,
726 const fstring datatype,
727 uint32 access_required,
728 const fstring clientname,
729 const fstring user_name)
731 DEBUG(5,("make_spoolss_q_open_printer_ex\n"));
732 q_u->printername_ptr = (printername!=NULL)?1:0;
733 init_unistr2(&q_u->printername, printername, strlen(printername)+1);
735 q_u->printer_default.datatype_ptr = 0;
737 q_u->printer_default.datatype_ptr = (datatype!=NULL)?1:0;
738 init_unistr2(&q_u->printer_default.datatype, datatype, strlen(datatype));
740 q_u->printer_default.devmode_cont.size=0;
741 q_u->printer_default.devmode_cont.devmode_ptr=0;
742 q_u->printer_default.devmode_cont.devmode=NULL;
743 q_u->printer_default.access_required=access_required;
745 q_u->user_ctr.level=1;
747 q_u->user_ctr.user1.size=strlen(clientname)+strlen(user_name)+10;
748 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
749 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
750 q_u->user_ctr.user1.build=1381;
751 q_u->user_ctr.user1.major=2;
752 q_u->user_ctr.user1.minor=0;
753 q_u->user_ctr.user1.processor=0;
754 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
755 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
760 /*******************************************************************
762 ********************************************************************/
763 BOOL make_spoolss_q_addprinterex(
765 SPOOL_Q_ADDPRINTEREX *q_u,
766 const char *srv_name,
767 const char* clientname,
768 const char* user_name,
770 PRINTER_INFO_CTR *ctr)
772 DEBUG(5,("make_spoolss_q_addprinterex\n"));
774 if (!ctr) return False;
776 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
777 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name));
781 q_u->info.level = level;
782 q_u->info.info_ptr = (ctr->printers_2!=NULL)?1:0;
786 /* init q_u->info.info2 from *info */
787 if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2))
789 DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n"));
797 q_u->unk0 = q_u->unk1 = q_u->unk2 = q_u->unk3 = 0;
801 q_u->user_ctr.level=1;
803 q_u->user_ctr.user1.client_name_ptr = (clientname!=NULL)?1:0;
804 q_u->user_ctr.user1.user_name_ptr = (user_name!=NULL)?1:0;
805 q_u->user_ctr.user1.build=1381;
806 q_u->user_ctr.user1.major=2;
807 q_u->user_ctr.user1.minor=0;
808 q_u->user_ctr.user1.processor=0;
809 init_unistr2(&q_u->user_ctr.user1.client_name, clientname, strlen(clientname)+1);
810 init_unistr2(&q_u->user_ctr.user1.user_name, user_name, strlen(user_name)+1);
811 q_u->user_ctr.user1.size=q_u->user_ctr.user1.user_name.uni_str_len +
812 q_u->user_ctr.user1.client_name.uni_str_len + 2;
817 /*******************************************************************
818 create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct
819 *******************************************************************/
821 BOOL make_spoolss_printer_info_2(
823 SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
828 SPOOL_PRINTER_INFO_LEVEL_2 *inf;
830 /* allocate the necessary memory */
831 if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2))))
833 DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n"));
837 inf->servername_ptr = (info->servername.buffer!=NULL)?1:0;
838 inf->printername_ptr = (info->printername.buffer!=NULL)?1:0;
839 inf->sharename_ptr = (info->sharename.buffer!=NULL)?1:0;
840 inf->portname_ptr = (info->portname.buffer!=NULL)?1:0;
841 inf->drivername_ptr = (info->drivername.buffer!=NULL)?1:0;
842 inf->comment_ptr = (info->comment.buffer!=NULL)?1:0;
843 inf->location_ptr = (info->location.buffer!=NULL)?1:0;
844 inf->devmode_ptr = (info->devmode!=NULL)?1:0;
845 inf->sepfile_ptr = (info->sepfile.buffer!=NULL)?1:0;
846 inf->printprocessor_ptr = (info->printprocessor.buffer!=NULL)?1:0;
847 inf->datatype_ptr = (info->datatype.buffer!=NULL)?1:0;
848 inf->parameters_ptr = (info->parameters.buffer!=NULL)?1:0;
849 inf->secdesc_ptr = (info->secdesc!=NULL)?1:0;
850 inf->attributes = info->attributes;
851 inf->priority = info->priority;
852 inf->default_priority = info->defaultpriority;
853 inf->starttime = info->starttime;
854 inf->untiltime = info->untiltime;
855 inf->cjobs = info->cjobs;
856 inf->averageppm = info->averageppm;
857 init_unistr2_from_unistr(&inf->servername, &info->servername);
858 init_unistr2_from_unistr(&inf->printername, &info->printername);
859 init_unistr2_from_unistr(&inf->sharename, &info->sharename);
860 init_unistr2_from_unistr(&inf->portname, &info->portname);
861 init_unistr2_from_unistr(&inf->drivername, &info->drivername);
862 init_unistr2_from_unistr(&inf->comment, &info->comment);
863 init_unistr2_from_unistr(&inf->location, &info->location);
864 init_unistr2_from_unistr(&inf->sepfile, &info->sepfile);
865 init_unistr2_from_unistr(&inf->printprocessor, &info->printprocessor);
866 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
867 init_unistr2_from_unistr(&inf->parameters, &info->parameters);
868 init_unistr2_from_unistr(&inf->datatype, &info->datatype);
869 inf->secdesc = inf->secdesc;
876 /*******************************************************************
878 * called from spoolss_q_open_printer_ex (srv_spoolss.c)
879 ********************************************************************/
881 BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth)
886 prs_debug(ps, depth, desc, "spoolss_io_q_open_printer_ex");
892 if (!prs_uint32("printername_ptr", ps, depth, &q_u->printername_ptr))
894 if (!smb_io_unistr2("", &q_u->printername, q_u->printername_ptr, ps,depth))
900 if (!spoolss_io_printer_default("", &q_u->printer_default, ps, depth))
903 if (!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
905 if (!spool_io_user_level("", &q_u->user_ctr, ps, depth))
911 /*******************************************************************
913 ********************************************************************/
914 BOOL make_spoolss_q_deleteprinterdriver(
916 SPOOL_Q_DELETEPRINTERDRIVER *q_u,
922 DEBUG(5,("make_spoolss_q_deleteprinterdriver\n"));
924 q_u->server_ptr = (server!=NULL)?1:0;
926 /* these must be NULL terminated or else NT4 will
927 complain about invalid parameters --jerry */
928 init_unistr2(&q_u->server, server, strlen(server)+1);
929 init_unistr2(&q_u->arch, arch, strlen(arch)+1);
930 init_unistr2(&q_u->driver, driver, strlen(driver)+1);
936 /*******************************************************************
938 * called from static spoolss_r_open_printer_ex (srv_spoolss.c)
939 * called from spoolss_open_printer_ex (cli_spoolss.c)
940 ********************************************************************/
942 BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth)
944 if (r_u == NULL) return False;
946 prs_debug(ps, depth, desc, "spoolss_io_r_open_printer_ex");
952 if (!smb_io_pol_hnd("printer handle",&(r_u->handle),ps,depth))
955 if (!prs_werror("status code", ps, depth, &(r_u->status)))
961 /*******************************************************************
963 ********************************************************************/
965 BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
966 const POLICY_HND *handle,
967 UNISTR2 *valuename, uint32 size)
969 if (q_u == NULL) return False;
971 DEBUG(5,("make_spoolss_q_getprinterdata\n"));
973 q_u->handle = *handle;
974 copy_unistr2(&q_u->valuename, valuename);
980 /*******************************************************************
982 * called from spoolss_q_getprinterdata (srv_spoolss.c)
983 ********************************************************************/
985 BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth)
990 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdata");
995 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
999 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1003 if (!prs_uint32("size", ps, depth, &q_u->size))
1009 /*******************************************************************
1011 * called from spoolss_q_deleteprinterdata (srv_spoolss.c)
1012 ********************************************************************/
1014 BOOL spoolss_io_q_deleteprinterdata(char *desc, SPOOL_Q_DELETEPRINTERDATA *q_u, prs_struct *ps, int depth)
1019 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdata");
1024 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1028 if (!smb_io_unistr2("valuename", &q_u->valuename,True,ps,depth))
1034 /*******************************************************************
1035 * write a structure.
1036 * called from spoolss_r_deleteprinterdata (srv_spoolss.c)
1037 ********************************************************************/
1039 BOOL spoolss_io_r_deleteprinterdata(char *desc, SPOOL_R_DELETEPRINTERDATA *r_u, prs_struct *ps, int depth)
1041 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdata");
1043 if(!prs_werror("status", ps, depth, &r_u->status))
1049 /*******************************************************************
1050 * write a structure.
1051 * called from spoolss_r_getprinterdata (srv_spoolss.c)
1052 ********************************************************************/
1054 BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth)
1059 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
1064 if (!prs_uint32("type", ps, depth, &r_u->type))
1066 if (!prs_uint32("size", ps, depth, &r_u->size))
1069 if (!prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size))
1075 if (!prs_uint32("needed", ps, depth, &r_u->needed))
1077 if (!prs_werror("status", ps, depth, &r_u->status))
1083 /*******************************************************************
1085 ********************************************************************/
1087 BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd)
1089 if (q_u == NULL) return False;
1091 DEBUG(5,("make_spoolss_q_closeprinter\n"));
1093 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
1098 /*******************************************************************
1100 * called from static spoolss_q_abortprinter (srv_spoolss.c)
1101 * called from spoolss_abortprinter (cli_spoolss.c)
1102 ********************************************************************/
1104 BOOL spoolss_io_q_abortprinter(char *desc, SPOOL_Q_ABORTPRINTER *q_u, prs_struct *ps, int depth)
1106 if (q_u == NULL) return False;
1108 prs_debug(ps, depth, desc, "spoolss_io_q_abortprinter");
1114 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1120 /*******************************************************************
1121 * write a structure.
1122 * called from spoolss_r_abortprinter (srv_spoolss.c)
1123 ********************************************************************/
1125 BOOL spoolss_io_r_abortprinter(char *desc, SPOOL_R_ABORTPRINTER *r_u, prs_struct *ps, int depth)
1127 prs_debug(ps, depth, desc, "spoolss_io_r_abortprinter");
1129 if(!prs_werror("status", ps, depth, &r_u->status))
1135 /*******************************************************************
1137 * called from static spoolss_q_deleteprinter (srv_spoolss.c)
1138 * called from spoolss_deleteprinter (cli_spoolss.c)
1139 ********************************************************************/
1141 BOOL spoolss_io_q_deleteprinter(char *desc, SPOOL_Q_DELETEPRINTER *q_u, prs_struct *ps, int depth)
1143 if (q_u == NULL) return False;
1145 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinter");
1151 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1157 /*******************************************************************
1158 * write a structure.
1159 * called from static spoolss_r_deleteprinter (srv_spoolss.c)
1160 * called from spoolss_deleteprinter (cli_spoolss.c)
1161 ********************************************************************/
1163 BOOL spoolss_io_r_deleteprinter(char *desc, SPOOL_R_DELETEPRINTER *r_u, prs_struct *ps, int depth)
1165 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinter");
1171 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1173 if (!prs_werror("status", ps, depth, &r_u->status))
1180 /*******************************************************************
1182 * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
1183 * called from spoolss_deleteprinterdriver (cli_spoolss.c)
1184 ********************************************************************/
1186 BOOL spoolss_io_q_deleteprinterdriver(char *desc, SPOOL_Q_DELETEPRINTERDRIVER *q_u, prs_struct *ps, int depth)
1188 if (q_u == NULL) return False;
1190 prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriver");
1196 if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
1198 if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
1200 if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
1202 if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
1210 /*******************************************************************
1211 * write a structure.
1212 ********************************************************************/
1213 BOOL spoolss_io_r_deleteprinterdriver(char *desc, SPOOL_R_DELETEPRINTERDRIVER *r_u, prs_struct *ps, int depth)
1215 if (r_u == NULL) return False;
1217 prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriver");
1223 if (!prs_werror("status", ps, depth, &r_u->status))
1231 /*******************************************************************
1233 * called from static spoolss_q_closeprinter (srv_spoolss.c)
1234 * called from spoolss_closeprinter (cli_spoolss.c)
1235 ********************************************************************/
1237 BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth)
1239 if (q_u == NULL) return False;
1241 prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
1247 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1253 /*******************************************************************
1254 * write a structure.
1255 * called from static spoolss_r_closeprinter (srv_spoolss.c)
1256 * called from spoolss_closeprinter (cli_spoolss.c)
1257 ********************************************************************/
1259 BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth)
1261 prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
1267 if (!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
1269 if (!prs_werror("status", ps, depth, &r_u->status))
1275 /*******************************************************************
1277 * called from spoolss_q_startdocprinter (srv_spoolss.c)
1278 ********************************************************************/
1280 BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth)
1282 if (q_u == NULL) return False;
1284 prs_debug(ps, depth, desc, "spoolss_io_q_startdocprinter");
1290 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1293 if(!smb_io_doc_info_container("",&q_u->doc_info_container, ps, depth))
1299 /*******************************************************************
1300 * write a structure.
1301 * called from spoolss_r_startdocprinter (srv_spoolss.c)
1302 ********************************************************************/
1304 BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth)
1306 prs_debug(ps, depth, desc, "spoolss_io_r_startdocprinter");
1308 if(!prs_uint32("jobid", ps, depth, &r_u->jobid))
1310 if(!prs_werror("status", ps, depth, &r_u->status))
1316 /*******************************************************************
1318 * called from spoolss_q_enddocprinter (srv_spoolss.c)
1319 ********************************************************************/
1321 BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth)
1323 if (q_u == NULL) return False;
1325 prs_debug(ps, depth, desc, "spoolss_io_q_enddocprinter");
1331 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1337 /*******************************************************************
1338 * write a structure.
1339 * called from spoolss_r_enddocprinter (srv_spoolss.c)
1340 ********************************************************************/
1342 BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth)
1344 prs_debug(ps, depth, desc, "spoolss_io_r_enddocprinter");
1346 if(!prs_werror("status", ps, depth, &r_u->status))
1352 /*******************************************************************
1354 * called from spoolss_q_startpageprinter (srv_spoolss.c)
1355 ********************************************************************/
1357 BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth)
1359 if (q_u == NULL) return False;
1361 prs_debug(ps, depth, desc, "spoolss_io_q_startpageprinter");
1367 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1373 /*******************************************************************
1374 * write a structure.
1375 * called from spoolss_r_startpageprinter (srv_spoolss.c)
1376 ********************************************************************/
1378 BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth)
1380 prs_debug(ps, depth, desc, "spoolss_io_r_startpageprinter");
1382 if(!prs_werror("status", ps, depth, &r_u->status))
1388 /*******************************************************************
1390 * called from spoolss_q_endpageprinter (srv_spoolss.c)
1391 ********************************************************************/
1393 BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth)
1395 if (q_u == NULL) return False;
1397 prs_debug(ps, depth, desc, "spoolss_io_q_endpageprinter");
1403 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1409 /*******************************************************************
1410 * write a structure.
1411 * called from spoolss_r_endpageprinter (srv_spoolss.c)
1412 ********************************************************************/
1414 BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth)
1416 prs_debug(ps, depth, desc, "spoolss_io_r_endpageprinter");
1418 if(!prs_werror("status", ps, depth, &r_u->status))
1424 /*******************************************************************
1426 * called from spoolss_q_writeprinter (srv_spoolss.c)
1427 ********************************************************************/
1429 BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth)
1431 if (q_u == NULL) return False;
1433 prs_debug(ps, depth, desc, "spoolss_io_q_writeprinter");
1439 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1441 if(!prs_uint32("buffer_size", ps, depth, &q_u->buffer_size))
1444 if (q_u->buffer_size!=0)
1446 if (UNMARSHALLING(ps))
1447 q_u->buffer=(uint8 *)prs_alloc_mem(ps,q_u->buffer_size*sizeof(uint8));
1448 if(q_u->buffer == NULL)
1450 if(!prs_uint8s(True, "buffer", ps, depth, q_u->buffer, q_u->buffer_size))
1455 if(!prs_uint32("buffer_size2", ps, depth, &q_u->buffer_size2))
1461 /*******************************************************************
1462 * write a structure.
1463 * called from spoolss_r_writeprinter (srv_spoolss.c)
1464 ********************************************************************/
1466 BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth)
1468 prs_debug(ps, depth, desc, "spoolss_io_r_writeprinter");
1470 if(!prs_uint32("buffer_written", ps, depth, &r_u->buffer_written))
1472 if(!prs_werror("status", ps, depth, &r_u->status))
1478 /*******************************************************************
1480 * called from spoolss_q_rffpcnex (srv_spoolss.c)
1481 ********************************************************************/
1483 BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u, prs_struct *ps, int depth)
1485 prs_debug(ps, depth, desc, "spoolss_io_q_rffpcnex");
1491 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
1493 if(!prs_uint32("flags", ps, depth, &q_u->flags))
1495 if(!prs_uint32("options", ps, depth, &q_u->options))
1497 if(!prs_uint32("localmachine_ptr", ps, depth, &q_u->localmachine_ptr))
1499 if(!smb_io_unistr2("localmachine", &q_u->localmachine, q_u->localmachine_ptr, ps, depth))
1505 if(!prs_uint32("printerlocal", ps, depth, &q_u->printerlocal))
1508 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1511 if (q_u->option_ptr!=0) {
1513 if (UNMARSHALLING(ps))
1514 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1517 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1524 /*******************************************************************
1525 * write a structure.
1526 * called from spoolss_r_rffpcnex (srv_spoolss.c)
1527 ********************************************************************/
1529 BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, prs_struct *ps, int depth)
1531 prs_debug(ps, depth, desc, "spoolss_io_r_rffpcnex");
1534 if(!prs_werror("status", ps, depth, &r_u->status))
1540 /*******************************************************************
1542 * called from spoolss_q_rfnpcnex (srv_spoolss.c)
1543 ********************************************************************/
1545 BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u, prs_struct *ps, int depth)
1547 prs_debug(ps, depth, desc, "spoolss_io_q_rfnpcnex");
1553 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
1556 if(!prs_uint32("change", ps, depth, &q_u->change))
1559 if(!prs_uint32("option_ptr", ps, depth, &q_u->option_ptr))
1562 if (q_u->option_ptr!=0) {
1564 if (UNMARSHALLING(ps))
1565 if((q_u->option=(SPOOL_NOTIFY_OPTION *)prs_alloc_mem(ps,sizeof(SPOOL_NOTIFY_OPTION))) == NULL)
1568 if(!smb_io_notify_option("notify option", q_u->option, ps, depth))
1575 /*******************************************************************
1576 * write a structure.
1577 * called from spoolss_r_rfnpcnex (srv_spoolss.c)
1578 ********************************************************************/
1580 BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, int depth)
1582 prs_debug(ps, depth, desc, "spoolss_io_r_rfnpcnex");
1588 if (!prs_uint32("info_ptr", ps, depth, &r_u->info_ptr))
1591 if(!smb_io_notify_info("notify info", &r_u->info ,ps,depth))
1596 if(!prs_werror("status", ps, depth, &r_u->status))
1602 /*******************************************************************
1603 * return the length of a uint16 (obvious, but the code is clean)
1604 ********************************************************************/
1606 static uint32 size_of_uint16(uint16 *value)
1608 return (sizeof(*value));
1611 /*******************************************************************
1612 * return the length of a uint32 (obvious, but the code is clean)
1613 ********************************************************************/
1615 static uint32 size_of_uint32(uint32 *value)
1617 return (sizeof(*value));
1620 /*******************************************************************
1621 * return the length of a NTTIME (obvious, but the code is clean)
1622 ********************************************************************/
1624 static uint32 size_of_nttime(NTTIME *value)
1626 return (sizeof(*value));
1629 /*******************************************************************
1630 * return the length of a UNICODE string in number of char, includes:
1631 * - the leading zero
1632 * - the relative pointer size
1633 ********************************************************************/
1635 static uint32 size_of_relative_string(UNISTR *string)
1639 size=str_len_uni(string); /* the string length */
1640 size=size+1; /* add the leading zero */
1641 size=size*2; /* convert in char */
1642 /* Ensure size is 4 byte multiple (prs_align is being called...). */
1643 size += ((4 - (size & 3)) & 3);
1644 size=size+4; /* add the size of the ptr */
1649 /*******************************************************************
1650 * return the length of a uint32 (obvious, but the code is clean)
1651 ********************************************************************/
1653 static uint32 size_of_device_mode(DEVICEMODE *devmode)
1658 return (4+devmode->size+devmode->driverextra);
1661 /*******************************************************************
1662 * return the length of a uint32 (obvious, but the code is clean)
1663 ********************************************************************/
1665 static uint32 size_of_systemtime(SYSTEMTIME *systime)
1670 return (sizeof(SYSTEMTIME) +4);
1673 /*******************************************************************
1674 * write a UNICODE string.
1675 * used by all the RPC structs passing a buffer
1676 ********************************************************************/
1678 static BOOL spoolss_smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
1683 prs_debug(ps, depth, desc, "spoolss_smb_io_unistr");
1686 /* there should be no align here as it can mess up
1687 parsing a NEW_BUFFER->prs */
1693 if (!prs_unistr("unistr", ps, depth, uni))
1699 /*******************************************************************
1700 * write a UNICODE string and its relative pointer.
1701 * used by all the RPC structs passing a buffer
1703 * As I'm a nice guy, I'm forcing myself to explain this code.
1704 * MS did a good job in the overall spoolss code except in some
1705 * functions where they are passing the API buffer directly in the
1706 * RPC request/reply. That's to maintain compatiility at the API level.
1707 * They could have done it the good way the first time.
1709 * So what happen is: the strings are written at the buffer's end,
1710 * in the reverse order of the original structure. Some pointers to
1711 * the strings are also in the buffer. Those are relative to the
1714 * If you don't understand or want to change that function,
1715 * first get in touch with me: jfm@samba.org
1717 ********************************************************************/
1719 static BOOL smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR *string)
1721 prs_struct *ps=&buffer->prs;
1723 if (MARSHALLING(ps)) {
1724 uint32 struct_offset = prs_offset(ps);
1725 uint32 relative_offset;
1727 buffer->string_at_end -= (size_of_relative_string(string) - 4);
1728 if(!prs_set_offset(ps, buffer->string_at_end))
1732 buffer->string_at_end = prs_offset(ps);
1734 /* write the string */
1735 if (!smb_io_unistr(desc, string, ps, depth))
1738 if(!prs_set_offset(ps, struct_offset))
1741 relative_offset=buffer->string_at_end - buffer->struct_start;
1742 /* write its offset */
1743 if (!prs_uint32("offset", ps, depth, &relative_offset))
1749 /* read the offset */
1750 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
1753 old_offset = prs_offset(ps);
1754 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
1757 /* read the string */
1758 if (!spoolss_smb_io_unistr(desc, string, ps, depth))
1761 if(!prs_set_offset(ps, old_offset))
1767 /*******************************************************************
1768 * write a array of UNICODE strings and its relative pointer.
1769 * used by 2 RPC structs
1770 ********************************************************************/
1772 static BOOL smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, uint16 **string)
1776 prs_struct *ps=&buffer->prs;
1778 if (MARSHALLING(ps)) {
1779 uint32 struct_offset = prs_offset(ps);
1780 uint32 relative_offset;
1787 /* first write the last 0 */
1788 buffer->string_at_end -= 2;
1789 if(!prs_set_offset(ps, buffer->string_at_end))
1792 if(!prs_uint16("leading zero", ps, depth, &zero))
1795 while (p && (*p!=0)) {
1799 /* Yes this should be malloc not talloc. Don't change. */
1801 chaine.buffer = malloc((q-p+1)*sizeof(uint16));
1802 if (chaine.buffer == NULL)
1805 memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
1807 buffer->string_at_end -= (q-p+1)*sizeof(uint16);
1809 if(!prs_set_offset(ps, buffer->string_at_end)) {
1810 free(chaine.buffer);
1814 /* write the string */
1815 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth)) {
1816 free(chaine.buffer);
1822 free(chaine.buffer);
1825 if(!prs_set_offset(ps, struct_offset))
1828 relative_offset=buffer->string_at_end - buffer->struct_start;
1829 /* write its offset */
1830 if (!prs_uint32("offset", ps, depth, &relative_offset))
1838 uint16 *chaine2=NULL;
1841 size_t realloc_size = 0;
1845 /* read the offset */
1846 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1849 old_offset = prs_offset(ps);
1850 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1854 if (!spoolss_smb_io_unistr(desc, &chaine, ps, depth))
1857 l_chaine=str_len_uni(&chaine);
1859 /* we're going to add two more bytes here in case this
1860 is the last string in the array and we need to add
1861 an extra NULL for termination */
1866 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
1868 /* Yes this should be realloc - it's freed below. JRA */
1870 if((tc2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL) {
1871 if (chaine2) free(chaine2);
1875 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1876 l_chaine2+=l_chaine+1;
1879 } while(l_chaine!=0);
1881 /* the end should be bould NULL terminated so add
1882 the second one here */
1885 chaine2[l_chaine2] = '\0';
1886 *string=(uint16 *)talloc_memdup(prs_get_mem_context(ps),chaine2,realloc_size);
1890 if(!prs_set_offset(ps, old_offset))
1896 /*******************************************************************
1897 Parse a DEVMODE structure and its relative pointer.
1898 ********************************************************************/
1900 static BOOL smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
1902 prs_struct *ps= &buffer->prs;
1904 prs_debug(ps, depth, desc, "smb_io_relsecdesc");
1907 if (MARSHALLING(ps)) {
1908 uint32 struct_offset = prs_offset(ps);
1909 uint32 relative_offset;
1912 relative_offset = 0;
1913 if (!prs_uint32("offset", ps, depth, &relative_offset))
1918 if (*secdesc != NULL) {
1919 buffer->string_at_end -= sec_desc_size(*secdesc);
1921 if(!prs_set_offset(ps, buffer->string_at_end))
1923 /* write the secdesc */
1924 if (!sec_io_desc(desc, secdesc, ps, depth))
1927 if(!prs_set_offset(ps, struct_offset))
1931 relative_offset=buffer->string_at_end - buffer->struct_start;
1932 /* write its offset */
1934 if (!prs_uint32("offset", ps, depth, &relative_offset))
1939 /* read the offset */
1940 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1943 old_offset = prs_offset(ps);
1944 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1948 if (!sec_io_desc(desc, secdesc, ps, depth))
1951 if(!prs_set_offset(ps, old_offset))
1957 /*******************************************************************
1958 Parse a DEVMODE structure and its relative pointer.
1959 ********************************************************************/
1961 static BOOL smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1963 prs_struct *ps=&buffer->prs;
1965 prs_debug(ps, depth, desc, "smb_io_reldevmode");
1968 if (MARSHALLING(ps)) {
1969 uint32 struct_offset = prs_offset(ps);
1970 uint32 relative_offset;
1972 if (*devmode == NULL) {
1974 if (!prs_uint32("offset", ps, depth, &relative_offset))
1976 DEBUG(8, ("boing, the devmode was NULL\n"));
1981 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1983 if(!prs_set_offset(ps, buffer->string_at_end))
1986 /* write the DEVMODE */
1987 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1990 if(!prs_set_offset(ps, struct_offset))
1993 relative_offset=buffer->string_at_end - buffer->struct_start;
1994 /* write its offset */
1995 if (!prs_uint32("offset", ps, depth, &relative_offset))
2001 /* read the offset */
2002 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2005 old_offset = prs_offset(ps);
2006 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2009 /* read the string */
2010 if((*devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE))) == NULL)
2012 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2015 if(!prs_set_offset(ps, old_offset))
2021 /*******************************************************************
2022 Parse a PRINTER_INFO_0 structure.
2023 ********************************************************************/
2025 BOOL smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2027 prs_struct *ps=&buffer->prs;
2029 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2032 buffer->struct_start=prs_offset(ps);
2034 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2036 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2039 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2041 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2043 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2046 if(!prs_uint16("year", ps, depth, &info->year))
2048 if(!prs_uint16("month", ps, depth, &info->month))
2050 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2052 if(!prs_uint16("day", ps, depth, &info->day))
2054 if(!prs_uint16("hour", ps, depth, &info->hour))
2056 if(!prs_uint16("minute", ps, depth, &info->minute))
2058 if(!prs_uint16("second", ps, depth, &info->second))
2060 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2063 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2065 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2068 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2070 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2072 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2074 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2076 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2078 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2080 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2082 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2084 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2086 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2088 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2090 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2092 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2094 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2096 if(!prs_uint32("status" , ps, depth, &info->status))
2098 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2100 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2102 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2104 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2106 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2108 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2110 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2112 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2114 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2116 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2122 /*******************************************************************
2123 Parse a PRINTER_INFO_1 structure.
2124 ********************************************************************/
2126 BOOL smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2128 prs_struct *ps=&buffer->prs;
2130 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2133 buffer->struct_start=prs_offset(ps);
2135 if (!prs_uint32("flags", ps, depth, &info->flags))
2137 if (!smb_io_relstr("description", buffer, depth, &info->description))
2139 if (!smb_io_relstr("name", buffer, depth, &info->name))
2141 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2147 /*******************************************************************
2148 Parse a PRINTER_INFO_2 structure.
2149 ********************************************************************/
2151 BOOL smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2153 prs_struct *ps=&buffer->prs;
2155 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2158 buffer->struct_start=prs_offset(ps);
2160 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2162 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2164 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2166 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2168 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2170 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2172 if (!smb_io_relstr("location", buffer, depth, &info->location))
2175 /* NT parses the DEVMODE at the end of the struct */
2176 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2179 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2181 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2183 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2185 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2188 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2191 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2193 if (!prs_uint32("priority", ps, depth, &info->priority))
2195 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2197 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2199 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2201 if (!prs_uint32("status", ps, depth, &info->status))
2203 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2205 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2209 if (!prs_uint32_post("secdesc_ptr", ps, depth, NULL, sec_offset, info->secdesc ? prs_offset(ps)-buffer->struct_start : 0 ))
2212 if (!sec_io_desc("secdesc", &info->secdesc, ps, depth))
2218 /*******************************************************************
2219 Parse a PRINTER_INFO_3 structure.
2220 ********************************************************************/
2222 BOOL smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2224 prs_struct *ps=&buffer->prs;
2226 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2229 buffer->struct_start=prs_offset(ps);
2231 if (!prs_uint32("flags", ps, depth, &info->flags))
2233 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2239 /*******************************************************************
2240 Parse a PORT_INFO_1 structure.
2241 ********************************************************************/
2243 BOOL smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2245 prs_struct *ps=&buffer->prs;
2247 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2250 buffer->struct_start=prs_offset(ps);
2252 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2258 /*******************************************************************
2259 Parse a PORT_INFO_2 structure.
2260 ********************************************************************/
2262 BOOL smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2264 prs_struct *ps=&buffer->prs;
2266 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2269 buffer->struct_start=prs_offset(ps);
2271 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2273 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2275 if (!smb_io_relstr("description", buffer, depth, &info->description))
2277 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2279 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2285 /*******************************************************************
2286 Parse a DRIVER_INFO_1 structure.
2287 ********************************************************************/
2289 BOOL smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2291 prs_struct *ps=&buffer->prs;
2293 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2296 buffer->struct_start=prs_offset(ps);
2298 if (!smb_io_relstr("name", buffer, depth, &info->name))
2304 /*******************************************************************
2305 Parse a DRIVER_INFO_2 structure.
2306 ********************************************************************/
2308 BOOL smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2310 prs_struct *ps=&buffer->prs;
2312 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2315 buffer->struct_start=prs_offset(ps);
2317 if (!prs_uint32("version", ps, depth, &info->version))
2319 if (!smb_io_relstr("name", buffer, depth, &info->name))
2321 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2323 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2325 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2327 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2333 /*******************************************************************
2334 Parse a DRIVER_INFO_3 structure.
2335 ********************************************************************/
2337 BOOL smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2339 prs_struct *ps=&buffer->prs;
2341 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2344 buffer->struct_start=prs_offset(ps);
2346 if (!prs_uint32("version", ps, depth, &info->version))
2348 if (!smb_io_relstr("name", buffer, depth, &info->name))
2350 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2352 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2354 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2356 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2358 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2361 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2364 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2366 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2372 /*******************************************************************
2373 Parse a DRIVER_INFO_6 structure.
2374 ********************************************************************/
2376 BOOL smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2378 prs_struct *ps=&buffer->prs;
2380 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2383 buffer->struct_start=prs_offset(ps);
2385 if (!prs_uint32("version", ps, depth, &info->version))
2387 if (!smb_io_relstr("name", buffer, depth, &info->name))
2389 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2391 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2393 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2395 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2397 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2400 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2403 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2405 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2408 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2411 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2413 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2416 if (!prs_uint32("padding", ps, depth, &info->padding))
2419 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2422 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2425 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2427 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2429 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2431 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2437 /*******************************************************************
2438 Parse a JOB_INFO_1 structure.
2439 ********************************************************************/
2441 BOOL smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2443 prs_struct *ps=&buffer->prs;
2445 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2448 buffer->struct_start=prs_offset(ps);
2450 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2452 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2454 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2456 if (!smb_io_relstr("username", buffer, depth, &info->username))
2458 if (!smb_io_relstr("document", buffer, depth, &info->document))
2460 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2462 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2464 if (!prs_uint32("status", ps, depth, &info->status))
2466 if (!prs_uint32("priority", ps, depth, &info->priority))
2468 if (!prs_uint32("position", ps, depth, &info->position))
2470 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2472 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2474 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2480 /*******************************************************************
2481 Parse a JOB_INFO_2 structure.
2482 ********************************************************************/
2484 BOOL smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2487 prs_struct *ps=&buffer->prs;
2489 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2492 buffer->struct_start=prs_offset(ps);
2494 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2496 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2498 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2500 if (!smb_io_relstr("username", buffer, depth, &info->username))
2502 if (!smb_io_relstr("document", buffer, depth, &info->document))
2504 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2506 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2509 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2511 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2513 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2515 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2517 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2520 /* SEC_DESC sec_desc;*/
2521 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2524 if (!prs_uint32("status",ps, depth, &info->status))
2526 if (!prs_uint32("priority",ps, depth, &info->priority))
2528 if (!prs_uint32("position",ps, depth, &info->position))
2530 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2532 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2534 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2536 if (!prs_uint32("size",ps, depth, &info->size))
2538 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2540 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2542 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2548 /*******************************************************************
2549 ********************************************************************/
2551 BOOL smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2553 prs_struct *ps=&buffer->prs;
2555 prs_debug(ps, depth, desc, "smb_io_form_1");
2558 buffer->struct_start=prs_offset(ps);
2560 if (!prs_uint32("flag", ps, depth, &info->flag))
2563 if (!smb_io_relstr("name", buffer, depth, &info->name))
2566 if (!prs_uint32("width", ps, depth, &info->width))
2568 if (!prs_uint32("length", ps, depth, &info->length))
2570 if (!prs_uint32("left", ps, depth, &info->left))
2572 if (!prs_uint32("top", ps, depth, &info->top))
2574 if (!prs_uint32("right", ps, depth, &info->right))
2576 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2582 /*******************************************************************
2583 Read/write a BUFFER struct.
2584 ********************************************************************/
2586 static BOOL spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
2588 NEW_BUFFER *buffer = *pp_buffer;
2590 prs_debug(ps, depth, desc, "spoolss_io_buffer");
2593 if (UNMARSHALLING(ps))
2594 buffer = *pp_buffer = (NEW_BUFFER *)prs_alloc_mem(ps, sizeof(NEW_BUFFER));
2599 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2603 if (UNMARSHALLING(ps)) {
2605 buffer->string_at_end=0;
2607 if (buffer->ptr==0) {
2609 * JRA. I'm not sure if the data in here is in big-endian format if
2610 * the client is big-endian. Leave as default (little endian) for now.
2613 if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
2618 if (!prs_uint32("size", ps, depth, &buffer->size))
2622 * JRA. I'm not sure if the data in here is in big-endian format if
2623 * the client is big-endian. Leave as default (little endian) for now.
2626 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
2629 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
2632 if (!prs_set_offset(&buffer->prs, 0))
2635 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
2638 buffer->string_at_end=buffer->size;
2646 if (buffer->ptr==0) {
2647 /* We have finished with the data in buffer->prs - free it. */
2648 prs_mem_free(&buffer->prs);
2652 if (!prs_uint32("size", ps, depth, &buffer->size))
2655 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
2661 /* We have finished with the data in buffer->prs - free it. */
2662 prs_mem_free(&buffer->prs);
2668 /*******************************************************************
2669 move a BUFFER from the query to the reply.
2670 As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
2671 this is ok. This is an OPTIMIZATION and is not strictly neccessary.
2672 ********************************************************************/
2674 void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2676 prs_switch_type(&src->prs, MARSHALL);
2677 if(!prs_set_offset(&src->prs, 0))
2679 prs_force_dynamic(&(src->prs));
2684 /*******************************************************************
2685 Get the size of a BUFFER struct.
2686 ********************************************************************/
2688 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2690 return (buffer->size);
2693 /*******************************************************************
2694 Parse a DRIVER_DIRECTORY_1 structure.
2695 ********************************************************************/
2697 BOOL smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2699 prs_struct *ps=&buffer->prs;
2701 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2704 buffer->struct_start=prs_offset(ps);
2706 if (!smb_io_unistr(desc, &info->name, ps, depth))
2712 /*******************************************************************
2713 Parse a PORT_INFO_1 structure.
2714 ********************************************************************/
2716 BOOL smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2718 prs_struct *ps=&buffer->prs;
2720 prs_debug(ps, depth, desc, "smb_io_port_1");
2723 buffer->struct_start=prs_offset(ps);
2725 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2731 /*******************************************************************
2732 Parse a PORT_INFO_2 structure.
2733 ********************************************************************/
2735 BOOL smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2737 prs_struct *ps=&buffer->prs;
2739 prs_debug(ps, depth, desc, "smb_io_port_2");
2742 buffer->struct_start=prs_offset(ps);
2744 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2746 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2748 if(!smb_io_relstr("description", buffer, depth, &info->description))
2750 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2752 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2758 /*******************************************************************
2759 ********************************************************************/
2761 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2763 prs_struct *ps=&buffer->prs;
2765 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2768 buffer->struct_start=prs_offset(ps);
2770 if (smb_io_relstr("name", buffer, depth, &info->name))
2776 /*******************************************************************
2777 ********************************************************************/
2779 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2781 prs_struct *ps=&buffer->prs;
2783 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2786 buffer->struct_start=prs_offset(ps);
2788 if (smb_io_relstr("name", buffer, depth, &info->name))
2794 /*******************************************************************
2795 ********************************************************************/
2797 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2799 prs_struct *ps=&buffer->prs;
2801 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2804 buffer->struct_start=prs_offset(ps);
2806 if (!smb_io_relstr("name", buffer, depth, &info->name))
2812 /*******************************************************************
2813 ********************************************************************/
2815 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2817 prs_struct *ps=&buffer->prs;
2819 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2822 buffer->struct_start=prs_offset(ps);
2824 if (!smb_io_relstr("name", buffer, depth, &info->name))
2826 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
2828 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2834 /*******************************************************************
2835 return the size required by a struct in the stream
2836 ********************************************************************/
2838 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2842 size+=size_of_relative_string( &info->printername );
2843 size+=size_of_relative_string( &info->servername );
2845 size+=size_of_uint32( &info->cjobs);
2846 size+=size_of_uint32( &info->total_jobs);
2847 size+=size_of_uint32( &info->total_bytes);
2849 size+=size_of_uint16( &info->year);
2850 size+=size_of_uint16( &info->month);
2851 size+=size_of_uint16( &info->dayofweek);
2852 size+=size_of_uint16( &info->day);
2853 size+=size_of_uint16( &info->hour);
2854 size+=size_of_uint16( &info->minute);
2855 size+=size_of_uint16( &info->second);
2856 size+=size_of_uint16( &info->milliseconds);
2858 size+=size_of_uint32( &info->global_counter);
2859 size+=size_of_uint32( &info->total_pages);
2861 size+=size_of_uint16( &info->major_version);
2862 size+=size_of_uint16( &info->build_version);
2864 size+=size_of_uint32( &info->unknown7);
2865 size+=size_of_uint32( &info->unknown8);
2866 size+=size_of_uint32( &info->unknown9);
2867 size+=size_of_uint32( &info->session_counter);
2868 size+=size_of_uint32( &info->unknown11);
2869 size+=size_of_uint32( &info->printer_errors);
2870 size+=size_of_uint32( &info->unknown13);
2871 size+=size_of_uint32( &info->unknown14);
2872 size+=size_of_uint32( &info->unknown15);
2873 size+=size_of_uint32( &info->unknown16);
2874 size+=size_of_uint32( &info->change_id);
2875 size+=size_of_uint32( &info->unknown18);
2876 size+=size_of_uint32( &info->status);
2877 size+=size_of_uint32( &info->unknown20);
2878 size+=size_of_uint32( &info->c_setprinter);
2880 size+=size_of_uint16( &info->unknown22);
2881 size+=size_of_uint16( &info->unknown23);
2882 size+=size_of_uint16( &info->unknown24);
2883 size+=size_of_uint16( &info->unknown25);
2884 size+=size_of_uint16( &info->unknown26);
2885 size+=size_of_uint16( &info->unknown27);
2886 size+=size_of_uint16( &info->unknown28);
2887 size+=size_of_uint16( &info->unknown29);
2892 /*******************************************************************
2893 return the size required by a struct in the stream
2894 ********************************************************************/
2896 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2900 size+=size_of_uint32( &info->flags );
2901 size+=size_of_relative_string( &info->description );
2902 size+=size_of_relative_string( &info->name );
2903 size+=size_of_relative_string( &info->comment );
2908 /*******************************************************************
2909 return the size required by a struct in the stream
2910 ********************************************************************/
2912 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2917 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2918 size += sec_desc_size( info->secdesc );
2920 size+=size_of_device_mode( info->devmode );
2922 size+=size_of_relative_string( &info->servername );
2923 size+=size_of_relative_string( &info->printername );
2924 size+=size_of_relative_string( &info->sharename );
2925 size+=size_of_relative_string( &info->portname );
2926 size+=size_of_relative_string( &info->drivername );
2927 size+=size_of_relative_string( &info->comment );
2928 size+=size_of_relative_string( &info->location );
2930 size+=size_of_relative_string( &info->sepfile );
2931 size+=size_of_relative_string( &info->printprocessor );
2932 size+=size_of_relative_string( &info->datatype );
2933 size+=size_of_relative_string( &info->parameters );
2935 size+=size_of_uint32( &info->attributes );
2936 size+=size_of_uint32( &info->priority );
2937 size+=size_of_uint32( &info->defaultpriority );
2938 size+=size_of_uint32( &info->starttime );
2939 size+=size_of_uint32( &info->untiltime );
2940 size+=size_of_uint32( &info->status );
2941 size+=size_of_uint32( &info->cjobs );
2942 size+=size_of_uint32( &info->averageppm );
2946 /*******************************************************************
2947 return the size required by a struct in the stream
2948 ********************************************************************/
2950 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
2952 /* The 4 is for the self relative pointer.. */
2953 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2954 return 4 + (uint32)sec_desc_size( info->secdesc );
2957 /*******************************************************************
2958 return the size required by a struct in the stream
2959 ********************************************************************/
2961 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2964 size+=size_of_relative_string( &info->name );
2969 /*******************************************************************
2970 return the size required by a struct in the stream
2971 ********************************************************************/
2973 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2976 size+=size_of_uint32( &info->version );
2977 size+=size_of_relative_string( &info->name );
2978 size+=size_of_relative_string( &info->architecture );
2979 size+=size_of_relative_string( &info->driverpath );
2980 size+=size_of_relative_string( &info->datafile );
2981 size+=size_of_relative_string( &info->configfile );
2986 /*******************************************************************
2987 return the size required by a string array.
2988 ********************************************************************/
2990 uint32 spoolss_size_string_array(uint16 *string)
2995 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2997 i=i+2; /* to count all chars including the leading zero */
2998 i=2*i; /* because we need the value in bytes */
2999 i=i+4; /* the offset pointer size */
3004 /*******************************************************************
3005 return the size required by a struct in the stream
3006 ********************************************************************/
3008 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3012 size+=size_of_uint32( &info->version );
3013 size+=size_of_relative_string( &info->name );
3014 size+=size_of_relative_string( &info->architecture );
3015 size+=size_of_relative_string( &info->driverpath );
3016 size+=size_of_relative_string( &info->datafile );
3017 size+=size_of_relative_string( &info->configfile );
3018 size+=size_of_relative_string( &info->helpfile );
3019 size+=size_of_relative_string( &info->monitorname );
3020 size+=size_of_relative_string( &info->defaultdatatype );
3022 size+=spoolss_size_string_array(info->dependentfiles);
3027 /*******************************************************************
3028 return the size required by a struct in the stream
3029 ********************************************************************/
3031 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3035 size+=size_of_uint32( &info->version );
3036 size+=size_of_relative_string( &info->name );
3037 size+=size_of_relative_string( &info->architecture );
3038 size+=size_of_relative_string( &info->driverpath );
3039 size+=size_of_relative_string( &info->datafile );
3040 size+=size_of_relative_string( &info->configfile );
3041 size+=size_of_relative_string( &info->helpfile );
3043 size+=spoolss_size_string_array(info->dependentfiles);
3045 size+=size_of_relative_string( &info->monitorname );
3046 size+=size_of_relative_string( &info->defaultdatatype );
3048 size+=spoolss_size_string_array(info->previousdrivernames);
3050 size+=size_of_nttime(&info->driver_date);
3051 size+=size_of_uint32( &info->padding );
3052 size+=size_of_uint32( &info->driver_version_low );
3053 size+=size_of_uint32( &info->driver_version_high );
3054 size+=size_of_relative_string( &info->mfgname );
3055 size+=size_of_relative_string( &info->oem_url );
3056 size+=size_of_relative_string( &info->hardware_id );
3057 size+=size_of_relative_string( &info->provider );
3062 /*******************************************************************
3063 return the size required by a struct in the stream
3064 ********************************************************************/
3066 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3069 size+=size_of_uint32( &info->jobid );
3070 size+=size_of_relative_string( &info->printername );
3071 size+=size_of_relative_string( &info->machinename );
3072 size+=size_of_relative_string( &info->username );
3073 size+=size_of_relative_string( &info->document );
3074 size+=size_of_relative_string( &info->datatype );
3075 size+=size_of_relative_string( &info->text_status );
3076 size+=size_of_uint32( &info->status );
3077 size+=size_of_uint32( &info->priority );
3078 size+=size_of_uint32( &info->position );
3079 size+=size_of_uint32( &info->totalpages );
3080 size+=size_of_uint32( &info->pagesprinted );
3081 size+=size_of_systemtime( &info->submitted );
3086 /*******************************************************************
3087 return the size required by a struct in the stream
3088 ********************************************************************/
3090 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3094 size+=4; /* size of sec desc ptr */
3096 size+=size_of_uint32( &info->jobid );
3097 size+=size_of_relative_string( &info->printername );
3098 size+=size_of_relative_string( &info->machinename );
3099 size+=size_of_relative_string( &info->username );
3100 size+=size_of_relative_string( &info->document );
3101 size+=size_of_relative_string( &info->notifyname );
3102 size+=size_of_relative_string( &info->datatype );
3103 size+=size_of_relative_string( &info->printprocessor );
3104 size+=size_of_relative_string( &info->parameters );
3105 size+=size_of_relative_string( &info->drivername );
3106 size+=size_of_device_mode( info->devmode );
3107 size+=size_of_relative_string( &info->text_status );
3108 /* SEC_DESC sec_desc;*/
3109 size+=size_of_uint32( &info->status );
3110 size+=size_of_uint32( &info->priority );
3111 size+=size_of_uint32( &info->position );
3112 size+=size_of_uint32( &info->starttime );
3113 size+=size_of_uint32( &info->untiltime );
3114 size+=size_of_uint32( &info->totalpages );
3115 size+=size_of_uint32( &info->size );
3116 size+=size_of_systemtime( &info->submitted );
3117 size+=size_of_uint32( &info->timeelapsed );
3118 size+=size_of_uint32( &info->pagesprinted );
3123 /*******************************************************************
3124 return the size required by a struct in the stream
3125 ********************************************************************/
3127 uint32 spoolss_size_form_1(FORM_1 *info)
3131 size+=size_of_uint32( &info->flag );
3132 size+=size_of_relative_string( &info->name );
3133 size+=size_of_uint32( &info->width );
3134 size+=size_of_uint32( &info->length );
3135 size+=size_of_uint32( &info->left );
3136 size+=size_of_uint32( &info->top );
3137 size+=size_of_uint32( &info->right );
3138 size+=size_of_uint32( &info->bottom );
3143 /*******************************************************************
3144 return the size required by a struct in the stream
3145 ********************************************************************/
3147 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3151 size+=size_of_relative_string( &info->port_name );
3156 /*******************************************************************
3157 return the size required by a struct in the stream
3158 ********************************************************************/
3160 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3164 size=str_len_uni(&info->name); /* the string length */
3165 size=size+1; /* add the leading zero */
3166 size=size*2; /* convert in char */
3171 /*******************************************************************
3172 return the size required by a struct in the stream
3173 ********************************************************************/
3175 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3179 size+=size_of_relative_string( &info->port_name );
3180 size+=size_of_relative_string( &info->monitor_name );
3181 size+=size_of_relative_string( &info->description );
3183 size+=size_of_uint32( &info->port_type );
3184 size+=size_of_uint32( &info->reserved );
3189 /*******************************************************************
3190 return the size required by a struct in the stream
3191 ********************************************************************/
3193 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3196 size+=size_of_relative_string( &info->name );
3201 /*******************************************************************
3202 return the size required by a struct in the stream
3203 ********************************************************************/
3205 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3208 size+=size_of_relative_string( &info->name );
3213 /*******************************************************************
3214 return the size required by a struct in the stream
3215 ********************************************************************/
3217 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3220 size+=size_of_relative_string( &info->name );
3225 /*******************************************************************
3226 return the size required by a struct in the stream
3227 ********************************************************************/
3229 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3232 size+=size_of_relative_string( &info->name);
3233 size+=size_of_relative_string( &info->environment);
3234 size+=size_of_relative_string( &info->dll_name);
3239 /*******************************************************************
3241 ********************************************************************/
3243 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3244 const POLICY_HND *hnd,
3245 const fstring architecture,
3246 uint32 level, uint32 clientmajor, uint32 clientminor,
3247 NEW_BUFFER *buffer, uint32 offered)
3252 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3254 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3257 q_u->clientmajorversion=clientmajor;
3258 q_u->clientminorversion=clientminor;
3261 q_u->offered=offered;
3266 /*******************************************************************
3268 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3269 ********************************************************************/
3271 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3273 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3279 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3281 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3283 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3288 if(!prs_uint32("level", ps, depth, &q_u->level))
3291 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3297 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3300 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3302 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3308 /*******************************************************************
3310 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3311 ********************************************************************/
3313 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3315 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3321 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3326 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3328 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3330 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3332 if (!prs_werror("status", ps, depth, &r_u->status))
3338 /*******************************************************************
3340 ********************************************************************/
3342 BOOL make_spoolss_q_enumprinters(
3343 SPOOL_Q_ENUMPRINTERS *q_u,
3353 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3354 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3358 q_u->offered=offered;
3363 /*******************************************************************
3365 ********************************************************************/
3367 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3368 fstring servername, uint32 level,
3369 NEW_BUFFER *buffer, uint32 offered)
3371 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3372 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3376 q_u->offered=offered;
3381 /*******************************************************************
3383 * called from spoolss_enumprinters (srv_spoolss.c)
3384 ********************************************************************/
3386 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3388 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3394 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3396 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3399 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3404 if (!prs_uint32("level", ps, depth, &q_u->level))
3407 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3412 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3418 /*******************************************************************
3419 Parse a SPOOL_R_ENUMPRINTERS structure.
3420 ********************************************************************/
3422 BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3424 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3430 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3436 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3439 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3442 if (!prs_werror("status", ps, depth, &r_u->status))
3448 /*******************************************************************
3449 * write a structure.
3450 * called from spoolss_r_enum_printers (srv_spoolss.c)
3452 ********************************************************************/
3454 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3456 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3462 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3468 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3471 if (!prs_werror("status", ps, depth, &r_u->status))
3477 /*******************************************************************
3479 * called from spoolss_getprinter (srv_spoolss.c)
3480 ********************************************************************/
3482 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3484 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3490 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3492 if (!prs_uint32("level", ps, depth, &q_u->level))
3495 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3500 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3506 /*******************************************************************
3508 ********************************************************************/
3510 BOOL make_spoolss_q_getprinter(
3511 TALLOC_CTX *mem_ctx,
3512 SPOOL_Q_GETPRINTER *q_u,
3513 const POLICY_HND *hnd,
3523 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3527 q_u->offered=offered;
3532 /*******************************************************************
3534 ********************************************************************/
3535 BOOL make_spoolss_q_setprinter(
3536 TALLOC_CTX *mem_ctx,
3537 SPOOL_Q_SETPRINTER *q_u,
3538 const POLICY_HND *hnd,
3540 PRINTER_INFO_CTR *info,
3545 DEVICEMODE *devmode;
3552 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3555 q_u->info.level = level;
3556 q_u->info.info_ptr = (info != NULL) ? 1 : 0;
3560 secdesc = info->printers_2->secdesc;
3561 devmode = info->printers_2->devmode;
3563 /* FIXMEE!! HACK ALERT!!! --jerry */
3564 info->printers_2->devmode = NULL;
3565 info->printers_2->secdesc = NULL;
3567 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3568 #if 0 /* JERRY TEST */
3569 q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
3570 if (!q_u->secdesc_ctr)
3572 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
3573 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3574 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3575 q_u->secdesc_ctr->sec = secdesc;
3577 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3578 q_u->devmode_ctr.size = sizeof(DEVICEMODE) + (3*sizeof(uint32));
3579 q_u->devmode_ctr.devmode = devmode;
3581 q_u->secdesc_ctr = NULL;
3583 q_u->devmode_ctr.devmode_ptr = 0;
3584 q_u->devmode_ctr.size = 0;
3585 q_u->devmode_ctr.devmode = NULL;
3589 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3594 q_u->command = command;
3600 /*******************************************************************
3601 ********************************************************************/
3603 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3605 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3611 if(!prs_werror("status", ps, depth, &r_u->status))
3617 /*******************************************************************
3618 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3619 ********************************************************************/
3621 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3623 uint32 ptr_sec_desc = 0;
3625 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3631 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3633 if(!prs_uint32("level", ps, depth, &q_u->level))
3636 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3639 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3646 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3651 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3657 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3662 /* Parse a NULL security descriptor. This should really
3663 happen inside the sec_io_desc_buf() function. */
3665 prs_debug(ps, depth, "", "sec_io_desc_buf");
3666 if (!prs_uint32("size", ps, depth + 1, &dummy)) return False;
3667 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
3671 if(!prs_uint32("command", ps, depth, &q_u->command))
3677 /*******************************************************************
3678 ********************************************************************/
3680 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3682 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3688 if(!prs_werror("status", ps, depth, &r_u->status))
3694 /*******************************************************************
3695 ********************************************************************/
3697 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3700 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3706 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3713 /*******************************************************************
3714 ********************************************************************/
3716 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3718 prs_debug(ps, depth, desc, "");
3724 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3730 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3733 if(!prs_werror("status", ps, depth, &r_u->status))
3739 /*******************************************************************
3740 ********************************************************************/
3742 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3744 prs_debug(ps, depth, desc, "");
3750 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3752 if(!prs_uint32("level", ps, depth, &q_u->level))
3755 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3761 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3767 /*******************************************************************
3768 ********************************************************************/
3770 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3772 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3778 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3784 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3787 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3790 if (!prs_werror("status", ps, depth, &r_u->status))
3796 /*******************************************************************
3797 ********************************************************************/
3799 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3810 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3811 q_u->firstjob = firstjob;
3812 q_u->numofjobs = numofjobs;
3814 q_u->buffer= buffer;
3815 q_u->offered = offered;
3819 /*******************************************************************
3820 ********************************************************************/
3822 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
3824 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
3830 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
3833 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
3835 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
3837 if (!prs_uint32("level", ps, depth, &q_u->level))
3840 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3843 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3849 /*******************************************************************
3850 ********************************************************************/
3852 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
3854 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
3860 if(!prs_werror("status", ps, depth, &r_u->status))
3866 /*******************************************************************
3867 ********************************************************************/
3869 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
3871 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
3877 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3879 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3885 /*******************************************************************
3886 ********************************************************************/
3888 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
3890 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
3896 if(!prs_werror("status", ps, depth, &r_u->status))
3902 /*******************************************************************
3903 ********************************************************************/
3905 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3907 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3913 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3915 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3918 * level is usually 0. If (level!=0) then I'm in trouble !
3919 * I will try to generate setjob command with level!=0, one day.
3921 if(!prs_uint32("level", ps, depth, &q_u->level))
3923 if(!prs_uint32("command", ps, depth, &q_u->command))
3929 /*******************************************************************
3930 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3931 ********************************************************************/
3933 BOOL spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3935 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
3941 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3947 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3950 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3953 if (!prs_werror("status", ps, depth, &r_u->status))
3959 /*******************************************************************
3961 ********************************************************************/
3963 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
3965 const char *environment,
3967 NEW_BUFFER *buffer, uint32 offered)
3969 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
3970 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
3974 q_u->offered=offered;
3979 /*******************************************************************
3980 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
3981 ********************************************************************/
3983 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
3986 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
3992 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3994 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
3999 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
4001 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4006 if (!prs_uint32("level", ps, depth, &q_u->level))
4009 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4015 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4021 /*******************************************************************
4022 ********************************************************************/
4024 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4027 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4032 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4034 if (!prs_uint32("level", ps, depth, &q_u->level))
4037 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4042 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4048 /*******************************************************************
4049 ********************************************************************/
4051 BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4053 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4059 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4065 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4068 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4071 if (!prs_werror("status", ps, depth, &r_u->status))
4077 /*******************************************************************
4078 ********************************************************************/
4080 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4083 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4088 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4090 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4096 if (!prs_uint32("level", ps, depth, &q_u->level))
4099 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4104 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4110 /*******************************************************************
4111 ********************************************************************/
4113 BOOL spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4115 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4121 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4127 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4130 if (!prs_werror("status", ps, depth, &r_u->status))
4136 /*******************************************************************
4137 Parse a SPOOL_R_ENUMPORTS structure.
4138 ********************************************************************/
4140 BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4142 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4148 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4154 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4157 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4160 if (!prs_werror("status", ps, depth, &r_u->status))
4166 /*******************************************************************
4167 ********************************************************************/
4169 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4171 prs_debug(ps, depth, desc, "");
4177 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4179 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4184 if (!prs_uint32("level", ps, depth, &q_u->level))
4187 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4192 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4198 /*******************************************************************
4199 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4200 ********************************************************************/
4202 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4204 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4210 if(!prs_uint32("flags", ps, depth, &il->flags))
4212 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4214 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4216 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4219 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4221 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4223 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4229 /*******************************************************************
4230 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4231 ********************************************************************/
4233 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4235 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4241 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4247 /*******************************************************************
4248 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4249 ********************************************************************/
4251 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4253 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4259 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4261 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4263 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4265 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4268 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4270 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4272 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4274 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4276 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4278 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4280 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4282 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4284 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4287 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4289 if(!prs_uint32("priority", ps, depth, &il->priority))
4291 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4293 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4295 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4297 if(!prs_werror("status", ps, depth, &il->status))
4299 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4301 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4304 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4306 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4308 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4310 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4312 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4314 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4316 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4318 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4320 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4322 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4324 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4330 /*******************************************************************
4331 ********************************************************************/
4333 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4335 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4340 if(!prs_uint32("level", ps, depth, &il->level))
4342 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4345 /* if no struct inside just return */
4346 if (il->info_ptr==0) {
4347 if (UNMARSHALLING(ps)) {
4354 switch (il->level) {
4356 * level 0 is used by setprinter when managing the queue
4357 * (hold, stop, start a queue)
4361 /* DOCUMENT ME!!! What is level 1 used for? */
4364 if (UNMARSHALLING(ps)) {
4365 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4368 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4373 * level 2 is used by addprinter
4374 * and by setprinter when updating printer's info
4377 if (UNMARSHALLING(ps)) {
4378 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4381 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4384 /* DOCUMENT ME!!! What is level 3 used for? */
4387 if (UNMARSHALLING(ps)) {
4388 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4391 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4400 /*******************************************************************
4401 ********************************************************************/
4403 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4405 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4410 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4412 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4418 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4421 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4424 /* the 4 unknown are all 0 */
4427 * en fait ils sont pas inconnu
4428 * par recoupement avec rpcSetPrinter
4429 * c'est le devicemode
4430 * et le security descriptor.
4435 if(!prs_uint32("unk0", ps, depth, &q_u->unk0))
4437 if(!prs_uint32("unk1", ps, depth, &q_u->unk1))
4439 if(!prs_uint32("unk2", ps, depth, &q_u->unk2))
4441 if(!prs_uint32("unk3", ps, depth, &q_u->unk3))
4444 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4446 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4452 /*******************************************************************
4453 ********************************************************************/
4455 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4456 prs_struct *ps, int depth)
4458 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4461 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4464 if(!prs_werror("status", ps, depth, &r_u->status))
4470 /*******************************************************************
4471 ********************************************************************/
4473 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4474 prs_struct *ps, int depth)
4476 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4478 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4482 if (UNMARSHALLING(ps)) {
4483 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4495 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4497 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4499 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4501 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4503 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4505 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4507 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4509 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4511 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4513 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4515 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4521 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4523 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4525 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4527 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4529 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4531 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4533 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4535 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4541 if (il->dependentfiles_ptr)
4542 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4547 /*******************************************************************
4548 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4549 ********************************************************************/
4551 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4552 prs_struct *ps, int depth)
4554 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4556 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4560 if (UNMARSHALLING(ps)) {
4561 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
4574 /* parse the main elements the packet */
4576 if(!prs_uint32("version", ps, depth, &il->version))
4579 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4582 * If name_ptr is NULL then the next 4 bytes are the name_ptr. A driver
4583 * with a NULL name just isn't a driver For example: "HP LaserJet 4si"
4584 * from W2K CDROM (which uses unidriver). JohnR 010205
4586 if (!il->name_ptr) {
4587 DEBUG(5,("spool_io_printer_driver_info_level_6: name_ptr is NULL! Get next value\n"));
4588 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4592 if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr))
4594 if(!prs_uint32("driverpath_ptr", ps, depth, &il->driverpath_ptr))
4596 if(!prs_uint32("datafile_ptr", ps, depth, &il->datafile_ptr))
4598 if(!prs_uint32("configfile_ptr", ps, depth, &il->configfile_ptr))
4600 if(!prs_uint32("helpfile_ptr", ps, depth, &il->helpfile_ptr))
4602 if(!prs_uint32("monitorname_ptr", ps, depth, &il->monitorname_ptr))
4604 if(!prs_uint32("defaultdatatype_ptr", ps, depth, &il->defaultdatatype_ptr))
4606 if(!prs_uint32("dependentfiles_len", ps, depth, &il->dependentfiles_len))
4608 if(!prs_uint32("dependentfiles_ptr", ps, depth, &il->dependentfiles_ptr))
4610 if(!prs_uint32("previousnames_len", ps, depth, &il->previousnames_len))
4612 if(!prs_uint32("previousnames_ptr", ps, depth, &il->previousnames_ptr))
4614 if(!smb_io_time("driverdate", &il->driverdate, ps, depth))
4616 if(!prs_uint32("dummy4", ps, depth, &il->dummy4))
4618 if(!prs_uint64("driverversion", ps, depth, &il->driverversion))
4620 if(!prs_uint32("mfgname_ptr", ps, depth, &il->mfgname_ptr))
4622 if(!prs_uint32("oemurl_ptr", ps, depth, &il->oemurl_ptr))
4624 if(!prs_uint32("hardwareid_ptr", ps, depth, &il->hardwareid_ptr))
4626 if(!prs_uint32("provider_ptr", ps, depth, &il->provider_ptr))
4629 /* parse the structures in the packet */
4631 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4636 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4641 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4646 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4651 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4656 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4661 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4666 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4670 if (il->dependentfiles_ptr) {
4671 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4676 if (il->previousnames_ptr) {
4677 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4682 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4686 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4690 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4694 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4700 /*******************************************************************
4701 convert a buffer of UNICODE strings null terminated
4702 the buffer is terminated by a NULL
4704 convert to an dos codepage array (null terminated)
4706 dynamically allocate memory
4708 ********************************************************************/
4709 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4715 if (buf5==NULL) return False;
4717 src = (char *)buf5->buffer;
4720 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4721 rpcstr_pull(f, src, sizeof(f)-1, -1, 0);
4722 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4723 tar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
4724 if (!tar) return False;
4726 fstrcpy((*ar)[n], f);
4729 fstrcpy((*ar)[n], "");
4734 /*******************************************************************
4735 read a UNICODE array with null terminated strings
4736 and null terminated array
4737 and size of array at beginning
4738 ********************************************************************/
4740 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
4742 if (buffer==NULL) return False;
4745 buffer->uni_str_len=buffer->uni_max_len;
4747 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
4750 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
4756 /*******************************************************************
4757 ********************************************************************/
4759 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
4761 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
4766 if(!prs_uint32("level", ps, depth, &il->level))
4768 if(!prs_uint32("ptr", ps, depth, &il->ptr))
4774 switch (il->level) {
4776 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
4780 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
4790 /*******************************************************************
4791 init a SPOOL_Q_ADDPRINTERDRIVER struct
4792 ******************************************************************/
4794 BOOL make_spoolss_q_addprinterdriver(
4795 TALLOC_CTX *mem_ctx,
4796 SPOOL_Q_ADDPRINTERDRIVER *q_u,
4797 const char* srv_name,
4799 PRINTER_DRIVER_CTR *info)
4801 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
4803 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
4804 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
4808 q_u->info.level = level;
4809 q_u->info.ptr = (info!=NULL)?1:0;
4812 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
4814 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
4817 /* info level 6 is supported by WinME and Win2k */
4819 /* WRITEME!! will add later --jerry */
4823 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
4830 BOOL make_spoolss_driver_info_3(
4831 TALLOC_CTX *mem_ctx,
4832 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
4833 DRIVER_INFO_3 *info3
4837 uint16 *ptr = info3->dependentfiles;
4839 BOOL null_char = False;
4840 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
4842 if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3))))
4845 inf->cversion = info3->version;
4846 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
4847 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
4848 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
4849 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
4850 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
4851 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
4852 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
4853 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
4855 init_unistr2_from_unistr(&inf->name, &info3->name);
4856 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
4857 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
4858 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
4859 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
4860 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
4861 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
4862 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
4869 /* the null_char BOOL is used to help locate
4870 two '\0's back to back */
4885 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
4886 inf->dependentfilessize = len;
4887 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
4893 *spool_drv_info = inf;
4898 /*******************************************************************
4899 make a BUFFER5 struct from a uint16*
4900 ******************************************************************/
4902 BOOL make_spoolss_buffer5(
4903 TALLOC_CTX *mem_ctx,
4910 buf5->buf_len = len;
4911 if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
4913 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
4920 /*******************************************************************
4921 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
4922 ********************************************************************/
4924 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4926 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
4932 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
4934 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4939 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4942 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
4948 /*******************************************************************
4949 ********************************************************************/
4951 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4953 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
4956 if(!prs_werror("status", ps, depth, &q_u->status))
4962 /*******************************************************************
4963 ********************************************************************/
4965 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
4966 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
4968 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
4970 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
4974 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
4982 d->cversion=uni->cversion;
4984 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
4985 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
4986 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
4987 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
4988 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
4989 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
4990 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
4991 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
4993 DEBUGADD(8,( "version: %d\n", d->cversion));
4994 DEBUGADD(8,( "name: %s\n", d->name));
4995 DEBUGADD(8,( "environment: %s\n", d->environment));
4996 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
4997 DEBUGADD(8,( "datafile: %s\n", d->datafile));
4998 DEBUGADD(8,( "configfile: %s\n", d->configfile));
4999 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5000 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5001 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5003 if (uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5010 /*******************************************************************
5011 ********************************************************************/
5012 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5013 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5015 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5017 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5021 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
5029 d->version=uni->version;
5031 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5032 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5033 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5034 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5035 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5036 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5037 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5038 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5040 DEBUGADD(8,( "version: %d\n", d->version));
5041 DEBUGADD(8,( "name: %s\n", d->name));
5042 DEBUGADD(8,( "environment: %s\n", d->environment));
5043 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5044 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5045 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5046 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5047 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5048 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5050 if (!uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles ))
5052 if (!uniarray_2_dosarray(&uni->previousnames, &d->previousnames ))
5062 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5063 NT_PRINTER_INFO_LEVEL_2 **asc)
5065 NT_PRINTER_INFO_LEVEL_2 *d;
5068 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5069 time_unix=time(NULL);
5072 DEBUGADD(8,("allocating memory\n"));
5074 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
5079 /* we allocate memory iff called from
5080 * addprinter(ex) so we can do one time stuff here.
5082 (*asc)->setuptime=time_unix;
5085 DEBUGADD(8,("start converting\n"));
5089 d->attributes=uni->attributes;
5090 d->priority=uni->priority;
5091 d->default_priority=uni->default_priority;
5092 d->starttime=uni->starttime;
5093 d->untiltime=uni->untiltime;
5094 d->status=uni->status;
5095 d->cjobs=uni->cjobs;
5097 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5098 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5099 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5100 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5101 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5102 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5103 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5104 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5105 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5106 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5107 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5112 /*******************************************************************
5114 ********************************************************************/
5116 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5117 fstring servername, fstring env_name, uint32 level,
5118 NEW_BUFFER *buffer, uint32 offered)
5120 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5121 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5125 q_u->offered=offered;
5130 /*******************************************************************
5131 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5132 ********************************************************************/
5134 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5136 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5141 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5143 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5149 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5151 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5157 if(!prs_uint32("level", ps, depth, &q_u->level))
5160 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5166 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5172 /*******************************************************************
5173 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5174 ********************************************************************/
5176 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5178 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5184 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5190 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5193 if (!prs_werror("status", ps, depth, &r_u->status))
5199 /*******************************************************************
5200 ********************************************************************/
5202 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5204 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5210 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5216 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5219 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5222 if (!prs_werror("status", ps, depth, &r_u->status))
5228 /*******************************************************************
5229 ********************************************************************/
5231 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5233 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5239 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5241 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5247 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5249 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5255 if (!prs_uint32("level", ps, depth, &q_u->level))
5258 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5264 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5270 /*******************************************************************
5271 ********************************************************************/
5273 BOOL spoolss_io_q_addprintprocessor(char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5275 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5281 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5283 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5288 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5293 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5298 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5304 /*******************************************************************
5305 ********************************************************************/
5307 BOOL spoolss_io_r_addprintprocessor(char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5309 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5315 if (!prs_werror("status", ps, depth, &r_u->status))
5321 /*******************************************************************
5322 ********************************************************************/
5324 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5326 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5332 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5338 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5341 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5344 if (!prs_werror("status", ps, depth, &r_u->status))
5350 /*******************************************************************
5351 ********************************************************************/
5353 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5355 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5361 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5363 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5369 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5371 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5377 if (!prs_uint32("level", ps, depth, &q_u->level))
5380 if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
5386 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5392 /*******************************************************************
5393 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5394 ********************************************************************/
5396 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5398 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5404 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5406 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5412 if (!prs_uint32("level", ps, depth, &q_u->level))
5415 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5421 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5427 /*******************************************************************
5428 ********************************************************************/
5430 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5432 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5438 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5444 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5447 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5450 if (!prs_werror("status", ps, depth, &r_u->status))
5456 /*******************************************************************
5457 ********************************************************************/
5459 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5461 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5466 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5469 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5475 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5478 if(!prs_uint32("type", ps, depth, &r_u->type))
5481 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5483 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5488 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5490 if(!prs_werror("status", ps, depth, &r_u->status))
5496 /*******************************************************************
5497 ********************************************************************/
5499 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5501 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5506 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5508 if(!prs_uint32("index", ps, depth, &q_u->index))
5510 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5512 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5518 /*******************************************************************
5519 ********************************************************************/
5521 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5522 const POLICY_HND *hnd,
5523 uint32 idx, uint32 valuelen, uint32 datalen)
5525 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5527 q_u->valuesize=valuelen;
5528 q_u->datasize=datalen;
5533 /*******************************************************************
5534 ********************************************************************/
5536 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5538 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5543 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5545 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5551 if(!prs_uint32("type", ps, depth, &q_u->type))
5554 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5564 if (UNMARSHALLING(ps))
5565 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
5566 if(q_u->data == NULL)
5568 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5576 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5582 /*******************************************************************
5583 ********************************************************************/
5585 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5587 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5592 if(!prs_werror("status", ps, depth, &r_u->status))
5598 /*******************************************************************
5599 ********************************************************************/
5601 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
5602 uint32 type, const uint8 *data, uint32 len)
5604 DEBUG(5,("converting a specific param struct\n"));
5608 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
5611 memset((char *)*param, '\0', sizeof(NT_PRINTER_PARAM));
5612 DEBUGADD(6,("Allocated a new PARAM struct\n"));
5614 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
5615 (*param)->type = type;
5617 /* le champ data n'est pas NULL termine */
5618 /* on stocke donc la longueur */
5620 (*param)->data_len=len;
5623 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
5624 if((*param)->data == NULL)
5626 memcpy((*param)->data, data, len);
5629 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
5630 dump_data(10, (char *)(*param)->data, (*param)->data_len);
5635 /*******************************************************************
5636 ********************************************************************/
5638 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5640 prs_debug(ps, depth, desc, "spoolss_io_addform");
5647 if(!prs_uint32("flags", ps, depth, &f->flags))
5649 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
5651 if(!prs_uint32("size_x", ps, depth, &f->size_x))
5653 if(!prs_uint32("size_y", ps, depth, &f->size_y))
5655 if(!prs_uint32("left", ps, depth, &f->left))
5657 if(!prs_uint32("top", ps, depth, &f->top))
5659 if(!prs_uint32("right", ps, depth, &f->right))
5661 if(!prs_uint32("bottom", ps, depth, &f->bottom))
5664 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
5671 /*******************************************************************
5672 ********************************************************************/
5674 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
5676 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
5681 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5683 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
5689 /*******************************************************************
5690 ********************************************************************/
5692 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
5694 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
5699 if(!prs_werror("status", ps, depth, &r_u->status))
5705 /*******************************************************************
5706 ********************************************************************/
5708 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
5710 uint32 useless_ptr=0;
5711 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
5716 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5718 if(!prs_uint32("level", ps, depth, &q_u->level))
5720 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5725 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5727 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5734 /*******************************************************************
5735 ********************************************************************/
5737 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
5739 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
5744 if(!prs_werror("status", ps, depth, &r_u->status))
5750 /*******************************************************************
5751 ********************************************************************/
5753 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
5755 uint32 useless_ptr=0;
5756 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
5761 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5763 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
5769 if(!prs_uint32("level", ps, depth, &q_u->level))
5771 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5776 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5778 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5785 /*******************************************************************
5786 ********************************************************************/
5788 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
5790 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
5795 if(!prs_werror("status", ps, depth, &r_u->status))
5801 /*******************************************************************
5802 Parse a SPOOL_R_GETJOB structure.
5803 ********************************************************************/
5805 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
5807 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
5813 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5819 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5822 if (!prs_werror("status", ps, depth, &r_u->status))
5828 /*******************************************************************
5829 Parse a SPOOL_Q_GETJOB structure.
5830 ********************************************************************/
5832 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
5834 prs_debug(ps, depth, desc, "");
5840 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5842 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
5844 if(!prs_uint32("level", ps, depth, &q_u->level))
5847 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5853 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5859 void free_devmode(DEVICEMODE *devmode)
5861 if (devmode!=NULL) {
5862 safe_free(devmode->private);
5867 void free_printer_info_1(PRINTER_INFO_1 *printer)
5872 void free_printer_info_2(PRINTER_INFO_2 *printer)
5874 if (printer!=NULL) {
5875 free_devmode(printer->devmode);
5876 printer->devmode = NULL;
5881 void free_printer_info_3(PRINTER_INFO_3 *printer)
5883 if (printer!=NULL) {
5888 void free_job_info_2(JOB_INFO_2 *job)
5891 free_devmode(job->devmode);
5894 /*******************************************************************
5896 ********************************************************************/
5898 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
5899 const fstring string, uint32 printer, uint32 type)
5904 init_unistr2(&q_u->string, string, strlen(string)+1);
5906 q_u->printer=printer;
5915 /*******************************************************************
5916 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
5917 ********************************************************************/
5919 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
5921 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
5927 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
5933 if(!prs_uint32("printer", ps, depth, &q_u->printer))
5935 if(!prs_uint32("type", ps, depth, &q_u->type))
5938 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
5940 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
5946 /*******************************************************************
5947 Parse a SPOOL_R_REPLYOPENPRINTER structure.
5948 ********************************************************************/
5950 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
5952 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
5958 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
5961 if (!prs_werror("status", ps, depth, &r_u->status))
5967 /*******************************************************************
5969 ********************************************************************/
5971 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
5976 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5981 /*******************************************************************
5982 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
5983 ********************************************************************/
5985 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
5987 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
5993 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5999 /*******************************************************************
6000 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
6001 ********************************************************************/
6003 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
6005 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6011 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
6014 if (!prs_werror("status", ps, depth, &r_u->status))
6020 /*******************************************************************
6022 ********************************************************************/
6024 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6025 uint32 change_low, uint32 change_high)
6030 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6032 q_u->change_low=change_low;
6033 q_u->change_high=change_high;
6040 q_u->info.version=2;
6041 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6047 /*******************************************************************
6048 Parse a SPOOL_Q_REPLY_RRPCN structure.
6049 ********************************************************************/
6051 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6053 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6059 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6062 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6065 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6068 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6071 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6074 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6077 if(q_u->info_ptr!=0)
6078 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6084 /*******************************************************************
6085 Parse a SPOOL_R_REPLY_RRPCN structure.
6086 ********************************************************************/
6088 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6090 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6096 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6099 if (!prs_werror("status", ps, depth, &r_u->status))