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 static 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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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_uint32("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 */
1864 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
1866 /* Yes this should be realloc - it's freed below. JRA */
1868 if((chaine2=(uint16 *)Realloc(chaine2, realloc_size)) == NULL)
1870 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
1871 l_chaine2+=l_chaine+1;
1874 } while(l_chaine!=0);
1876 /* the end should be bould NULL terminated so add
1877 the second one here */
1880 chaine2[l_chaine2] = '\0';
1881 *string=(uint16 *)talloc_memdup(prs_get_mem_context(ps),chaine2,realloc_size);
1885 if(!prs_set_offset(ps, old_offset))
1891 /*******************************************************************
1892 Parse a DEVMODE structure and its relative pointer.
1893 ********************************************************************/
1895 static BOOL smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth, SEC_DESC **secdesc)
1897 prs_struct *ps= &buffer->prs;
1899 prs_debug(ps, depth, desc, "smb_io_relsecdesc");
1902 if (MARSHALLING(ps)) {
1903 uint32 struct_offset = prs_offset(ps);
1904 uint32 relative_offset;
1907 relative_offset = 0;
1908 if (!prs_uint32("offset", ps, depth, &relative_offset))
1913 if (*secdesc != NULL) {
1914 buffer->string_at_end -= sec_desc_size(*secdesc);
1916 if(!prs_set_offset(ps, buffer->string_at_end))
1918 /* write the secdesc */
1919 if (!sec_io_desc(desc, secdesc, ps, depth))
1922 if(!prs_set_offset(ps, struct_offset))
1926 relative_offset=buffer->string_at_end - buffer->struct_start;
1927 /* write its offset */
1929 if (!prs_uint32("offset", ps, depth, &relative_offset))
1934 /* read the offset */
1935 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
1938 old_offset = prs_offset(ps);
1939 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
1943 if (!sec_io_desc(desc, secdesc, ps, depth))
1946 if(!prs_set_offset(ps, old_offset))
1952 /*******************************************************************
1953 Parse a DEVMODE structure and its relative pointer.
1954 ********************************************************************/
1956 static BOOL smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE **devmode)
1958 prs_struct *ps=&buffer->prs;
1960 prs_debug(ps, depth, desc, "smb_io_reldevmode");
1963 if (MARSHALLING(ps)) {
1964 uint32 struct_offset = prs_offset(ps);
1965 uint32 relative_offset;
1967 if (*devmode == NULL) {
1969 if (!prs_uint32("offset", ps, depth, &relative_offset))
1971 DEBUG(8, ("boing, the devmode was NULL\n"));
1976 buffer->string_at_end -= ((*devmode)->size + (*devmode)->driverextra);
1978 if(!prs_set_offset(ps, buffer->string_at_end))
1981 /* write the DEVMODE */
1982 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
1985 if(!prs_set_offset(ps, struct_offset))
1988 relative_offset=buffer->string_at_end - buffer->struct_start;
1989 /* write its offset */
1990 if (!prs_uint32("offset", ps, depth, &relative_offset))
1996 /* read the offset */
1997 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
2000 old_offset = prs_offset(ps);
2001 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
2004 /* read the string */
2005 if((*devmode=(DEVICEMODE *)prs_alloc_mem(ps,sizeof(DEVICEMODE))) == NULL)
2007 if (!spoolss_io_devmode(desc, ps, depth, *devmode))
2010 if(!prs_set_offset(ps, old_offset))
2016 /*******************************************************************
2017 Parse a PRINTER_INFO_0 structure.
2018 ********************************************************************/
2020 BOOL smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, int depth)
2022 prs_struct *ps=&buffer->prs;
2024 prs_debug(ps, depth, desc, "smb_io_printer_info_0");
2027 buffer->struct_start=prs_offset(ps);
2029 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2031 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2034 if(!prs_uint32("cjobs", ps, depth, &info->cjobs))
2036 if(!prs_uint32("total_jobs", ps, depth, &info->total_jobs))
2038 if(!prs_uint32("total_bytes", ps, depth, &info->total_bytes))
2041 if(!prs_uint16("year", ps, depth, &info->year))
2043 if(!prs_uint16("month", ps, depth, &info->month))
2045 if(!prs_uint16("dayofweek", ps, depth, &info->dayofweek))
2047 if(!prs_uint16("day", ps, depth, &info->day))
2049 if(!prs_uint16("hour", ps, depth, &info->hour))
2051 if(!prs_uint16("minute", ps, depth, &info->minute))
2053 if(!prs_uint16("second", ps, depth, &info->second))
2055 if(!prs_uint16("milliseconds", ps, depth, &info->milliseconds))
2058 if(!prs_uint32("global_counter", ps, depth, &info->global_counter))
2060 if(!prs_uint32("total_pages", ps, depth, &info->total_pages))
2063 if(!prs_uint16("major_version", ps, depth, &info->major_version))
2065 if(!prs_uint16("build_version", ps, depth, &info->build_version))
2067 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2069 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2071 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2073 if(!prs_uint32("session_counter", ps, depth, &info->session_counter))
2075 if(!prs_uint32("unknown11", ps, depth, &info->unknown11))
2077 if(!prs_uint32("printer_errors", ps, depth, &info->printer_errors))
2079 if(!prs_uint32("unknown13", ps, depth, &info->unknown13))
2081 if(!prs_uint32("unknown14", ps, depth, &info->unknown14))
2083 if(!prs_uint32("unknown15", ps, depth, &info->unknown15))
2085 if(!prs_uint32("unknown16", ps, depth, &info->unknown16))
2087 if(!prs_uint32("change_id", ps, depth, &info->change_id))
2089 if(!prs_uint32("unknown18", ps, depth, &info->unknown18))
2091 if(!prs_uint32("status" , ps, depth, &info->status))
2093 if(!prs_uint32("unknown20", ps, depth, &info->unknown20))
2095 if(!prs_uint32("c_setprinter", ps, depth, &info->c_setprinter))
2097 if(!prs_uint16("unknown22", ps, depth, &info->unknown22))
2099 if(!prs_uint16("unknown23", ps, depth, &info->unknown23))
2101 if(!prs_uint16("unknown24", ps, depth, &info->unknown24))
2103 if(!prs_uint16("unknown25", ps, depth, &info->unknown25))
2105 if(!prs_uint16("unknown26", ps, depth, &info->unknown26))
2107 if(!prs_uint16("unknown27", ps, depth, &info->unknown27))
2109 if(!prs_uint16("unknown28", ps, depth, &info->unknown28))
2111 if(!prs_uint16("unknown29", ps, depth, &info->unknown29))
2117 /*******************************************************************
2118 Parse a PRINTER_INFO_1 structure.
2119 ********************************************************************/
2121 BOOL smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
2123 prs_struct *ps=&buffer->prs;
2125 prs_debug(ps, depth, desc, "smb_io_printer_info_1");
2128 buffer->struct_start=prs_offset(ps);
2130 if (!prs_uint32("flags", ps, depth, &info->flags))
2132 if (!smb_io_relstr("description", buffer, depth, &info->description))
2134 if (!smb_io_relstr("name", buffer, depth, &info->name))
2136 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2142 /*******************************************************************
2143 Parse a PRINTER_INFO_2 structure.
2144 ********************************************************************/
2146 BOOL smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
2148 prs_struct *ps=&buffer->prs;
2150 prs_debug(ps, depth, desc, "smb_io_printer_info_2");
2153 buffer->struct_start=prs_offset(ps);
2155 if (!smb_io_relstr("servername", buffer, depth, &info->servername))
2157 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2159 if (!smb_io_relstr("sharename", buffer, depth, &info->sharename))
2161 if (!smb_io_relstr("portname", buffer, depth, &info->portname))
2163 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2165 if (!smb_io_relstr("comment", buffer, depth, &info->comment))
2167 if (!smb_io_relstr("location", buffer, depth, &info->location))
2170 /* NT parses the DEVMODE at the end of the struct */
2171 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2174 if (!smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
2176 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2178 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2180 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2183 if (!smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
2186 if (!prs_uint32("attributes", ps, depth, &info->attributes))
2188 if (!prs_uint32("priority", ps, depth, &info->priority))
2190 if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
2192 if (!prs_uint32("starttime", ps, depth, &info->starttime))
2194 if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
2196 if (!prs_uint32("status", ps, depth, &info->status))
2198 if (!prs_uint32("jobs", ps, depth, &info->cjobs))
2200 if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
2204 if (!prs_uint32_post("secdesc_ptr", ps, depth, NULL, sec_offset, info->secdesc ? prs_offset(ps)-buffer->struct_start : 0 ))
2207 if (!sec_io_desc("secdesc", &info->secdesc, ps, depth))
2213 /*******************************************************************
2214 Parse a PRINTER_INFO_3 structure.
2215 ********************************************************************/
2217 BOOL smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
2219 prs_struct *ps=&buffer->prs;
2221 prs_debug(ps, depth, desc, "smb_io_printer_info_3");
2224 buffer->struct_start=prs_offset(ps);
2226 if (!prs_uint32("flags", ps, depth, &info->flags))
2228 if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
2234 /*******************************************************************
2235 Parse a PORT_INFO_1 structure.
2236 ********************************************************************/
2238 BOOL smb_io_port_info_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2240 prs_struct *ps=&buffer->prs;
2242 prs_debug(ps, depth, desc, "smb_io_port_info_1");
2245 buffer->struct_start=prs_offset(ps);
2247 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2253 /*******************************************************************
2254 Parse a PORT_INFO_2 structure.
2255 ********************************************************************/
2257 BOOL smb_io_port_info_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2259 prs_struct *ps=&buffer->prs;
2261 prs_debug(ps, depth, desc, "smb_io_port_info_2");
2264 buffer->struct_start=prs_offset(ps);
2266 if (!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2268 if (!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2270 if (!smb_io_relstr("description", buffer, depth, &info->description))
2272 if (!prs_uint32("port_type", ps, depth, &info->port_type))
2274 if (!prs_uint32("reserved", ps, depth, &info->reserved))
2280 /*******************************************************************
2281 Parse a DRIVER_INFO_1 structure.
2282 ********************************************************************/
2284 BOOL smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth)
2286 prs_struct *ps=&buffer->prs;
2288 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_1");
2291 buffer->struct_start=prs_offset(ps);
2293 if (!smb_io_relstr("name", buffer, depth, &info->name))
2299 /*******************************************************************
2300 Parse a DRIVER_INFO_2 structure.
2301 ********************************************************************/
2303 BOOL smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth)
2305 prs_struct *ps=&buffer->prs;
2307 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_2");
2310 buffer->struct_start=prs_offset(ps);
2312 if (!prs_uint32("version", ps, depth, &info->version))
2314 if (!smb_io_relstr("name", buffer, depth, &info->name))
2316 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2318 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2320 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2322 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2328 /*******************************************************************
2329 Parse a DRIVER_INFO_3 structure.
2330 ********************************************************************/
2332 BOOL smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
2334 prs_struct *ps=&buffer->prs;
2336 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_3");
2339 buffer->struct_start=prs_offset(ps);
2341 if (!prs_uint32("version", ps, depth, &info->version))
2343 if (!smb_io_relstr("name", buffer, depth, &info->name))
2345 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2347 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2349 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2351 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2353 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2356 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2359 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2361 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2367 /*******************************************************************
2368 Parse a DRIVER_INFO_6 structure.
2369 ********************************************************************/
2371 BOOL smb_io_printer_driver_info_6(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_6 *info, int depth)
2373 prs_struct *ps=&buffer->prs;
2375 prs_debug(ps, depth, desc, "smb_io_printer_driver_info_6");
2378 buffer->struct_start=prs_offset(ps);
2380 if (!prs_uint32("version", ps, depth, &info->version))
2382 if (!smb_io_relstr("name", buffer, depth, &info->name))
2384 if (!smb_io_relstr("architecture", buffer, depth, &info->architecture))
2386 if (!smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
2388 if (!smb_io_relstr("datafile", buffer, depth, &info->datafile))
2390 if (!smb_io_relstr("configfile", buffer, depth, &info->configfile))
2392 if (!smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
2395 if (!smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
2398 if (!smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
2400 if (!smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
2403 if (!smb_io_relarraystr("previousdrivernames", buffer, depth, &info->previousdrivernames))
2406 if (!prs_uint32("date.low", ps, depth, &info->driver_date.low))
2408 if (!prs_uint32("date.high", ps, depth, &info->driver_date.high))
2411 if (!prs_uint32("padding", ps, depth, &info->padding))
2414 if (!prs_uint32("driver_version_low", ps, depth, &info->driver_version_low))
2417 if (!prs_uint32("driver_version_high", ps, depth, &info->driver_version_high))
2420 if (!smb_io_relstr("mfgname", buffer, depth, &info->mfgname))
2422 if (!smb_io_relstr("oem_url", buffer, depth, &info->oem_url))
2424 if (!smb_io_relstr("hardware_id", buffer, depth, &info->hardware_id))
2426 if (!smb_io_relstr("provider", buffer, depth, &info->provider))
2432 /*******************************************************************
2433 Parse a JOB_INFO_1 structure.
2434 ********************************************************************/
2436 BOOL smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
2438 prs_struct *ps=&buffer->prs;
2440 prs_debug(ps, depth, desc, "smb_io_job_info_1");
2443 buffer->struct_start=prs_offset(ps);
2445 if (!prs_uint32("jobid", ps, depth, &info->jobid))
2447 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2449 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2451 if (!smb_io_relstr("username", buffer, depth, &info->username))
2453 if (!smb_io_relstr("document", buffer, depth, &info->document))
2455 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2457 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2459 if (!prs_uint32("status", ps, depth, &info->status))
2461 if (!prs_uint32("priority", ps, depth, &info->priority))
2463 if (!prs_uint32("position", ps, depth, &info->position))
2465 if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
2467 if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
2469 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
2475 /*******************************************************************
2476 Parse a JOB_INFO_2 structure.
2477 ********************************************************************/
2479 BOOL smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
2482 prs_struct *ps=&buffer->prs;
2484 prs_debug(ps, depth, desc, "smb_io_job_info_2");
2487 buffer->struct_start=prs_offset(ps);
2489 if (!prs_uint32("jobid",ps, depth, &info->jobid))
2491 if (!smb_io_relstr("printername", buffer, depth, &info->printername))
2493 if (!smb_io_relstr("machinename", buffer, depth, &info->machinename))
2495 if (!smb_io_relstr("username", buffer, depth, &info->username))
2497 if (!smb_io_relstr("document", buffer, depth, &info->document))
2499 if (!smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
2501 if (!smb_io_relstr("datatype", buffer, depth, &info->datatype))
2504 if (!smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
2506 if (!smb_io_relstr("parameters", buffer, depth, &info->parameters))
2508 if (!smb_io_relstr("drivername", buffer, depth, &info->drivername))
2510 if (!smb_io_reldevmode("devmode", buffer, depth, &info->devmode))
2512 if (!smb_io_relstr("text_status", buffer, depth, &info->text_status))
2515 /* SEC_DESC sec_desc;*/
2516 if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
2519 if (!prs_uint32("status",ps, depth, &info->status))
2521 if (!prs_uint32("priority",ps, depth, &info->priority))
2523 if (!prs_uint32("position",ps, depth, &info->position))
2525 if (!prs_uint32("starttime",ps, depth, &info->starttime))
2527 if (!prs_uint32("untiltime",ps, depth, &info->untiltime))
2529 if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
2531 if (!prs_uint32("size",ps, depth, &info->size))
2533 if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
2535 if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
2537 if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
2543 /*******************************************************************
2544 ********************************************************************/
2546 BOOL smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth)
2548 prs_struct *ps=&buffer->prs;
2550 prs_debug(ps, depth, desc, "smb_io_form_1");
2553 buffer->struct_start=prs_offset(ps);
2555 if (!prs_uint32("flag", ps, depth, &info->flag))
2558 if (!smb_io_relstr("name", buffer, depth, &info->name))
2561 if (!prs_uint32("width", ps, depth, &info->width))
2563 if (!prs_uint32("length", ps, depth, &info->length))
2565 if (!prs_uint32("left", ps, depth, &info->left))
2567 if (!prs_uint32("top", ps, depth, &info->top))
2569 if (!prs_uint32("right", ps, depth, &info->right))
2571 if (!prs_uint32("bottom", ps, depth, &info->bottom))
2577 /*******************************************************************
2578 Read/write a BUFFER struct.
2579 ********************************************************************/
2581 static BOOL spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUFFER **pp_buffer)
2583 NEW_BUFFER *buffer = *pp_buffer;
2585 prs_debug(ps, depth, desc, "spoolss_io_buffer");
2588 if (UNMARSHALLING(ps))
2589 buffer = *pp_buffer = (NEW_BUFFER *)prs_alloc_mem(ps, sizeof(NEW_BUFFER));
2594 if (!prs_uint32("ptr", ps, depth, &buffer->ptr))
2598 if (UNMARSHALLING(ps)) {
2600 buffer->string_at_end=0;
2602 if (buffer->ptr==0) {
2604 * JRA. I'm not sure if the data in here is in big-endian format if
2605 * the client is big-endian. Leave as default (little endian) for now.
2608 if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
2613 if (!prs_uint32("size", ps, depth, &buffer->size))
2617 * JRA. I'm not sure if the data in here is in big-endian format if
2618 * the client is big-endian. Leave as default (little endian) for now.
2621 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
2624 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
2627 if (!prs_set_offset(&buffer->prs, 0))
2630 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
2633 buffer->string_at_end=buffer->size;
2641 if (buffer->ptr==0) {
2642 /* We have finished with the data in buffer->prs - free it. */
2643 prs_mem_free(&buffer->prs);
2647 if (!prs_uint32("size", ps, depth, &buffer->size))
2650 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
2656 /* We have finished with the data in buffer->prs - free it. */
2657 prs_mem_free(&buffer->prs);
2663 /*******************************************************************
2664 move a BUFFER from the query to the reply.
2665 As the data pointers in NEW_BUFFER are malloc'ed, not talloc'ed,
2666 this is ok. This is an OPTIMIZATION and is not strictly neccessary.
2667 ********************************************************************/
2669 void spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest)
2671 prs_switch_type(&src->prs, MARSHALL);
2672 if(!prs_set_offset(&src->prs, 0))
2674 prs_force_dynamic(&(src->prs));
2679 /*******************************************************************
2680 Get the size of a BUFFER struct.
2681 ********************************************************************/
2683 uint32 new_get_buffer_size(NEW_BUFFER *buffer)
2685 return (buffer->size);
2688 /*******************************************************************
2689 Parse a DRIVER_DIRECTORY_1 structure.
2690 ********************************************************************/
2692 BOOL smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth)
2694 prs_struct *ps=&buffer->prs;
2696 prs_debug(ps, depth, desc, "smb_io_driverdir_1");
2699 buffer->struct_start=prs_offset(ps);
2701 if (!smb_io_unistr(desc, &info->name, ps, depth))
2707 /*******************************************************************
2708 Parse a PORT_INFO_1 structure.
2709 ********************************************************************/
2711 BOOL smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
2713 prs_struct *ps=&buffer->prs;
2715 prs_debug(ps, depth, desc, "smb_io_port_1");
2718 buffer->struct_start=prs_offset(ps);
2720 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2726 /*******************************************************************
2727 Parse a PORT_INFO_2 structure.
2728 ********************************************************************/
2730 BOOL smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
2732 prs_struct *ps=&buffer->prs;
2734 prs_debug(ps, depth, desc, "smb_io_port_2");
2737 buffer->struct_start=prs_offset(ps);
2739 if(!smb_io_relstr("port_name", buffer, depth, &info->port_name))
2741 if(!smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
2743 if(!smb_io_relstr("description", buffer, depth, &info->description))
2745 if(!prs_uint32("port_type", ps, depth, &info->port_type))
2747 if(!prs_uint32("reserved", ps, depth, &info->reserved))
2753 /*******************************************************************
2754 ********************************************************************/
2756 BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
2758 prs_struct *ps=&buffer->prs;
2760 prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
2763 buffer->struct_start=prs_offset(ps);
2765 if (smb_io_relstr("name", buffer, depth, &info->name))
2771 /*******************************************************************
2772 ********************************************************************/
2774 BOOL smb_io_printprocdatatype_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCDATATYPE_1 *info, int depth)
2776 prs_struct *ps=&buffer->prs;
2778 prs_debug(ps, depth, desc, "smb_io_printprocdatatype_info_1");
2781 buffer->struct_start=prs_offset(ps);
2783 if (smb_io_relstr("name", buffer, depth, &info->name))
2789 /*******************************************************************
2790 ********************************************************************/
2792 BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
2794 prs_struct *ps=&buffer->prs;
2796 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
2799 buffer->struct_start=prs_offset(ps);
2801 if (!smb_io_relstr("name", buffer, depth, &info->name))
2807 /*******************************************************************
2808 ********************************************************************/
2810 BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
2812 prs_struct *ps=&buffer->prs;
2814 prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
2817 buffer->struct_start=prs_offset(ps);
2819 if (!smb_io_relstr("name", buffer, depth, &info->name))
2821 if (!smb_io_relstr("environment", buffer, depth, &info->environment))
2823 if (!smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
2829 /*******************************************************************
2830 return the size required by a struct in the stream
2831 ********************************************************************/
2833 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
2837 size+=size_of_relative_string( &info->printername );
2838 size+=size_of_relative_string( &info->servername );
2840 size+=size_of_uint32( &info->cjobs);
2841 size+=size_of_uint32( &info->total_jobs);
2842 size+=size_of_uint32( &info->total_bytes);
2844 size+=size_of_uint16( &info->year);
2845 size+=size_of_uint16( &info->month);
2846 size+=size_of_uint16( &info->dayofweek);
2847 size+=size_of_uint16( &info->day);
2848 size+=size_of_uint16( &info->hour);
2849 size+=size_of_uint16( &info->minute);
2850 size+=size_of_uint16( &info->second);
2851 size+=size_of_uint16( &info->milliseconds);
2853 size+=size_of_uint32( &info->global_counter);
2854 size+=size_of_uint32( &info->total_pages);
2856 size+=size_of_uint16( &info->major_version);
2857 size+=size_of_uint16( &info->build_version);
2859 size+=size_of_uint32( &info->unknown7);
2860 size+=size_of_uint32( &info->unknown8);
2861 size+=size_of_uint32( &info->unknown9);
2862 size+=size_of_uint32( &info->session_counter);
2863 size+=size_of_uint32( &info->unknown11);
2864 size+=size_of_uint32( &info->printer_errors);
2865 size+=size_of_uint32( &info->unknown13);
2866 size+=size_of_uint32( &info->unknown14);
2867 size+=size_of_uint32( &info->unknown15);
2868 size+=size_of_uint32( &info->unknown16);
2869 size+=size_of_uint32( &info->change_id);
2870 size+=size_of_uint32( &info->unknown18);
2871 size+=size_of_uint32( &info->status);
2872 size+=size_of_uint32( &info->unknown20);
2873 size+=size_of_uint32( &info->c_setprinter);
2875 size+=size_of_uint16( &info->unknown22);
2876 size+=size_of_uint16( &info->unknown23);
2877 size+=size_of_uint16( &info->unknown24);
2878 size+=size_of_uint16( &info->unknown25);
2879 size+=size_of_uint16( &info->unknown26);
2880 size+=size_of_uint16( &info->unknown27);
2881 size+=size_of_uint16( &info->unknown28);
2882 size+=size_of_uint16( &info->unknown29);
2887 /*******************************************************************
2888 return the size required by a struct in the stream
2889 ********************************************************************/
2891 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
2895 size+=size_of_uint32( &info->flags );
2896 size+=size_of_relative_string( &info->description );
2897 size+=size_of_relative_string( &info->name );
2898 size+=size_of_relative_string( &info->comment );
2903 /*******************************************************************
2904 return the size required by a struct in the stream
2905 ********************************************************************/
2907 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
2912 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2913 size += sec_desc_size( info->secdesc );
2915 size+=size_of_device_mode( info->devmode );
2917 size+=size_of_relative_string( &info->servername );
2918 size+=size_of_relative_string( &info->printername );
2919 size+=size_of_relative_string( &info->sharename );
2920 size+=size_of_relative_string( &info->portname );
2921 size+=size_of_relative_string( &info->drivername );
2922 size+=size_of_relative_string( &info->comment );
2923 size+=size_of_relative_string( &info->location );
2925 size+=size_of_relative_string( &info->sepfile );
2926 size+=size_of_relative_string( &info->printprocessor );
2927 size+=size_of_relative_string( &info->datatype );
2928 size+=size_of_relative_string( &info->parameters );
2930 size+=size_of_uint32( &info->attributes );
2931 size+=size_of_uint32( &info->priority );
2932 size+=size_of_uint32( &info->defaultpriority );
2933 size+=size_of_uint32( &info->starttime );
2934 size+=size_of_uint32( &info->untiltime );
2935 size+=size_of_uint32( &info->status );
2936 size+=size_of_uint32( &info->cjobs );
2937 size+=size_of_uint32( &info->averageppm );
2941 /*******************************************************************
2942 return the size required by a struct in the stream
2943 ********************************************************************/
2945 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
2947 /* The 4 is for the self relative pointer.. */
2948 /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
2949 return 4 + (uint32)sec_desc_size( info->secdesc );
2952 /*******************************************************************
2953 return the size required by a struct in the stream
2954 ********************************************************************/
2956 uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
2959 size+=size_of_relative_string( &info->name );
2964 /*******************************************************************
2965 return the size required by a struct in the stream
2966 ********************************************************************/
2968 uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
2971 size+=size_of_uint32( &info->version );
2972 size+=size_of_relative_string( &info->name );
2973 size+=size_of_relative_string( &info->architecture );
2974 size+=size_of_relative_string( &info->driverpath );
2975 size+=size_of_relative_string( &info->datafile );
2976 size+=size_of_relative_string( &info->configfile );
2981 /*******************************************************************
2982 return the size required by a string array.
2983 ********************************************************************/
2985 uint32 spoolss_size_string_array(uint16 *string)
2990 for (i=0; (string[i]!=0x0000) || (string[i+1]!=0x0000); i++);
2992 i=i+2; /* to count all chars including the leading zero */
2993 i=2*i; /* because we need the value in bytes */
2994 i=i+4; /* the offset pointer size */
2999 /*******************************************************************
3000 return the size required by a struct in the stream
3001 ********************************************************************/
3003 uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
3007 size+=size_of_uint32( &info->version );
3008 size+=size_of_relative_string( &info->name );
3009 size+=size_of_relative_string( &info->architecture );
3010 size+=size_of_relative_string( &info->driverpath );
3011 size+=size_of_relative_string( &info->datafile );
3012 size+=size_of_relative_string( &info->configfile );
3013 size+=size_of_relative_string( &info->helpfile );
3014 size+=size_of_relative_string( &info->monitorname );
3015 size+=size_of_relative_string( &info->defaultdatatype );
3017 size+=spoolss_size_string_array(info->dependentfiles);
3022 /*******************************************************************
3023 return the size required by a struct in the stream
3024 ********************************************************************/
3026 uint32 spoolss_size_printer_driver_info_6(DRIVER_INFO_6 *info)
3030 size+=size_of_uint32( &info->version );
3031 size+=size_of_relative_string( &info->name );
3032 size+=size_of_relative_string( &info->architecture );
3033 size+=size_of_relative_string( &info->driverpath );
3034 size+=size_of_relative_string( &info->datafile );
3035 size+=size_of_relative_string( &info->configfile );
3036 size+=size_of_relative_string( &info->helpfile );
3038 size+=spoolss_size_string_array(info->dependentfiles);
3040 size+=size_of_relative_string( &info->monitorname );
3041 size+=size_of_relative_string( &info->defaultdatatype );
3043 size+=spoolss_size_string_array(info->previousdrivernames);
3045 size+=size_of_nttime(&info->driver_date);
3046 size+=size_of_uint32( &info->padding );
3047 size+=size_of_uint32( &info->driver_version_low );
3048 size+=size_of_uint32( &info->driver_version_high );
3049 size+=size_of_relative_string( &info->mfgname );
3050 size+=size_of_relative_string( &info->oem_url );
3051 size+=size_of_relative_string( &info->hardware_id );
3052 size+=size_of_relative_string( &info->provider );
3057 /*******************************************************************
3058 return the size required by a struct in the stream
3059 ********************************************************************/
3061 uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
3064 size+=size_of_uint32( &info->jobid );
3065 size+=size_of_relative_string( &info->printername );
3066 size+=size_of_relative_string( &info->machinename );
3067 size+=size_of_relative_string( &info->username );
3068 size+=size_of_relative_string( &info->document );
3069 size+=size_of_relative_string( &info->datatype );
3070 size+=size_of_relative_string( &info->text_status );
3071 size+=size_of_uint32( &info->status );
3072 size+=size_of_uint32( &info->priority );
3073 size+=size_of_uint32( &info->position );
3074 size+=size_of_uint32( &info->totalpages );
3075 size+=size_of_uint32( &info->pagesprinted );
3076 size+=size_of_systemtime( &info->submitted );
3081 /*******************************************************************
3082 return the size required by a struct in the stream
3083 ********************************************************************/
3085 uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
3089 size+=4; /* size of sec desc ptr */
3091 size+=size_of_uint32( &info->jobid );
3092 size+=size_of_relative_string( &info->printername );
3093 size+=size_of_relative_string( &info->machinename );
3094 size+=size_of_relative_string( &info->username );
3095 size+=size_of_relative_string( &info->document );
3096 size+=size_of_relative_string( &info->notifyname );
3097 size+=size_of_relative_string( &info->datatype );
3098 size+=size_of_relative_string( &info->printprocessor );
3099 size+=size_of_relative_string( &info->parameters );
3100 size+=size_of_relative_string( &info->drivername );
3101 size+=size_of_device_mode( info->devmode );
3102 size+=size_of_relative_string( &info->text_status );
3103 /* SEC_DESC sec_desc;*/
3104 size+=size_of_uint32( &info->status );
3105 size+=size_of_uint32( &info->priority );
3106 size+=size_of_uint32( &info->position );
3107 size+=size_of_uint32( &info->starttime );
3108 size+=size_of_uint32( &info->untiltime );
3109 size+=size_of_uint32( &info->totalpages );
3110 size+=size_of_uint32( &info->size );
3111 size+=size_of_systemtime( &info->submitted );
3112 size+=size_of_uint32( &info->timeelapsed );
3113 size+=size_of_uint32( &info->pagesprinted );
3118 /*******************************************************************
3119 return the size required by a struct in the stream
3120 ********************************************************************/
3122 uint32 spoolss_size_form_1(FORM_1 *info)
3126 size+=size_of_uint32( &info->flag );
3127 size+=size_of_relative_string( &info->name );
3128 size+=size_of_uint32( &info->width );
3129 size+=size_of_uint32( &info->length );
3130 size+=size_of_uint32( &info->left );
3131 size+=size_of_uint32( &info->top );
3132 size+=size_of_uint32( &info->right );
3133 size+=size_of_uint32( &info->bottom );
3138 /*******************************************************************
3139 return the size required by a struct in the stream
3140 ********************************************************************/
3142 uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
3146 size+=size_of_relative_string( &info->port_name );
3151 /*******************************************************************
3152 return the size required by a struct in the stream
3153 ********************************************************************/
3155 uint32 spoolss_size_driverdir_info_1(DRIVER_DIRECTORY_1 *info)
3159 size=str_len_uni(&info->name); /* the string length */
3160 size=size+1; /* add the leading zero */
3161 size=size*2; /* convert in char */
3166 /*******************************************************************
3167 return the size required by a struct in the stream
3168 ********************************************************************/
3170 uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
3174 size+=size_of_relative_string( &info->port_name );
3175 size+=size_of_relative_string( &info->monitor_name );
3176 size+=size_of_relative_string( &info->description );
3178 size+=size_of_uint32( &info->port_type );
3179 size+=size_of_uint32( &info->reserved );
3184 /*******************************************************************
3185 return the size required by a struct in the stream
3186 ********************************************************************/
3188 uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
3191 size+=size_of_relative_string( &info->name );
3196 /*******************************************************************
3197 return the size required by a struct in the stream
3198 ********************************************************************/
3200 uint32 spoolss_size_printprocdatatype_info_1(PRINTPROCDATATYPE_1 *info)
3203 size+=size_of_relative_string( &info->name );
3208 /*******************************************************************
3209 return the size required by a struct in the stream
3210 ********************************************************************/
3212 uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
3215 size+=size_of_relative_string( &info->name );
3220 /*******************************************************************
3221 return the size required by a struct in the stream
3222 ********************************************************************/
3224 uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
3227 size+=size_of_relative_string( &info->name);
3228 size+=size_of_relative_string( &info->environment);
3229 size+=size_of_relative_string( &info->dll_name);
3234 /*******************************************************************
3236 ********************************************************************/
3238 BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u,
3239 const POLICY_HND *hnd,
3240 const fstring architecture,
3241 uint32 level, uint32 clientmajor, uint32 clientminor,
3242 NEW_BUFFER *buffer, uint32 offered)
3247 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3249 init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
3252 q_u->clientmajorversion=clientmajor;
3253 q_u->clientminorversion=clientminor;
3256 q_u->offered=offered;
3261 /*******************************************************************
3263 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3264 ********************************************************************/
3266 BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth)
3268 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriver2");
3274 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3276 if(!prs_uint32("architecture_ptr", ps, depth, &q_u->architecture_ptr))
3278 if(!smb_io_unistr2("architecture", &q_u->architecture, q_u->architecture_ptr, ps, depth))
3283 if(!prs_uint32("level", ps, depth, &q_u->level))
3286 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3292 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3295 if(!prs_uint32("clientmajorversion", ps, depth, &q_u->clientmajorversion))
3297 if(!prs_uint32("clientminorversion", ps, depth, &q_u->clientminorversion))
3303 /*******************************************************************
3305 * called from spoolss_getprinterdriver2 (srv_spoolss.c)
3306 ********************************************************************/
3308 BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth)
3310 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriver2");
3316 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3321 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3323 if (!prs_uint32("servermajorversion", ps, depth, &r_u->servermajorversion))
3325 if (!prs_uint32("serverminorversion", ps, depth, &r_u->serverminorversion))
3327 if (!prs_uint32("status", ps, depth, &r_u->status))
3333 /*******************************************************************
3335 ********************************************************************/
3337 BOOL make_spoolss_q_enumprinters(
3338 SPOOL_Q_ENUMPRINTERS *q_u,
3348 q_u->servername_ptr = (servername != NULL) ? 1 : 0;
3349 init_buf_unistr2(&q_u->servername, &q_u->servername_ptr, servername);
3353 q_u->offered=offered;
3358 /*******************************************************************
3360 ********************************************************************/
3362 BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u,
3363 fstring servername, uint32 level,
3364 NEW_BUFFER *buffer, uint32 offered)
3366 q_u->name_ptr = (servername != NULL) ? 1 : 0;
3367 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
3371 q_u->offered=offered;
3376 /*******************************************************************
3378 * called from spoolss_enumprinters (srv_spoolss.c)
3379 ********************************************************************/
3381 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u, prs_struct *ps, int depth)
3383 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
3389 if (!prs_uint32("flags", ps, depth, &q_u->flags))
3391 if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
3394 if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
3399 if (!prs_uint32("level", ps, depth, &q_u->level))
3402 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3407 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3413 /*******************************************************************
3414 Parse a SPOOL_R_ENUMPRINTERS structure.
3415 ********************************************************************/
3417 BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
3419 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinters");
3425 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3431 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3434 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3437 if (!prs_uint32("status", ps, depth, &r_u->status))
3443 /*******************************************************************
3444 * write a structure.
3445 * called from spoolss_r_enum_printers (srv_spoolss.c)
3447 ********************************************************************/
3449 BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth)
3451 prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
3457 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3463 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3466 if (!prs_uint32("status", ps, depth, &r_u->status))
3472 /*******************************************************************
3474 * called from spoolss_getprinter (srv_spoolss.c)
3475 ********************************************************************/
3477 BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth)
3479 prs_debug(ps, depth, desc, "spoolss_io_q_getprinter");
3485 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3487 if (!prs_uint32("level", ps, depth, &q_u->level))
3490 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3495 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3501 /*******************************************************************
3503 ********************************************************************/
3505 BOOL make_spoolss_q_getprinter(
3506 TALLOC_CTX *mem_ctx,
3507 SPOOL_Q_GETPRINTER *q_u,
3508 const POLICY_HND *hnd,
3518 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3522 q_u->offered=offered;
3527 /*******************************************************************
3529 ********************************************************************/
3530 BOOL make_spoolss_q_setprinter(
3531 TALLOC_CTX *mem_ctx,
3532 SPOOL_Q_SETPRINTER *q_u,
3533 const POLICY_HND *hnd,
3535 PRINTER_INFO_CTR *info,
3540 DEVICEMODE *devmode;
3547 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3550 q_u->info.level = level;
3551 q_u->info.info_ptr = (info != NULL) ? 1 : 0;
3555 secdesc = info->printers_2->secdesc;
3556 devmode = info->printers_2->devmode;
3558 /* FIXMEE!! HACK ALERT!!! --jerry */
3559 info->printers_2->devmode = NULL;
3560 info->printers_2->secdesc = NULL;
3562 make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2);
3563 #if 0 /* JERRY TEST */
3564 q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF));
3565 if (!q_u->secdesc_ctr)
3567 q_u->secdesc_ctr->ptr = (secdesc != NULL) ? 1: 0;
3568 q_u->secdesc_ctr->max_len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3569 q_u->secdesc_ctr->len = (secdesc) ? sizeof(SEC_DESC) + (2*sizeof(uint32)) : 0;
3570 q_u->secdesc_ctr->sec = secdesc;
3572 q_u->devmode_ctr.devmode_ptr = (devmode != NULL) ? 1 : 0;
3573 q_u->devmode_ctr.size = sizeof(DEVICEMODE) + (3*sizeof(uint32));
3574 q_u->devmode_ctr.devmode = devmode;
3576 q_u->secdesc_ctr = NULL;
3578 q_u->devmode_ctr.devmode_ptr = 0;
3579 q_u->devmode_ctr.size = 0;
3580 q_u->devmode_ctr.devmode = NULL;
3584 DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
3589 q_u->command = command;
3595 /*******************************************************************
3596 ********************************************************************/
3598 BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth)
3600 prs_debug(ps, depth, desc, "spoolss_io_r_setprinter");
3606 if(!prs_uint32("status", ps, depth, &r_u->status))
3612 /*******************************************************************
3613 Marshall/unmarshall a SPOOL_Q_SETPRINTER struct.
3614 ********************************************************************/
3616 BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth)
3618 uint32 ptr_sec_desc = 0;
3620 prs_debug(ps, depth, desc, "spoolss_io_q_setprinter");
3626 if(!smb_io_pol_hnd("printer handle", &q_u->handle ,ps, depth))
3628 if(!prs_uint32("level", ps, depth, &q_u->level))
3631 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
3634 if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
3641 ptr_sec_desc = q_u->info.info_2->secdesc_ptr;
3646 ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
3652 if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
3657 /* Parse a NULL security descriptor. This should really
3658 happen inside the sec_io_desc_buf() function. */
3660 prs_debug(ps, depth, "", "sec_io_desc_buf");
3661 if (!prs_uint32("size", ps, depth + 1, &dummy)) return False;
3662 if (!prs_uint32("ptr", ps, depth + 1, &dummy)) return
3666 if(!prs_uint32("command", ps, depth, &q_u->command))
3672 /*******************************************************************
3673 ********************************************************************/
3675 BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
3677 prs_debug(ps, depth, desc, "spoolss_io_r_fcpn");
3683 if(!prs_uint32("status", ps, depth, &r_u->status))
3689 /*******************************************************************
3690 ********************************************************************/
3692 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth)
3695 prs_debug(ps, depth, desc, "spoolss_io_q_fcpn");
3701 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3708 /*******************************************************************
3709 ********************************************************************/
3711 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth)
3713 prs_debug(ps, depth, desc, "");
3719 if(!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3725 if(!prs_uint32("needed", ps, depth, &r_u->needed))
3728 if(!prs_uint32("status", ps, depth, &r_u->status))
3734 /*******************************************************************
3735 ********************************************************************/
3737 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth)
3739 prs_debug(ps, depth, desc, "");
3745 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
3747 if(!prs_uint32("level", ps, depth, &q_u->level))
3750 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3756 if(!prs_uint32("offered", ps, depth, &q_u->offered))
3762 /*******************************************************************
3763 ********************************************************************/
3765 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
3767 prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
3773 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3779 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3782 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3785 if (!prs_uint32("status", ps, depth, &r_u->status))
3791 /*******************************************************************
3792 ********************************************************************/
3794 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
3805 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
3806 q_u->firstjob = firstjob;
3807 q_u->numofjobs = numofjobs;
3809 q_u->buffer= buffer;
3810 q_u->offered = offered;
3814 /*******************************************************************
3815 ********************************************************************/
3817 BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth)
3819 prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
3825 if (!smb_io_pol_hnd("printer handle",&q_u->handle, ps, depth))
3828 if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
3830 if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
3832 if (!prs_uint32("level", ps, depth, &q_u->level))
3835 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
3838 if (!prs_uint32("offered", ps, depth, &q_u->offered))
3844 /*******************************************************************
3845 ********************************************************************/
3847 BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth)
3849 prs_debug(ps, depth, desc, "spoolss_io_r_schedulejob");
3855 if(!prs_uint32("status", ps, depth, &r_u->status))
3861 /*******************************************************************
3862 ********************************************************************/
3864 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth)
3866 prs_debug(ps, depth, desc, "spoolss_io_q_schedulejob");
3872 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3874 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3880 /*******************************************************************
3881 ********************************************************************/
3883 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth)
3885 prs_debug(ps, depth, desc, "spoolss_io_r_setjob");
3891 if(!prs_uint32("status", ps, depth, &r_u->status))
3897 /*******************************************************************
3898 ********************************************************************/
3900 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth)
3902 prs_debug(ps, depth, desc, "spoolss_io_q_setjob");
3908 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
3910 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
3913 * level is usually 0. If (level!=0) then I'm in trouble !
3914 * I will try to generate setjob command with level!=0, one day.
3916 if(!prs_uint32("level", ps, depth, &q_u->level))
3918 if(!prs_uint32("command", ps, depth, &q_u->command))
3924 /*******************************************************************
3925 Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
3926 ********************************************************************/
3928 BOOL spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
3930 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdrivers");
3936 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
3942 if (!prs_uint32("needed", ps, depth, &r_u->needed))
3945 if (!prs_uint32("returned", ps, depth, &r_u->returned))
3948 if (!prs_uint32("status", ps, depth, &r_u->status))
3954 /*******************************************************************
3956 ********************************************************************/
3958 BOOL make_spoolss_q_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u,
3960 const char *environment,
3962 NEW_BUFFER *buffer, uint32 offered)
3964 init_buf_unistr2(&q_u->name, &q_u->name_ptr, name);
3965 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, environment);
3969 q_u->offered=offered;
3974 /*******************************************************************
3975 Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
3976 ********************************************************************/
3978 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
3981 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
3987 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
3989 if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
3994 if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
3996 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
4001 if (!prs_uint32("level", ps, depth, &q_u->level))
4004 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4010 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4016 /*******************************************************************
4017 ********************************************************************/
4019 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth)
4022 prs_debug(ps, depth, desc, "spoolss_io_q_enumforms");
4027 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4029 if (!prs_uint32("level", ps, depth, &q_u->level))
4032 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4037 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4043 /*******************************************************************
4044 ********************************************************************/
4046 BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth)
4048 prs_debug(ps, depth, desc, "spoolss_io_r_enumforms");
4054 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4060 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4063 if (!prs_uint32("numofforms", ps, depth, &r_u->numofforms))
4066 if (!prs_uint32("status", ps, depth, &r_u->status))
4072 /*******************************************************************
4073 ********************************************************************/
4075 BOOL spoolss_io_q_getform(char *desc, SPOOL_Q_GETFORM *q_u, prs_struct *ps, int depth)
4078 prs_debug(ps, depth, desc, "spoolss_io_q_getform");
4083 if (!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
4085 if (!smb_io_unistr2("", &q_u->formname,True,ps,depth))
4091 if (!prs_uint32("level", ps, depth, &q_u->level))
4094 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4099 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4105 /*******************************************************************
4106 ********************************************************************/
4108 BOOL spoolss_io_r_getform(char *desc, SPOOL_R_GETFORM *r_u, prs_struct *ps, int depth)
4110 prs_debug(ps, depth, desc, "spoolss_io_r_getform");
4116 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4122 if (!prs_uint32("size of buffer needed", ps, depth, &r_u->needed))
4125 if (!prs_uint32("status", ps, depth, &r_u->status))
4131 /*******************************************************************
4132 Parse a SPOOL_R_ENUMPORTS structure.
4133 ********************************************************************/
4135 BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
4137 prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
4143 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
4149 if (!prs_uint32("needed", ps, depth, &r_u->needed))
4152 if (!prs_uint32("returned", ps, depth, &r_u->returned))
4155 if (!prs_uint32("status", ps, depth, &r_u->status))
4161 /*******************************************************************
4162 ********************************************************************/
4164 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
4166 prs_debug(ps, depth, desc, "");
4172 if (!prs_uint32("", ps, depth, &q_u->name_ptr))
4174 if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
4179 if (!prs_uint32("level", ps, depth, &q_u->level))
4182 if (!spoolss_io_buffer("", ps, depth, &q_u->buffer))
4187 if (!prs_uint32("offered", ps, depth, &q_u->offered))
4193 /*******************************************************************
4194 Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure.
4195 ********************************************************************/
4197 BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth)
4199 prs_debug(ps, depth, desc, "spool_io_printer_info_level_1");
4205 if(!prs_uint32("flags", ps, depth, &il->flags))
4207 if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr))
4209 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4211 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4214 if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth))
4216 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4218 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4224 /*******************************************************************
4225 Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
4226 ********************************************************************/
4228 BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
4230 prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
4236 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4242 /*******************************************************************
4243 Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
4244 ********************************************************************/
4246 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth)
4248 prs_debug(ps, depth, desc, "spool_io_printer_info_level_2");
4254 if(!prs_uint32("servername_ptr", ps, depth, &il->servername_ptr))
4256 if(!prs_uint32("printername_ptr", ps, depth, &il->printername_ptr))
4258 if(!prs_uint32("sharename_ptr", ps, depth, &il->sharename_ptr))
4260 if(!prs_uint32("portname_ptr", ps, depth, &il->portname_ptr))
4263 if(!prs_uint32("drivername_ptr", ps, depth, &il->drivername_ptr))
4265 if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr))
4267 if(!prs_uint32("location_ptr", ps, depth, &il->location_ptr))
4269 if(!prs_uint32("devmode_ptr", ps, depth, &il->devmode_ptr))
4271 if(!prs_uint32("sepfile_ptr", ps, depth, &il->sepfile_ptr))
4273 if(!prs_uint32("printprocessor_ptr", ps, depth, &il->printprocessor_ptr))
4275 if(!prs_uint32("datatype_ptr", ps, depth, &il->datatype_ptr))
4277 if(!prs_uint32("parameters_ptr", ps, depth, &il->parameters_ptr))
4279 if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
4282 if(!prs_uint32("attributes", ps, depth, &il->attributes))
4284 if(!prs_uint32("priority", ps, depth, &il->priority))
4286 if(!prs_uint32("default_priority", ps, depth, &il->default_priority))
4288 if(!prs_uint32("starttime", ps, depth, &il->starttime))
4290 if(!prs_uint32("untiltime", ps, depth, &il->untiltime))
4292 if(!prs_uint32("status", ps, depth, &il->status))
4294 if(!prs_uint32("cjobs", ps, depth, &il->cjobs))
4296 if(!prs_uint32("averageppm", ps, depth, &il->averageppm))
4299 if(!smb_io_unistr2("servername", &il->servername, il->servername_ptr, ps, depth))
4301 if(!smb_io_unistr2("printername", &il->printername, il->printername_ptr, ps, depth))
4303 if(!smb_io_unistr2("sharename", &il->sharename, il->sharename_ptr, ps, depth))
4305 if(!smb_io_unistr2("portname", &il->portname, il->portname_ptr, ps, depth))
4307 if(!smb_io_unistr2("drivername", &il->drivername, il->drivername_ptr, ps, depth))
4309 if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth))
4311 if(!smb_io_unistr2("location", &il->location, il->location_ptr, ps, depth))
4313 if(!smb_io_unistr2("sepfile", &il->sepfile, il->sepfile_ptr, ps, depth))
4315 if(!smb_io_unistr2("printprocessor", &il->printprocessor, il->printprocessor_ptr, ps, depth))
4317 if(!smb_io_unistr2("datatype", &il->datatype, il->datatype_ptr, ps, depth))
4319 if(!smb_io_unistr2("parameters", &il->parameters, il->parameters_ptr, ps, depth))
4325 /*******************************************************************
4326 ********************************************************************/
4328 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth)
4330 prs_debug(ps, depth, desc, "spool_io_printer_info_level");
4335 if(!prs_uint32("level", ps, depth, &il->level))
4337 if(!prs_uint32("info_ptr", ps, depth, &il->info_ptr))
4340 /* if no struct inside just return */
4341 if (il->info_ptr==0) {
4342 if (UNMARSHALLING(ps)) {
4349 switch (il->level) {
4351 * level 0 is used by setprinter when managing the queue
4352 * (hold, stop, start a queue)
4356 /* DOCUMENT ME!!! What is level 1 used for? */
4359 if (UNMARSHALLING(ps)) {
4360 if ((il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_1))) == NULL)
4363 if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
4368 * level 2 is used by addprinter
4369 * and by setprinter when updating printer's info
4372 if (UNMARSHALLING(ps)) {
4373 if ((il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_2))) == NULL)
4376 if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
4379 /* DOCUMENT ME!!! What is level 3 used for? */
4382 if (UNMARSHALLING(ps)) {
4383 if ((il->info_3=(SPOOL_PRINTER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_INFO_LEVEL_3))) == NULL)
4386 if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
4395 /*******************************************************************
4396 ********************************************************************/
4398 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth)
4400 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterex");
4405 if(!prs_uint32("", ps, depth, &q_u->server_name_ptr))
4407 if(!smb_io_unistr2("", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4413 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4416 if(!spool_io_printer_info_level("", &q_u->info, ps, depth))
4419 /* the 4 unknown are all 0 */
4422 * en fait ils sont pas inconnu
4423 * par recoupement avec rpcSetPrinter
4424 * c'est le devicemode
4425 * et le security descriptor.
4430 if(!prs_uint32("unk0", ps, depth, &q_u->unk0))
4432 if(!prs_uint32("unk1", ps, depth, &q_u->unk1))
4434 if(!prs_uint32("unk2", ps, depth, &q_u->unk2))
4436 if(!prs_uint32("unk3", ps, depth, &q_u->unk3))
4439 if(!prs_uint32("user_switch", ps, depth, &q_u->user_switch))
4441 if(!spool_io_user_level("", &q_u->user_ctr, ps, depth))
4447 /*******************************************************************
4448 ********************************************************************/
4450 BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
4451 prs_struct *ps, int depth)
4453 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterex");
4456 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
4459 if(!prs_uint32("status", ps, depth, &r_u->status))
4465 /*******************************************************************
4466 ********************************************************************/
4468 BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
4469 prs_struct *ps, int depth)
4471 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *il;
4473 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_3");
4477 if (UNMARSHALLING(ps)) {
4478 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3));
4490 if(!prs_uint32("cversion", ps, depth, &il->cversion))
4492 if(!prs_uint32("name", ps, depth, &il->name_ptr))
4494 if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
4496 if(!prs_uint32("driverpath", ps, depth, &il->driverpath_ptr))
4498 if(!prs_uint32("datafile", ps, depth, &il->datafile_ptr))
4500 if(!prs_uint32("configfile", ps, depth, &il->configfile_ptr))
4502 if(!prs_uint32("helpfile", ps, depth, &il->helpfile_ptr))
4504 if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
4506 if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
4508 if(!prs_uint32("dependentfilessize", ps, depth, &il->dependentfilessize))
4510 if(!prs_uint32("dependentfiles", ps, depth, &il->dependentfiles_ptr))
4516 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4518 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4520 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4522 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4524 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4526 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4528 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4530 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4536 if (il->dependentfiles_ptr)
4537 smb_io_buffer5("", &il->dependentfiles, ps, depth);
4542 /*******************************************************************
4543 parse a SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure
4544 ********************************************************************/
4546 BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
4547 prs_struct *ps, int depth)
4549 SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *il;
4551 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level_6");
4555 if (UNMARSHALLING(ps)) {
4556 il=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *)prs_alloc_mem(ps,sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6));
4569 /* parse the main elements the packet */
4571 if(!prs_uint32("version", ps, depth, &il->version))
4574 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4577 * If name_ptr is NULL then the next 4 bytes are the name_ptr. A driver
4578 * with a NULL name just isn't a driver For example: "HP LaserJet 4si"
4579 * from W2K CDROM (which uses unidriver). JohnR 010205
4581 if (!il->name_ptr) {
4582 DEBUG(5,("spool_io_printer_driver_info_level_6: name_ptr is NULL! Get next value\n"));
4583 if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
4587 if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr))
4589 if(!prs_uint32("driverpath_ptr", ps, depth, &il->driverpath_ptr))
4591 if(!prs_uint32("datafile_ptr", ps, depth, &il->datafile_ptr))
4593 if(!prs_uint32("configfile_ptr", ps, depth, &il->configfile_ptr))
4595 if(!prs_uint32("helpfile_ptr", ps, depth, &il->helpfile_ptr))
4597 if(!prs_uint32("monitorname_ptr", ps, depth, &il->monitorname_ptr))
4599 if(!prs_uint32("defaultdatatype_ptr", ps, depth, &il->defaultdatatype_ptr))
4601 if(!prs_uint32("dependentfiles_len", ps, depth, &il->dependentfiles_len))
4603 if(!prs_uint32("dependentfiles_ptr", ps, depth, &il->dependentfiles_ptr))
4605 if(!prs_uint32("previousnames_len", ps, depth, &il->previousnames_len))
4607 if(!prs_uint32("previousnames_ptr", ps, depth, &il->previousnames_ptr))
4609 if(!smb_io_time("driverdate", &il->driverdate, ps, depth))
4611 if(!prs_uint32("dummy4", ps, depth, &il->dummy4))
4613 if(!prs_uint64("driverversion", ps, depth, &il->driverversion))
4615 if(!prs_uint32("mfgname_ptr", ps, depth, &il->mfgname_ptr))
4617 if(!prs_uint32("oemurl_ptr", ps, depth, &il->oemurl_ptr))
4619 if(!prs_uint32("hardwareid_ptr", ps, depth, &il->hardwareid_ptr))
4621 if(!prs_uint32("provider_ptr", ps, depth, &il->provider_ptr))
4624 /* parse the structures in the packet */
4626 if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth))
4631 if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth))
4636 if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth))
4641 if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth))
4646 if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth))
4651 if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth))
4656 if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth))
4661 if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth))
4665 if (il->dependentfiles_ptr) {
4666 if(!smb_io_buffer5("dependentfiles", &il->dependentfiles, ps, depth))
4671 if (il->previousnames_ptr) {
4672 if(!smb_io_buffer5("previousnames", &il->previousnames, ps, depth))
4677 if(!smb_io_unistr2("mfgname", &il->mfgname, il->mfgname_ptr, ps, depth))
4681 if(!smb_io_unistr2("oemurl", &il->oemurl, il->oemurl_ptr, ps, depth))
4685 if(!smb_io_unistr2("hardwareid", &il->hardwareid, il->hardwareid_ptr, ps, depth))
4689 if(!smb_io_unistr2("provider", &il->provider, il->provider_ptr, ps, depth))
4695 /*******************************************************************
4696 convert a buffer of UNICODE strings null terminated
4697 the buffer is terminated by a NULL
4699 convert to an dos codepage array (null terminated)
4701 dynamically allocate memory
4703 ********************************************************************/
4704 static BOOL uniarray_2_dosarray(BUFFER5 *buf5, fstring **ar)
4710 if (buf5==NULL) return False;
4712 src = (char *)buf5->buffer;
4715 while (src < ((char *)buf5->buffer) + buf5->buf_len*2) {
4716 unistr_to_dos(f, src, sizeof(f)-1);
4717 src = skip_unibuf(src, 2*buf5->buf_len - PTR_DIFF(src,buf5->buffer));
4718 *ar = (fstring *)Realloc(*ar, sizeof(fstring)*(n+2));
4719 fstrcpy((*ar)[n], f);
4722 fstrcpy((*ar)[n], "");
4727 /*******************************************************************
4728 read a UNICODE array with null terminated strings
4729 and null terminated array
4730 and size of array at beginning
4731 ********************************************************************/
4733 BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth)
4735 if (buffer==NULL) return False;
4738 buffer->uni_str_len=buffer->uni_max_len;
4740 if(!prs_uint32("buffer_size", ps, depth, &buffer->uni_max_len))
4743 if(!prs_unistr2(True, "buffer ", ps, depth, buffer))
4749 /*******************************************************************
4750 ********************************************************************/
4752 BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth)
4754 prs_debug(ps, depth, desc, "spool_io_printer_driver_info_level");
4759 if(!prs_uint32("level", ps, depth, &il->level))
4761 if(!prs_uint32("ptr", ps, depth, &il->ptr))
4767 switch (il->level) {
4769 if(!spool_io_printer_driver_info_level_3("", &il->info_3, ps, depth))
4773 if(!spool_io_printer_driver_info_level_6("", &il->info_6, ps, depth))
4783 /*******************************************************************
4784 init a SPOOL_Q_ADDPRINTERDRIVER struct
4785 ******************************************************************/
4787 BOOL make_spoolss_q_addprinterdriver(
4788 TALLOC_CTX *mem_ctx,
4789 SPOOL_Q_ADDPRINTERDRIVER *q_u,
4790 const char* srv_name,
4792 PRINTER_DRIVER_CTR *info)
4794 DEBUG(5,("make_spoolss_q_addprinterdriver\n"));
4796 q_u->server_name_ptr = (srv_name!=NULL)?1:0;
4797 init_unistr2(&q_u->server_name, srv_name, strlen(srv_name)+1);
4801 q_u->info.level = level;
4802 q_u->info.ptr = (info!=NULL)?1:0;
4805 /* info level 3 is supported by Windows 95/98, WinNT and Win2k */
4807 make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3);
4810 /* info level 6 is supported by WinME and Win2k */
4812 /* WRITEME!! will add later --jerry */
4816 DEBUG(0,("make_spoolss_q_addprinterdriver: Unknown info level [%d]\n", level));
4823 BOOL make_spoolss_driver_info_3(
4824 TALLOC_CTX *mem_ctx,
4825 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info,
4826 DRIVER_INFO_3 *info3
4830 uint16 *ptr = info3->dependentfiles;
4832 BOOL null_char = False;
4833 SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf;
4835 if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3))))
4838 inf->cversion = info3->version;
4839 inf->name_ptr = (info3->name.buffer!=NULL)?1:0;
4840 inf->environment_ptr = (info3->architecture.buffer!=NULL)?1:0;
4841 inf->driverpath_ptr = (info3->driverpath.buffer!=NULL)?1:0;
4842 inf->datafile_ptr = (info3->datafile.buffer!=NULL)?1:0;
4843 inf->configfile_ptr = (info3->configfile.buffer!=NULL)?1:0;
4844 inf->helpfile_ptr = (info3->helpfile.buffer!=NULL)?1:0;
4845 inf->monitorname_ptr = (info3->monitorname.buffer!=NULL)?1:0;
4846 inf->defaultdatatype_ptr = (info3->defaultdatatype.buffer!=NULL)?1:0;
4848 init_unistr2_from_unistr(&inf->name, &info3->name);
4849 init_unistr2_from_unistr(&inf->environment, &info3->architecture);
4850 init_unistr2_from_unistr(&inf->driverpath, &info3->driverpath);
4851 init_unistr2_from_unistr(&inf->datafile, &info3->datafile);
4852 init_unistr2_from_unistr(&inf->configfile, &info3->configfile);
4853 init_unistr2_from_unistr(&inf->helpfile, &info3->helpfile);
4854 init_unistr2_from_unistr(&inf->monitorname, &info3->monitorname);
4855 init_unistr2_from_unistr(&inf->defaultdatatype, &info3->defaultdatatype);
4862 /* the null_char BOOL is used to help locate
4863 two '\0's back to back */
4878 inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0;
4879 inf->dependentfilessize = len;
4880 if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles))
4886 *spool_drv_info = inf;
4891 /*******************************************************************
4892 make a BUFFER5 struct from a uint16*
4893 ******************************************************************/
4895 BOOL make_spoolss_buffer5(
4896 TALLOC_CTX *mem_ctx,
4903 buf5->buf_len = len;
4904 if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL)
4906 DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n"));
4913 /*******************************************************************
4914 fill in the prs_struct for a ADDPRINTERDRIVER request PDU
4915 ********************************************************************/
4917 BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4919 prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriver");
4925 if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
4927 if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
4932 if(!prs_uint32("info_level", ps, depth, &q_u->level))
4935 if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
4941 /*******************************************************************
4942 ********************************************************************/
4944 BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth)
4946 prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriver");
4949 if(!prs_uint32("status", ps, depth, &q_u->status))
4955 /*******************************************************************
4956 ********************************************************************/
4958 BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
4959 NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc)
4961 NT_PRINTER_DRIVER_INFO_LEVEL_3 *d;
4963 DEBUG(7,("uni_2_asc_printer_driver_3: Converting from UNICODE to ASCII\n"));
4967 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3));
4975 d->cversion=uni->cversion;
4977 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
4978 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
4979 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
4980 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
4981 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
4982 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
4983 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
4984 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
4986 DEBUGADD(8,( "version: %d\n", d->cversion));
4987 DEBUGADD(8,( "name: %s\n", d->name));
4988 DEBUGADD(8,( "environment: %s\n", d->environment));
4989 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
4990 DEBUGADD(8,( "datafile: %s\n", d->datafile));
4991 DEBUGADD(8,( "configfile: %s\n", d->configfile));
4992 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
4993 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
4994 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
4996 uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles );
5001 /*******************************************************************
5002 ********************************************************************/
5003 BOOL uni_2_asc_printer_driver_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 *uni,
5004 NT_PRINTER_DRIVER_INFO_LEVEL_6 **asc)
5006 NT_PRINTER_DRIVER_INFO_LEVEL_6 *d;
5008 DEBUG(7,("uni_2_asc_printer_driver_6: Converting from UNICODE to ASCII\n"));
5012 *asc=(NT_PRINTER_DRIVER_INFO_LEVEL_6 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_6));
5020 d->version=uni->version;
5022 unistr2_to_ascii(d->name, &uni->name, sizeof(d->name)-1);
5023 unistr2_to_ascii(d->environment, &uni->environment, sizeof(d->environment)-1);
5024 unistr2_to_ascii(d->driverpath, &uni->driverpath, sizeof(d->driverpath)-1);
5025 unistr2_to_ascii(d->datafile, &uni->datafile, sizeof(d->datafile)-1);
5026 unistr2_to_ascii(d->configfile, &uni->configfile, sizeof(d->configfile)-1);
5027 unistr2_to_ascii(d->helpfile, &uni->helpfile, sizeof(d->helpfile)-1);
5028 unistr2_to_ascii(d->monitorname, &uni->monitorname, sizeof(d->monitorname)-1);
5029 unistr2_to_ascii(d->defaultdatatype, &uni->defaultdatatype, sizeof(d->defaultdatatype)-1);
5031 DEBUGADD(8,( "version: %d\n", d->version));
5032 DEBUGADD(8,( "name: %s\n", d->name));
5033 DEBUGADD(8,( "environment: %s\n", d->environment));
5034 DEBUGADD(8,( "driverpath: %s\n", d->driverpath));
5035 DEBUGADD(8,( "datafile: %s\n", d->datafile));
5036 DEBUGADD(8,( "configfile: %s\n", d->configfile));
5037 DEBUGADD(8,( "helpfile: %s\n", d->helpfile));
5038 DEBUGADD(8,( "monitorname: %s\n", d->monitorname));
5039 DEBUGADD(8,( "defaultdatatype: %s\n", d->defaultdatatype));
5041 uniarray_2_dosarray(&uni->dependentfiles, &d->dependentfiles );
5042 uniarray_2_dosarray(&uni->previousnames, &d->previousnames );
5047 BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
5048 NT_PRINTER_INFO_LEVEL_2 **asc)
5050 NT_PRINTER_INFO_LEVEL_2 *d;
5053 DEBUG(7,("Converting from UNICODE to ASCII\n"));
5054 time_unix=time(NULL);
5057 DEBUGADD(8,("allocating memory\n"));
5059 *asc=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2));
5064 /* we allocate memory iff called from
5065 * addprinter(ex) so we can do one time stuff here.
5067 (*asc)->setuptime=time_unix;
5070 DEBUGADD(8,("start converting\n"));
5074 d->attributes=uni->attributes;
5075 d->priority=uni->priority;
5076 d->default_priority=uni->default_priority;
5077 d->starttime=uni->starttime;
5078 d->untiltime=uni->untiltime;
5079 d->status=uni->status;
5080 d->cjobs=uni->cjobs;
5082 unistr2_to_ascii(d->servername, &uni->servername, sizeof(d->servername)-1);
5083 unistr2_to_ascii(d->printername, &uni->printername, sizeof(d->printername)-1);
5084 unistr2_to_ascii(d->sharename, &uni->sharename, sizeof(d->sharename)-1);
5085 unistr2_to_ascii(d->portname, &uni->portname, sizeof(d->portname)-1);
5086 unistr2_to_ascii(d->drivername, &uni->drivername, sizeof(d->drivername)-1);
5087 unistr2_to_ascii(d->comment, &uni->comment, sizeof(d->comment)-1);
5088 unistr2_to_ascii(d->location, &uni->location, sizeof(d->location)-1);
5089 unistr2_to_ascii(d->sepfile, &uni->sepfile, sizeof(d->sepfile)-1);
5090 unistr2_to_ascii(d->printprocessor, &uni->printprocessor, sizeof(d->printprocessor)-1);
5091 unistr2_to_ascii(d->datatype, &uni->datatype, sizeof(d->datatype)-1);
5092 unistr2_to_ascii(d->parameters, &uni->parameters, sizeof(d->parameters)-1);
5097 /*******************************************************************
5099 ********************************************************************/
5101 BOOL make_spoolss_q_getprinterdriverdir(SPOOL_Q_GETPRINTERDRIVERDIR *q_u,
5102 fstring servername, fstring env_name, uint32 level,
5103 NEW_BUFFER *buffer, uint32 offered)
5105 init_buf_unistr2(&q_u->name, &q_u->name_ptr, servername);
5106 init_buf_unistr2(&q_u->environment, &q_u->environment_ptr, env_name);
5110 q_u->offered=offered;
5115 /*******************************************************************
5116 Parse a SPOOL_Q_GETPRINTERDRIVERDIR structure.
5117 ********************************************************************/
5119 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth)
5121 prs_debug(ps, depth, desc, "spoolss_io_q_getprinterdriverdir");
5126 if(!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5128 if(!smb_io_unistr2("", &q_u->name, q_u->name_ptr, ps, depth))
5134 if(!prs_uint32("", ps, depth, &q_u->environment_ptr))
5136 if(!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5142 if(!prs_uint32("level", ps, depth, &q_u->level))
5145 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5151 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5157 /*******************************************************************
5158 Parse a SPOOL_R_GETPRINTERDRIVERDIR structure.
5159 ********************************************************************/
5161 BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth)
5163 prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdriverdir");
5169 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5175 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5178 if (!prs_uint32("status", ps, depth, &r_u->status))
5184 /*******************************************************************
5185 ********************************************************************/
5187 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
5189 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
5195 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5201 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5204 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5207 if (!prs_uint32("status", ps, depth, &r_u->status))
5213 /*******************************************************************
5214 ********************************************************************/
5216 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth)
5218 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
5224 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5226 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5232 if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
5234 if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
5240 if (!prs_uint32("level", ps, depth, &q_u->level))
5243 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5249 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5255 /*******************************************************************
5256 ********************************************************************/
5258 BOOL spoolss_io_q_addprintprocessor(char *desc, SPOOL_Q_ADDPRINTPROCESSOR *q_u, prs_struct *ps, int depth)
5260 prs_debug(ps, depth, desc, "spoolss_io_q_addprintprocessor");
5266 if (!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
5268 if (!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
5273 if (!smb_io_unistr2("environment", &q_u->environment, True, ps, depth))
5278 if (!smb_io_unistr2("path", &q_u->path, True, ps, depth))
5283 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5289 /*******************************************************************
5290 ********************************************************************/
5292 BOOL spoolss_io_r_addprintprocessor(char *desc, SPOOL_R_ADDPRINTPROCESSOR *r_u, prs_struct *ps, int depth)
5294 prs_debug(ps, depth, desc, "spoolss_io_r_addprintproicessor");
5300 if (!prs_uint32("status", ps, depth, &r_u->status))
5306 /*******************************************************************
5307 ********************************************************************/
5309 BOOL spoolss_io_r_enumprintprocdatatypes(char *desc, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u, prs_struct *ps, int depth)
5311 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocdatatypes");
5317 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5323 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5326 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5329 if (!prs_uint32("status", ps, depth, &r_u->status))
5335 /*******************************************************************
5336 ********************************************************************/
5338 BOOL spoolss_io_q_enumprintprocdatatypes(char *desc, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, prs_struct *ps, int depth)
5340 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocdatatypes");
5346 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5348 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5354 if (!prs_uint32("processor_ptr", ps, depth, &q_u->processor_ptr))
5356 if (!smb_io_unistr2("processor", &q_u->processor, q_u->processor_ptr, ps, depth))
5362 if (!prs_uint32("level", ps, depth, &q_u->level))
5365 if(!spoolss_io_buffer("buffer", ps, depth, &q_u->buffer))
5371 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5377 /*******************************************************************
5378 Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
5379 ********************************************************************/
5381 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
5383 prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
5389 if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
5391 if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
5397 if (!prs_uint32("level", ps, depth, &q_u->level))
5400 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5406 if (!prs_uint32("offered", ps, depth, &q_u->offered))
5412 /*******************************************************************
5413 ********************************************************************/
5415 BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
5417 prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
5423 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5429 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5432 if (!prs_uint32("returned", ps, depth, &r_u->returned))
5435 if (!prs_uint32("status", ps, depth, &r_u->status))
5441 /*******************************************************************
5442 ********************************************************************/
5444 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
5446 prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
5451 if(!prs_uint32("valuesize", ps, depth, &r_u->valuesize))
5454 if(!prs_uint16uni(False, "value", ps, depth, r_u->value, r_u->valuesize ))
5460 if(!prs_uint32("realvaluesize", ps, depth, &r_u->realvaluesize))
5463 if(!prs_uint32("type", ps, depth, &r_u->type))
5466 if(!prs_uint32("datasize", ps, depth, &r_u->datasize))
5468 if(!prs_uint8s(False, "data", ps, depth, r_u->data, r_u->datasize))
5473 if(!prs_uint32("realdatasize", ps, depth, &r_u->realdatasize))
5475 if(!prs_uint32("status", ps, depth, &r_u->status))
5481 /*******************************************************************
5482 ********************************************************************/
5484 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth)
5486 prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdata");
5491 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5493 if(!prs_uint32("index", ps, depth, &q_u->index))
5495 if(!prs_uint32("valuesize", ps, depth, &q_u->valuesize))
5497 if(!prs_uint32("datasize", ps, depth, &q_u->datasize))
5503 /*******************************************************************
5504 ********************************************************************/
5506 BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
5507 const POLICY_HND *hnd,
5508 uint32 idx, uint32 valuelen, uint32 datalen)
5510 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5512 q_u->valuesize=valuelen;
5513 q_u->datasize=datalen;
5518 /*******************************************************************
5519 ********************************************************************/
5521 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth)
5523 prs_debug(ps, depth, desc, "spoolss_io_q_setprinterdata");
5528 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5530 if(!smb_io_unistr2("", &q_u->value, True, ps, depth))
5536 if(!prs_uint32("type", ps, depth, &q_u->type))
5539 if(!prs_uint32("max_len", ps, depth, &q_u->max_len))
5549 if (UNMARSHALLING(ps))
5550 q_u->data=(uint8 *)prs_alloc_mem(ps, q_u->max_len * sizeof(uint8));
5551 if(q_u->data == NULL)
5553 if(!prs_uint8s(False,"data", ps, depth, q_u->data, q_u->max_len))
5561 if(!prs_uint32("real_len", ps, depth, &q_u->real_len))
5567 /*******************************************************************
5568 ********************************************************************/
5570 BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth)
5572 prs_debug(ps, depth, desc, "spoolss_io_r_setprinterdata");
5577 if(!prs_uint32("status", ps, depth, &r_u->status))
5583 /*******************************************************************
5584 ********************************************************************/
5586 BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
5587 uint32 type, const uint8 *data, uint32 len)
5589 DEBUG(5,("converting a specific param struct\n"));
5593 *param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
5596 memset((char *)*param, '\0', sizeof(NT_PRINTER_PARAM));
5597 DEBUGADD(6,("Allocated a new PARAM struct\n"));
5599 unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
5600 (*param)->type = type;
5602 /* le champ data n'est pas NULL termine */
5603 /* on stocke donc la longueur */
5605 (*param)->data_len=len;
5608 (*param)->data=(uint8 *)malloc(len * sizeof(uint8));
5609 if((*param)->data == NULL)
5611 memcpy((*param)->data, data, len);
5614 DEBUGADD(6,("\tvalue:[%s], len:[%d]\n",(*param)->value, (*param)->data_len));
5615 dump_data(10, (char *)(*param)->data, (*param)->data_len);
5620 /*******************************************************************
5621 ********************************************************************/
5623 static BOOL spoolss_io_addform(char *desc, FORM *f, uint32 ptr, prs_struct *ps, int depth)
5625 prs_debug(ps, depth, desc, "spoolss_io_addform");
5632 if(!prs_uint32("flags", ps, depth, &f->flags))
5634 if(!prs_uint32("name_ptr", ps, depth, &f->name_ptr))
5636 if(!prs_uint32("size_x", ps, depth, &f->size_x))
5638 if(!prs_uint32("size_y", ps, depth, &f->size_y))
5640 if(!prs_uint32("left", ps, depth, &f->left))
5642 if(!prs_uint32("top", ps, depth, &f->top))
5644 if(!prs_uint32("right", ps, depth, &f->right))
5646 if(!prs_uint32("bottom", ps, depth, &f->bottom))
5649 if(!smb_io_unistr2("", &f->name, f->name_ptr, ps, depth))
5656 /*******************************************************************
5657 ********************************************************************/
5659 BOOL spoolss_io_q_deleteform(char *desc, SPOOL_Q_DELETEFORM *q_u, prs_struct *ps, int depth)
5661 prs_debug(ps, depth, desc, "spoolss_io_q_deleteform");
5666 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5668 if(!smb_io_unistr2("form name", &q_u->name, True, ps, depth))
5674 /*******************************************************************
5675 ********************************************************************/
5677 BOOL spoolss_io_r_deleteform(char *desc, SPOOL_R_DELETEFORM *r_u, prs_struct *ps, int depth)
5679 prs_debug(ps, depth, desc, "spoolss_io_r_deleteform");
5684 if(!prs_uint32("status", ps, depth, &r_u->status))
5690 /*******************************************************************
5691 ********************************************************************/
5693 BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth)
5695 uint32 useless_ptr=0;
5696 prs_debug(ps, depth, desc, "spoolss_io_q_addform");
5701 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5703 if(!prs_uint32("level", ps, depth, &q_u->level))
5705 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5710 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5712 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5719 /*******************************************************************
5720 ********************************************************************/
5722 BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth)
5724 prs_debug(ps, depth, desc, "spoolss_io_r_addform");
5729 if(!prs_uint32("status", ps, depth, &r_u->status))
5735 /*******************************************************************
5736 ********************************************************************/
5738 BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth)
5740 uint32 useless_ptr=0;
5741 prs_debug(ps, depth, desc, "spoolss_io_q_setform");
5746 if(!smb_io_pol_hnd("printer handle", &q_u->handle, ps, depth))
5748 if(!smb_io_unistr2("", &q_u->name, True, ps, depth))
5754 if(!prs_uint32("level", ps, depth, &q_u->level))
5756 if(!prs_uint32("level2", ps, depth, &q_u->level2))
5761 if(!prs_uint32("useless_ptr", ps, depth, &useless_ptr))
5763 if(!spoolss_io_addform("", &q_u->form, useless_ptr, ps, depth))
5770 /*******************************************************************
5771 ********************************************************************/
5773 BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth)
5775 prs_debug(ps, depth, desc, "spoolss_io_r_setform");
5780 if(!prs_uint32("status", ps, depth, &r_u->status))
5786 /*******************************************************************
5787 Parse a SPOOL_R_GETJOB structure.
5788 ********************************************************************/
5790 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth)
5792 prs_debug(ps, depth, desc, "spoolss_io_r_getjob");
5798 if (!spoolss_io_buffer("", ps, depth, &r_u->buffer))
5804 if (!prs_uint32("needed", ps, depth, &r_u->needed))
5807 if (!prs_uint32("status", ps, depth, &r_u->status))
5813 /*******************************************************************
5814 Parse a SPOOL_Q_GETJOB structure.
5815 ********************************************************************/
5817 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth)
5819 prs_debug(ps, depth, desc, "");
5825 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5827 if(!prs_uint32("jobid", ps, depth, &q_u->jobid))
5829 if(!prs_uint32("level", ps, depth, &q_u->level))
5832 if(!spoolss_io_buffer("", ps, depth, &q_u->buffer))
5838 if(!prs_uint32("offered", ps, depth, &q_u->offered))
5844 void free_devmode(DEVICEMODE *devmode)
5846 if (devmode!=NULL) {
5847 safe_free(devmode->private);
5852 void free_printer_info_1(PRINTER_INFO_1 *printer)
5857 void free_printer_info_2(PRINTER_INFO_2 *printer)
5859 if (printer!=NULL) {
5860 free_devmode(printer->devmode);
5861 printer->devmode = NULL;
5866 void free_printer_info_3(PRINTER_INFO_3 *printer)
5868 if (printer!=NULL) {
5873 void free_job_info_2(JOB_INFO_2 *job)
5876 free_devmode(job->devmode);
5879 /*******************************************************************
5881 ********************************************************************/
5883 BOOL make_spoolss_q_replyopenprinter(SPOOL_Q_REPLYOPENPRINTER *q_u,
5884 const fstring string, uint32 printer, uint32 type)
5889 init_unistr2(&q_u->string, string, strlen(string)+1);
5891 q_u->printer=printer;
5900 /*******************************************************************
5901 Parse a SPOOL_Q_REPLYOPENPRINTER structure.
5902 ********************************************************************/
5904 BOOL spoolss_io_q_replyopenprinter(char *desc, SPOOL_Q_REPLYOPENPRINTER *q_u, prs_struct *ps, int depth)
5906 prs_debug(ps, depth, desc, "spoolss_io_q_replyopenprinter");
5912 if(!smb_io_unistr2("", &q_u->string, True, ps, depth))
5918 if(!prs_uint32("printer", ps, depth, &q_u->printer))
5920 if(!prs_uint32("type", ps, depth, &q_u->type))
5923 if(!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
5925 if(!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
5931 /*******************************************************************
5932 Parse a SPOOL_R_REPLYOPENPRINTER structure.
5933 ********************************************************************/
5935 BOOL spoolss_io_r_replyopenprinter(char *desc, SPOOL_R_REPLYOPENPRINTER *r_u, prs_struct *ps, int depth)
5937 prs_debug(ps, depth, desc, "spoolss_io_r_replyopenprinter");
5943 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
5946 if (!prs_uint32("status", ps, depth, &r_u->status))
5952 /*******************************************************************
5954 ********************************************************************/
5956 BOOL make_spoolss_q_reply_closeprinter(SPOOL_Q_REPLYCLOSEPRINTER *q_u, POLICY_HND *hnd)
5961 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
5966 /*******************************************************************
5967 Parse a SPOOL_Q_REPLYCLOSEPRINTER structure.
5968 ********************************************************************/
5970 BOOL spoolss_io_q_replycloseprinter(char *desc, SPOOL_Q_REPLYCLOSEPRINTER *q_u, prs_struct *ps, int depth)
5972 prs_debug(ps, depth, desc, "spoolss_io_q_replycloseprinter");
5978 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
5984 /*******************************************************************
5985 Parse a SPOOL_R_REPLYCLOSEPRINTER structure.
5986 ********************************************************************/
5988 BOOL spoolss_io_r_replycloseprinter(char *desc, SPOOL_R_REPLYCLOSEPRINTER *r_u, prs_struct *ps, int depth)
5990 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
5996 if(!smb_io_pol_hnd("printer handle",&r_u->handle,ps,depth))
5999 if (!prs_uint32("status", ps, depth, &r_u->status))
6005 /*******************************************************************
6007 ********************************************************************/
6009 BOOL make_spoolss_q_reply_rrpcn(SPOOL_Q_REPLY_RRPCN *q_u, POLICY_HND *hnd,
6010 uint32 change_low, uint32 change_high)
6015 memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
6017 q_u->change_low=change_low;
6018 q_u->change_high=change_high;
6025 q_u->info.version=2;
6026 q_u->info.flags=PRINTER_NOTIFY_INFO_DISCARDED;
6032 /*******************************************************************
6033 Parse a SPOOL_Q_REPLY_RRPCN structure.
6034 ********************************************************************/
6036 BOOL spoolss_io_q_reply_rrpcn(char *desc, SPOOL_Q_REPLY_RRPCN *q_u, prs_struct *ps, int depth)
6038 prs_debug(ps, depth, desc, "spoolss_io_q_reply_rrpcn");
6044 if(!smb_io_pol_hnd("printer handle",&q_u->handle,ps,depth))
6047 if (!prs_uint32("change_low", ps, depth, &q_u->change_low))
6050 if (!prs_uint32("change_high", ps, depth, &q_u->change_high))
6053 if (!prs_uint32("unknown0", ps, depth, &q_u->unknown0))
6056 if (!prs_uint32("unknown1", ps, depth, &q_u->unknown1))
6059 if (!prs_uint32("info_ptr", ps, depth, &q_u->info_ptr))
6062 if(q_u->info_ptr!=0)
6063 if(!smb_io_notify_info(desc, &q_u->info, ps, depth))
6069 /*******************************************************************
6070 Parse a SPOOL_R_REPLY_RRPCN structure.
6071 ********************************************************************/
6073 BOOL spoolss_io_r_reply_rrpcn(char *desc, SPOOL_R_REPLY_RRPCN *r_u, prs_struct *ps, int depth)
6075 prs_debug(ps, depth, desc, "spoolss_io_r_replycloseprinter");
6081 if (!prs_uint32("unknown0", ps, depth, &r_u->unknown0))
6084 if (!prs_uint32("status", ps, depth, &r_u->status))